前提条件:Oracle EBS 企业税改方案(一)-业务需求整理及基础设置篇
Oracle EBS系统版本:11.5.10
未结采购单处理起来比未结销售订单麻烦多了,由于采购订单底层表架构及逻辑,如采购接收以后不会拆分行。特别是好多公司对PR、PBA、Quotation或标准PO等等有比深度定制,处理起来比较棘手。比如:我们公司的采购订单有客制化如下,行中添加了税码和含税价。
另外,自动创建采购订单也是客制化的,还好当时考虑的比较周全,对本税改影响不是特别太,风险还是可控的。
一、Supplier Site-Tax 修改供应商地点层税。当然,根据不同公司设置默认税码优先级别不同,也可以不让操作该步骤。批量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 等等一步一步测试,好像没有发现什么问题。不过,我是让用户去一家一家供应商手工更新:):)
二、未结采购申请单
未结采购申请单是指所有未创建采购订单的申请,其情况如下
但是,我直接用“采购申请已批准但未创建采购订单”使用准标AutoCreate,PO发运行的税码是16%的税码(VAT16),貌似不需求修改税率。希望有朋友帮验证一下,是不是可能我们系统之前客制化修改标准的库文件或包?
三、创建VMI/寄售供应商的AP Invoices,注意:该步骤有可能设置不同默认税码优先级别,有可能提前操作(包括手工AP invoices匹配的),尽可能创建 AP Invoices之前税码不要变。
3.1Create Consumption Advice(创建冲减通知):INV->Reports->Transactions->Create Consumption Advice:无需输入任何条件直接提交。
3.2Pay On Receipt AutoInvoice:AP->View->Request->Pay On Receipt AutoInvoice
未结采购订单是指所有未Create AP Invoices的采购订单。其情况如下
特别注意一点:所有VMI/寄售模式合作的供应商,未结采购订单可以无需处理,直接修改PBA的对应行的采购单价和税码优先级别的设置。由于我们有一部分VMI/寄售的结算方式是以当时下标准PO的单价结算,可以参考:Oracle EBS VMI取标准PO单价,也建议最好不处理,客制化报表汇总税率引起的差异,直接在AP Invoices中调整。
也可以用API批量处理未结采购订单。但是,由于资源问题暂时没有写,有的朋友可以分分享一下。但是,新创建订单行的单价必须要与原来行的单价一样。特别是单价波动比较大的材料,避免给公司带来损失。
五、Quotations 和 BPA修改税码和单价:
•PO->RFQ’sand Quotations-> Quotations :修改Quotations 单价
•PO->PurchaSEOrders -> Purchase Orders : BPA税率和含税单价
之前做了一个项目,每天根据有色金重期货价格、卡通箱平方单价和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_ID Into l_NewTaxName,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,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/寄售耗用需求调整税率,需求财务手工操作。