合并会计报表(多分支机构科目余额表)
将XX公司(编制单位「XX公司(合并)」)按单价设立的多个分支机构账套的《科目余额表》合并为一张合并报表。合并不是重新记账,而是按统一科目归集、抵消内部往来、还原损益全额后重算。
一、命名与主体约定(务必先确认)
- 编制单位写「XX公司(合并)」,绝不写「XX公司集团」。
- 合并范围内的 10 个 xlsx 是「分支机构账套」(按单价设立),表述一律用「分支机构/各分支机构」,禁止写「项目部/项目」。
- 金额单位统一「元」,报告/图表用「¥X,XXX.XX 元」或列名「金额(元)」,不出现「万元/万」缩写。
脱敏强制规范(防回退铁律,2026-08-27 固化)
- 真实分支名绝不落产物/文档:10 个真实分支名只存在于用户的源账套文件名中(形如「<分支名>1-7月发生额及余额表.xlsx」),绝不进入任何产物 xlsx 单元格,也绝不出现在
scripts/脚本或本 SKILL.md /references/正文(文档一律用「分支机构0X」/「旧体系账套」泛称)。 branchmap.py是脱敏逻辑的单一数据源(零真实名):内含_real_of()(从文件名解析分支名)、init_branches()(运行时按源目录文件名动态排序建编号表)、anon_branch()(真实名→分支机构0X)、detect_legacy()(数据驱动自动识别旧体系账套);所有脚本的branch_of()须from branchmap import ...调用anon_branch(),且main开头须init_branches(a.src)。产物列/行表头一律「分支机构01–10」。禁止在脚本中硬写真实名或编号。- 旧体系账套身份完全隐藏:原旧体系账套不以任何方式标注其旧体系身份——crosswalk 表头用「旧体系原始编码」、NOTE/合并说明用「旧体系账套」泛称;各脚本数据驱动自动检测旧体系账套(不再硬编码「分支机构02」),
--legacy默认auto,不进产物。 - 防回退复核(每次改脚本后必做):
run_all.py重跑后用verify_formulas.py <产物目录> --src <源目录>复核——所有产物真实名残留必须 = 0(真实名黑名单由--src文件名动态解析,不硬编码);按分支列的产物(01可行性/04工作底稿/06内部明细/07职工薪酬·增值税/08管理费透视)还须「分支机构01–10」10 个编号齐全;02映射表/03转平检查/05标准样式不按分支列、不要求编号齐全。任一真实名残留即视为脱敏未固化、产物不得交付。
二、源数据结构
- 每个分支机构一份《科目余额表(期间)》;表头 7–8 行,数据第 9 行起。
- 列序:科目类别(B) / 编码(C) / 名称(D) / 期初借(E)·贷(F) / 本期发生借(G)·贷(H) / 期末借(I)·贷(J)。
- 编码:4 位 = 一级科目,6 位 = 二级(子目)。6 位子目编码普遍带前导全角空格
,须replace('\u3000','').replace(' ','')清洗(一级 4 位编码无此问题)。 - 科目类别:资产 / 负债 / 权益 / 成本 / 损益。
三、编码体系与 crosswalk(自动合并的关键)
- 其余 9 个分支机构用统一新体系编码;旧体系账套用旧体系(仅 1002 银行存款同码,其余 8 个同名不同码)。
- 旧码 → 统一码 映射(脚本
gen_crosswalk.py自动从源数据按"旧体系账套名称→统一编码"反查派生,无需手填):
| 旧体系账套旧码 | 统一码 | 名称 | 旧体系账套旧码 | 统一码 | 名称 | |
|---|---|---|---|---|---|---|
| 1133 | 1221 | 其他应收款 | 2351 | 1301 | 内部往来 | |
| 2181 | 2241 | 其他应付款 | 3131 | 3103 | 本年利润 | |
| 1501 | 1601 | 固定资产 | 3141 | 3104 | 利润分配 | |
| 1502 | 1602 | 累计折旧 | 5503 | 5603 | 财务费用 |
- 编码为主键、名称为派生标签:合并按统一 4 位码聚合;统一名称由统一科目表按编码反查得到,永不偏离。旧体系账套原始码仅留痕、不参与运算。
- 剔除旧体系账套后,其余 9 个账套一级科目(编码+名称)完全一致(双向核对 0 冲突),可直接合并;唯一破坏一致的来源就是旧体系账套旧体系。
- crosswalk + 统一科目表皆为数据表非硬编码,新增旧体系账套只加行、合并逻辑零改动。
四、合并核心规则(决定正确性的根)
- 取 4 位编码父行求和(已验证 ≡ 叶子求和,金额完全等价,不重复计)。绝不对父子重复累加。
- 利润表口径(定生死):
- ✅ 收入类科目取本期贷方累计(G 列)、支出类科目取本期借方累计(H 列),按全额列示。
- ❌ 绝不用"本期净额=贷−借"逐科目带符号累加(会把损益类未结转余额净额 ≈XXX 误当净利润)。
- 正确净利润 = XXX(验证值,资产总计 XXX)。 - 损益分类坑:代码 5802 以前年度损益调整借=贷(净额 0),既不属收入也不属支出,必须从当期净利润计算中排除(按符号兜底会错判为收入,多计 XXX)。收入/支出按
REVENUE_CODES/EXPENSE_CODES显式集合划分,借=贷的损益码跳过。 - 半结账坑(本年利润):源数据多为半结账,
本年利润(3103)未含全额净利润。合并视角下本年利润结转为零,未分配利润 = 利润分配(3104)期末净额 + 净利润(全额)。切勿直接读 3103 原始余额进权益。 - 内部科目抵消:内部往来(1301/2351)、内部摊销(1302) 内部净额恒 0,全额抵消、不单列;旧体系账套 2351 经 crosswalk 归到 1301 后再一并抵消。
- 旧体系账套特征:旧体系缺管理费用/应付职工薪酬/应交增值税等科目,合并时按 0 计入属正常;其利润表营业收入/营业成本=0(无 5001/5401 等父行),经营成果经未分配利润与财务费用进入合并,非处理错误。⚠️ 旧体系账套收入漏计风险(2026-08-24 标记,未改码):旧体系账套 5001=0 系旧体系未映射收入类码所致(crosswalk 仅 9 个旧码、不含收入码),若旧体系账套收入实记于其他码(如 5101),合并收入将漏计旧体系账套部分;待确认旧体系账套收入码后补映射重跑(见第十一节修订记录)。
五、三方勾稽自检(脚本强制,不过则中止)
- 资产负债表:资产总计 = 负债+权益总计(期末 & 年初均平衡)。
- 未分配利润:未分配利润(合并) = 利润分配净额 + 净利润。
- 利润表:净利润 = Σ收入贷累计 − Σ支出借累计。
- 内部往来/摊销合并数 = 0。
未分配利润勾稽的完整口径(2026-08-18 固化,关联计算、非直接取数):
- 利润分配净额 = Σ各分支「利润分配」科目期末净额(贷−借)=工作底稿权益类合并数;年初净额同理由各分支期初余额汇总(旧体系账套 3141 经 crosswalk 归位为 3104 后一并计入)。
- 期初→期末未分配利润变动 = 本期净利润 + 利润分配科目本期发生净额(贷−借);且逐分支「期初+发生=期末」恒等(合并引擎须校验)。
- ⚠️ 坑:真实差额 = 利润分配科目本期发生净额(本期间 XXX = 某分支贷 XXX − 另一分支借 XXX,仅 2 分支有发生)。曾误写「差额 0.00 = 年初未分配利润 − 利润分配年初净额」——两者恒等、该式无意义,严禁再犯(病根在 gen_standard.py 旧 equity_transfer = retained_begin - pd_qc,已修复)。
- 05「合并说明」第 8 条与第 11 条即按此口径由 gen_standard.py 数据驱动动态生成(第 11 条六项核对:①勾稽公式 ②期末核对 ③年初核对 ④变动核对 ⑤利润分配净额口径=贷方余额分支合计−借方余额分支合计 ⑥本期发生净额口径=本期贷方发生−本期借方发生),换月份自动重算,勿手工改产物文字。
六、文件命名规范与产物顺序(逻辑依赖,非生成日期)
文件命名规范(强制)
所有产物文件名统一为「编号 + 业务名 + 期间 + 生成日期」四段:
<编号>_<业务名>_<期间>_<生成日期>.xlsx
- 编号:01–08,按数据逻辑依赖顺序(上游/底座在前,下游/派生在后)。
- 期间:从源文件夹名提取,如 余额表-202601-07 → 202601-07。
- 生成日期:实际生成当天,如 2026-08-17。
- 例:04_合并报表_工作底稿_202601-07_2026-08-17.xlsx。
> 逻辑顺序 ≠ 时间顺序:先有可行性/映射底座,主表才能正确归位旧体系账套,工作底稿才能对照。
9 项产物(标准交付集)
| 编号 | 文件 | 数据依赖 | 生成脚本 |
|---|---|---|---|
| 01 | 01_自动合并可行性分析_<期间>_<日期>.xlsx |
仅源 | gen_feasibility.py |
| 02 | 02_自动合并_映射表与科目表_<期间>_<日期>.xlsx |
仅源 | gen_crosswalk.py |
| 03 | 03_损益类科目转平检查_<期间>_<日期>.xlsx |
仅源 | gen_pnl_check.py |
| 04 | 04_合并报表_工作底稿_<期间>_<日期>.xlsx |
源 + ② | consolidate.py |
| 05 | 05_合并报表_标准样式_<期间>_<日期>.xlsx |
源 + ② | gen_standard.py |
| 06 | 06_内部科目明细_期初发生期末_<期间>_<日期>.xlsx |
源 + ② | gen_details.py |
| 07 | 07_应付职工薪酬与应交增值税汇总_<期间>_<日期>.xlsx |
源 + ② | gen_details.py |
| 08 | 08_管理费用借方透视(按账套)_<期间>_<日期>.xlsx |
源 + ② | gen_pivot.py |
| 09 | 09_财务分析报告_合并_<期间>_<日期>.html |
⑤ + ⑦ | gen_fin_report.py |
说明:
- 04 含 合并资产负债表(数据)/合并利润表(数据)/资产类/负债类/权益类/成本类/损益类_本年累计 共 7 表。原单一「合并工作底稿」已按类别拆分为 5 张逐户矩阵表(纵向项目 × 10 账套,编码为主键升序):资产/负债/权益/成本类列示各账套「期末余额」借贷净额(资产·成本=借−贷,负债·权益=贷−借)+「合并数(期末净额)」=SUM(各账套);损益类_本年累计列示「本期发生」本年累计发生额——收入类取本期发生贷方、费用类取本期发生借方(与利润表口径一致;第 3 列「损益分类」标注 收入类/费用类)+「汇总」=SUM(各账套)。各表底部附「数据来源」说明。本年利润(3103)在权益类按结账后口径列 0,未分配利润不单列(=利润分配净额+净利润,见合并利润表)。合并资产负债表(数据)按 资产→成本→负债→权益 顺序排列,「资产总计」置于「成本小计」行下方(=资产小计+成本小计),其后接负债类/权益类及「负债+权益总计」。
- 列宽固化(2026-08-18 用户点名加宽,已固化进生成脚本,重跑即生效):04「合并资产负债表(数据)」A16/B18/C16/D22;资产类/负债类/权益类 A13/B21/C13/D–M15/N21(wide=True);成本类保持 A10/B18/C10/D–M12/N16(未点名);损益类_本年累计 A13/B21/C13/D11/E–N15/O19;合并利润表(数据) 保持 A10/B20/C10/D18/E22(未点名)。06「内部摊销」全列 17(wide=True),「内部往来」保持全列 14(未点名)。08 A21、各账套列 B–K 17、合计列 L 18。
- 07 两张表(2026-08-19 用户要求改为全列,已固化):应付职工薪酬汇总 与 应交增值税汇总 均列 期初借方/期初贷方/本期发生借方/本期发生贷方/期末借方/期末贷方 共 6 列(源数据全部提取,旧体系账套无此科目处标「—(无此科目)」)。应付职工薪酬取 2211 父级(含子目 221101/221102/…),应交增值税取 222109「应交增值税金」(2221 父级还含城建税/个税/附加等不计入)。各表「合计」行 = 6 列各自 SUM(各分支行)(每表 6 个,共 12 个活公式)。口径说明 sheet 动态注入期初/发生/期末 借·贷 合计及本期发生净额(增值税负数为留抵税额)。旧版仅列「本年贷方累计」/「借·贷累计+净额」已废弃。
- 03 序号列约定:未转平明细 的「序号」列由 enumerate(recs, 1) 连续编号(1…N),「合计」行序号留空(不编号);重跑 gen_pnl_check.py 自动保持,勿擅自改为分组编号或给合计行编号。
- 05 会小企 01 资产负债表:右侧「所有者权益(或股东权益)」区下对齐——「负债和所有者权益总计」落在 r37,与左侧「资产合计」(r37) 同行底部齐平;负债合计(r24)与权益区起始(r31)之间 r25–r30 画细网格线,权益起始/权益合计/总计行顶部加中粗分隔线。
- 08 为单 sheet 文件(仅「管理费用借方透视(按账套)」),不附带管理费用明细合并/利润表复核等多 sheet 内容。
- 多 sheet 的「管理费用明细及利润表复核_含透视」已不在标准交付集;如需可 gen_details.py --with-mgmt-pnl 按需生成(不带编号前缀,明确置于交付集之外)。
- 09 为下游 HTML 产物(唯一非 xlsx 交付):由合并产物 05(会小企01/02 标准样式)+ 07(应交增值税汇总)自动灌数生成,是「财务分析报告(脱敏模板)」与合并报表的数据关联落地。报告定量部分(资负表/利润表合并数、KPI、三表勾稽、结构/盈利/营运分析、异常科目追踪)全取自合并数;税务风险与税会勾稽的定性结论以纳税申报表进一步验证为前置,故保留框架。金额单位元、编制单位「XX公司(合并)」占位符,产物零真实分支名。verify_formulas.py 对 09 仅查真实名残留,不要求分支编号。
- 换月份只需改 --src 与期间/日期参数,一键 run_all.py 复现上述 9 项(自动套用命名规范)。
详细列结构与关键数字速查见 references/product_sequence.md。
七、脚本用法(scripts/,均参数化,换 --src 即用于任意月份)
一键复现(推荐)
# 自动串联 01→09,统一套用 NN_业务名_期间_生成日期(xlsx / 09 为 html)
# --outdir 可省略:缺省落到 <当前目录>/合并报表_<期间>_<生成日期> 新文件夹
python run_all.py --src <余额表文件夹> [--outdir <输出目录>] \
[--period-label 202601-07] [--gen-date 2026-08-17] \
[--start 2026-01-01] [--end 2026-07-31]
# period-label / start / end 均可省略:默认从源文件夹名(如 余额表-202601-07)推断
# ⚠️ 期间末 `--end` 省略时,run_all.py 用 calendar.monthrange 取**真实月末**(2026-08-18 修复:30 天月不再生成非法日期如 2026-06-31,06→2026-06-30)
# 例:python run_all.py --src 余额表-202601-07
# -> 输出至 ./合并报表_202601-07_2026-08-17/ 下的 9 个编号文件(含 1 个 HTML)
分步脚本(run_all 内部依次调用)
# 0) 一致性核对(控制台预检,仅需剔除旧体系账套验证时)
python check_consistency.py --src <余额表文件夹> [--exclude 分支机构02]
# 1) 可行性分析(01)
python gen_feasibility.py --src <余额表文件夹> --out <01_...xlsx> --period 202601-07 --date 2026-08-17
# 2) 派生 crosswalk + 统一科目表(02)
python gen_crosswalk.py --src <余额表文件夹> --out <02_...xlsx> [--legacy 分支机构02]
# 3) 损益类转平检查(03)
python gen_pnl_check.py --src <余额表文件夹> --out <03_...xlsx> --period "2026年1月–2026年7月"
# 4) 核心合并引擎 / 工作底稿(04,含三方勾稽自检)
python consolidate.py --src <余额表文件夹> --crosswalk <02_...xlsx> --out <04_...xlsx> --period "..." --start ... --end ... --date ...
# 5) 会小企 01/02 标准样式主表(05)
python gen_standard.py --src <余额表文件夹> --crosswalk <02_...xlsx> --out <05_...xlsx> --period "..." --start ... --end ... --date ...
# 6)+7) 内部科目明细(06)+ 应付职工薪酬与应交增值税(07)
python gen_details.py --src <余额表文件夹> --crosswalk <02_...xlsx> \
--out06 <06_...xlsx> --out07 <07_...xlsx> --period 202601-07 --date 2026-08-17 \
[--with-mgmt-pnl --out-extra <管理费用明细及利润表复核_含透视_...xlsx>]
# 8) 管理费用借方透视(按账套) 单表(08)
python gen_pivot.py --src <余额表文件夹> --crosswalk <02_...xlsx> --out <08_...xlsx> --period 202601-07 --date 2026-08-17
# 9) 财务分析报告(合并) HTML(09,下游产物:由 05+07 灌数生成)
python gen_fin_report.py --p05 <05_...xlsx> --p07 <07_...xlsx> \
--out <09_财务分析报告_合并_202601-07_2026-08-17.html> \
[--period "2026年1月–2026年7月"] [--gen-date 2026-08-17]
consolidate.py 内部执行:读 crosswalk 归位 → 取 4 位父行合并 → 抵消内部往来 → 利润表全额口径 → 未分配利润=利润分配+净利润 → 三方勾稽 → 输出 合并资产负债表(数据)/合并利润表(数据)/合并工作底稿 三表。合并工作底稿明细行按统一编码升序(未分配利润(合并) 附末行)。勾稽不过立即报错中止,防错表流出。gen_standard.py 的合并说明 sheet 关键数均按本脚本计算结果动态注入,换月份无需改硬编码;会小企 01 表权益区下对齐(总计与资产合计同行)+ 负债/权益间网格线,格式固定无需改。
八、Excel 活公式(勾稽可核查,2026-08-17 固化)
所有产物的「合计 / 总计 / 小计 / 净额」关键格均写入 Excel 活公式(明细格保持数值),打开即重算,便于逐层检查计算结果。已统一设置 wb.calculation.fullCalcOnLoad = True,Excel/LibreOffice 打开自动重算。各文件公式位置:
| 文件 | 活公式位置(关键勾稽格) |
|---|---|
| 01 可行性分析 | 覆盖矩阵「覆盖数」列 = COUNTA(各分支列)(40 个公式格;矩阵单元格仅 ✓/空,非空计数与 COUNTIF(...,"✓") 数值等价;2026-08-18 由 COUNTIF 改为 COUNTA,规避老版 Excel 对含 Unicode criteria 的兼容闪退) |
| 03 损益类转平检查 | 未转平明细含「损益分类」列(收入类/费用类);「净额(元)」= 期末贷 − 期末借(收入正/费用负,与 04 利润表符号一致,2026-08-18 修正,旧口径 借−贷 已废);期末借/贷/净额「合计」行 = SUM;按科目合并视角同口径(6 个 SUM) |
| 04 工作底稿 | ① 分类表:资产/负债/权益/成本类「合并数(期末净额)」列 N = SUM(D:M)(按类别逐明细行);损益类_本年累计「汇总」列 O = SUM(E:N),损益分类列标注 收入类/费用类;② 合并资产负债表(数据)/合并利润表(数据) 两张汇总表:明细行写数值(合并引擎算好的结果),仅小计/合计/净利润用本表内 SUM 公式(如 净利润==SUM(D4:D13)、资产总计==D资产小计+D成本小计、负债+权益总计==D负债小计+D权益小计);严禁跨表 SUMIFS 引用分类工作表、严禁建隐藏底稿(如 _损益发生额底稿)供引用——这是 2026-08-18 用户明确修正项,回退即错 |
| 05 标准样式 | 资产负债表:流动资产/非流动资产/资产合计、负债各合计、权益合计、负债和所有者权益总计 = SUM/加减(18 个);利润表:营业利润 D26=D6-D7-D8-D16-D19-D23+D25、利润总额 D35=D26+D27-D29、净利润 D37=D35-D36(3 个) |
| 06 内部科目明细 | 内部往来/内部摊销「期初/发生/期末 借/贷」合计行 = SUM(各分支行)(每表 6 个,共 12 个) |
| 07 应付职工薪酬/增值税 | 两张表各「期初借/贷、本期发生借/贷、期末借/贷」6 列,合计行 = SUM(各分支行)(每表 6 个,共 12 个) |
| 08 管理费用透视 | 每行「合计」列 = SUM(各账套列);「合计」行各账套列 = SUM(各明细行),总计 = SUM(账套列)(23 个) |
> 维护约束:改任何生成脚本时,若新增/挪动合计行,必须同步更新本节公式行号(如 05 利润表「利润总额」在 D35、「净利润」在 D37,因 ln29「税收滞纳金」占一行);任何时候 run_all.py 重跑须通过 verify_formulas.py 防回退复核(真实分支名残留=0 + 分支机构01–10 编号齐全,容忍 0 误报;见第一节脱敏强制规范第 4 条)。
> 04 汇总表公式铁律(2026-08-18 用户明确要求,防回退):「合并资产负债表(数据)」「合并利润表(数据)」只许「明细数值 + 本表内 SUM 小计/合计」,绝不允许为图"自动化"改成跨表 SUMIFS(引用资产类/负债类/权益类工作表)或新增隐藏底稿供利润表引用;跨表引用/SUMIFS 公式数必须 = 0。用户原话:仅加一般 sum 求和公式,不用数据表之间的引用公式。
九、Excel 兼容性与产物文件编辑经验(2026-08-18 固化)
- 老版 Excel 闪退坑(Office 2010 / Office14):
COUNTIF/SUMIF类公式的 criteria 含 Unicode 字符(如"✓")+fullCalcOnLoad=1打开即全量重算,老版本 Excel 兼容性差、打开闪退。规避原则:① 矩阵类计数一律用COUNTA(单元格仅 ✓/空时非空计数与COUNTIF(...,"✓")数值等价)或预先算好写数值;② 所有产物公式避免含 Unicode 文本条件的 COUNTIF/SUMIF。01 覆盖数已由 COUNTIF 改 COUNTA(gen_feasibility.py)。 - 产物文件后续编辑的通道回退:编辑 xlsx 时优先走表格子代理(sheetagent)通道;若 MCP 不可用(如
mcp__sheetagent__*未注册),回退为 openpyxl 直接读写,必须先向用户说明。编辑后必须验证:原活公式(05 资产负债 18 个、利润表 3 个)、fullCalcOnLoad=True、文件可重新加载。 - 改说明文字改脚本,勿只改产物:05 合并说明由
gen_standard.py生成,任何说明文字/数字的修正必须改脚本后重跑(勿手工只改 xlsx,否则下次 run_all 覆盖丢失);脚本内说明文字需带数据来源口径(关联计算、非直接取数),数字不得凭空直接引用。
十、适用触发语
"合并 YYYYMM 的报表" / "做合并资产负债表和利润表" / "把这 10 个分支机构账套合并" / "自动合并会计报表" / "旧体系账套科目怎么归并" / "损益类有没有没转平的" / "合并工作底稿" / "未分配利润勾稽" / "勾稽核对说明"。
十一、修订记录
v1.1.0(2026-08-24)
- 修复 04「损益类_本年累计」取数方向 bug:原
consolidate.py第 394 行对收入类科目取本期发生借方(fs_d)、费用类取贷方(fs_c),与用户硬规则「收入类按贷方发生额、成本费用类按借方发生额」相反。已改为 收入类取贷方(fs_c)、费用类取借方(fs_d),与 04「合并利润表(数据)」/05 标准利润表口径完全一致。同步修订 consolidate.py 的 docstring(第 16 行)、377 行注释、NOTE_PNL 说明文字,以及本 SKILL.md 第 90 行的错误描述(原称「对方发生额——收入类取借方、费用类取贷方」)。 - 根因复盘(防再犯,已记入项目日志):检查「取数口径」类任务时,绝不能以「汇总勾稽绿」或「表内 NOTE 自述语义」替代逐科目数值核对。必须对每个损益科目做「源 fs_c/fs_d ↔ 产物值」的逐科目数值比对。本次 bug 上一轮曾被误判为「分析视图、不矛盾」而放过,属看到异常却用错标准,已纠正。
- 已知风险(待核查,未改码):旧体系账套科目体系未含收入类码(crosswalk 仅映射 9 个旧码、不含收入码),合并后旧体系账套 5001 主营业务收入=0,合并收入可能漏计旧体系账套真实收入。若旧体系账套收入记在其他码(如 5101),需补 crosswalk 映射后再重跑。当前视为已知局限,待用户确认旧体系账套收入码后处理。
v1.1.1(2026-08-24)
- 消除「损益分类」启发式兜底误判风险:原
consolidate.py对未列入REVENUE_CODES/EXPENSE_CODES显式集的损益码(仅 5802 以前年度损益调整会命中),用启发式收入类 if fs_c>fs_d else 费用类兜底判类。虽当前各分支 5802 借=贷、数值无冲突,但属权益调整(转利润分配)、非收入/成本费用类,且启发式对未来未知码存在方向误判隐患。 - 加固做法:在 consolidate.py 第 29 行新增
ADJUST_CODES = {"5802","5803"}显式集;「损益类_本年累计」分类逻辑改为REVENUE → 收入类 / EXPENSE → 费用类 / ADJUST → 损益调整(按借方列示、不纳入收入/费用方向校验) / 其余 → 启发式兜底,5802 等不再走兜底;同步更新 NOTE_PNL 文字说明。本补丁不改变任何产物数值(5802 仍取借方、汇总 XXX 不变),仅将分类显式化、消除潜在误判。 - 防再犯规则延续 v1.1.0:检查取数口径须逐科目数值比对。
v1.2.0(2026-08-27)
- 分支名脱敏(用户要求):新增
scripts/branchmap.py作为「真实分支名 → 匿名编号(分支机构01–10)」的单一映射源;所有脚本的branch_of()统一调用anon_branch(),产物列/行表头一律用「分支机构01–10」。映射仅在branchmap.py一处维护,新增/调整分支不改逻辑。 - 旧体系标识完全隐藏:原旧体系账套不再以任何形式标注其旧体系身份——crosswalk 表头改为「旧体系原始编码」;各 NOTE/合并说明文字改为「旧体系账套」泛称;
run_all.py的--legacy默认auto,由各脚本detect_legacy()数据驱动自动检测旧体系账套,不进产物(见 v1.2.1)。 - 文档同步脱敏:本 SKILL.md 与
references/product_sequence.md真实分支名全部改为「旧体系账套」/「分支机构0X」;未分配利润示例改为「某分支/另一分支」。 - 可复现:
run_all.py --src 余额表-202601-07 --gen-date 2026-08-27重新生成 8 项脱敏产物(落合并报表_202601-07_2026-08-27/),三方勾稽仍全绿(资产总计 XXX / 净利润 XXX / 未分配利润 XXX)。 - 落地
scripts/verify_formulas.py防回退复核:脱敏固化后新增的校验工具,扫描全部产物 xlsx,断言「真实分支名残留=0 且 分支机构01–10 编号齐全」,任一不满足即退出码 1(产物不得交付);同时修正第八节措辞,消除「verify_formulas.py 未实现」的文档漂移。
v1.2.1(2026-08-27)
branchmap.py彻底零真实名化:删除原BRANCH_MAP静态字典与LEGACY_BRANCH="分支机构02"硬编码;改为init_branches(src)(运行时按源目录文件名 Unicode 排序动态分配「分支机构01–10」)+detect_legacy(data)(数据驱动自动识别旧体系账套:其一级科目编码多为「仅自身出现的罕见旧码」)。真实名现在只存在于用户的源账套文件名,脚本/文档/产物均无。- 连带修复(实施暴露的 2 个 bug):①
init_branches原对glob完整路径解析致编号误为 11–20 → 修正为取basename;② 旧detect_legacy(多数投票)在「统一体系账套部分科目未发生」时误判 → 改为「罕见编码数最多」算法,实测正确锁定原旧体系账套。 - 同步改造:
run_all.py的--legacy硬编码→auto;verify_formulas.py不再 import 已删的BRANCH_MAP,改为从--src动态解析黑名单(零硬编码);gen_pnl_check.py同步自动检测;第一节铁律与版本记录同步。 - 验证:重跑 8 项产物勾稽全绿(资产总计 XXX / 净利润 XXX / 未分配利润 XXX,与 v1.2.0 完全一致);
verify_formulas.py --src 余额表-202601-07→ ALL_PASS。
v1.2.2(2026-08-27)
- 文档级真实名清零(用户复核截图后):第一节铁律中仅存的旧体系账套文件名示例改为泛称(
<分支名>1-7月发生额及余额表.xlsx);对scripts/+references/+SKILL.md全量检索 10 个真实分支名已零残留,并清理__pycache__中的旧字节码缓存。 - 脱敏边界确认:真实名现仅允许存在于「用户源账套文件名」与「项目工作日志历史记录」两处(均非 skill 交付物);skill 自身及其产物均零真实名,固化完成。
v1.2.3(2026-08-27)
- 财务分析报告与合并报表建立数据关联(第 09 项产物):用户提供的「财务分析报告样本_脱敏.html」模板,其定量部分由合并数自动填充,故新增
scripts/gen_fin_report.py作为合并流程下游产物——读取合并产物 05(会小企01/02 标准样式)+ 07(应交增值税汇总),把模板灌入真实合并数,输出09_财务分析报告_合并_<期间>_<日期>.html。run_all.py串联为第 09 步(依赖 05+07)。模板定量部分全取自合并数(资负表/利润表合并数、KPI、三表勾稽、结构/盈利/营运分析、异常科目追踪);税务风险与税会勾稽的定性结论以纳税申报表进一步验证为前置,故保留框架。 - 标准交付集由 8 项扩为 9 项:SKILL.md 第七节表格、一键复现示例、分步脚本用法同步更新;09 为唯一非 xlsx(HTML)交付。
verify_formulas.py扫描范围扩至含*.html,对 09 仅查真实名残留(不要求分支编号)。 - 测试期 bug 修复(固固前已验证):营业利润公式原漏减「财务费用」致净利润错算为 XXX,修正后与勾稽值 XXX 一致;
gen_fin_report.py由测试脚本_test_fin_report.py清理冗余重建逻辑后固化(参数化--p05/--p07/--out/--period/--gen-date)。 - 验证:重跑 9 项产物,勾稽全绿、关键数(资产总计 XXX / 净利润 XXX / 未分配利润 XXX)与 v1.2.0 一致;
verify_formulas.py --src 余额表-202601-07→ ALL_PASS(含 09 HTML 零真实名)。