应付账款支付处理数据 template
应付账款支付处理数据 template
- Sage Intacct 的关键数据字段
- 标准化的流程里程碑
- 特定的提取说明
应付账款支付流程属性
| 名称 | 描述 | ||
|---|---|---|---|
| 事件timestamp EventTime | 活动发生的特定日期和时间。 | ||
| 描述 此属性记录 event 发生的准确时刻。它是所有基于时间的计算基础,包括“平均发票周期时间”和“平均审批时长”。准确的时间戳对于在“审批 workflow 绩效”dashboard 中识别瓶颈至关重要。 为何重要 用于对 event 进行排序,并计算流程步骤之间的持续时间。 获取方式 源表中的交易创建或修改时间戳 示例 2023-10-12T08:30:00Z2023-10-12T14:45:12Z2023-10-15T09:15:00Z | |||
| 发票编号 InvoiceNumber | 供应商发票单据的唯一标识符。 | ||
| 描述 发票号码是该流程明确的 case 标识符。它唯一地对属于单个供应商发票的所有 event 进行分组,从而能够全面分析其从接收到结算的历程。在 Sage Intacct 中,这通常对应于 AP Bill 对象中的单据编号或记录编号。 为何重要 它是将所有流程活动链接到单个案例实例的基础键。 获取方式 Sage Intacct AP Bill 对象,字段 DOCNUMBER 或 RECORDNO 示例 INV-2023-001988722-AFEB-23-991 | |||
| 活动名称 ActivityName | 在发票生命周期中发生的特定动作或 event。 | ||
| 描述 此属性捕获正在执行的步骤名称,例如“发票已创建”、“发票已批准”或“支付已过账”。它对于在“端到端周期时间分布”dashboard 中重建流程流向和可视化 event 序列至关重要。 为何重要 定义流程图中的各个步骤,是进行任何流程挖掘分析的必填项。 获取方式 审计追踪日志或系统交易历史表 示例 发票草稿已创建发票已审批付款已生成 | |||
| 最后数据更新 LastDataUpdate | 记录上次提取或刷新的时间戳。 | ||
| 描述 此属性追踪数据上次与 Process Mining 平台同步的时间。它帮助用户了解“支付批处理优化”等 dashboard 中显示的数据新鲜度,并确保分析反映了应付账款分类账的最新状态。 为何重要 增量加载和数据新鲜度检查所需的规范字段。 获取方式 数据提取时的系统时间 示例 2023-11-01T12:00:00Z2023-11-02T01:00:00Z | |||
| 源系统 SourceSystem | event 发起的系统名称。 | ||
| 描述 此属性标识数据的来源,在此流程中通常为“Sage Intacct”。但是,如果发票是从 OCR 工具或外部采购平台摄取的,则此字段有助于在“合规与风险概览”中区分数据源。 为何重要 确保数据血缘可追溯性,尤其是在多系统环境中。 获取方式 在提取过程中硬编码或衍生自连接设置 示例 Sage IntacctBill.comExpensify | |||
| 付款日期 PaymentDate | 执行支付的日期。 | ||
| 描述 此属性记录财务结算的最终时间戳。它用于计算周期时间,并与到期日比对以得出“准时支付率”KPI。 为何重要 标志着核心流程周期的完成。 获取方式 Sage Intacct AP Payment Detail,字段 WHENPAID 示例 2023-11-052023-11-10 | |||
| 供应商名称 VendorName | 开具发票的供应商或服务提供商名称。 | ||
| 描述 此属性标识欠款的外部实体。它是“供应商支付可预测性”dashboard 的主要维度,允许分析师按供应商对绩效指标进行分组,并识别高风险供应商关系或频繁的人工干预环节。 为何重要 对于按供应商绩效和行为进行细分分析至关重要。 获取方式 Sage Intacct AP Bill 对象,字段 VENDORNAME 示例 Acme公司Global Services IncOffice Depot | |||
| 创建者 CreatedBy | 录入发票的人员用户 ID。 | ||
| 描述 此属性标识流程 case 的发起者。在“人工干预和触点”分析中,它用于识别经常需要纠正数据或产生重复项的特定用户的培训需求。 为何重要 支持资源绩效分析并识别培训机会。 获取方式 Sage Intacct AP Bill 对象,字段 CREATEDBY 示例 jsmithap_automation_botmdoe | |||
| 到期日期 DueDate | 合同规定的支付截止日期。 | ||
| 描述 此属性指示必须支付的时间以避免处罚。它是“准时支付率”KPI 的分母。分析在该日期之后执行的支付可以揭示合规差距以及对供应商关系的潜在损害。 为何重要 用于衡量按时完成表现和 SLA 达成情况的基准。 获取方式 Sage Intacct AP Bill 对象,字段 WHENDUE 示例 2023-11-012023-11-15 | |||
| 发票日期 InvoiceDate | 供应商开具发票的日期。 | ||
| 描述 此属性反映物理发票上注明的单据日期。它与支付日期结合使用,以计算端到端周期时间。发票日期与录入日期之间的巨大间隔可能表明收发室或扫描环节存在延迟。 为何重要 账龄分析和支付条款计算的起点。 获取方式 Sage Intacct AP Bill 对象,字段 WHENTOCREATE 或 DATECREATED 示例 2023-10-012023-10-05 | |||
| 发票状态 InvoiceStatus | 发票在系统中的当前生命周期状态。 | ||
| 描述 此属性反映当前的系统状态(例如已过账、已支付、草稿)。它有助于在“端到端周期时间分布”dashboard 中过滤出进行中与已完成的 case。 为何重要 快速识别 case 的状态。 获取方式 Sage Intacct AP Bill 对象,字段 STATE 示例 已过账已付款草稿部分已付 | |||
| 发票金额 InvoiceAmount | 发票的总货币价值。 | ||
| 描述 此属性表示特定 case 的总财务负债。在“重复提交检测”dashboard 中,它用于识别金额和供应商 ID 相同的发票。它还允许按高价值与低价值交易进行过滤分析。 为何重要 对于财务影响分析和风险评分至关重要。 获取方式 Sage Intacct AP Bill 对象,字段 TOTALENTERED 或 TOTALDUE 示例 1500.00250.5010000.00 | |||
| 部门 Department | 负责该项支出的内部部门。 | ||
| 描述 此属性按成本中心或业务职能对发票进行分类。它通过突出显示哪些部门在审批延迟或高返工率方面与组织平均水平相比存在困难,为“流程差异分析”dashboard 提供支持。 为何重要 支持组织层级的钻取和根本原因分析。 获取方式 Sage Intacct AP Bill 对象,字段 DEPTID 或 DEPTNAME 示例 IT服务市场营销运营 | |||
| 采购订单号 PurchaseOrderNumber | 相关采购订单的引用编号。 | ||
| 描述 此属性将发票链接到上游采购单据。它是“三方匹配效率”dashboard 以及“PO 合规与非 PO 支出分析”的关键驱动因素。此值为 null 的 case 表示非 PO 支出。 为何重要 区分基于 PO 的发票和非 PO 发票,以便进行合规分析。 获取方式 Sage Intacct AP Bill 对象,字段 PONUMBER 或相关单据链接 示例 PO-9912PO-1002null | |||
| 业务单元 BusinessUnit | 与发票关联的法律实体或办公地点。 | ||
| 描述 此属性区分不同的子公司或办公地点。这对于“合规与风险概览”比对组织内不同地理或法律实体的流程遵守情况至关重要。 为何重要 对于多实体基准测试至关重要。 获取方式 Sage Intacct AP Bill 对象,字段 LOCATIONID 或 ENTITY 示例 美国总部 (USA-HQ)EMEA-LondonAPAC-Singapore | |||
| 付款条款 PaymentTerms | 约定的支付时间和折扣条件。 | ||
| 描述 此属性描述用于计算到期日和折扣日的规则(例如 Net 30、2/10 Net 30)。它对于“早期支付折扣分析”dashboard 识别哪些原本符合省钱条件的发票被错过了至关重要。 为何重要 用于分析现金流策略和错失折扣机会的上下文。 获取方式 Sage Intacct AP Bill 对象,字段 TERMNAME 示例 净 30 天见票即付2/10 Net 30 | |||
| 周期时间(天) CycleTimeDays | 从收到发票到支付的天数。 | ||
| 描述 此指标量化了每个 case 的流程速度。它直接计入“平均发票周期时间”KPI,并允许在“端到端周期时间分布”dashboard 中进行直方图分析。 为何重要 衡量效率的标准绩效指标。 获取方式 计算得出:发票日期与付款日期之间的天数 示例 15.530.05.2 | |||
| 挂起状态 HoldStatus | 指示发票当前是否处于付款挂起状态。 | ||
| 描述 此属性标记被暂停支付处理的 case。它通过识别停留在冻结状态下的 case,为“支付冻结影响监控”dashboard 提供支持。 为何重要 识别需要干预的紧急瓶颈。 获取方式 Sage Intacct AP Bill 对象,字段 ONHOLD 示例 truefalse | |||
| 是否有 PO 支撑 IsPOBacked | 指示发票是否与采购订单关联的标记。 | ||
| 描述 此属性标识发票是否遵循了标准采购程序。它是“采购订单合规率”KPI 的主要过滤器,有助于将临时支出与受管支出分开。 为何重要 流程路径分析的关键区分因素。 获取方式 计算得出:采购订单编号不为空 示例 truefalse | |||
| 是否逾期支付 IsPaidLate | 指示付款日期是否超过截止日期的标记。 | ||
| 描述 此布尔属性通过比对支付日期与到期日计算得出。它作为“准时支付率”KPI 的直接过滤器,并有助于在“供应商支付可预测性”dashboard 中隔离出有问题的 case。 为何重要 简化了对 SLA 违规情况的过滤。 获取方式 计算得出:付款日期 > 截止日期 示例 truefalse | |||
应付账款支付流程活动
| 活动 | 描述 | ||
|---|---|---|---|
| 付款已生成 | 创建与发票关联的支付记录(支票、ACH、EFT)。这是系统中启动资金转账的时刻。 | ||
| 为何重要 用于计算“平均发票周期时间”和“准时支付率”的主要时间戳。 获取方式 识别与 APBILL 关联的 APPYMT 记录的创建。使用付款对象的创建日期。 捕获 在创建 APPYMT 记录时记录 事件类型 explicit | |||
| 发票已与采购订单匹配 | 识别供应商发票何时通过转换或关联采购订单或收货单而创建。该活动验证了三方匹配的效率。 | ||
| 为何重要 对于“首检匹配率”KPI 以及区分 PO 合规支出与非 PO 支出至关重要。 获取方式 检查 APBILL 对象的“createdfrom”或“source_id”字段是否不为空,这表示其与采购交易相关联。 捕获 比较记录 ID 与源交易 ID 事件类型 inferred | |||
| 发票已审批 | 在指定审批工作流中记录的一次明确审批操作。这表示拥有足够权限的用户已授权支付该账单。 | ||
| 为何重要 对于“平均审批时长”KPI 和识别管理层签核瓶颈至关重要。 获取方式 在与 AP Bill 关联的“查看审批历史”日志中查询“已批准”操作。 捕获 在执行审批操作时记录 事件类型 explicit | |||
| 发票已提交 | 发票从“草稿”状态转变为“已提交”状态,触发审批 workflow。这标志着数据录入的结束和审批周期的开始。 | ||
| 为何重要 在周期时间分析中,对于区分“数据录入”时长与“审批”时长至关重要。 获取方式 从 APBILL 审计追踪中推断,即 State 字段从“草稿”更改为“已提交”或“待审批”的地方。 捕获 比较操作前后的状态字段 事件类型 inferred | |||
| 发票已过账 | 发票提交到总账的节点。在没有审批 workflow 的系统中,这可能与提交同时发生。 | ||
| 为何重要 指示财务负债已正式在会计账簿中确认。 获取方式 在 APBILL 审计追踪中查询状态变为“已过账”的记录。 捕获 在交易过账到总账时记录 事件类型 explicit | |||
| 发票草稿已创建 | 在 Sage Intacct 中初步创建 AP Bill 记录,通常处于“草稿”状态。这捕获了发票数据进入审批或过账 workflow 之前的录入点。 | ||
| 为何重要 确定流程周期时间的最早时间戳,并识别负债记录的起点。 获取方式 在 APBILL 对象审计追踪中查询“创建”操作或记录创建的初始时间戳。 捕获 在首次创建 APBILL 记录时记录 事件类型 explicit | |||
| 付款已作废 | 取消之前生成的支付。这会重新开启发票负债,并需要重新开始支付流程。 | ||
| 为何重要 识别严重的下游流程故障,即付款已生成但被撤回的情况。 获取方式 在 APPYMT 对象中查询状态为“作废”及其关联的时间戳。 捕获 在发生作废交易时记录 事件类型 explicit | |||
| 付款已对账 | 确认支付已通过银行结算,在现金管理模块的银行对账过程中标记。 | ||
| 为何重要 从现金流的角度提供“端到端周期时间”,确认资金已实际转出账户。 获取方式 检查 APPYMT 对象或关联的现金管理交易上的对账状态或“结算日期 (Cleared Date)”字段。 捕获 比较对账状态 事件类型 inferred | |||
| 发票已取消挂起 | 移除支付冻结,允许发票进入支付选择。这标志着争议或问题的解决。 | ||
| 为何重要 标志着瓶颈期的结束和标准流程的恢复。 获取方式 从 APBILL 审计追踪中推断,即“On Hold”布尔值或状态字段转变为 false 的地方。 捕获 比较操作前后的状态字段 事件类型 inferred | |||
| 发票已拒绝 | 记录审批人驳回发票的时间,此时发票会退回到“草稿”或“部分批准”状态。这表明存在流程循环或数据质量问题。 | ||
| 为何重要 突出显示工作流中的摩擦点,并计入返工指标。 获取方式 在与 AP Bill 关联的“查看审批历史”日志中查询“拒绝”或“驳回”操作。 捕获 在执行拒绝操作时记录 事件类型 explicit | |||
| 发票已更新 | 记录初次创建后对发票抬头或行项目的修改。此活动的频繁发生表明存在人工返工或数据提取错误。 | ||
| 为何重要 计算“零干预处理率”并识别低效人工数据修正循环的关键。 获取方式 在 APBILL 审计历史中查询过账前由用户执行的“更新”操作。 捕获 在交易被修改时记录 事件类型 explicit | |||
| 发票已被挂起 | 对发票应用支付冻结或“待定”状态。这会阻止该发票被选中进行支付处理。 | ||
| 为何重要 直接影响“付款冻结处理时间”,并将支付管道中的延迟可视化。 获取方式 从 APBILL 审计追踪中推断,即“On Hold”布尔值或状态字段转变为 true 的地方。 捕获 比较操作前后的状态字段 事件类型 inferred | |||
| 发票已选中待付 | 将发票纳入支付批处理或选择运行中。状态通常变为“已选择”,从而将其从其他支付运行中锁定。 | ||
| 为何重要 分析“付款批处理优化”以及从决定付款到实际签发支票之间的滞后时间。 获取方式 通过“支付账单”屏幕操作,从 APBILL 状态更改为“Selected(已选中)”或同等状态中推断。 捕获 比较操作前后的状态字段 事件类型 inferred | |||
提取指南
步骤
准备应付账款账单视图 登录 Sage Intacct,前往“应付账款 (Accounts Payable)”>“全部 (All)”选项卡 >“账单 (Bills)”。选择“创建新视图”。 将视图命名为“流程挖掘 - 账单提取”。 按顺序选择以下列:发票号码 (Doc Number)、供应商名称、创建日期、过账日期、截止日期、总金额、状态 (State)、货币、PO 号码、部门、创建者、挂起状态 (On Hold)、描述、记录编号 (System ID)。 如果您只想获取已过账数据,请设置筛选器排除“草稿”状态的账单;或者保持开启以捕获完整生命周期。确保日期范围涵盖您的分析周期(例如:创建日期 = 过去 365 天)。 保存视图。
导出应付账款账单数据 打开“流程挖掘 - 账单提取”视图。 点击“导出”按钮并选择“CSV”格式。 将文件保存为“AP_Bills.csv”。
准备已过账付款视图 前往“应付账款”>“全部”选项卡 >“已过账付款 (Posted Payments)”。 创建一个名为“流程挖掘 - 付款”的新视图。 选择以下列:支票/付款编号、付款日期、供应商名称、交易金额、付款方式、状态(作废/已结算)、对账日期、账单编号(参考)、记录编号。 保存视图。
导出付款数据 打开“流程挖掘 - 付款”视图。 点击“导出”并选择“CSV”。 将文件保存为“AP_Payments.csv”。
可选:工作流历史审计追踪 Intacct 中的标准自定义视图仅显示“当前”状态和“最后”修改日期。要捕获“发票被拒绝”或特定审批时间戳等历史事件,您必须导出审计历史 (Audit History)。 前往“报告 (Reports)”>“设置 (Setup)”>“审计追踪 (Audit Trail)”。 配置审计追踪以查看“AP Bill”对象。 选择操作类型:添加 (Add)、修改 (Modify)、批准 (Approve)、拒绝 (Decline)。 将此报告导出为“AP_Audit_History.csv”。
运行转换脚本 使用“查询”部分提供的 Python 脚本合并这些文件。该脚本将摄取“AP_Bills.csv”、“AP_Payments.csv”和可选的“AP_Audit_History.csv”,以生成所需的事件日志结构。
验证与格式化 打开生成的“Event_Log_Output.csv”。 确保
EventTime符合 ISO 8601 格式 (YYYY-MM-DD HH:MM:SS)。 验证所有行是否都填写了InvoiceNumber。 将最终的 CSV 文件上传至 ProcessMind。
配置
- 视图配置: 确保视图设置中的“记录数”足够高以捕获所有交易,或者在受到限制时使用“下一页”导出功能。
- 日期处理: Intacct 按用户的本地格式导出日期(例如:MM/DD/YYYY)。转换脚本假设使用标准美国格式;如果您的用户配置文件使用 DD/MM/YYYY,请调整脚本。
- 字段权限: 确保创建视图的用户拥有应付账款账单和已过账付款的“列表”和“查看”权限。
- 历史粒度: 如果不导出审计追踪 (Audit Trail),则“发票已批准”等活动将依赖于“过账日期”代理,而“发票已更新”将仅反映最后修改时间。
- 筛选: 对“创建日期” >= [开始日期] 应用筛选以限制数据量。除非您明确想排除已作废或历史记录,否则请避免按“状态 (State)”进行筛选。
a 查询示例 config
import pandas as pd
import numpy as np
from datetime import datetime
# CONFIGURATION
# Update these filenames to match your exported files
FILE_BILLS = 'AP_Bills.csv'
FILE_PAYMENTS = 'AP_Payments.csv'
# Set to None if Audit History is unavailable
FILE_AUDIT = 'AP_Audit_History.csv'
# COLUMNS MAPPING (Adjust based on your View column headers)
COL_BILL_NUM = 'Invoice Number'
COL_VENDOR = 'Vendor Name'
COL_AMOUNT = 'Total Amount'
COL_CREATED = 'Date Created'
COL_POSTED = 'Date Posted'
COL_DUE = 'Due Date'
COL_STATE = 'State'
COL_PO = 'PO Number'
COL_HOLD = 'On Hold'
COL_PAY_DATE = 'Payment Date'
COL_PAY_REF = 'Check/Payment Number'
COL_PAY_BILL_REF = 'Bill Number'
COL_PAY_STATE = 'State'
# OUTPUT STRUCTURE
event_log_columns = [
'InvoiceNumber', 'ActivityName', 'EventTime', 'SourceSystem',
'LastDataUpdate', 'VendorName', 'InvoiceAmount', 'PurchaseOrderNumber',
'InvoiceDate', 'DueDate', 'InvoiceStatus'
]
def run_extraction():
events = []
current_time = datetime.now().isoformat()
# 1. LOAD BILLS
try:
df_bills = pd.read_csv(FILE_BILLS)
# Clean formatting (remove currency symbols if present)
df_bills[COL_AMOUNT] = df_bills[COL_AMOUNT].replace('[\\$,]', '', regex=True).astype(float)
except FileNotFoundError:
print('Bills file not found.')
return
# 2. LOAD PAYMENTS
try:
df_pay = pd.read_csv(FILE_PAYMENTS)
except FileNotFoundError:
print('Payments file not found.')
df_pay = pd.DataFrame()
# PROCESSING BILLS
for index, row in df_bills.iterrows():
invoice_num = str(row[COL_BILL_NUM])
vendor = row[COL_VENDOR]
amount = row[COL_AMOUNT]
po_num = str(row[COL_PO]) if pd.notna(row[COL_PO]) else None
due_date = row[COL_DUE]
status = row[COL_STATE]
# Common attributes for this invoice
base_attr = {
'InvoiceNumber': invoice_num,
'SourceSystem': 'Sage Intacct',
'LastDataUpdate': current_time,
'VendorName': vendor,
'InvoiceAmount': amount,
'PurchaseOrderNumber': po_num,
'DueDate': due_date,
'InvoiceStatus': status
}
# Activity: Invoice Draft Created
if pd.notna(row[COL_CREATED]):
events.append({**base_attr,
'ActivityName': 'Invoice Draft Created',
'EventTime': row[COL_CREATED],
'InvoiceDate': row[COL_CREATED]})
# Activity: Invoice Matched to PO
if po_num and pd.notna(row[COL_CREATED]):
events.append({**base_attr,
'ActivityName': 'Invoice Matched to PO',
'EventTime': row[COL_CREATED],
'InvoiceDate': row[COL_CREATED]})
# Activity: Invoice Posted
if pd.notna(row[COL_POSTED]):
events.append({**base_attr,
'ActivityName': 'Invoice Posted',
'EventTime': row[COL_POSTED]})
# In standard views, Posted often implies Submission and Approval if no audit trail
# We generate proxy events if Audit Trail is missing
if not FILE_AUDIT:
events.append({**base_attr,
'ActivityName': 'Invoice Submitted',
'EventTime': row[COL_POSTED]})
events.append({**base_attr,
'ActivityName': 'Invoice Approved',
'EventTime': row[COL_POSTED]})
# Activity: Invoice Placed on Hold
if str(row[COL_HOLD]).lower() in ['true', 'yes', 'on hold']:
# Time is approximate (Last Modified) as View doesn't track hold time
events.append({**base_attr,
'ActivityName': 'Invoice Placed on Hold',
'EventTime': row.get('Date Modified', row[COL_CREATED])})
# PROCESSING PAYMENTS
# Intacct payment export might list multiple bills per check line or require join logic
# Assuming direct link via Bill Number
if not df_pay.empty:
for index, row in df_pay.iterrows():
bill_ref = str(row[COL_PAY_BILL_REF])
# Only process if this payment links to a bill we know
# (In a real scenario, merge on Bill Number)
pay_attr = {
'InvoiceNumber': bill_ref,
'SourceSystem': 'Sage Intacct',
'LastDataUpdate': current_time,
'ActivityName': 'Payment Generated',
'EventTime': row[COL_PAY_DATE]
}
events.append(pay_attr)
if str(row[COL_PAY_STATE]).lower() == 'void':
events.append({**pay_attr, 'ActivityName': 'Payment Voided', 'EventTime': row[COL_PAY_DATE]})
if 'Date Reconciled' in row and pd.notna(row['Date Reconciled']):
events.append({**pay_attr, 'ActivityName': 'Payment Reconciled', 'EventTime': row['Date Reconciled']})
# 3. OUTPUT
df_events = pd.DataFrame(events)
# Ensure dates are ISO format
df_events['EventTime'] = pd.to_datetime(df_events['EventTime']).dt.strftime('%Y-%m-%d %H:%M:%S')
# Final Select
df_final = df_events[event_log_columns]
df_final.to_csv('Event_Log_Output.csv', index=False)
print(f'Successfully exported {len(df_final)} events.')
if __name__ == '__main__':
run_extraction() 步骤
建立 Web Services 会话: 使用您的 Sender ID、密码、公司 ID、用户 ID 和用户密码通过 Sage Intacct Web Services 3.0 终端进行身份验证,以获取会话 ID。
识别所需对象: 您必须从三个主要对象中提取数据以捕获完整生命周期:
APBILL(发票抬头)、APPYMTDETAIL(与账单关联的付款明细)和AUDITTRAIL(工作流历史)。提取发票抬头数据: 在
APBILL对象上使用readByQuery方法。选择字段RECORDNO、DOCNUMBER、WHENCREATED、WHENPOSTED、STATE、VENDORNAME、TOTALENTERED、PONUMBER、DUE_DATE。使用WHENCREATED按日期范围进行筛选。提取付款数据: 在
APPYMTDETAIL上使用readByQuery。选择RECORDNO、WHENCREATED、PAYMENTDATE、TRX_AMOUNT、DOCNUMBER(付款参考号)和BILLRECORDNO(指向 APBILL 的外键)。确保提取CLEARED状态或日期(如果有)以便进行对账。提取审计历史: 在
AUDITTRAIL对象上使用readByQuery。筛选OBJECTTYPE= 'APBILL'。这对于捕获审批、拒绝、挂起和作废事件至关重要,因为这些事件不会作为时间戳持久化在抬头表中。选择OBJECTKEY、LOGTYPE、MESSAGE、WHENDOCCURRED和USERID。暂存数据: 将这三个 API 调用的 XML/JSON 响应加载到暂存数据库(如 SQL Server、Snowflake、Postgres 等)中。由于该 API 不支持在单次调用中进行复杂的联接 (join) 或联合 (union),因此转换必须在提取后进行。
执行转换脚本: 针对暂存表运行“查询”部分中提供的 SQL 脚本。该脚本将静态抬头数据与事务审计日志统一起来,生成单个事件日志。
验证活动类型: 检查审计追踪消息中是否存在特定关键词(如 Approved、Declined),并确保您的字符串匹配逻辑涵盖了 Intacct 配置中的特定措辞。
格式化日期: 确保在最终导出期间将
EventTime列格式化为 ISO 8601 (YYYY-MM-DD THH:MM:SS) 标准。导出事件日志: 将 SQL 查询结果导出为 CSV 或 Parquet 文件,以便上传至 ProcessMind。
配置
- API 终端: https://api.intacct.com/ia/xml/xmlgw.phtml
- 方法:
readByQuery(Web Services 3.0) - 分页大小: 将
pagesize设置为 1000(建议最大值)以减少 HTTP 开销。使用resultId实现循环以获取后续页面。 - 日期筛选: 在查询字符串中针对
WHENCREATED列使用标准 SQL 运算符(>=、<、AND)来限制提取窗口(例如:过去 365 天)。 - 权限: 提取用户需要对应付账款的“列表”和“查看”权限,以及“审计追踪 (Audit Trail)”权限(通常位于平台服务或公司管理设置中)。
- 对象关联:
APBILL.RECORDNO是主键,用于关联APPYMTDETAIL.BILLRECORDNO和AUDITTRAIL.OBJECTKEY。
a 查询示例 sql
/*
PROCESSMIND TRANSFORMATION SCRIPT
Prerequisite: Data from APBILL, APPYMTDETAIL, and AUDITTRAIL
must be extracted via API and staged in tables with those names.
*/
/* 1. Invoice Draft Created */
SELECT
H.DOCNUMBER AS InvoiceNumber,
'Invoice Draft Created' AS ActivityName,
H.WHENCREATED AS EventTime,
'Sage Intacct' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.VENDORNAME AS VendorName,
H.TOTALENTERED AS InvoiceAmount,
H.PONUMBER AS PurchaseOrderNumber,
H.WHENCREATED AS InvoiceDate,
H.DUE_DATE AS DueDate,
NULL AS Department,
H.CREATEDBY AS CreatedBy,
H.STATE AS InvoiceStatus,
NULL AS PaymentDate
FROM APBILL H
UNION ALL
/* 2. Invoice Matched to PO (Derived from existence of PO Number at creation) */
SELECT
H.DOCNUMBER,
'Invoice Matched to PO',
H.WHENCREATED, -- Occurs effectively at creation if PO links
'Sage Intacct',
GETDATE(),
H.VENDORNAME,
H.TOTALENTERED,
H.PONUMBER,
H.WHENCREATED,
H.DUE_DATE,
NULL,
H.CREATEDBY,
H.STATE,
NULL
FROM APBILL H
WHERE H.PONUMBER IS NOT NULL AND H.PONUMBER <> ''
UNION ALL
/* 3. Invoice Posted (Header Timestamp) */
SELECT
H.DOCNUMBER,
'Invoice Posted',
H.WHENPOSTED,
'Sage Intacct',
GETDATE(),
H.VENDORNAME,
H.TOTALENTERED,
H.PONUMBER,
H.WHENCREATED,
H.DUE_DATE,
NULL,
H.CREATEDBY,
H.STATE,
NULL
FROM APBILL H
WHERE H.WHENPOSTED IS NOT NULL
UNION ALL
/* 4. Payment Generated */
SELECT
H.DOCNUMBER,
'Payment Generated',
P.WHENCREATED,
'Sage Intacct',
GETDATE(),
H.VENDORNAME,
P.TRX_AMOUNT,
H.PONUMBER,
H.WHENCREATED,
H.DUE_DATE,
NULL,
P.CREATEDBY,
H.STATE,
P.PAYMENTDATE
FROM APPYMTDETAIL P
JOIN APBILL H ON P.BILLRECORDNO = H.RECORDNO
UNION ALL
/* 5. Payment Reconciled */
SELECT
H.DOCNUMBER,
'Payment Reconciled',
P.WHENCLEARED,
'Sage Intacct',
GETDATE(),
H.VENDORNAME,
P.TRX_AMOUNT,
H.PONUMBER,
H.WHENCREATED,
H.DUE_DATE,
NULL,
P.CREATEDBY,
H.STATE,
P.PAYMENTDATE
FROM APPYMTDETAIL P
JOIN APBILL H ON P.BILLRECORDNO = H.RECORDNO
WHERE P.WHENCLEARED IS NOT NULL
UNION ALL
/* 6. Workflow Activities from Audit Trail */
/* Covers: Updated, Submitted, Approved, Declined, Hold, Released, Voided, Selected */
SELECT
H.DOCNUMBER,
CASE
WHEN A.MESSAGE LIKE '%Submitted%' THEN 'Invoice Submitted'
WHEN A.MESSAGE LIKE '%Approved%' THEN 'Invoice Approved'
WHEN A.MESSAGE LIKE '%Declined%' THEN 'Invoice Declined'
WHEN A.MESSAGE LIKE '%Hold%' AND A.LOGTYPE = 'Add' THEN 'Invoice Placed on Hold'
WHEN A.MESSAGE LIKE '%Hold%' AND A.LOGTYPE = 'Remove' THEN 'Invoice Released from Hold'
WHEN A.MESSAGE LIKE '%Voided%' THEN 'Payment Voided'
WHEN A.MESSAGE LIKE '%Selected for payment%' THEN 'Invoice Selected for Payment'
WHEN A.MESSAGE LIKE '%Modified%' THEN 'Invoice Updated'
ELSE 'System Activity'
END AS ActivityName,
A.WHENDOCCURRED AS EventTime,
'Sage Intacct' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.VENDORNAME,
H.TOTALENTERED,
H.PONUMBER,
H.WHENCREATED,
H.DUE_DATE,
NULL,
A.USERID AS CreatedBy,
H.STATE,
NULL
FROM AUDITTRAIL A
JOIN APBILL H ON A.OBJECTKEY = CAST(H.RECORDNO AS VARCHAR(50))
WHERE A.OBJECTTYPE = 'APBILL'
AND (
A.MESSAGE LIKE '%Submitted%'
OR A.MESSAGE LIKE '%Approved%'
OR A.MESSAGE LIKE '%Declined%'
OR A.MESSAGE LIKE '%Hold%'
OR A.MESSAGE LIKE '%Voided%'
OR A.MESSAGE LIKE '%Selected for payment%'
OR A.MESSAGE LIKE '%Modified%'
)
/* Exclude creation updates to avoid duplication with Invoice Draft Created */
AND NOT (A.MESSAGE LIKE '%Modified%' AND ABS(DATEDIFF(second, A.WHENDOCCURRED, H.WHENCREATED)) < 60)