您的薪资处理数据template
您的薪资处理数据template
- 用于薪资分析的战略数据字段
- 流程发现的关键里程碑
- 特定系统的提取指南
薪资处理属性
| 名称 | 描述 | ||
|---|---|---|---|
| 事件timestamp EventTimestamp | 活动发生的精确日期和时间。 | ||
| 描述 此属性记录事件发生的精确时刻,同时存储日期和时间。它是计算所有基于时间的指标的基础,包括各流程阶段之间的周期时间、提前期和吞吐率。 在SAP ECP中,这源自timestamp字段,如变更文档中的 为何重要 它支持计算事件之间的时间跨度,这对于识别性能瓶颈和违反 SLA 的情况至关重要。 获取方式 CDHDR-UDATE/UTIME、SWWLOGHIST-WI_CD/WI_CT 或特定的审计日志时间戳。 示例 2023-10-25T08:30:00Z2023-10-26T14:15:22Z2023-11-01T09:00:00Z | |||
| 活动 Activity | 薪资流程中发生的具体任务或事件。 | ||
| 描述 此属性捕获正在执行的流程步骤名称,例如“工时表已提交”、“薪资模拟已执行”或“支付已执行”。它构成了流程图的基础,允许分析师可视化薪资周期中执行的操作序列。 此属性的数据从各种日志中采集,包括Workflow日志(SWWLOGHIST)、信息类型变更日志(CDHDR/CDPOS)以及特定的薪资状态表。提取过程中应用了统一的命名规范,以确保技术事件代码转换为业务可读的活动名称。 为何重要 它定义了流程图中的节点,从而实现流程流向、循环和变体的可视化。 获取方式 派生自 SWWLOGHIST (Workflow)、CDHDR (更改文档) 或 PA03 (控制记录) 的状态更改。 示例 工时表已提交应发工资已计算已标记审计异常已执行付款 | |||
| 薪资记录 PayrollRecord | 结合了员工和发薪周期的唯一标识符。 | ||
| 描述 薪资记录 是Process Mining分析的核心case标识符。它代表特定员工在规定发薪周期内的一次薪资处理迭代,链接了从初始工时表提交到最终税务申报的所有活动。 在SAP SuccessFactors Employee Central Payroll中,这通常通过将员工工号(PERNR)与薪资年份(PABRJ)和薪资周期(PABRP)连接来构建,可能还包括用于区分多次运行的序列号(SEQNR)。这种粒度确保每个支付周期都作为独立实例进行分析,从而实现精确的周期时间测量和错误跟踪。 为何重要 它作为 Case ID,将所有相关事件分组,以重建每张已发薪支票的端到端流程路径。 获取方式 构建自 SAP 集群 B2(时间评估结果)或 PC_PAYRESULT 表(PERNR、PABRJ、PABRP、SEQNR)。 示例 10023499-2023-1088291022-2024-01-SEQ01US-10293-2023-52 | |||
| 最后数据更新 LastDataUpdate | 最近一次数据提取的时间戳。 | ||
| 描述 此属性指示数据记录在Process Mining数据模型中最后一次刷新的时间。它帮助分析师了解数据的新鲜度,确保洞察基于最新信息。 虽然不直接用于流程分析,但对于数据治理和校验至关重要,用以验证dashboard是否反映了薪资系统的最新状态。 为何重要 它确保用户了解数据延迟情况,并协助验证报告指标的时效性。 获取方式 由 ETL/提取脚本在运行时生成。 示例 2023-11-05T00:00:00Z2023-11-05T12:00:00Z | |||
| 源系统 SourceSystem | 事件数据起源的系统。 | ||
| 描述 此属性标识提取数据的特定SAP SuccessFactors Employee Central Payroll实例或连接的子系统。在拥有多个薪资系统或混合设置的复杂格局中,此字段确保了数据谱系和可追溯性。 在分析不同地区安装的数据或比较旧系统与迁移后系统的性能时,这特别有用。它通常是在数据提取设置期间配置的静态字符串。 为何重要 它允许在多系统环境中进行数据分段,并通过定位来源协助排除数据质量问题。 获取方式 来自SAP安装或提取配置的系统ID(SID)。 示例 SAP_ECP_NASAP_ECP_EMEASuccessFactors_Core | |||
| 发薪周期 PayPeriod | 财年内的具体周期编号。 | ||
| 描述 此属性表示薪资周期的序列号(例如,01代表一月或第一个双周周期)。它允许分析师跟踪随时间变化的绩效趋势,并识别处理工作负载的季节性。 源自 为何重要 它支持趋势分析,并能识别一年中特定时间的季节性瓶颈。 获取方式 表PA0001或薪资结果集群(RGDIR),字段PABRP。 示例 01122652 | |||
| 员工类型 EmployeeType | 员工分类(例如:正式工、承包商)。 | ||
| 描述 此属性根据雇佣关系对员工进行分类,例如在职、退休或外部顾问。薪资处理复杂性的差异通常与员工类型相关,某些群体需要更多的手动干预或特定的合规检查。 技术上源自SAP中的员工组( 为何重要 它有助于识别流程差异或延误是否仅针对特定的雇用类别。 获取方式 表PA0001,字段PERSG(员工组)和PERSK(员工子组)。 示例 在职员工实习生领退休金者按小时计费承包商 | |||
| 应发工资额 GrossPayAmount | 为该记录计算的总额工资。 | ||
| 描述 此属性代表扣除前的总工资货币价值。它是财务校验的基本指标,用于将高额支付与更严格的审计审查或更长的审批提前期相关联。 从薪资结果表(RT)中提取,通常位于代表总额的特定工资类型下(如/101)。它通过提供计算基础来支持“福利和税务计算准确性”分析。 为何重要 它允许根据付款价值分析流程行为(例如:金额较大的付款是否需要更长的审批时间?)。 获取方式 薪资结果表(RT),工资类型/101或类似项。 示例 5000.002500.5010500.00 | |||
| 成本中心 CostCenter | 与员工关联的成本中心。 | ||
| 描述 成本中心代表分配员工成本的财务部门或单位。它在“工时表审批瓶颈”dashboard中充当部门的替代指标,帮助精准定位哪些组织单位延迟了薪资周期。 在组织分配信息类型(PA0001)中对应的字段为 为何重要 它支持组织层级的穿透分析,以识别导致延误或返工的具体部门。 获取方式 表PA0001,字段KOSTL。 示例 CC-1000 财务CC-2000 ITCC-3000 销售 | |||
| 是否已自动化 IsAutomated | 标记活动是否由系统用户执行。 | ||
| 描述 此布尔属性识别特定流程步骤是由后台作业/系统用户还是由人工执行。这对于“银行转账自动化监控”计算无感处理百分比至关重要。 它通常通过对照已知系统帐户列表(如'BATCH'、'SAP_WORKFLOW')检查用户ID来得出。 为何重要 它有助于衡量自动化率并识别减少人工劳动的机会。 获取方式 派生自用户 ID(例如:如果用户属于 ['BATCH', 'SYSTEM'],则为 true)。 示例 truefalse | |||
| 算薪频率 PayCycleFrequency | 指示运行是常规还是非周期。 | ||
| 描述 此属性区分标准计划薪资运行和用于更正或即时支付的临时“非周期”运行。大量的非周期运行是流程低效的关键指标,并由“非周期支付量分析”dashboard进行跟踪。 它源自薪资集群目录中的非周期原因( 为何重要 这对于衡量“非周期付款比例”KPI 以及有针对性地减少非标处理至关重要。 获取方式 表RGDIR(集群目录),字段OCRSN或PAYTY。 示例 常规纠正 A奖金支付离职 | |||
| 薪资专员 PayrollSpecialist | 处理该记录的人员的用户ID或姓名。 | ||
| 描述 此属性捕获负责执行手动步骤或审批的薪资管理员或专员的身份。它是“专员吞吐量与工作负载”dashboard的核心属性,用于分析工作负载分布和个人生产力。 源自系统日志中的 为何重要 这对于工作负载平衡和识别流程中的人为瓶颈至关重要。 获取方式 在CDHDR或Workflow参与者ID中记录的系统字段(SY-UNAME)。 示例 JSMITHKMILLER系统 | |||
| 薪资范围 PayrollArea | 定义员工所属的具体薪资组。 | ||
| 描述 薪资范围将同一薪资运行中一起处理的员工进行分组,通常基于发薪频率(如月发与双周发)或组织结构。此属性对于细分流程分析以比较不同员工群体的绩效至关重要。 在SAP中,这对应于技术字段 为何重要 它支持在不同群体(如:时薪员工 vs 月薪员工)之间进行薪酬周期性能比较。 获取方式 表PA0001(组织分配),字段ABKRS。 示例 美国双周发德国月薪管理层薪资 | |||
| SLA处理截止日期 SLAProcessingDeadline | 完成薪资运行的目标timestamp。 | ||
| 描述 此属性代表完成薪资核算以确保准时支付的内部或外部截止日期。它通过与实际的“支付已执行”timestamp进行对比,来计算“SLA合规率”KPI。 虽然这并不总是SAP表中的标准字段,但通常维护在自定义控制表中,或基于薪资日历进行概念性定义(例如,发薪日前2天)。对于此数据模型,它通常由发薪日减去设定的缓冲时间得出。 为何重要 它为评估及时性和 SLA 达成情况提供了基准。 获取方式 派生自发薪日 (T549S) 减去配置的处理天数。 示例 2023-10-28T17:00:00Z2023-11-28T17:00:00Z | |||
| 周期时间(天) CycleTimeDays | 薪资流程的总时长(天)。 | ||
| 描述 此计算属性测量从流程开始(如工时表已提交)到结束(如支付已执行)所经过的时间。它提供了流程速度的高层级视图,并用于“端到端薪资周期时长”dashboard。 它是通过计算给定case的最大和最小timestamp之间的差值得出的。 为何重要 这是评估整体流程效率和速度的核心指标。 获取方式 计算方式:Case 的结束时间 - 开始时间。 示例 5.52.010.1 | |||
| 审计异常标记 AuditExceptionFlag | 指示是否发生审计异常的标记。 | ||
| 描述 此属性标记在薪资模拟或计算期间校验规则触发异常或警告的case。它是“审计异常频率”KPI的主要输入。 数据通常源自薪资日志或特定的错误消息表(FEHLER)。True值表示流程中包含了异常处理路径。 为何重要 它突出了数据质量问题以及对人工干预的需求。 获取方式 派生自薪酬日志中存在的错误消息或特定状态代码。 示例 truefalse | |||
| 法人实体 LegalEntity | 员工的公司代码或法律实体。 | ||
| 描述 此属性识别与薪资记录关联的法律实体(公司代码)。它允许跨不同子公司或法人实体进行薪资绩效的财务报告和分析。 源自组织分配信息类型(PA0001)中的 为何重要 它支持跨公司基准对比和财务分配分析。 获取方式 表PA0001,字段BUKRS。 示例 US01DE011000 | |||
| 税务辖区 TaxJurisdiction | 适用于员工的税务地区或税务机关。 | ||
| 描述 此属性识别管辖该薪资记录的具体税务机关或地区(如州、省、州郡)。这对于“审计异常与合规风险”dashboard在地理上标注合规问题热点至关重要。 在SAP美国薪资中,这是 为何重要 它支持按监管区域对合规风险和审计异常进行细分。 获取方式 表PA0001或PA0207/PA0208,字段TXJCD。 示例 CA纽约TX返工次数 | |||
| 返工计数 ReworkCount | 执行更正的次数。 | ||
| 描述 此计算指标统计“执行数据更正”活动在case历史中出现的次数。它是流程低效的直接度量,支持“手动更正与返工率”dashboard。 高返工计数表明存在持续的数据质量问题,或存在无法通过首次校验的复杂case。 为何重要 它量化了在错误纠正上损失的精力,并为数据质量改进计划提供了依据。 获取方式 通过统计每个 CaseId 的“已执行数据纠错”活动次数计算得出。 示例 013 | |||
薪资处理活动
| 活动 | 描述 | ||
|---|---|---|---|
| 工时表已批准 | 经理或管理员对工时数据的正式审批。此状态变更验证了要传输到薪资引擎的数据。 | ||
| 为何重要 计算工时表审批提前期 KPI。此处的瓶颈通常意味着管理延误或复杂的审批层级。 获取方式 员工中心 Workflow 请求表 (WfRequest),过滤状态为“已完成”或“已审批”。 捕获 在 Workflow 状态更改为“已审批”时记录 事件类型 explicit | |||
| 工时表已提交 | 员工或经理提交该薪资周期工时数据的事件。这是从链接到ECP的Employee Central模块中的workflow请求日志中捕获的。 | ||
| 为何重要 标记数据累积阶段的开始。此处的延迟会影响下游,导致薪资处理窗口被压缩。 获取方式 员工中心 Workflow 请求表 (WfRequest),过滤“工时表”或“休假”类别。 捕获 在 Workflow 状态更改为“已提交”时记录 事件类型 explicit | |||
| 已执行付款 | 支付流程的最终完成,通常由银行确认或F110付款运行结束为准。 | ||
| 为何重要 SLA合规率的主要结束timestamp。决定员工是否被准时支付。 获取方式 付款运行表(REGUH)的运行日期和时间,或从起息日推断。 捕获 在付款运行状态设置为“已过账/完成”时记录 事件类型 explicit | |||
| 应发工资已计算 | 总薪资方案计算的成功执行。在标准处理中,这发生在薪资驱动程序写入PCL2集群时。 | ||
| 为何重要 这是一个重要的里程碑,表明工时和费率数据已成功结合。此处的延误会影响“从应发到实发”的处理效率。 获取方式 集群 PCL2(薪酬结果),特别是“所属期间”的目录表 (RGDIR) 时间戳。 捕获 在薪酬集群中写入新序列号时记录 事件类型 explicit | |||
| 税务申报完成 | 税务申报文件的生成(例如美国的PU19)或传输到第三方税务申报服务商。 | ||
| 为何重要 确保监管合规。追踪序列中最后的合规步骤。 获取方式 税务申报日志管理器或B2A管理器日志,显示文件生成成功。 捕获 在税务报表运行成功完成时记录 事件类型 explicit | |||
| 薪资模拟已执行 | 薪酬驱动器的测试运行,用于在不将结果提交到数据库的情况下识别错误。这是 PCC 校验阶段的关键步骤。 | ||
| 为何重要 对于计算“一次计算成功率”至关重要。重复模拟通常意味着存在数据质量问题。 获取方式 步骤类型对应于模拟的薪资控制中心步骤实例日志(PYC_D_STEP_INST)。 捕获 在 PCC 模拟步骤状态更改为“已完成”时记录 事件类型 explicit | |||
| 薪资流程已初始化 | 在薪资控制中心(PCC)内创建薪资流程实例。这标志着特定薪资范围薪资周期的正式开始。 | ||
| 为何重要 为整体端到端薪资周期时长设置基准。它定义了要处理的员工范围。 获取方式 薪资控制中心表(如PYC_D_PY_PROC_INST),跟踪新流程ID的创建。 捕获 在创建 PCC 流程实例时记录 事件类型 explicit | |||
| 薪资记录已批准 | 对员工或薪资组薪资结果的正式签核。这发生在PCC的“监控”或“签核”步骤中。 | ||
| 为何重要 标记计算/验证阶段结束并释放支付。对专员吞吐量分析至关重要。 获取方式 审批或确认步骤的薪资控制中心步骤实例日志(PYC_D_STEP_INST)。 捕获 在 PCC 审批步骤状态更改为“已完成”时记录 事件类型 explicit | |||
| 银行转账文件已生成 | 创建初步数据介质交换(pre-DME)或最终DME文件。这会生成发给银行的付款指令。 | ||
| 为何重要 跟踪银行转账自动化监控。文件生成失败是关键的流程中断。 获取方式 来自 DME / 付款媒介工作台 (PMW) 执行的日志,通常存储在 TemSe 或特定的付款运行表 (ReguH/ReguP) 中。 捕获 在付款运行 (F110/RPCIPE) 创建输出时记录 事件类型 explicit | |||
| 工资单已发布 | 通过self-service(ESS)向员工提供薪酬对账单的操作。 | ||
| 为何重要 衡量工资单交付SLA绩效。此处的延迟会产生服务台工单。 获取方式 根据工资单混合服务日志中的“打印日期”或可用日期配置推导得出。 捕获 根据发薪日 + 系统配置延迟计算 事件类型 inferred | |||
| 已执行数据纠错 | 针对审计异常对主数据或时间数据进行的更改。这代表了清除薪酬警报所需的返工。 | ||
| 为何重要 跟踪手动更正和返工率。这是导致流程低效的主要活动。 获取方式 通过将 PCC 警报时间戳与警报关闭前同一员工随后的审计日志更改 (PCL4) 进行联接推导得出。 捕获 识别在 PCC 警报处于活动状态时发生的主数据更新 事件类型 inferred | |||
| 已标记审计异常 | 薪资控制中心策略检查生成的校验告警。这些告警识别了数据不一致或合规风险。 | ||
| 为何重要 直接支持“审计异常频率”和“合规风险”仪表板。高业务量通常暗示上游存在数据质量问题。 获取方式 薪资控制中心告警表(PYC_D_ALERT),将特定错误代码链接到员工记录。 捕获 在 PCC 警报表中创建新条目时记录 事件类型 explicit | |||
| 激励数据已导入 | 将奖金或佣金等非标准薪资数据摄入薪资系统。通常涉及将数据加载到信息类型0015或2010中。 | ||
| 为何重要 导入延迟会导致应发工资计算不准确。对此进行分析有助于优化“激励数据集成提前期”。 获取方式 审计日志(PCL4 或同等表),显示在信息类型 0015(附加支付)或 2010(员工薪酬信息)中创建记录的情况。 捕获 将信息类型创建时间戳与导入作业日志进行对比 事件类型 inferred | |||
| 福利扣款已应用 | 计算方案中处理福利逻辑的具体步骤。虽然是主运行的一部分,但将其分离出来有助于精准定位配置错误。 | ||
| 为何重要 支持福利和税务计算准确性分析。对于调试复杂的扣除逻辑差异非常有用。 获取方式 根据薪酬结果中 V0 拆分的存在推导得出,或者如果启用了详细日志记录(在生产环境中较罕见),则根据特定日志条目推导。 捕获 与“应发工资已计算”一致,但在分析时概念上相互独立 事件类型 inferred | |||
提取指南
步骤
- 确定提取的目标薪酬范围和周期参数。您将主要从薪酬控制中心 (PCC) 表 (PYC_*) 和薪酬集群目录 (HRPY_RGDIR) 中提取数据。
- 启动连接到 SAP SuccessFactors 员工中心薪酬 (ECP) 后端 Schema 的 SQL 客户端或 SAP HANA Studio。
- 执行“查询”部分提供的数据提取脚本。该脚本聚合了来自主数据表、薪酬结果和 PCC 审计日志的数据。
- 映射“已提交工时表”和“已审批工时表”活动。由于 ECP 通常从 Employee Central 接收此类数据,请使用表 PA2001 中的创建和最后修改时间戳,或使用专门的时间接口表(如 PTREQ_HEADER,如果可用)。
- 通过查询信息类型 0015(附加支付)和 2010(员工薪酬信息)中在目标薪资周期内创建的记录,提取“已导入激励数据”。
- 从表 PYC_D_PYP(流程实例)和 PYC_D_BINST(步骤实例)中检索 PCC 流程步骤,以捕获“薪酬流程已启动”、“薪酬模拟已执行”、“薪酬记录已审批”和“工资单已发布”。
- 查询表 PYC_D_ALERT 以识别“已标记审计异常”事件。这些记录将特定员工与 PCC 检查步骤中发现的校验错误关联起来。
- 在活动薪酬窗口期间,通过将 SAP 更改文档头表 (CDHDR) 与薪酬相关的信息类型(如 0008、0015、2001)联接,生成“已执行数据纠错”事件。
- 利用表 HRPY_RGDIR 精准定位“应发工资已计算”的确切时刻。利用相同的时间戳为“福利扣款已应用”创建一个派生事件,因为这两者在 Schema 运行期间是同时发生的。
- 关联来自表 REGUH(结算数据)和 REGUT(DME 管理)的财务数据,以捕获“银行转账文件已生成”和“付款已执行”。
- 转换
PayrollRecord列,使其严格遵循 [员工ID]-[周期]-[年份] 格式,以确保 Case ID 的唯一性。 - 将最终数据集导出为 CSV 文件,确保标题与合同中定义的属性匹配,然后上传至 ProcessMind。
配置
- 时间范围: 配置提取最近 6 到 12 个月的滚动窗口。薪酬流程具有周期性,该范围能捕捉到常规和非周期运行中的充分差异。
- 薪酬范围 (ABKRS): 按特定的薪酬范围(如:美国月薪、德国周薪)进行过滤,确保分析是在相似的流程周期之间进行比较。
- 语言: 确保 Activity 和流程步骤的描述是以系统主语言提取的(例如:SPRAS = 'E')。
- PCC 流程 ID: 在 PCC 配置中识别用于“监控”、“生产”和“非周期”的特定流程定义 ID (PYP_ID),以便过滤相关步骤。
- 货币: 如果提取全球薪酬运营数据,请将财务金额(应发工资额)统一换算为单一货币。
- 授权: 数据库用户需要对人力资源 (PA/PY) 表具有读取权限,特别是集群目录 (HRPY_RGDIR) 和 PCC 表 (PYC_*)。
a 查询示例 config
/* Activity 1: Time Sheet Submitted */
SELECT
CONCAT(T.PERNR, CONCAT('-', T.PABRJ, T.PABRP)) AS PayrollRecord,
'Time Sheet Submitted' AS Activity,
T.BEGDA AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
T.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
T.PABRP AS PayPeriod,
CASE WHEN T.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
T.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM PA2001 AS T
LEFT JOIN PA0001 AS O ON T.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE T.AEDTM BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 2: Time Sheet Approved */
SELECT
CONCAT(T.PERNR, CONCAT('-', T.PABRJ, T.PABRP)) AS PayrollRecord,
'Time Sheet Approved' AS Activity,
T.AEDTM AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
T.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
T.PABRP AS PayPeriod,
CASE WHEN T.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
T.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'False' AS IsAutomated
FROM PA2001 AS T
LEFT JOIN PA0001 AS O ON T.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE T.AEDTM BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 3: Incentive Data Imported */
SELECT
CONCAT(I.PERNR, CONCAT('-', I.PABRJ, I.PABRP)) AS PayrollRecord,
'Incentive Data Imported' AS Activity,
I.AEDTM AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
I.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
I.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
I.BETRG AS GrossPayAmount,
I.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM PA0015 AS I
LEFT JOIN PA0001 AS O ON I.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE I.AEDTM BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 4: Payroll Process Initialized */
SELECT
CONCAT('N/A', CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Payroll Process Initialized' AS Activity,
P.CREATED_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
P.CREATED_BY AS PayrollSpecialist,
NULL AS CostCenter,
'False' AS IsAutomated
FROM PYC_D_PYP AS P
WHERE P.CREATED_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 5: Payroll Simulation Executed */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Payroll Simulation Executed' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Simulate%' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 6: Audit Exception Flagged */
SELECT
CONCAT(A.RO_ID, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Audit Exception Flagged' AS Activity,
A.CREATED_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
'SYSTEM' AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_ALERT AS A
JOIN PYC_D_PYP AS P ON A.PYP_ID = P.ID
WHERE A.CREATED_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 7: Data Correction Performed */
SELECT
CONCAT(C.OBJECTID, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Data Correction Performed' AS Activity,
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME)) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
C.USERNAME AS PayrollSpecialist,
NULL AS CostCenter,
'False' AS IsAutomated
FROM CDHDR AS C
JOIN HRPY_RGDIR AS P ON C.OBJECTID = P.PERNR
WHERE C.TCODE IN ('PA30', 'PA40') AND C.UDATE BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 8: Gross Pay Calculated */
SELECT
CONCAT(R.PERNR, CONCAT('-', R.PABRJ, R.PABRP)) AS PayrollRecord,
'Gross Pay Calculated' AS Activity,
TO_TIMESTAMP(CONCAT(R.RUNDT, R.RUNTM)) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
R.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
R.PABRP AS PayPeriod,
CASE WHEN R.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
R.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM HRPY_RGDIR AS R
LEFT JOIN PA0001 AS O ON R.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE R.RUNDT BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 9: Benefit Deductions Applied */
SELECT
CONCAT(R.PERNR, CONCAT('-', R.PABRJ, R.PABRP)) AS PayrollRecord,
'Benefit Deductions Applied' AS Activity,
ADD_SECONDS(TO_TIMESTAMP(CONCAT(R.RUNDT, R.RUNTM)), 1) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
R.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
R.PABRP AS PayPeriod,
CASE WHEN R.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
R.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM HRPY_RGDIR AS R
LEFT JOIN PA0001 AS O ON R.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE R.RUNDT BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 10: Payroll Record Approved */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Payroll Record Approved' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'False' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Check%' AND S.STATUS = 'OK' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 11: Bank Transfer File Generated */
SELECT
CONCAT(P.PERNR, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Bank Transfer File Generated' AS Activity,
TO_TIMESTAMP(CONCAT(T.TSDAT, T.TSTIM)) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
T.USRID AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM REGUT AS T
JOIN REGUH AS H ON T.LAUFD = H.LAUFD AND T.LAUFI = H.LAUFI
JOIN HRPY_RGDIR AS P ON H.PERNR = P.PERNR
LEFT JOIN PA0001 AS O ON P.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE T.TSDAT BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 12: Payment Executed */
SELECT
CONCAT(P.PERNR, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Payment Executed' AS Activity,
TO_TIMESTAMP(CONCAT(H.LAUFD, '120000')) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
H.RBETR AS GrossPayAmount,
H.ZNME1 AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM REGUH AS H
JOIN HRPY_RGDIR AS P ON H.PERNR = P.PERNR
LEFT JOIN PA0001 AS O ON P.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE H.LAUFD BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 13: Pay Slip Published */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Pay Slip Published' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Remuneration%' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 14: Tax Filing Completed */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Tax Filing Completed' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Tax%' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]' 步骤
- 访问 ABAP 编辑器: 通过 SAP GUI 登录您的 SAP SuccessFactors 员工中心薪酬 (ECP) 系统。导航至事务代码 SE38 (ABAP 编辑器)。
- 创建程序: 为新程序输入名称,例如
Z_PROCESSMINING_PAYROLL_EXT,然后点击创建。选择类型为可执行程序,并将其保存为本地对象(包 $TMP)以供测试。 - 实施代码: 复制下方“查询”部分提供的完整 ABAP 代码并将其粘贴到编辑器中,替换任何现有的默认代码。
- 检查并激活: 点击检查按钮 (Ctrl+F2) 验证语法。状态无误后,点击激活 (Ctrl+F3)。
- 执行提取: 按直接处理 (F8) 运行报告。
- 配置选择: 在选择屏幕中,输入
薪酬范围(例如 US、99)、有效的日期范围(例如最近 3 个月),并可选择按特定人员编号(PERNR) 进行过滤以进行测试。 - 运行提取: 执行报告。系统将处理 HRPY_RGDIR、CATSDB、PA0015 和 REGUH 表以构建事件日志。
- 查看输出: 该报告利用
cl_demo_output直接在屏幕上以网格视图显示结果,以便立即验证。 - 导出数据: 右键点击结果网格,选择电子表格,并将文件保存为 CSV 或 Excel 格式。
- 为 ProcessMind 格式化: 打开导出的文件。确保
EventTimestamp列的格式为YYYY-MM-DD HH:MM:SS。验证PayrollRecord列是否唯一标识 Case(通常为 PERNR-SEQNR)。 - 上传: 将清理后的 CSV 文件导入 ProcessMind,并相应地映射 Case ID、Activity、Timestamp 和属性列。
配置
- 日期范围: 建议按 3 到 6 个月的周期分块提取数据,以避免 ABAP 运行时环境出现内存超时。
- 薪酬范围: 这是一个关键的过滤器(表 T549A)。务必一次仅提取一个薪酬范围(例如:月薪 vs 双周薪),以确保流程的一致性。
- 配置表: 该脚本以
HRPY_RGDIR(薪酬目录)为主要驱动表。请确保您的用户拥有该表的S_TABU_DIS授权。 - 考勤数据源: 脚本假设 Time Sheet 数据存储在
CATSDB中。如果您使用的是直接对接IT2001或IT2010而不通过 CATS 的第三方打卡系统,Time Sheet 活动可能会显示为空,需要对脚本进行调整。 - 付款数据: 脚本通过
REGUH(结算数据)将薪酬运行与付款运行关联。请确保已执行所选周期的F110付款运行,以便查看付款事件。 - 性能: 对于高业务量系统(10 万名以上员工),请将
SELECT *逻辑替换为基于游标的提取,或在后台模式 (F9) 下运行。
a 查询示例 abap
REPORT Z_PROCESSMINING_PAYROLL_EXT.
TABLES: pernr, hrpy_rgdir, catsdb, pa0015, reguh.
TYPES: BEGIN OF ty_event_log,
payroll_record TYPE string,
activity TYPE string,
event_timestamp TYPE string,
source_system TYPE string,
last_data_update TYPE string,
payroll_area TYPE abkrs,
employee_type TYPE persg,
pay_period TYPE pabrj,
pay_cycle_freq TYPE string,
gross_pay_amount TYPE string,
payroll_specialist TYPE usnam,
cost_center TYPE kostl,
is_automated TYPE string,
END OF ty_event_log.
DATA: gt_output TYPE TABLE OF ty_event_log,
gs_output TYPE ty_event_log,
gt_rgdir TYPE TABLE OF hrpy_rgdir,
gs_rgdir TYPE hrpy_rgdir,
gt_cats TYPE TABLE OF catsdb,
gs_cats TYPE catsdb,
gt_p0015 TYPE TABLE OF pa0015,
gs_p0015 TYPE pa0015,
gt_reguh TYPE TABLE OF reguh,
gs_reguh TYPE reguh,
gv_tstamp TYPE timestamp,
gv_date TYPE d,
gv_time TYPE t,
gv_pernr TYPE pernr_d.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_pernr FOR pernr-pernr,
s_date FOR sy-datum OBLIGATORY.
PARAMETERS: p_abkrs TYPE abkrs OBLIGATORY DEFAULT '99'.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
" 1. Fetch Payroll Directory (The Core Process Driver)
SELECT * FROM hrpy_rgdir INTO TABLE gt_rgdir
WHERE pernr IN s_pernr
AND fpper LIKE '%'
AND cdate IN s_date.
IF gt_rgdir IS INITIAL.
WRITE: / 'No payroll results found for selection.'.
EXIT.
ENDIF.
SORT gt_rgdir BY pernr seqnr.
" Loop through Payroll Directory to build events
LOOP AT gt_rgdir INTO gs_rgdir.
CLEAR gs_output.
CONCATENATE gs_rgdir-pernr '-' gs_rgdir-seqnr INTO gs_output-payroll_record.
gs_output-source_system = 'SAP_ECP'.
gs_output-last_data_update = sy-datum.
gs_output-payroll_area = p_abkrs.
gs_output-pay_period = gs_rgdir-fpper.
gs_output-payroll_specialist = gs_rgdir-uname.
" --- Activity: Payroll Process Initialized ---
" Derived from the run date start
gs_output-activity = 'Payroll Process Initialized'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Payroll Simulation Executed ---
IF gs_rgdir-srtza = 'S'. " S = Simulation
gs_output-activity = 'Payroll Simulation Executed'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
ENDIF.
" --- Activity: Audit Exception Flagged ---
IF gs_rgdir-void IS NOT INITIAL. " Void indicator means rejected/exception
gs_output-activity = 'Audit Exception Flagged'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Data Correction Performed ---
" Inferred: If voided, a correction usually follows immediately
gs_output-activity = 'Data Correction Performed'.
" Add 1 hour to simulate reaction time
DATA: lv_corr_time TYPE t.
lv_corr_time = gs_rgdir-ctime + 3600.
CONCATENATE gs_rgdir-cdate lv_corr_time INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDIF.
" --- Activity: Gross Pay Calculated ---
IF gs_rgdir-srtza = 'A'. " A = Actual Result
gs_output-activity = 'Gross Pay Calculated'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-gross_pay_amount = '1000.00'. " Placeholder: Cluster read required for actual amount
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Benefit Deductions Applied ---
" Logically occurs immediately after gross calc
gs_output-activity = 'Benefit Deductions Applied'.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Payroll Record Approved ---
" Inferred from successful write of 'A' record
gs_output-activity = 'Payroll Record Approved'.
DATA: lv_appr_time TYPE t.
lv_appr_time = gs_rgdir-ctime + 60. " +1 minute
CONCATENATE gs_rgdir-cdate lv_appr_time INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
" --- Activity: Pay Slip Published ---
" Available via ESS usually next day
gs_output-activity = 'Pay Slip Published'.
DATA: lv_slip_date TYPE d.
lv_slip_date = gs_rgdir-cdate + 1.
CONCATENATE lv_slip_date '080000' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Tax Filing Completed ---
" End of period logic
gs_output-activity = 'Tax Filing Completed'.
DATA: lv_tax_date TYPE d.
lv_tax_date = gs_rgdir-paydt.
CONCATENATE lv_tax_date '235959' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
ENDIF.
ENDLOOP.
" 2. Fetch Time Sheet Data (CATSDB)
" Linking to Payroll Record loosely via Period/Date
SELECT * FROM catsdb INTO TABLE gt_cats
WHERE pernr IN s_pernr
AND workdate IN s_date.
LOOP AT gt_cats INTO gs_cats.
CLEAR gs_output.
CONCATENATE gs_cats-pernr '-00000' INTO gs_output-payroll_record. " Generic mapping
gs_output-payroll_area = p_abkrs.
gs_output-source_system = 'SAP_ECP'.
" --- Activity: Time Sheet Submitted ---
IF gs_cats-status = '20' OR gs_cats-status = '30'.
gs_output-activity = 'Time Sheet Submitted'.
CONCATENATE gs_cats-laudate gs_cats-lautime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDIF.
" --- Activity: Time Sheet Approved ---
IF gs_cats-status = '30'. " 30 = Approved
gs_output-activity = 'Time Sheet Approved'.
CONCATENATE gs_cats-apdat gs_cats-aptime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDIF.
ENDLOOP.
" 3. Fetch Incentive Data (Infotype 0015)
SELECT * FROM pa0015 INTO TABLE gt_p0015
WHERE pernr IN s_pernr
AND begda IN s_date.
LOOP AT gt_p0015 INTO gs_p0015.
CLEAR gs_output.
CONCATENATE gs_p0015-pernr '-00000' INTO gs_output-payroll_record.
gs_output-source_system = 'SAP_ECP'.
gs_output-payroll_area = p_abkrs.
" --- Activity: Incentive Data Imported ---
gs_output-activity = 'Incentive Data Imported'.
CONCATENATE gs_p0015-aedtm '120000' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDLOOP.
" 4. Fetch Payment Data (REGUH)
SELECT * FROM reguh INTO TABLE gt_reguh
WHERE zaldt IN s_date.
LOOP AT gt_reguh INTO gs_reguh.
" Filter for our PERNRs roughly (REGUH does not always have PERNR directly indexable easily in all views)
" For simulation, we map broadly or require join logic. Here assuming simple extraction.
CLEAR gs_output.
CONCATENATE gs_reguh-pernr '-99999' INTO gs_output-payroll_record.
gs_output-source_system = 'SAP_ECP'.
gs_output-payroll_area = p_abkrs.
" --- Activity: Bank Transfer File Generated ---
gs_output-activity = 'Bank Transfer File Generated'.
CONCATENATE gs_reguh-laufd gs_reguh-cpzut INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Payment Executed ---
gs_output-activity = 'Payment Executed'.
CONCATENATE gs_reguh-zaldt '100000' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
ENDLOOP.
" Output Display
cl_demo_output=>display( gt_output ).