2026-10-09 · 喵窝资源铺
钱账系列再补一篇合规侧:每年调基数,HR 按旧数报、工资表忘同步、有人工资超上限忘了封顶——错的不只是报表,是真金白银的补缴和滞纳金。这版脚本把申报基数逐人×工资表核对一遍,代码实跑验证,真实输出贴在下面。
测试数据:7 名员工,故意埋 5 处陷阱——李娜工资 3000 低于下限 4462 还按 3000 报;王强工资 30000 忘了封顶 22311;赵敏工资 10000 只报 5000;陈晨基数没问题但工资表社保扣款 3800(应扣 997.5);孙悦扣款直接是 0;刘洋工资为 0 却还在报基数 6000。跑完(基数下限 4462 / 上限 22311,个人合计费率 10.5% 示例):
E001 张伟 → 正常 E002 李娜 → 申报基数3000低于下限4462,应按下限核 → 少缴约153.51/月(个人);工资表扣款300≠应扣468.51 E003 王强 → 申报基数30000超上限22311,应封顶 → 多缴约807.34/月(个人);工资表扣款3000≠应扣2342.65 E004 赵敏 → 基数5000≠工资10000(限内低报/高报,需有政策依据);工资表扣款500≠应扣525.00 E005 陈晨 → 工资表扣款3800≠应扣997.50(按核定基数9500×10.5%) E006 刘洋 → 工资为0/空但仍申报基数6000,数据矛盾 E007 孙悦 → 工资表扣款0≠应扣840.00(按核定基数8000×10.5%) 核对完成: 7 人, 异常 6 人
逐项验收:低报、超封顶、限内低报、扣款漏算、停发矛盾全对出;对照张伟零误报。边界:空表明确报错退出;缺列报错;下限>上限直接报错(参数手滑不该生成一张全错的表);幂等:同输入连跑两次输出一致。5 项边界测试全过。
| 结论 | 判定 |
|---|---|
| 应托底(少缴) | 申报基数 < 下限 → 按下限核,差额×费率 = 每月少缴额 |
| 应封顶(多缴) | 申报基数 > 上限 → 按上限核,多缴不是违规但白白多扣,一样要提醒 |
| 限内低报/高报 | 基数≠工资且不在上下限上 → 单独列,标「需有政策依据」(有些公司合规允许按上年均值报) |
| 扣款对账 | 工资表社保扣款 ≠ 核定基数×费率(误差>1元)→ 报差异,这最容易漏 |
思路与前几篇一致:先核定「应然」(按政策该扣多少),再对「实然」(工资表真扣了多少),差异落到人头。费率和上下限做成命令行参数——各地各年度不一样,脚本不写死。
先 pip install openpyxl。输入列:工号 / 姓名 / 月工资 / 申报基数 / 工资表社保扣款(扣款列可选,没有就只核基数)。运行:
python shebao_check.py 社保基数申报.xlsx 核对结果.xlsx 4462 22311 10.5
后三个参数是当地社保年度的基数下限、上限、个人合计费率%,按当地文件填。输出 xlsx 一张表,异常结论直接可读。
第一版里,工资 5000 按下限 4462 报、工资 25000 封顶到 22311 报,都被当成「限内低报/高报」报了异常——但这恰恰是合规操作。判断顺序必须是:先看托底/封顶,命中了就不再进「基数≠工资」的判断分支。把参数边界值专门放进零误报测试用例,才防住这个回归。
张伟基数完全合规,但工资表扣款写了 1200(应扣 1260)——只核基数他会显示「正常」,钱照样扣错了。所以核对结论是基数结论 + 扣款对账两条链路分别跑再合并,任何一条异常都不能标正常。另外费率是估计值时(10.5% 只是示例合计),输出里注明「按核定基数×费率估算」,别让报表替政策拍板。
收入侧:合同回款×银行流水催收对账;支出侧:报销单×银行流水对账;工资侧:加班表×工资表工时对账、时间列清洗后核工资。