Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整

前提条件: Oracle EBS 企业税改方案(一)-业务需求整理及基础设置篇
Oracle EBS系统版本:11.5.10
未结采购单处理起来比未结销售订单麻烦多了,由于采购订单底层表架构及逻辑,如采购接收以后不会拆分行。特别是好多公司对PR、PBA、Quotation或标准PO等等有比深度定制,处理起来比较棘手。比如:我们公司的采购订单有客制化如下,行中添加了税码含税价
Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整_第1张图片

另外,自动创建采购订单也是客制化的,还好当时考虑的比较周全,对本税改影响不是特别太,风险还是可控的。

一、Supplier Site-Tax 修改供应商地点层税。当然,根据不同公司设置默认税码优先级别不同,也可以不让操作该步骤。
AP->Supplies->Entry->Suppliers->SupplierSites->Invoice Tax 
Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整_第2张图片

批量API修改供应商地点层的税,我没有细仔去研究。有朋友跟我讲他们是直接更新该表的税码,如下:

Update PO_VENDOR_SITES_ALL
   Set VAT_CODE = 'VAT16'
 Where VENDOR_SITE_ID = 924;

我也从PR->PO->Receiving->VMI/寄售耗用->Create Consumption Advice->Create AP Invoices 等等一步一步测试,好像没有发现什么问题。不过,我是让用户去一家一家供应商手工更新:):)

二、未结采购申请单
      未结采购申请单是指所有未创建采购订单的申请,其情况如下
Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整_第3张图片

但是,我直接用“采购申请已批准但未创建采购订单”使用准标AutoCreate,PO发运行的税码是16%的税码(VAT16),貌似不需求修改税率。希望有朋友帮验证一下,是不是可能我们系统之前客制化修改标准的库文件或包?

三、创建VMI/寄售供应商的AP Invoices,注意:该步骤有可能设置不同默认税码优先级别,有可能提前操作(包括手工AP invoices匹配的),尽可能创建 AP Invoices之前税码不要变
3.1 Create Consumption Advice(创建冲减通知): INV->Reports->Transactions->Create Consumption Advice:无需输入任何条件直接提交。
3.2 Pay On Receipt AutoInvoice: AP->View->Request->Pay On Receipt AutoInvoice

四 、未结采购订单

未结采购订单是指所有未Create AP Invoices的采购订单。其情况如下
Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整_第4张图片

特别注意一点:所有VMI/寄售模式合作的供应商,未结采购订单可以无需处理,直接修改PBA的对应行的采购单价和税码优先级别的设置。由于我们有一部分VMI/寄售的结算方式是以当时下标准PO的单价结算,可以参考:Oracle EBS VMI取标准PO单价,也建议最好不处理,客制化报表汇总税率引起的差异,直接在AP Invoices中调整。
Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整_第5张图片

也可以用API批量处理未结采购订单。但是,由于资源问题暂时没有写,有的朋友可以分分享一下。但是,新创建订单行的单价必须要与原来行的单价一样。特别是单价波动比较大的材料,避免给公司带来损失。

五、Quotations 和 BPA修改税码和单价:
PO->RFQ’sand Quotations-> Quotations :修改Quotations 单价
PO->PurchaseOrders -> Purchase Orders : 修改BPA税率和含税单价

Oracle EBS 企业税改方案(三)-未结采购单据及部分AP Invoices税率调整_第6张图片

之前做了一个项目,每天根据有色金重期货价格、卡通箱平方单价和PCB板平方单价自动计算出每个原材料的单价,在该基础上修改PL/SQL用API批量修改Quotations和PBA的单价,代码如下:

