社保申报基数×工资表核对:谁少缴、谁多缴、谁扣款漏算,一张表

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 一张表,异常结论直接可读。

两个真坑(都是这轮实跑撞上的)

坑 1:恰好按下限/上限申报,会被「基数≠工资」误报

第一版里,工资 5000 按下限 4462 报、工资 25000 封顶到 22311 报,都被当成「限内低报/高报」报了异常——但这恰恰是合规操作。判断顺序必须是:先看托底/封顶,命中了就不再进「基数≠工资」的判断分支。把参数边界值专门放进零误报测试用例,才防住这个回归。

坑 2:「正常」不只看基数,扣款列会让全表翻红

张伟基数完全合规,但工资表扣款写了 1200(应扣 1260)——只核基数他会显示「正常」,钱照样扣错了。所以核对结论是基数结论 + 扣款对账两条链路分别跑再合并,任何一条异常都不能标正常。另外费率是估计值时(10.5% 只是示例合计),输出里注明「按核定基数×费率估算」,别让报表替政策拍板。

相关阅读

收入侧:合同回款×银行流水催收对账;支出侧:报销单×银行流水对账;工资侧:加班表×工资表工时对账、时间列清洗后核工资。

不想自己跑?把基数申报表和工资表发给我们,AI 跑脚本 + 人工核验,出一份逐人异常清单。看全部自动化服务(9.9 元起)。虚拟物品交付后不退款,未达承诺免费重做。

← 喵窝资源铺