出勤天数×底薪核算:中途入职折算、病假打折、全勤奖,一个脚本对清
上一篇加班费倍率复核管的是「加班那部分钱」,这篇往前钻一层:底薪部分。工资条上的应发 = 出勤折算底薪 − 请假扣款 + 全勤奖,坑密度比加班费还高:
- 21.75 是什么:月计薪天数 = (365-104)/12 ≈ 21.75。日薪 = 底薪/21.75,不是 /30 也不是 /22——除错基数,每个请假天数的扣款就差 38%。
- 中途入职/离职要按月折算:9 月 15 日入职,只该发在职工作日/21.75 × 底薪,不是全额。
- 病假不是事假:病假按规定比例计发(各地不同,常见 60%),只扣 40%。按事假全额扣就是多发扣、少发钱。
- 全勤奖的口径:事假、缺勤通常直接取消全勤;病假是否影响,公司制度说了算——但发不发要和制度一致。
脚本做什么
输入两张表:考勤表(姓名/日期/状态:出勤·事假·病假·缺勤)+ 工资条(姓名/底薪/入职日期/应发合计)。对每个人按标准算法算出应发,和工资条逐人比对:
- 差额 > 0.05 元 → 少发;< -0.05 → 多发
- 并列给出所有能复现工资条金额的原因假设,不是只报第一个
- 工资条有、考勤表无此人 → 凭空多算;反过来 → 漏发
- 法定节假日表可用
HOLIDAYS环境变量覆盖,病假比例SICK_RATE、全勤奖FULL_BONUS同理可配
实跑结果:9 人埋 6 类坑,全对出
2026 年 9 月(21 个工作日,含中秋 3 天法定假),底薪 6525(日薪 300),全勤奖 300:
| 姓名 | 情况 | 工资条 | 脚本结论 |
|---|---|---|---|
| 张三/郑十一 | 全勤对照组 | 正确 | 一致,零误报 |
| 李四 | 事假2天,工资条按全月底薪发 | 6525 | 多发 600 → 事假未扣 |
| 王五 | 病假3天,被按事假全额扣 | 5925 | 少发 540 → 病假未按60%计发 |
| 赵六 | 9-15 中途入职,正确折算 | 3600 | 一致(折算 6525×11/21.75+300) |
| 孙七 | 缺勤2天,工资条按全月底薪发 | 6525 | 多发 600 → 缺勤未扣 |
| 吴十 | 事假1天,日薪按/30算且照发全勤 | 6607.5 | 多发 382.5 → 日薪按30天折算且照发全勤(复合错法) |
| 周九 | 考勤表有、工资条无 | — | 漏发 |
| 钱十二 | 考勤表无、工资条发 5300 | 5300 | 凭空多算 |
这次实跑揪出的真坑:复合错法
吴十的坑我故意埋成「双重错」:日薪按 30 天折(少扣 82.5)且请了事假还照发全勤奖(多发 300)。如果原因猜测还是 if/elif 只报第一个吻合的假设,两个假设各自单独都不等于 6607.5,会报「未匹配到已知错法,需人工核对」——排查者就得从零开始。
解法:把已知错法的组合也列进候选(「日薪按30天折算且照发全勤奖(复合错法)」),命中后写明是复合错法。上一条教训(解释要并列)的延伸:单假设覆盖不了真实世界,错误经常是叠加的。
边界 7 项全过
- 考勤表缺列 → 报错并打印实际表头,不静默
- 坏日期「9月1日」→ 报错不静默跳过
- 空考勤表(只有表头)→ 报错不崩
- 非法状态(如「旷工!」)→ 报错并列出合法值
- 文件不存在 → 报错
HOLIDAYS覆盖生效(法定假天数随之变化)- 同输入两次运行输出逐格一致(内容级幂等)
用起来
python attendance_payroll_recon.py 考勤表.xlsx 工资条.xlsx 复核结果.xlsx
# 可选:HOLIDAYS=2026-10-01,2026-10-02 SICK_RATE=0.6 FULL_BONUS=300
脚本和生成测试数据的自测脚本在 gitee 仓库,也可以直接找我们定制:考勤系统导出格式千奇百怪(钉钉、企业微信、手工 Excel),按你的实际格式改好交付。
相关:加班工时对账 · 加班费倍率复核 · 考勤月度汇总 · 三表联合工资体检单 · 请假状态筛选
喵窝资源铺 · AI 自动化脚本服务 · 虚拟物品,交付后不退款 · 每单附真实运行截图