Declare
  l_iface_rec       PO.PO_HEADERS_INTERFACE%ROWTYPE;
  l_iface_lines_rec po.po_lines_interface%ROWTYPE;

  v_batch_id Number := 180417001; --To_Number(To_Char(To_Char(Sysdate, 'MMDDHH24MISS')));
  --组织标识
  l_OrgId      Number := 114; --OU ID
  l_OldTaxName Varchar2(200) := 'VAT17'; --17%税率代码
  l_NewTaxName Varchar2(200); --16%税率代码
  l_NewTaxId   Number; --16%税率ID
  l_NewTaxRate Number; --16%税率
  --Quotation & PBA订单题头  注意:没有价格分段
  Cursor CrH Is
    Select PHA.PO_HEADER_ID,
           PHA.VENDOR_ID,
           PHA.VENDOR_SITE_ID,
           PHA.SEGMENT1 PO_NUMBER,
           PHA.TYPE_LOOKUP_CODE,
           PHA.Authorization_Status,
           PHA.STATUS_LOOKUP_CODE,
           PHA.AGENT_ID,
           PHA.START_DATE
      From PO_HEADERS_ALL PHA
     Where PHA.ORG_ID = 114
       --And PHA.SEGMENT1 = '211000024137'
       And PHA.TYPE_LOOKUP_CODE In ('QUOTATION', 'BLANKET') --QUOTATION表示报价单,BLANKET表示PBA一揽子采购协议
       And Nvl(PHA.START_DATE, Trunc(Sysdate)) <= Trunc(Sysdate) --有效开始日期
       And NVL(PHA.END_DATE, Trunc(Sysdate)) >= Trunc(Sysdate) --有效结果日期
       And Nvl(PHA.CLOSED_CODE, 'N') = 'N' --是否关闭
       And (PHA.STATUS_LOOKUP_CODE = 'A' Or
           (PHA.AUTHORIZATION_STATUS = 'APPROVED' And
           Nvl(PHA.CLOSED_CODE, 'OPEN') != 'CLOSED'));
  --找出Quotation & PBA行17%的税率
  Cursor CrL(P_POHEADER_ID Number) Is
    Select PLA.PO_LINE_ID,
           PLA.LINE_NUM,
           MSI.SEGMENT1 ITEM_NUMBER,
           MSI.DESCRIPTION ITEM_DESCRIPTION,
           To_Number(PLA.ATTRIBUTE1) TAX_UNIT_PRICE, --含税单价
           PLA.UNIT_PRICE, --不含税单价
           TAX.TAX_RATE --17%税率
      From PO_HEADERS_ALL     PHA,
           PO_LINES_ALL       PLA,
           MTL_SYSTEM_ITEMS_B MSI,
           AP_TAX_CODES_ALL   TAX
     Where PHA.PO_HEADER_ID = PLA.PO_HEADER_ID
       And 122 = MSI.ORGANIZATION_ID
       And PLA.ITEM_ID = MSI.INVENTORY_ITEM_ID
       And PLA.TAX_CODE_ID = TAX.TAX_ID(+)
       And (PHA.TYPE_LOOKUP_CODE = 'QUOTATION' Or
           (PHA.TYPE_LOOKUP_CODE = 'BLANKET' And TAX.NAME = l_OldTaxName))
       And PHA.PO_HEADER_ID = P_POHEADER_ID
       And PLA.LINE_NUM In (1, 9, 11)
       And Nvl(PLA.CANCEL_FLAG, 'N') = 'N'
       And Nvl(PLA.CLOSED_CODE, 'OPEN') != 'FINALLY CLOSED'
     Order By PLA.LINE_NUM;
  --通过更新成功有的接口表记录,更新PBA的含税单价和税码  
  Cursor CrR Is
    Select PHI.DOCUMENT_NUM,
           PHI.DOCUMENT_TYPE_CODE,
           PLI.LINE_NUM,
           PLI.PROCESS_CODE,
           PLI.PO_LINE_ID,
           PLI.LINE_ATTRIBUTE1,
           PLI.UNIT_PRICE
      From PO.PO_HEADERS_INTERFACE PHI, PO_LINES_INTERFACE PLI
     where PHI.INTERFACE_HEADER_ID = PLI.INTERFACE_HEADER_ID
       And PHI.BATCH_ID = v_batch_id
       And PHI.DOCUMENT_TYPE_CODE = 'BLANKET'
       And PHI.PROCESS_CODE = 'ACCEPTED'
     Order By PHI.DOCUMENT_NUM, PLI.LINE_NUM;

  v_Price      Number;  
  v_TaxPrice   Number;
  l_UserId     Number := 1110;
  l_RespId     Number := 50244;
  l_RespApplId Number := 201;
