ap_create_pay_scheds_pkg.Create_Payment_Schedules --創建計劃付款
業務需要後臺程序拆分發票計劃付款行,可以使用上面的API。但是上述API存在如下問題
1.該API只能生成一條計劃付款行,如果已經存在計劃付款行,則會報錯。
原因:因爲每次調用該API都會生成 PAYMENT_NUM = 1 的記錄。如果已經存在記錄則報違反唯一性約束錯誤。
2.該API不能插入暫掛,暫掛原因,銀行等字段
所以這個地方需要客戶化cux_ap_create_pay_scheds_pkg,使其每次進入該API時生成MAX(PAYMENT_NUM)+1 的記錄,
其次參數中添加 暫掛,暫掛原因,銀行等字段
測試後證明:
使用上述方法可以對一張發票生成多行計劃付款,而且能夠實現暫掛。
但是當我們驗證發票的時候,會發現驗證程序會將我們插入的多行記錄都刪除,然後生成一行數量與發票數量相等的
計劃付款,相當於將其初始化了。
驗證的時候會調用AP_APPROVAL_PKG.Approve
其中有如下代碼:
IF (l_recalc_pay_schedule_flag = 'Y') THEN
SELECT DECODE(NVL((MAX(aps.last_update_date)- MIN(aps.creation_date)),0),
0,'N','Y')
INTO l_diff_flag
FROM ap_payment_schedules aps
WHERE aps.invoice_id = l_invoice_id;
IF (l_diff_flag = 'N') THEN
AP_PPA_PKG.Due_Date_Sweeper(
l_invoice_id,
l_matched,
l_system_user,
l_receipt_acc_days,
l_curr_calling_sequence);
END IF;
END IF;
其中: l_recalc_pay_schedule_flag在OU下設置,這個地方如果 l_diff_flag = 'N'則會進入AP_PPA_PKG.Due_Date_Sweeper。所以我們要使l_diff_flag = 'Y'
AP_PPA_PKG.Due_Date_Sweeper中會根據付款條件行與當前計劃付款行條數進行對比,如果計劃付款行數多於付款條件行數。
則該API會刪除當前計劃付款記錄。然後插入新的自動生成的記錄。
所以只需要在插入計劃付款(cux_ap_create_pay_scheds_pkg.Create_Payment_Schedules)的時候使 aps.last_update_date 比 aps.creation_date 大個1s即可。
但是這樣是否會有其他問題,還需驗證。
調用 cux_ap_create_pay_scheds_pkg.Create_Payment_Schedules
BEGIN
SELECT aia.terms_id,
aia.terms_date,
aia.batch_id,
aia.invoice_amount,
aia.payment_cross_rate,
cfrh.payment_method_code, --aia.payment_method_lookup_code,
aia.invoice_currency_code,
aia.payment_currency_code,
aia.amount_applicable_to_discount,
aia.last_updated_by,
aia.created_by,
'Y',
NULL
INTO l_terms_id,
l_terms_date,
l_batch_id,
l_invoice_amount,
l_payment_cross_rate,
l_payment_method_lookup_code,
l_invoice_currency_code,
l_payment_currency_code,
l_amount_app_to_discount,
l_last_update_by,
l_created_by,
l_hold_flag,
l_iby_hold_reason
FROM ap_invoices_all aia,
cux_fin_recpay_headers_all cfrh,
cux_finreq_headers_all cfh
WHERE aia.invoice_id = p_invoice_id
AND aia.attribute1 = cfh.req_number
AND cfh.req_header_id = cfrh.req_header_id
AND rownum = 1;
cux_ap_create_pay_scheds_pkg.create_payment_schedules(p_invoice_id => p_invoice_id,
p_terms_id => l_terms_id,
p_last_updated_by => l_last_update_by,
p_created_by => l_created_by,
p_payment_priority => 99,
p_batch_id => l_batch_id,
p_terms_date => l_terms_date,
p_invoice_amount => l_invoice_amount,
p_pay_curr_invoice_amount => l_pay_curr_invoice_amount,--需要輸入的金額
p_payment_cross_rate => l_payment_cross_rate,
p_amount_for_discount => l_amount_app_to_discount,
p_payment_method => l_payment_method_lookup_code,
p_invoice_currency => l_invoice_currency_code,
p_payment_currency => l_payment_currency_code,
p_calling_sequence => 'Import_invoices<- Before Report Trigger',
p_hold_flag => l_hold_flag,
p_iby_hold_reason => l_iby_hold_reason);
END;