前提條件: Oracle EBS 企業稅改方案(一)-業務需求整理及基礎設定篇
Oracle EBS系統版本:11.5.10
未結採購單處理起來比未結銷售訂單麻煩多了,由於採購訂單底層表架構及邏輯,如採購接收以後不會拆分行。特別是好多公司對PR、PBA、Quotation或標準PO等等有比深度定製,處理起來比較棘手。比如:我們公司的採購訂單有客制化如下,行中添加了稅碼和含稅價。
另外,自動建立採購訂單也是客制化的,還好當時考慮的比較周全,對本稅改影響不是特別太,風險還是可控的。一、Supplier Site-Tax 修改供應商地點層稅。當然,根據不同公司設定預設稅碼優先順序別不同,也可以不讓操作該步驟。 • AP->Supplies->Entry->Suppliers->SupplierSites->Invoice 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 HeaderEnd;
執行完成以後,檢查有沒有未更新成功的代碼如下,建議操作完成以後,刪除相關介面表中的資料
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/寄售耗用需求調整稅率,需求財務手工操作。