HR 与薪资
GitHub用于多辖区雇佣记录、排班、休假、报销、贷款、薪资和法定缴款的 Bolt 工作区。每次薪资批次为每份雇佣合同生成一张工资单,并关联其结算的记录。
应用与角色
| 应用 | 用途 |
|---|---|
| 员工自助 | 本人排班、休假、报销和工资单 |
| 实体 | 法律实体、班次模式与定义、假日 |
| 人员 | 档案、雇佣合同、人脸登记和离职 |
| 事件 | 排班与考勤、休假、报销、一次性付款、贷款 |
| 薪资 | 常规与非周期批次、工资单和导出 |
| 设置 | 辖区版本、目录、规则和行为 |
五个 HR 应用位于 src/app/hr_controller/,员工自助位于 src/app/hr_employee/。团队(src/access_control/team/+team.ts)关联以下策略:
| 团队 | 策略 | 应用 |
|---|---|---|
| Employee | employee |
员工自助 |
| Supervisor、Production Manager | supervisor |
员工自助、人员 |
| L1 Manager | manager |
全部 HR 应用与员工自助 |
| Senior Management | senior_management |
全部 HR 应用与员工自助 |
| HQ Payroll HR、Manager (HR Controller) | hr_controller |
全部 HR 应用与员工自助 |
| HR Manager | hr_manager |
全部 HR 应用与员工自助 |
| Attendance Kiosk | kiosk |
attendance 终端 |
自动化以 hr_controller(calendar_tick,以及与 payslip_hold_automation 一起的 behaviour_taps)或各自的 *_automation 策略运行;src/access_control/policy/grants.ts 存放各策略共用的授权片段。种子包在 sys_user.team 中记录员工所属团队。
终端。 attendance(/kiosk/attendance):无界面框架的考勤打卡设备,由 Attendance Kiosk 团队打开。
数据模型
各国法规是数据而非代码。每个辖区是一组带生效日期、已封存的 jurisdiction_settings 版本,附带目录行(statutory_contribution、leave、claim、adhoc、loan、allowance、work)和 rule_set 行。费率、档位、资格和计价都是这些行上的 CEL 表达式,行为(例如离职休假兑现)是设置版本上的规则。src/lib/payroll_engine/ 下的引擎只负责求值,不含任何辖区专属逻辑。法规变更即新版本,无需改动源代码。
各辖区的配置内容及缺口记录在各辖区跟踪表。
辖区版本以经校验的自定义字段持有停工类别定义。工作区共有 27 个模型;薪资变动、结算/付款记录以及独立复核的运营记录各自保留身份。
自动化与集成
| 自动化 | 触发方式 | 结果 |
|---|---|---|
behaviour_taps |
创建薪资批次;雇佣合同离职事实或期间更新 | 执行版本的行为规则:每条规则读取其声明的记录并返回写入。 |
statutory_drift |
每月或按需 | 为每个已封存且生效的谱系排队一次 statutory_lineage。不会封存。 |
statutory_lineage |
由 statutory_drift 排队或按需 |
对照官方来源检查一个谱系;变更生成一个未封存草稿供复核。 |
late_arrival_notice |
每五分钟 | 排班超过实体宽限时间仍无打卡时,每人每日提醒一次。 |
calendar_tick |
每日 | 为每个在职雇佣执行行为规则,使按日期触发的义务生成任务。 |
invitation_profile |
邀请员工;创建员工用户或其联系方式变更 | 为受邀员工创建雇佣档案,并在接受邀请后关联其身份。 |
薪资热线
员工通过 WhatsApp 查询自己的工资单,每个法人实体一个号码。源角色为 src/agent/envoy/+payroll_hotline.envoy.ts,
其全部权限即 payroll_hotline 策略。管理员在“设置 → 集成”中添加并配对 WhatsApp 实例;HR 在实体的“常规”页签中将该号码选为
薪资热线(entity.hotline),保存后点击“在此号码上应答薪资问题”。员工的 WhatsApp 号码由管理员记录在其账号上。私信只持有
payroll_hotline(dm: 'envoy',管理员亦然):只读取发信人自己、且属于其所联系号码对应实体的工资单,不做任何写入。未知号码
收到一条固定提示,群组消息一律忽略。
种子
- base:
seed/jurisdiction/<CODE>/version_*/中九个已封存的辖区谱系(SG、MY、PH、ID、VN、TW、CN、JP 和 TH)及其目录与规则集;seed/overtime_policies.ts为每个版本补充加班规则。 - sample(私有):
seed/seed.ts在bolt build --bank=<checkout>时读取种子库的norbital_hr树:实体、人员、合同、排班及其记录。排班日的加班与奖励工时由打卡超出计划班次的部分推导,因此种子库中手填的工时不会读入。
检查
pnpm install
pnpm check # bolt check
pnpm test # bolt build --bank=$SEED_BANK(默认 ../../seed_bank)、bolt test,然后 test:node
pnpm test:node # vitest.node.config.ts:tests/ 中的 Node 端测试
pnpm lint # prettier --check .