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;