Acumatica AP Electronic Payments 付款通知如何发送?
结论
可以实现。较稳妥的方案是创建一份“付款通知/Remittance Advice”报表,以 APPayment 为主记录、APAdjust 为付款明细,按付款单的 DocType + RefNbr 生成 PDF,再通过 Acumatica 的邮件模板或通知机制发送给供应商。
各版本和本地化包提供的标准报表不完全一致,建议先检查当前环境中是否已有 Remittance Advice、Payment Advice、Payment Register 等类似报表。如果没有,再进行定制。
发送时点也需要谨慎选择。通常不建议在生成银行电子付款文件时立即发送,而应等付款成功释放,并确认电子付款文件已经生成或上传后再发送。
报表应包含哪些数据
每份通知建议只对应一笔付款,至少包含以下内容:
- 供应商名称和供应商编号
- 付款日期
- Payment Ref. Nbr.
- Payment Method
- 付款币种及总金额
- 被核销的账单编号
- 供应商发票号
- 发票日期
- 原始金额
- 本次付款金额
- Cash Discount
- Withholding Tax
- 调整或核销金额
- 付款备注
- 必要时显示经过掩码处理的银行账户信息
主要数据关系如下:
APPayment:付款单头APAdjust:付款与账单的核销关系APInvoice:被支付的 AP BillVendor:供应商资料Location:供应商付款地点Contact:通知收件人及电子邮件地址
报表必须同时使用以下两个参数定位付款:
DocType
RefNbr
不能只使用 RefNbr,因为不同 AP 单据类型可能使用相同编号。
实现步骤
1. 检查现有报表
先在 AP 付款处理、付款查询和报表菜单中查找以下名称或相近名称:
Remittance Advice
Payment Advice
Payment Register
Check Register
Payment Details
如果已有合适的报表,应复制标准 .rpx 报表后再修改,不要直接覆盖系统文件。具体报表编号会因 Acumatica 版本、本地化包和已安装功能而异,不能假定所有环境都相同。
2. 创建付款通知报表
在 Report Designer 中以 APPayment 为主表,加入 APAdjust 和 APInvoice。
核心关联条件可以按以下逻辑配置:
APPayment.DocType = APAdjust.AdjgDocType
APPayment.RefNbr = APAdjust.AdjgRefNbr
APAdjust.AdjdDocType = APInvoice.DocType
APAdjust.AdjdRefNbr = APInvoice.RefNbr
报表筛选条件如下:
APPayment.DocType = @DocType
AND APPayment.RefNbr = @RefNbr
付款总额应使用付款单头的币种金额。明细金额则根据业务需要,选用 APAdjust 中对应的调整币种字段。
处理跨币种付款时,不能直接混合汇总基础币字段和单据币字段。应先确定报表展示的是付款币种还是账单币种。
3. 确定供应商通知邮箱
邮箱可以按以下顺序获取:
- 付款地点中专门配置的 remittance contact
- 供应商付款地点的默认联系人
- 供应商主联系人
- 经确认的自定义“付款通知邮箱”字段
不要默认使用供应商主档中的任意邮箱。采购联系人、应付联系人和收款通知联系人可能并非同一个人。实际项目中,增加一个明确的 Remittance Email 自定义字段通常更方便维护。
4. 配置邮件模板
邮件主题可以使用:
付款通知:{{VendorName}} / {{PaymentRefNbr}}
正文示例:
您好:
我方已于 {{PaymentDate}} 安排电子付款,付款金额为
{{CurrencyID}} {{PaymentAmount}}。
付款参考号:{{PaymentRefNbr}}
详细的发票核销信息请查看附件中的付款通知。
此邮件由系统自动发送。如对付款内容有疑问,请联系我方应付账款部门。
模板字段的实际语法取决于当前版本使用的 Notification Template、Business Event 或定制发送程序。配置时应以当前环境的字段选择器为准。
5. 选择发送方式
可以采用以下三种方式。
手工发送
在付款查询或自定义 Processing Screen 中选择已释放的付款,然后执行“发送付款通知”。
这种方式便于控制和补发,适合在上线初期验证流程。
批量发送
创建一个处理页面,并按以下业务条件筛选:
Released = true
PaymentMethod.UseForAP = true
ElectronicPayment = true
NotificationSent = false
Voided = false
各版本对电子付款方式的字段定义可能不同。以上内容表示业务筛选逻辑,不代表所有版本都有这些同名字段。
自动发送
可以通过 Business Event、Automation Step 或 Graph Extension,在付款达到最终状态后发送通知。启用自动发送前,需要先处理重复发送、失败重试和邮件地址为空等情况。
BQL 查询示例
以下查询演示了如何根据付款单获取被核销的 AP Bill,可作为定制代码的起点。具体命名空间和 BQL 写法可能需要根据目标 Acumatica 版本调整。
using PX.Data;
using PX.Data.BQL.Fluent;
using PX.Objects.AP;
public static PXResultset<APAdjust, APInvoice> GetPaidDocuments(
PXGraph graph,
string docType,
string refNbr)
{
return SelectFrom<APAdjust>
.LeftJoin<APInvoice>
.On<APInvoice.docType.IsEqual<APAdjust.adjdDocType>
.And<APInvoice.refNbr.IsEqual<APAdjust.adjdRefNbr>>>
.Where<APAdjust.adjgDocType.IsEqual<@P.AsString>
.And<APAdjust.adjgRefNbr.IsEqual<@P.AsString>>>
.View.Select(graph, docType, refNbr);
}
调用报表时,应同时传入两个参数:
var reportParameters = new Dictionary<string, string>
{
["DocType"] = payment.DocType,
["RefNbr"] = payment.RefNbr
};
不同 Acumatica 版本的邮件发送 API 可能存在差异,包括通知模板生成器的构造方式、报表附件参数和邮件账户解析方式。应在目标版本的 Customization Project 中引用对应程序集,并参考该版本现有的邮件发送代码。不能直接假定某个 NotificationGenerator 示例可以跨版本编译。
发送状态与防重复设计
可以在 APPayment 扩展字段中记录发送结果,例如:
public sealed class APPaymentExt : PXCacheExtension<APPayment>
{
public abstract class usrRemittanceSent : PX.Data.BQL.BqlBool.Field<usrRemittanceSent>
{
}
[PXDBBool]
[PXDefault(false)]
[PXUIField(DisplayName = "Remittance Sent")]
public bool? UsrRemittanceSent { get; set; }
public abstract class usrRemittanceSentDateTime :
PX.Data.BQL.BqlDateTime.Field<usrRemittanceSentDateTime>
{
}
[PXDBDateAndTime]
[PXUIField(DisplayName = "Remittance Sent On", Enabled = false)]
public DateTime? UsrRemittanceSentDateTime { get; set; }
}
只有在邮件成功进入 Acumatica 邮件发送队列后,才能更新发送状态。如果生成报表、创建邮件或保存邮件记录失败,不应将付款标记为已发送。
如果业务允许补发,最好另外记录发送次数,而不是只设置一个布尔字段。
重要注意事项
- 只向已经
Released的付款发送正式通知。 - 如果电子付款文件可能被重新生成或拒绝,需要明确由“生成文件”还是“确认付款”触发邮件。
- Void Payment、退款和冲销不能沿用普通付款通知,应使用独立模板或禁止发送。
- 邮件附件中不要显示完整银行账号、Routing Number 或其他敏感信息。
- 多币种付款需要分别核对付款币种金额、账单币种金额和基础币金额。
- 一笔付款核销多张账单时,应按付款汇总发送,不能为每张账单重复发送邮件。
- 保存发送日志,包括付款编号、收件人、发送时间、发送结果和错误信息。
- 上线前至少验证部分付款、折扣、预付款、贷项调整、跨币种付款、Void Payment 和邮箱为空等情况。
从实施风险考虑,可以先交付支持手工批量发送的付款通知报表。流程稳定后,再增加自动触发,这样更便于验证和维护。
备注:内容仅供参考。
