您的“从订单到收款 - 账单与开票”数据模板
您的“从订单到收款 - 账单与开票”数据模板
- 建议收集的属性
- 需要追踪的关键活动
- NetSuite数据提取指南
从订单到现金 - 计费与开票属性
| 名称 | 描述 | ||
|---|---|---|---|
| 事件timestamp EventTimestamp | 特定活动或事件发生的精确日期和时间。 | ||
| 描述 该属性记录了活动发生的精确时刻。它是按时间顺序排列事件以及进行所有基于时间的分析的关键组件。 在流程挖掘中,Event Timestamp 用于计算活动间的周期时间、案例持续时间和等待时间。这对于识别瓶颈、衡量符合 SLA 的流程绩效以及理解账单流程的时间动态至关重要。例如,它被用于计算发票生成周期时间和应收账款周转天数 (DSO)。 为何重要 它提供了事件的时间顺序,这对于计算所有基于持续时间的指标、识别瓶颈以及分析随时间变化的流程绩效至关重要。 获取方式 时间戳信息通常可以在 NetSuite 中每笔发票交易相关记录的系统备注、审计追踪或“创建日期”字段中找到。 示例 2023-10-26T10:00:00Z2023-10-27T14:30:00Z2023-11-15T09:05:00Z | |||
| 发票编号 InvoiceNumber | 每个发票单据的唯一标识符,作为账单流程的主要案例标识符。 | ||
| 描述 Invoice Number 是账单流程分析的基石,它唯一标识了从创建到最终关闭的每一张发票。它将所有相关活动(如审批、发送和付款应用)整合为一个完整的案例 (Case)。 在流程挖掘中,分析每个发票号码的处理历程可以全面了解整个账单生命周期。这有助于识别流程变体、瓶颈以及与标准程序的偏差,为优化现金流和提高运营效率提供关键洞察。 为何重要 它对于追踪每张发票的端到端生命周期至关重要,从而能够重建整个计费流程并进行详细的性能分析。 获取方式 这通常是 NetSuite 中发票交易记录上的“交易 ID”或类似的唯一标识符字段。 示例 INV-0012345INV-0012346INV-0012347 | |||
| 活动名称 ActivityName | 发票生命周期中特定时点发生的业务事件名称。 | ||
| 描述 Activity Name 描述了账单流程中的具体步骤或事件,例如“发票已创建”、“发票已审批”或“已收到客户付款”。这些活动构成了流程图的顺序构建块。 分析这些活动的顺序和频率是流程挖掘的基础。它有助于实现实际流程流的可视化,识别常见和罕见的流程路径(变体),并精准定位经常重复的活动(这通常意味着返工或低效)。 为何重要 该属性是构建流程图的基础,支持发票所经不同步骤和路径的可视化与分析。 获取方式 源自系统日志、状态变更或与 NetSuite 中发票交易相关的特定事件记录。这通常需要将交易状态变更或相关记录创建映射到定义的活动名称。 示例 发票已创建发票已审批已收到客户付款发票已全额支付 | |||
| 最后数据更新 LastDataUpdate | 用于指示数据上次从源系统刷新的时间戳。 | ||
| 描述 此属性记录数据集最后一次更新的时间。它为流程挖掘分析的时效性和相关性提供了背景信息。 分析师和业务利益相关者利用此信息来了解洞察结果是否反映了最新的运营状态。这是任何仪表板或报告的关键元数据,确保决策是基于已知时间的数据,而不是在非实时的情况下被误读为实时数据。 为何重要 这告知用户数据的更新时间,确保他们了解分析的时间范围以及洞察结果的相关性。 获取方式 此时间戳由数据提取工具或流水线在数据刷新时生成并记录。 示例 2024-05-21T02:00:00Z | |||
| 源系统 SourceSystem | 数据提取来源系统。 | ||
| 描述 此属性标识流程数据的来源。在此视图中,该值始终为 'NetSuite'。 在更广泛的分析背景下(特别是对于拥有多个 ERP 或集成系统的组织),此属性对于数据血缘和治理至关重要。它有助于区分可能跨越不同平台的流程,并确保分析能够正确归因于相应的记录系统。 为何重要 它为数据来源和治理提供了关键背景,特别是在可能集成多个系统的环境中。 获取方式 这是在数据抽取与转换过程中添加的静态值('NetSuite')。 示例 NetSuite | |||
| 事件结束时间 EventEndTime | 特定活动或事件完成的精确日期和时间。 | ||
| 描述 Event End Time 标志着一项活动的完成。虽然许多活动是瞬间完成的(开始和结束时间相同),但某些活动(如审批步骤)可能具有可衡量的持续时间。 该属性与 Event Timestamp (Start Time) 结合使用,可以直接计算活动的实际处理时间。分析处理时间有助于识别哪些具体步骤消耗了最多的时间和资源,并将其与活动之间的等待时间区分开来。这对于精准定位特定任务中的低效环节至关重要。 为何重要 它能够精确计算完成每项活动所需的时间,这对于分析资源效率和识别耗时任务至关重要。 获取方式 与 StartTime 类似,这可以从 NetSuite 的系统审计追踪中获取。可能需要特定逻辑将“开始”事件与相应的“结束”事件进行匹配。 示例 2023-10-26T10:05:14Z2023-10-27T14:32:00Z2023-11-15T09:05:00Z | |||
| 到期日期 DueDate | 发票付款的最后期限。 | ||
| 描述 Due Date 是根据发票日期和约定的付款条件计算得出的。它代表了客户在不被视为逾期的情况下的最后付款期限。 该属性对于监控应收账款和管理现金流至关重要。它是计算“准时付款率”KPI 以及分析客户付款行为的基准。通过跟踪与到期日的偏差,有助于识别经常逾期付款的客户,并评估催收策略的有效性。 为何重要 它对于衡量按时付款表现和分析客户付款行为至关重要,直接支持催收和现金流预测。 获取方式 这对应于 NetSuite 中发票交易记录上的“到期日” (duedate) 字段。 示例 2023-11-252023-11-262023-12-15 | |||
| 区域 Region | 与客户或交易关联的地理区域。 | ||
| 描述 Region(区域)属性根据地理位置对发票进行分类,这可以源自客户地址或开具发票的业务部门。 这是一个用于对比分析的强大维度。“区域账单流程对比”仪表板依靠此属性来比较不同区域的 KPI(如周期时间、错误率和流程变体)。这有助于识别区域间的绩效差异,发现高效区域的最佳实践,并推动整个组织的流程标准化工作。 为何重要 它支持跨地理区域的对比分析,这对于识别区域绩效差距和标准化最佳实践至关重要。 获取方式 此类数据通常存储在 NetSuite 客户主档或交易记录中的自定义段或分类字段中。 示例 北美欧洲、中东和非洲亚太 | |||
| 发票总金额 InvoiceTotalAmount | 发票的总金额,包括税费和其他费用。 | ||
| 描述 此属性代表客户应支付的全额款项。它是每个账单案例的基础财务数据。 根据发票金额分析流程可以实现基于价值的分析。例如,它可以揭示高额发票是否遵循了与小额发票不同且更复杂的流程。它还可用于确定催收工作的优先级,并了解付款延迟或发票错误带来的财务影响。 为何重要 它支持基于价值的流程分析,有助于优先处理高价值发票,并了解流程低效对财务的影响。 获取方式 这对应于 NetSuite 中发票交易记录上的“总计” (total) 字段。 示例 1500.0089.9912500.50 | |||
| 发票日期 InvoiceDate | 向客户开具发票的正式日期。 | ||
| 描述 Invoice Date(或交易日期)是许多与账单相关的财务计算的起点。付款条件和到期日通常都从该日期开始计算。 在分析中,此日期是计算关键财务 KPI(如应收账款周转天数 (DSO) 和发票账龄)的主要基准。它还支持同期群分析,以便比较不同时期的账单执行表现,例如环比或同比分析。 为何重要 该日期是应收账款周转天数 (DSO) 和发票账龄等关键财务指标的基准,直接影响营运资金分析。 获取方式 这对应于 NetSuite 中发票交易记录上的“日期” (trandate) 字段。 示例 2023-10-262023-10-272023-11-15 | |||
| 客户名称 CustomerName | 发票开具对象的客户名称。 | ||
| 描述 此属性标识被开具账单的法律实体或个人。它将账单流程与客户关系管理功能联系起来。 按客户分析账单流程有助于识别特定客户的付款行为模式、纠纷或发票复杂性。这可以为客户细分策略、信用额度决策和定制化的催收方法提供依据。例如,它可以揭示某个特定客户是否经常出现需要返工的发票。 为何重要 它允许进行以客户为中心的分析,有助于识别特定客户的付款模式、常见问题或流程偏差。 获取方式 这对应于 NetSuite 中发票交易记录上的“客户”或“实体”名称字段。 示例 Global Tech Inc.Innovate Solutions LLCCornerstone Corp | |||
| 是否已自动化 IsAutomated | 一个标记,指示该活动是否由系统自动执行。 | ||
| 描述 此布尔属性区分了由用户手动执行的活动与由系统工作流、脚本或集成自动执行的活动。 该属性是衡量账单流程自动化程度的关键,直接支持“自动开票率”KPI。通过筛选自动或手动活动,分析师可以识别由人工干预引起的瓶颈,并精准定位提高自动化水平、减少人为错误以及提升效率的机会。 为何重要 它有助于衡量流程的自动化程度,识别减少手动工作量和提高效率的机会。 获取方式 这通常通过检查与活动关联的“用户”来衍生。由名为“SYSTEM”、“Workflow”或“Integration”的用户触发的事件会被标记为自动化。 示例 truefalse | |||
| 用户 User | 执行该活动的用户姓名或ID。 | ||
| 描述 此属性用于识别负责执行特定流程步骤的员工或系统用户。这可能是创建发票、审批发票或进行付款核销的人员。 按用户分析流程有助于了解工作负载分布、个人绩效并识别培训需求。通过展示哪些手动活动参与人数最多,它还能揭示潜在的自动化机会。此外,这对于合规性和审计追踪分析也至关重要。 为何重要 它支持分析工作负载分布、特定用户表现和流程遵循度,这对于资源管理和针对性培训至关重要。 获取方式 可在 NetSuite 发票及相关交易记录的 System Notes 子选项卡或特定的“Modified By”字段中找到。 示例 Alice SmithBob Johnson系统 | |||
| DSO(应收账款周转天数) DaysSalesOutstanding | 发票日期与收到付款日期之间的时间天数。 | ||
| 描述 应收账款周转天数 (DSO) 是衡量发票开具后平均收款天数的关键财务指标。此属性是针对每张发票单独计算的,以便进行详细分析。 虽然 DSO 通常作为高层 KPI 进行汇总,但拥有单张发票级别的 DSO 数据可以实现强大的分析。它可以用来识别哪些客户、地区或发票类型的 DSO 最高。“DSO 趋势”仪表板依靠此指标来可视化收款效率随时间的变化,为营运资金管理提供关键见解。 为何重要 它量化了单张发票级别的催收效率,从而能够对高 DSO 及其对现金流的影响进行详细的根本原因分析。 获取方式 通过从“收到客户付款”活动的时间戳中减去“InvoiceDate”计算得出。 示例 294562 | |||
| 付款条款 PaymentTerms | 公司与客户之间约定的付款条件。 | ||
| 描述 付款条件定义了客户预期支付发票的时间和方式,例如“Net 30”或“收到即付”。此信息用于自动计算发票到期日。 此属性对于“付款条件遵循度”仪表板至关重要。分析不同付款条件下的按时付款率有助于评估其有效性。例如,它可以显示“Net 15”条件的客户是否比“Net 30”条件的客户付款更快,从而为未来的合同谈判和信用政策提供依据。 为何重要 它对于分析不同付款条件的有效性及其对客户付款及时性的影响至关重要。 获取方式 这对应于 NetSuite 中发票交易记录上的“条款”字段。 示例 净 30 天净 60 天见票即付 | |||
| 发票状态 InvoiceStatus | 发票在其生命周期中的当前状态。 | ||
| 描述 此属性反映发票的当前状态,如“未结”、“已全额支付”或“已作废”。它提供了发票在流程中任一时刻所处位置的快照。 “未结发票状态概览”仪表板直接基于此属性构建。它支持对应收账款进行实时评估,帮助财务团队监控未结余额、管理催收并预测现金流入。分析最终状态还有助于理解流程产出。 为何重要 它提供了应收账款当前状态的快照,支持通过仪表板监控未结发票和整体开票进度。 获取方式 这对应于 NetSuite 中发票交易记录上的“状态”字段。 示例 未结已全额支付已作废待审批 | |||
| 是否按时付款 IsOnTimePayment | 一个标记,指示客户付款是否在发票到期日当天或之前收到。 | ||
| 描述 此计算布尔标记将“已收到客户付款”活动的时间戳与发票的 DueDate 进行对比。如果付款及时或提前,则设为 true;如果逾期,则设为 false。 该属性是“准时付款率”KPI 和“付款条件遵循”仪表板的基础。它提供了对客户付款行为的清晰二元衡量,简化了分析和报告工作。它有助于快速识别付款及时性的趋势,并评估催收策略的有效性。 为何重要 这为催收工作提供了清晰的成功衡量标准,直接支持“准时付款率”KPI 的计算和客户行为分析。 获取方式 这是一个计算属性。它需要将付款事件的时间戳与案例层级的“DueDate”属性进行对比。 示例 truefalse | |||
| 是否返工 IsRework | 这是一个推算的标记,用于识别被视为返工或修正循环的活动。 | ||
| 描述 对于代表非增值返工的活动(如“发票已修正”或同一案例中的第二次“发票已审批”事件),此布尔标记会设置为 true。它通常根据活动名称或活动的重复情况衍生而来。 此属性对于“发票返工与拒绝分析”仪表板以及“发票错误率”KPI 至关重要。它支持对返工进行轻松量化,有助于突出流程质量问题。通过筛选返工活动,团队可以迅速识别错误的根本原因,并衡量流程改进计划的效果。 为何重要 它通过标记低效的返工循环来直接衡量流程质量,从而能够分析计费错误的根本原因及其对财务的影响。 获取方式 这是一个在数据转换过程中计算出的衍生属性。通过逻辑识别返工,例如标记特定的活动名称(如“发票已修正”)或重复执行的活动。 示例 truefalse | |||
| 活动处理时间 ActivityProcessingTime | 在某项活动上实际投入的工作时长。 | ||
| 描述 此计算指标衡量单个活动开始和结束时间戳之间流逝的时间。它代表的是实际工作时长,而非活动间的等待时间。 这是“活动吞吐量与瓶颈”仪表板的关键指标。通过分析处理时间,团队可以识别哪些具体任务最耗时且资源密集。由此可进行针对性改进,例如提供更好的培训、提升系统性能或将任务自动化。 为何重要 它量化了每项任务的实际投入,有助于区分实际工作时间与空闲等待时间,并精准定位低效活动。 获取方式 通过为每个活动记录从 EventEndTime 中减去 EventTimestamp (StartTime) 计算得出。 示例 300601200 | |||
| 货币 Currency | 发票金额的货币代码。 | ||
| 描述 此属性指定发票金额的货币单位,例如 USD、EUR 或 GBP。它是任何货币价值不可或缺的背景信息。 对于跨国组织而言,按货币分析对于了解不同市场的财务表现非常重要。它确保了货币价值被正确解读,并支持在必要时进行货币转换后的准确汇总与比较。 为何重要 它为所有货币价值提供了必要的背景,这对于准确的财务报告和分析至关重要,特别是在跨国运营中。 获取方式 这对应于 NetSuite 中发票交易记录上的“货币”字段。 示例 美元EURGBP | |||
| 部门 Department | 与发票关联的内部部门。 | ||
| 描述 此属性代表负责该交易的内部部门,如销售部、服务部或特定的业务线。它是 NetSuite 中的标准分类维度。 按部门分析流程有助于进行内部基准测试,并识别某些部门的账单流程是否比其他部门更高效。它可以揭示流程遵循情况或资源分配的差异,为组织内特定部门的针对性流程改进计划提供洞察。 为何重要 它支持对比不同内部部门的流程绩效,突出差异以及内部流程标准化的机会。 获取方式 这对应于“部门”分类字段,可以在 NetSuite 发票交易的抬头或行项目级别进行设置。 示例 销售 - 企业级专业服务硬件 | |||
| 销售订单编号 SalesOrderNumber | 生成该发票的销售订单标识符。 | ||
| 描述 此属性提供了返回原始销售订单的直接链接,将账单流程与之前的销售和履约流程连接起来。 包含 Sales Order Number(销售订单号)可以更全面地查看整个从订单到收款 (O2C) 周期。它支持将账单中的问题追溯到销售环节的源头。例如,频繁的发票修正可能与特定类型销售订单上的数据录入错误有关。 为何重要 它将计费流程链接回销售流程,支持更广泛的端到端 O2C 分析,以识别计费问题的根本原因。 获取方式 可在 NetSuite 发票交易的“Created From”字段或“相关记录”子选项卡中找到。 示例 SO-0009876SO-0009877SO-0009878 | |||
从订单到现金 - 计费与开票活动
| 活动 | 描述 | ||
|---|---|---|---|
| 发票已全额支付 | 发票状态已更改为“全额支付”,表示余额已归零。这标志着该发票的账单和收款周期圆满结束。 | ||
| 为何重要 这是该流程主要且成功的结束事件。分析到达此状态所需的总时间,即可得出现金转化周期的端到端周期时间。 获取方式 根据发票记录的“Status”字段变更为“Paid In Full”推断。此状态变更的时间戳可在交易的系统注释中查看。 捕获 根据系统注释中“状态”字段变更为“已全额支付”推断。 事件类型 inferred | |||
| 发票已创建 | 标志着 NetSuite 中发票交易记录的正式创建。该事件是每个唯一发票编号开票流程的起点,从交易的创建时间戳中获取。 | ||
| 为何重要 这是账单流程的主要起始事件。分析从该事件到其他事件的时间,可以揭示整体流程效率,并作为“发票生成周期时间”KPI 的基准。 获取方式 从发票交易记录的“Date Created”时间戳中获取。NetSuite 的发票系统注释也会明确记录创建事件和用户。 捕获 发票交易记录创建时记录的事件。 事件类型 explicit | |||
| 发票已发送给客户 | 表示发票已发送给客户(通常通过电子邮件)。系统通过跟踪用户在发票记录中执行“发送邮件”操作的时间来捕获此事件。 | ||
| 为何重要 这标志着客户催收期的开始,也是计算应收账款周转天数 (DSO) 的主要起点。 获取方式 根据发票记录上的“Date Last Emailed”字段被填充推断。或者,也可以通过在“Communication”子选项卡下创建电子邮件记录来获取。 捕获 根据“上次发送邮件日期”填充或沟通记录的创建推断。 事件类型 inferred | |||
| 发票已审批 | 发票已正式获批,准备发送给客户。当审批状态从“待审批”更新为“已通过”时(通常通过工作流操作完成),系统会捕获此事件。 | ||
| 为何重要 这是阻止发票发送给客户的关键里程碑。它对于衡量审批周期时间以及计算“自动开票率”KPI 至关重要。 获取方式 根据发票记录上的“Approval Status”字段变更为“Approved”推断。精确的时间戳记录在该交易的系统注释中。 捕获 根据系统注释中“审批状态”字段变更为“已批准”推断。 事件类型 inferred | |||
| 已收到客户付款 | 已收到客户付款并记录在系统中。这通过在 NetSuite 中创建“Customer Payment”交易来获取,该交易可应用于一张或多张发票。 | ||
| 为何重要 标志着现金的接收,但不一定已应用到特定发票。这是现金应用流程的第一步,也是 DSO 计算的关键事件。 获取方式 从“Customer Payment”交易记录的创建日期获取。与发票的关联在付款的“Apply”子选项卡中建立。 捕获 创建客户付款交易记录。 事件类型 explicit | |||
| 付款到期日已到 | 这是一个推算的事件,当当前日期与发票的到期日匹配时触发。该事件不对应于直接的用户或系统操作,而是在分析过程中根据现有数据推导出来的。 | ||
| 为何重要 作为衡量付款及时性的关键基准。它对于计算“按时付款率”KPI 以及分析客户付款行为至关重要。 获取方式 这在 NetSuite 中不是一个显性事件。它是通过对比事件日志的时间戳与发票交易记录中的“到期日”字段计算得出的。 捕获 当事件时间戳等于发票上的“Due Date”字段时计算得出。 事件类型 calculated | |||
| 发票已作废 | 发票已作废,即发票已撤销并冲销了任何总账影响。此操作通常针对在付款前发现录入错误的发票。 | ||
| 为何重要 代表流程异常及终止状态。深入了解发票作废的原因,可以揭示上游环节中需要修正的数据录入或流程错误。 获取方式 这是一个明确的用户操作。它可以从发票记录的系统备注中获取,其中记录了交易作废的时间和执行人。 捕获 在发票系统注释中记录的明确“作废”操作。 事件类型 explicit | |||
| 发票已提交审批 | 代表发票状态更改为“待审批”。当用户将发票提交至预设的审批工作流(这在系统中是很常见的自定义配置)时,系统会捕获此事件。 | ||
| 为何重要 此活动可识别潜在的审批瓶颈起点。等待审批所花费的时间是整个发票处理周期时间的关键组成部分。 获取方式 根据发票记录上的“Approval Status”字段变更为“Pending Approval”推断。该变更的时间戳可以在发票的系统注释审计追踪中找到。 捕获 根据系统注释中记录的“审批状态”字段变更推断。 事件类型 inferred | |||
| 发票已结案 | 发票交易已关闭,通常作为期末会计结算的一部分。此操作可防止在发票全额支付并核销后对交易进行进一步更改。 | ||
| 为何重要 虽然这通常发生在“全额支付”之后,但它可能是最后一道行政手续。分析付款与关闭之间的延迟可能会影响财务报告的及时性。 获取方式 根据“Status”字段变更为“Closed”或类似状态推断。此变更的时间戳从系统注释中获取。 捕获 根据系统注释中的“状态”字段变更推断。 事件类型 inferred | |||
| 已发布付款提醒 | 已向客户发送关于待付款项的沟通信息。这通常通过催收解决方案从发票或客户记录中发送的电子邮件或记录的活动来获取。 | ||
| 为何重要 对于评估催收策略的有效性至关重要。分析此活动对后续付款的影响有助于优化提醒频率和时间。 获取方式 从发票或客户记录的“Communication > Messages”子选项卡中创建的电子邮件记录获取。自动催收解决方案也可能将这些记录为自定义记录或任务。 捕获 记录为与发票关联的电子邮件或活动记录。 事件类型 explicit | |||
| 款项已核销至发票 | 收到的客户付款已专门用于核销此发票,从而冲减了应付金额。当核销操作在“客户付款”记录中保存时,系统会记录此信息。 | ||
| 为何重要 这是现金收款与发票结清之间的关键环节。从“已收到付款”到此事件的持续时间定义了“款项应用周期”这一关键 KPI。 获取方式 从客户付款交易的系统注释或审计追踪中获取,特别是保存应用到发票行的时间。此应用的时间戳是关键。 捕获 当保存应用到发票的客户付款记录时记录。 事件类型 explicit | |||
| 贷项通知单已创建 | 已创建贷项通知单交易并将其应用到发票,从而减少了未付余额。这通常表示产品退货、服务投诉或价格修正。 | ||
| 为何重要 突出返工、质量问题或客户纠纷。频繁发生此类情况可能预示着潜在问题,这也是“发票返工与拒绝分析”仪表板的关键所在。 获取方式 从贷项通知单交易的创建中获取。与原始发票的链接可在贷项通知单的“Created From”字段或“Apply”子选项卡中找到。 捕获 创建链接到原始发票的贷项通知单记录。 事件类型 explicit | |||
提取指南
步骤
- 登录 NetSuite: 使用具有足够权限在交易记录上创建并运行 Saved Searches 的角色访问您的 NetSuite 账户。
- 导航至 Saved Searches: 转到 报告 > Saved Searches > 所有 Saved Searches > 新建。从搜索类型列表中选择“Transaction”。这将作为为每个事件类型创建多个搜索的基础。
- 创建“发票已创建”搜索: 这是获取发票创建情况的主要搜索。
- 在“Criteria”选项卡下的“Standard”中,将“Type”过滤器设置为“is Invoice”。
- 添加另一个“Main Line”过滤器并将其设置为“is true”,以便每个发票获得一条记录。
- 在“Results”选项卡中,添加所需的列。使用公式创建标准字段,如“ActivityName”。例如,添加一个“Formula (Text)”字段,公式为
_UTF8'Invoice Created'。
- 创建状态变更搜索(审批、支付、作废、关闭): 许多活动属于状态变更。获取精确时间戳最可靠的方法是通过 System Notes。
- 新建一个 Transaction Saved Search。
- 在“Criteria”选项卡中,将“Type”设置为“is Invoice”。
- 在“Standard”子选项卡下,添加过滤器“System Notes : Field”并选择相关的状态字段,例如“Approval Status”。
- 添加另一个过滤器“System Notes : New Value”并将其设置为目标状态,例如“Approved”。
- 在“Results”选项卡中,将“System Notes : Date”映射到
EventTimestamp,将“System Notes : Set by”映射到User。 - 对每个基于状态的活动重复此过程:“发票已提交审批”、“发票已批准”、“发票已全额支付”、“发票已作废”和“发票已关闭”,并相应调整字段和值过滤器。
- 创建“发票已发送至客户”搜索: 此事件通常通过追踪从发票记录发送的电子邮件来获取。
- 新建一个 Transaction Saved Search,将“Type”设置为“is Invoice”。
- 在“Criteria”选项卡下的“Related Records”中,添加“Messages : Date Sent”过滤器并将其设置为“is not empty”。
- 在“Results”选项卡中,将“Messages : Date Sent”映射到
EventTimestamp,将“Messages : Author”映射到User。
- 创建付款和贷项通知单活动搜索: 这些涉及链接到发票的独立交易类型。
- 对于“收到客户付款”,创建一个“Type”为“Customer Payment”的搜索。获取创建日期作为事件时间戳。
- 对于“付款已应用至发票”,使用相同的“Customer Payment”搜索,但关联到“Applied To Transaction”字段。付款交易的“Date Created”作为时间戳。每个发票应用将获得一行。
- 对于“贷项通知单已创建”,创建一个“Type”为“Credit Memo”的搜索,并链接到“Created From”字段以获取原始发票编号。
- 运行并导出每个 Saved Search: 执行您创建的每个保存的搜索。在结果页面中,点击导出图标(CSV、Excel 或 PDF)并选择 CSV。如果结果集大于 NetSuite 的导出限制,您可能需要分批导出。
- 合并与转换数据: 使用 Microsoft Excel、Python 脚本或数据准备工具将所有导出的 CSV 文件合并为一个文件。
- 推导“付款到期日已到”事件: 在合并的数据文件中,为每个“发票已创建”事件创建一个新行。将
ActivityName设置为“Payment Due Date Reached”,将EventTimestamp设置为发票“DueDate”字段的值,并复制其他相关的发票属性。 - 完成事件日志: 标准化所有列标题以匹配所需的架构(例如
InvoiceNumber、ActivityName、EventTimestamp)。确保时间戳格式一致。为此提取批次添加包含静态值的SourceSystem和LastDataUpdate列。将最终合并的文件保存为 CSV 以便上传。
配置
- 前提条件: 您需要拥有一个具备创建、编辑和运行“Transaction”类型 Saved Searches 权限的用户角色。此外,还需要拥有查看发票 (Invoice)、客户付款 (Customer Payment)、贷项通知单 (Credit Memo) 以及 System Notes 记录的访问权限。
- 搜索类型: 所有数据提取主要使用“Transaction”搜索类型。该类型可以访问所有必要的记录及其关联关系。
- 日期范围过滤: 为了优化性能并管理数据量,请为每个搜索应用日期范围过滤。建议在初次分析时,针对“Date Created”设置过去 3 到 6 个月的过滤条件。
- Main Line 过滤器: 对于文档抬头级别的事件(如“Invoice Created”),请将“Main Line”标准设置为“true”。如果您需要分析行项目详情(本流程通常不需要),请将其设置为“false”。
- System Notes: 状态变更的获取高度依赖 System Notes。请确保在 NetSuite 配置中启用了关键交易字段(如“Status”和“Approval Status”)的审计功能(设置 > 公司 > 启用功能 > SuiteCloud > SuiteAudit Trail)。
- 性能考虑: 在 NetSuite 界面中运行跨大日期范围、包含多个关联 (join) 和公式字段的复杂搜索可能会比较缓慢。建议在非高峰时段运行并导出这些搜索。如果搜索超时,请缩小日期范围并分批导出数据。
a 查询示例 config
/*
This section describes the configuration for multiple NetSuite Saved Searches needed to generate the complete event log. Each block represents a separate Saved Search that must be created in the UI, exported, and then combined externally.
*/
-- Search 1: Invoice Created
Activity Name: 'Invoice Created'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- Main Line is true
Results Columns (Mapped to Event Log Attributes):
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Created'
- EventTimestamp: Date Created
- User: Created By
- InvoiceDate: Date
- DueDate: Due Date
- InvoiceTotalAmount: Amount (Gross)
- CustomerName: Name
-- Search 2: Invoice Submitted for Approval
Activity Name: 'Invoice Submitted for Approval'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Approval Status
- System Notes : New Value is [Your 'Pending Approval' status]
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Submitted for Approval'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 3: Invoice Approved
Activity Name: 'Invoice Approved'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Approval Status
- System Notes : New Value is [Your 'Approved' status]
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Approved'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 4: Invoice Sent to Customer
Activity Name: 'Invoice Sent to Customer'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- Messages : Date Sent is not empty
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Sent to Customer'
- EventTimestamp: Messages : Date Sent (use Maximum summary type if multiple)
- User: Messages : Author (use Maximum summary type)
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 5: Payment Reminder Issued
Activity Name: 'Payment Reminder Issued'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- User Notes : Note contains [Your dunning/reminder keyword]
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Payment Reminder Issued'
- EventTimestamp: User Notes : Date
- User: User Notes : Author
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 6: Credit Memo Created
Activity Name: 'Credit Memo Created'
Saved Search Type: Transaction
Criteria:
- Type is Credit Memo
- Main Line is true
Results Columns:
- InvoiceNumber: Created From : Document Number
- ActivityName: Formula (Text) = 'Credit Memo Created'
- EventTimestamp: Date Created
- User: Created By
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 7: Customer Payment Received
Activity Name: 'Customer Payment Received'
Saved Search Type: Transaction
Criteria:
- Type is Customer Payment
- Main Line is true
Results Columns:
- InvoiceNumber: Applied to Transaction : Document Number
- ActivityName: Formula (Text) = 'Customer Payment Received'
- EventTimestamp: Date Created
- User: Created By
- CustomerName: Name
-- Search 8: Payment Applied To Invoice
Activity Name: 'Payment Applied To Invoice'
Saved Search Type: Transaction
Criteria:
- Type is Customer Payment
- Main Line is false
Results Columns:
- InvoiceNumber: Applied to Transaction : Document Number
- ActivityName: Formula (Text) = 'Payment Applied To Invoice'
- EventTimestamp: Date Created
- User: Created By
- CustomerName: Name
-- Search 9: Invoice Paid In Full
Activity Name: 'Invoice Paid In Full'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Status
- System Notes : New Value is Paid In Full
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Paid In Full'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 10: Invoice Voided
Activity Name: 'Invoice Voided'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- Status is Invoice : Voided
- System Notes : Field is Status
- System Notes : New Value is Voided
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Voided'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
-- Search 11: Invoice Closed
Activity Name: 'Invoice Closed'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Status
- System Notes : New Value contains Closed
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Closed'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Event to be Derived Post-Extraction: Payment Due Date Reached
/*
This event is not extracted directly. After combining all other CSVs, create a new row for each unique invoice.
Set ActivityName to 'Payment Due Date Reached'.
Set EventTimestamp to the DueDate value from the 'Invoice Created' event for that invoice.
Copy other attributes like InvoiceNumber, CustomerName, etc.
*/ 步骤
- 前提条件:启用 SuiteAnalytics Connect:确保您的 NetSuite 实例已获得 SuiteAnalytics Connect 模块的许可并已启用。这通常由 NetSuite 管理员在 设置 > 公司 > 启用功能 > 分析 下完成。
- 下载并配置 ODBC 驱动程序:导航到 NetSuite 主页仪表板并找到“设置”小组件。点击“设置 SuiteAnalytics Connect”链接,下载适用于您操作系统的 ODBC 驱动程序。按照 NetSuite 提供的安装说明进行安装和配置,输入您的服务主机、端口、账户 ID、角色 ID、电子邮件和密码。
- 建立数据库连接:使用支持 ODBC 连接的 SQL 客户端工具(如 DBeaver、Tableau 或 Power BI)。使用您在上一步中配置的驱动程序创建新的 ODBC 连接。测试连接以确保您可以成功通过身份验证并访问 NetSuite 只读副本数据库。
- 准备 SQL 查询:复制本文档“查询”部分提供的完整 SQL 查询。该查询旨在提取从订单到现金开票流程所需的所有活动和属性。
- 设置查询参数:在执行之前,找到查询中的占位符值。您必须将
'YYYY-MM-DD'替换为您希望提取的时间段的开始和结束日期。同时,将[Your Subsidiary ID]替换为您希望分析的 NetSuite 子公司的内部 ID。 - 执行查询:在 SQL 客户端中运行修改后的查询。执行时间将取决于日期范围和 NetSuite 账户中的交易量。
- 查看结果:查询完成后,将返回一个代表事件日志的扁平表。每一行对应发票生命周期中的一个特定活动。检查数据的完整性和准确性。
- 导出事件日志:将 SQL 客户端中的查询结果导出为 CSV 文件。确保文件采用 UTF-8 编码以防止字符问题。
- 准备上传:在上传到流程挖掘工具之前,请确认列标题与所需的属性名称(如 InvoiceNumber、ActivityName 和 EventTimestamp)匹配。检查日期和时间格式是否一致。
配置
- SuiteAnalytics Connect 许可证:必须拥有有效的 SuiteAnalytics Connect 模块许可证才能访问 NetSuite 只读副本数据库。如果没有此许可证,将无法进行直接 SQL 访问。
- 专用角色与用户:强烈建议为 SuiteAnalytics Connect 创建一个具备适当权限的专用 NetSuite 角色。该角色应拥有对必要记录(包括 Transactions、Customers 和 System Notes)的只读访问权限。为数据提取分配一个专用用户,以确保安全性和可审计性。
- 日期范围过滤:提供的查询在发票创建日期 (
Transaction.TRANDATE) 上包含一个WHERE子句。对于初始提取,建议从较小的日期范围(如过去 3 到 6 个月)开始,以平衡性能和数据量。例如:AND T.TRANDATE BETWEEN '2023-01-01' AND '2023-06-30'。 - 子公司过滤:对于拥有多个子公司的账户,按特定子公司进行过滤对于性能和数据相关性都至关重要。查询中包含一个占位符
WHERE T.SUBSIDIARY_ID = [Your Subsidiary ID],请根据实际情况配置。 - 数据及时性:SuiteAnalytics Connect 数据库是一个只读副本。数据通常每小时刷新多次,但并非实时。请注意,在 NetSuite 中发生的交易与其出现在 Connect 数据库中之间可能存在长达数小时的延迟。
a 查询示例 sql
WITH Invoices AS (
SELECT
T.TRANSACTION_ID,
T.TRANID AS InvoiceNumber,
T.TRANDATE AS InvoiceDate,
T.DUEDATE AS DueDate,
T.FOREIGN_TOTAL AS InvoiceTotalAmount,
C.COMPANYNAME AS CustomerName,
BUILTIN.DF(C.LOCATION) AS Region,
T.CREATED_DATE AS InvoiceCreationDate,
CREATOR.FIRST_NAME || ' ' || CREATOR.LAST_NAME AS CreatorUser
FROM
TRANSACTIONS T
JOIN
CUSTOMERS C ON T.ENTITY_ID = C.CUSTOMER_ID
LEFT JOIN
EMPLOYEES CREATOR ON T.CREATED_BY_ID = CREATOR.EMPLOYEE_ID
WHERE
T.TRANSACTION_TYPE = 'Invoice'
AND T.TRANDATE BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD') AND TO_DATE('2023-12-31', 'YYYY-MM-DD')
-- AND T.SUBSIDIARY_ID = [Your Subsidiary ID] -- Add your subsidiary filter if needed
)
-- 1. Invoice Created
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Invoice Created' AS "ActivityName",
I.InvoiceCreationDate AS "EventTimestamp",
I.InvoiceCreationDate AS "EventEndTime",
I.CreatorUser AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN I.CreatorUser LIKE '%System%' THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
UNION ALL
-- 2. Invoice Submitted for Approval & 3. Invoice Approved
SELECT
I.InvoiceNumber AS "InvoiceNumber",
CASE WHEN SN.NEW_VALUE = 'Pending Approval' THEN 'Invoice Submitted for Approval' ELSE 'Invoice Approved' END AS "ActivityName",
SN.DATE_CREATED AS "EventTimestamp",
SN.DATE_CREATED AS "EventEndTime",
SN_AUTHOR.FIRST_NAME || ' ' || SN_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN SN.AUTHOR_ID < 0 THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
JOIN
SYSTEM_NOTES SN ON I.TRANSACTION_ID = SN.TRANSACTION_ID
LEFT JOIN
EMPLOYEES SN_AUTHOR ON SN.AUTHOR_ID = SN_AUTHOR.EMPLOYEE_ID
WHERE
SN.FIELD = 'TRANSACTION.APPROVALSTATUS' AND SN.NEW_VALUE IN ('Pending Approval', 'Approved')
UNION ALL
-- 4. Invoice Sent to Customer
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Invoice Sent to Customer' AS "ActivityName",
M.MESSAGE_DATE AS "EventTimestamp",
M.MESSAGE_DATE AS "EventEndTime",
MSG_AUTHOR.FIRST_NAME || ' ' || MSG_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
0 AS "IsAutomated"
FROM
Invoices I
JOIN
MESSAGES M ON I.TRANSACTION_ID = M.TRANSACTION_ID
LEFT JOIN
EMPLOYEES MSG_AUTHOR ON M.AUTHOR_ID = MSG_AUTHOR.EMPLOYEE_ID
WHERE
M.INCOMING = 'F' -- Indicates an outgoing message
UNION ALL
-- 5. Payment Due Date Reached
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Payment Due Date Reached' AS "ActivityName",
I.DueDate AS "EventTimestamp",
I.DueDate AS "EventEndTime",
'System' AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
1 AS "IsAutomated"
FROM
Invoices I
WHERE
I.DueDate IS NOT NULL AND I.DueDate < SYSDATE
UNION ALL
-- 6. Payment Reminder Issued (based on Messages table, requires a specific subject line convention)
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Payment Reminder Issued' AS "ActivityName",
M.MESSAGE_DATE AS "EventTimestamp",
M.MESSAGE_DATE AS "EventEndTime",
MSG_AUTHOR.FIRST_NAME || ' ' || MSG_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN M.AUTHOR_ID < 0 THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
JOIN
MESSAGES M ON I.TRANSACTION_ID = M.TRANSACTION_ID
LEFT JOIN
EMPLOYEES MSG_AUTHOR ON M.AUTHOR_ID = MSG_AUTHOR.EMPLOYEE_ID
WHERE
M.INCOMING = 'F' AND UPPER(M.SUBJECT) LIKE '%PAYMENT REMINDER%'
UNION ALL
-- 7. Credit Memo Created & Applied
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Credit Memo Created' AS "ActivityName",
CM.CREATED_DATE AS "EventTimestamp",
CM.CREATED_DATE AS "EventEndTime",
CM_CREATOR.FIRST_NAME || ' ' || CM_CREATOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
0 AS "IsAutomated"
FROM
Invoices I
JOIN
TRANSACTION_LINES T_LINES ON I.TRANSACTION_ID = T_LINES.APPLIED_TO_TRANSACTION_ID
JOIN
TRANSACTIONS CM ON T_LINES.TRANSACTION_ID = CM.TRANSACTION_ID
LEFT JOIN
EMPLOYEES CM_CREATOR ON CM.CREATED_BY_ID = CM_CREATOR.EMPLOYEE_ID
WHERE
CM.TRANSACTION_TYPE = 'Credit Memo'
UNION ALL
-- 8. Customer Payment Received & 9. Payment Applied to Invoice
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Customer Payment Received' AS "ActivityName", -- Can also create a separate 'Payment Applied' event if needed
PAYMENT.CREATED_DATE AS "EventTimestamp",
PAYMENT.CREATED_DATE AS "EventEndTime",
PMT_CREATOR.FIRST_NAME || ' ' || PMT_CREATOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
0 AS "IsAutomated"
FROM
Invoices I
JOIN
TRANSACTION_LINES T_LINES ON I.TRANSACTION_ID = T_LINES.APPLIED_TO_TRANSACTION_ID
JOIN
TRANSACTIONS PAYMENT ON T_LINES.TRANSACTION_ID = PAYMENT.TRANSACTION_ID
LEFT JOIN
EMPLOYEES PMT_CREATOR ON PAYMENT.CREATED_BY_ID = PMT_CREATOR.EMPLOYEE_ID
WHERE
PAYMENT.TRANSACTION_TYPE = 'Customer Payment'
UNION ALL
-- 10. Invoice Paid In Full, 11. Invoice Voided, 12. Invoice Closed
SELECT
I.InvoiceNumber AS "InvoiceNumber",
CASE
WHEN SN.NEW_VALUE_ID = 'Invoice:B' THEN 'Invoice Paid In Full' -- 'B' is status 'Paid In Full'
WHEN SN.FIELD = 'TRANSACTION.VOIDED' AND SN.NEW_VALUE = 'T' THEN 'Invoice Voided'
WHEN SN.FIELD = 'TRANSACTION.CLOSED' AND SN.NEW_VALUE = 'T' THEN 'Invoice Closed'
END AS "ActivityName",
SN.DATE_CREATED AS "EventTimestamp",
SN.DATE_CREATED AS "EventEndTime",
SN_AUTHOR.FIRST_NAME || ' ' || SN_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN SN.AUTHOR_ID < 0 THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
JOIN
SYSTEM_NOTES SN ON I.TRANSACTION_ID = SN.TRANSACTION_ID
LEFT JOIN
EMPLOYEES SN_AUTHOR ON SN.AUTHOR_ID = SN_AUTHOR.EMPLOYEE_ID
WHERE
(SN.FIELD = 'TRANSACTION.STATUS' AND SN.NEW_VALUE_ID = 'Invoice:B')
OR (SN.FIELD = 'TRANSACTION.VOIDED' AND SN.NEW_VALUE = 'T')
OR (SN.FIELD = 'TRANSACTION.CLOSED' AND SN.NEW_VALUE = 'T');