前提条件: 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.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的采购订单。其情况如下
特别注意一点:所有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_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/寄售耗用需求调整税率,需求财务手工操作。