Begin
  --初始化  
  fnd_global.apps_initialize(user_id      => l_UserId,
                             resp_id      => l_RespId,
                             resp_appl_id => l_RespApplId);
  --删除接口表数据
  Begin
    Delete From PO_LINES_INTERFACE
     Where INTERFACE_HEADER_ID In
           (Select INTERFACE_HEADER_ID
              From PO.PO_HEADERS_INTERFACE
             Where BATCH_ID = v_batch_id);
    Delete From PO.PO_HEADERS_INTERFACE Where BATCH_ID = v_batch_id;
    Commit;
  Exception
    When Others Then
      Null;
  End;

  For RsH In CrH Loop
    --Start Header 
    l_iface_rec.org_id := l_OrgId;
    SELECT po_headers_interface_s.NEXTVAL
      INTO l_iface_rec.interface_header_id
      FROM dual;
    l_iface_rec.process_code          := 'PENDING';
    l_iface_rec.action                := 'UPDATE';
    l_iface_rec.document_type_code    := RsH.TYPE_LOOKUP_CODE;
    l_iface_rec.document_subtype      := NULL;
    l_iface_rec.document_num          := RsH.PO_NUMBER;
    l_iface_rec.approval_status       := 'APPROVED';
    l_iface_rec.agent_id              := RsH.AGENT_ID;
    l_iface_rec.vendor_id             := RsH.VENDOR_ID;
    l_iface_rec.vendor_site_id        := RsH.VENDOR_SITE_ID;
    l_iface_rec.interface_source_code := '17TO16';
    l_iface_rec.batch_id              := v_batch_id;
    INSERT INTO po.po_headers_interface VALUES l_iface_rec;
    --获得供应商地点层税率
    Begin
      Select PSV.VAT_CODE, TAX.TAX_RATE, TAX.TAX_ID
        Into l_NewTaxName, l_NewTaxRate, l_NewTaxId
        From AP_VENDOR_SITES_V PSV, AP_TAX_CODES TAX
       Where PSV.VAT_CODE = TAX.NAME(+)
         And PSV.vendor_site_id = RsH.vendor_site_id;
    Exception
      When No_Data_Found Then
        l_NewTaxRate := 0;
    End;
    --供应商地点层税率未设置,默认取财务应付系统的税率
    If (Nvl(l_NewTaxRate, 0) = 0) Then
      Begin
        Select FIN.VAT_CODE, TAX.TAX_RATE, TAX.TAX_ID
          Into l_NewTaxName, l_NewTaxRate, l_NewTaxId
          From FINANCIALS_SYSTEM_PARAMETERS FIN, AP_TAX_CODES TAX
         Where FIN.VAT_CODE = TAX.NAME(+)
           And FIN.ORG_ID = l_OrgId;
      Exception
        When No_Data_Found Then
          l_NewTaxRate := Null;
      End;
    End If;
    l_NewTaxRate := Nvl(l_NewTaxRate, 0);
    dbms_output.put_line('l_NewTaxName=' || l_NewTaxName);
    For RsL In CrL(RsH.PO_HEADER_ID) Loop
      l_iface_lines_rec.interface_header_id := l_iface_rec.interface_header_id;
      l_iface_lines_rec.process_code        := 'PENDING';
      l_iface_lines_rec.action              := 'UPDATE';
      l_iface_lines_rec.po_line_id          := RsL.PO_LINE_ID;
      l_iface_lines_rec.line_num            := RsL.Line_Num;
    
      If (RsH.TYPE_LOOKUP_CODE = 'QUOTATION') Then --更新报价单行的单价
        v_Price                      := RsL.UNIT_PRICE *
                                        (1 / (1 + RsL.TAX_RATE / 100)); --计算未含税单价
        v_TaxPrice                   := v_TaxPrice *
                                        (1 + l_NewTaxRate / 100); --计算含税单价
        l_iface_lines_rec.unit_price := Round(v_TaxPrice, 5);
        --Dbms_output.put_line(l_iface_lines_rec.line_num ||':'|| l_iface_lines_rec.unit_price);
      Else --更新一揽子采购协议行的单价 
        --根据含税单价计算出未含税单价
        v_TaxPrice := RsL.TAX_UNIT_PRICE; --含税单价
        v_Price    := Round(RsL.TAX_UNIT_PRICE / (1 + l_NewTaxRate / 100),5); --计算未含税单价
        /*--根据未含税单价计算含单价
        v_Price    := RsL.UNIT_PRICE; --不含税单价
        v_TaxPrice := Round(v_Price * (1 + l_NewTaxRate / 100), 5); --计算含税单价*/
        --更新含税单价
        l_iface_lines_rec.line_attribute1 := v_TaxPrice;
        --更新新非含税单价
        l_iface_lines_rec.unit_price := v_Price;
        --Dbms_output.put_line(l_iface_lines_rec.line_num ||':'|| l_iface_lines_rec.line_attribute1);
      End If;
      SELECT po_lines_interface_s.NEXTVAL
        INTO l_iface_lines_rec.interface_line_id
        FROM dual;
      INSERT INTO po_lines_interface VALUES l_iface_lines_rec;
    End Loop; --End Line
    Begin
      po_docs_interface_sv5.process_po_headers_interface(x_selected_batch_id          => l_iface_rec.batch_id,
                                                         x_buyer_id                   => NULL,
                                                         x_document_type              => l_iface_rec.document_type_code,
                                                         x_document_subtype           => l_iface_rec.document_subtype,
                                                         x_create_items               => 'N',
                                                         x_create_sourcing_rules_flag => NULL,
                                                         x_rel_gen_method             => NULL,
                                                         x_approved_status            => l_iface_rec.approval_status,
                                                         x_commit_interval            => 1,
                                                         x_process_code               => 'PENDING',
                                                         x_interface_header_id        => Null,
                                                         x_org_id_param               => NULL,
                                                         x_ga_flag                    => NULL);
      --更新PBA含税单价和税码
      For RsR In CrR Loop
        Update PO_LINES_ALL
           Set attribute1  = RsR.Line_Attribute1, --PBA含税单价
               TAX_CODE_ID = l_NewTaxId,
               TAX_NAME    = l_NewTaxName --税码
         where PO_LINE_ID = RSR.PO_LINE_ID;
      End Loop;
      --删除更新成功的临时接口记录
      Delete From PO_LINES_INTERFACE
       Where INTERFACE_HEADER_ID = l_iface_rec.interface_header_id
         And PROCESS_CODE = 'ACCEPTED';
      Delete From PO.PO_HEADERS_INTERFACE
       Where INTERFACE_HEADER_ID In
             (Select INTERFACE_HEADER_ID
                From PO_LINES_INTERFACE
               Where INTERFACE_HEADER_ID = l_iface_rec.interface_header_id
                 And PROCESS_CODE = 'ACCEPTED');
      Commit;
    Exception
      When Others Then
        Rollback;
        Dbms_Output.put_line(RsH.TYPE_LOOKUP_CODE || '类型订单' || RsH.PO_NUMBER || '调税率:失败');
    End;
  End Loop; --End Header
End;

执行完成以后,检查有没有未更新成功的代码如下,建议操作完成以后,删除相关接口表中的数据

Select PHI.DOCUMENT_NUM,
       PHI.DOCUMENT_TYPE_CODE,
       PLI.LINE_NUM,
       PLI.PROCESS_CODE,
       PLI.PO_LINE_ID,
       PLI.LINE_ATTRIBUTE1,
       PLI.UNIT_PRICE
  From PO.PO_HEADERS_INTERFACE PHI, PO_LINES_INTERFACE PLI
 where PHI.INTERFACE_HEADER_ID = PLI.INTERFACE_HEADER_ID
   And PHI.BATCH_ID = &P_BATCH_ID
   And PHI.DOCUMENT_TYPE_CODE = 'BLANKET'
   And PLI.Process_Code != 'ACCEPTED'
 Order By PHI.DOCUMENT_NUM, PLI.LINE_NUM;

注意: 我们Quotations的单价是含税价。

六、AP Invoices 
与供应商对帐时,难免有的PO接收或VMI/寄售耗用需求调整税率,需求财务手工操作。

你可能感兴趣的:(Oracel,Developer,Oracle,EBS,Purchasing,Oracle,EBS,Payables,Oracle,EBS,InterfaceAPI)