panshi 0.1.26__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. panshi-0.1.26/CHANGELOG.md +3086 -0
  2. panshi-0.1.26/LICENSE +21 -0
  3. panshi-0.1.26/MANIFEST.in +39 -0
  4. panshi-0.1.26/PKG-INFO +129 -0
  5. panshi-0.1.26/README.md +93 -0
  6. panshi-0.1.26/panshi/__init__.py +0 -0
  7. panshi-0.1.26/panshi/data/README.md +38 -0
  8. panshi-0.1.26/panshi/data/__init__.py +0 -0
  9. panshi-0.1.26/panshi/data/banks/README.md +77 -0
  10. panshi-0.1.26/panshi/data/banks/bf.md +32 -0
  11. panshi-0.1.26/panshi/data/banks/bj.md +30 -0
  12. panshi-0.1.26/panshi/data/banks/ci.md +45 -0
  13. panshi-0.1.26/panshi/data/banks/cn.md +34 -0
  14. panshi-0.1.26/panshi/data/banks/dj.md +47 -0
  15. panshi-0.1.26/panshi/data/banks/gb.md +25 -0
  16. panshi-0.1.26/panshi/data/banks/gw.md +22 -0
  17. panshi-0.1.26/panshi/data/banks/hk.md +26 -0
  18. panshi-0.1.26/panshi/data/banks/ml.md +30 -0
  19. panshi-0.1.26/panshi/data/banks/ne.md +30 -0
  20. panshi-0.1.26/panshi/data/banks/sn.md +45 -0
  21. panshi-0.1.26/panshi/data/banks/tg.md +30 -0
  22. panshi-0.1.26/panshi/data/banks/us.md +25 -0
  23. panshi-0.1.26/panshi/data/calendar.py +138 -0
  24. panshi-0.1.26/panshi/data/calendar_zone.py +252 -0
  25. panshi-0.1.26/panshi/data/holiday/README.md +278 -0
  26. panshi-0.1.26/panshi/data/holiday/__init__.py +13 -0
  27. panshi-0.1.26/panshi/data/holiday/_api.py +218 -0
  28. panshi-0.1.26/panshi/data/holiday/chn.md +130 -0
  29. panshi-0.1.26/panshi/data/holiday/dji.md +96 -0
  30. panshi-0.1.26/panshi/data/holiday/gbr.md +89 -0
  31. panshi-0.1.26/panshi/data/holiday/gha.md +151 -0
  32. panshi-0.1.26/panshi/data/holiday/hkg.md +124 -0
  33. panshi-0.1.26/panshi/data/holiday/jpn.md +100 -0
  34. panshi-0.1.26/panshi/data/holiday/mac.md +149 -0
  35. panshi-0.1.26/panshi/data/holiday/sgp.md +77 -0
  36. panshi-0.1.26/panshi/data/holiday/sle.md +92 -0
  37. panshi-0.1.26/panshi/data/holiday/sources.md +112 -0
  38. panshi-0.1.26/panshi/data/holiday/twn.md +114 -0
  39. panshi-0.1.26/panshi/data/holiday/uemoa.md +192 -0
  40. panshi-0.1.26/panshi/data/holiday/usa.md +99 -0
  41. panshi-0.1.26/panshi/data/trading_calendar.py +1022 -0
  42. panshi-0.1.26/panshi/mod.rs +6 -0
  43. panshi-0.1.26/panshi/tools/__init__.py +9 -0
  44. panshi-0.1.26/panshi/tools/git/__init__.py +5 -0
  45. panshi-0.1.26/panshi/tools/git/issue/README.md +280 -0
  46. panshi-0.1.26/panshi/tools/git/issue/__init__.py +12 -0
  47. panshi-0.1.26/panshi/tools/git/issue/__main__.py +297 -0
  48. panshi-0.1.26/panshi/tools/git/issue/_base.py +172 -0
  49. panshi-0.1.26/panshi/tools/git/issue/codeberg.py +354 -0
  50. panshi-0.1.26/panshi/tools/git/issue/gitee.py +219 -0
  51. panshi-0.1.26/panshi/tools/git/issue/labels.py +237 -0
  52. panshi-0.1.26/panshi/tools/publish/README.md +46 -0
  53. panshi-0.1.26/panshi/tools/publish/__init__.py +16 -0
  54. panshi-0.1.26/panshi/tools/publish/__main__.py +341 -0
  55. panshi-0.1.26/panshi.egg-info/PKG-INFO +129 -0
  56. panshi-0.1.26/panshi.egg-info/SOURCES.txt +62 -0
  57. panshi-0.1.26/panshi.egg-info/dependency_links.txt +1 -0
  58. panshi-0.1.26/panshi.egg-info/entry_points.txt +3 -0
  59. panshi-0.1.26/panshi.egg-info/requires.txt +26 -0
  60. panshi-0.1.26/panshi.egg-info/scm_file_list.json +813 -0
  61. panshi-0.1.26/panshi.egg-info/scm_version.json +8 -0
  62. panshi-0.1.26/panshi.egg-info/top_level.txt +1 -0
  63. panshi-0.1.26/pyproject.toml +150 -0
  64. panshi-0.1.26/setup.cfg +4 -0
@@ -0,0 +1,3086 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [Unreleased]
5
+
6
+ ## [0.1.26] - 2026-10-30
7
+ ### Changed
8
+ - feat[python]:新增 labs-tools-publish, 把 PyPI 发布收成 panshi 的工具
9
+ - 新增 panshi/tools/publish: 项目根 → 项目名 → 依赖 build/twine → 构建 → 版本查重 → twine 上传
10
+ → 清残留, 五步各自可复现; 项目根缺省从当前目录向上找 pyproject.toml, --root 可指定
11
+ - 产物名按归一后的前缀认(Demo_Pkg -> demo_pkg), 不只认 [project] name 字面值;
12
+ build/ 只清 setuptools 自己的子目录, 别的工具的构建树不动
13
+ - 子进程统一带 PYTHONSAFEPATH=1: 工作目录不进 sys.path, 仓库里的 build/ 不会顶替 build 包
14
+ - 退出码 0 成功 / 1 失败 / 2 版本已存在; 新增 --dry-run 只解析项目根与项目名
15
+ - scripts/publish.ps1 / publish.sh 一并通用化: 去掉单仓库假设(-Root/--root, 脚本在 scripts/
16
+ 下取父目录, 找不到 pyproject.toml 立即失败); publish.sh 记 100755
17
+ - pyproject 注册 labs-tools-publish 入口; CONTRIBUTING §9 改指向该命令, 脚本保留给未装 panshi 的环境
18
+ - 验证: labs-tools-publish --dry-run 解析出 panshi; --help 正常; 纯函数冒烟覆盖根解析/项目名/
19
+ 产物解析/清理(残留目录删、同名源码目录留、dist 删)/PyPI 查重(requests 2.32.0 命中、999.0.0 未命中);
20
+ ps1 语法解析与 -Help 通过; sh 的 bash -n 与 --help 通过; ruff 与 pyright 通过
21
+ - 关联 #17
22
+ - refactor[python]:命令行入口改名为 labs-tool-publish
23
+ - pyproject 的 [project.scripts]、argparse 的 prog、README 与 CONTRIBUTING §9 一并改名
24
+ - 重装后旧的 labs-tools-publish.exe 由 pip 自动清除, Scripts 下只剩新名字
25
+ - 验证: labs-tool-publish --help 显示新命令名, --dry-run 仍解析出 panshi; ruff 与 pyright 通过
26
+ - 关联 #17
27
+ - release version 0.1.26
28
+
29
+ ## [0.1.25] - 2026-10-30
30
+ ### Changed
31
+ - 调整项目名称
32
+ - release version 0.1.25
33
+
34
+ ## [0.1.24] - 2026-10-30
35
+ ### Changed
36
+ - feat[python]:工单标签引入本体层, 按仓库映射到 codeberg 与 gitee
37
+ - 新增 panshi/tools/git/issue/labels.py: 本体用英文槽位(type/feature|bug|task|docs、
38
+ status/todo|in_progress|done|reserved|deferred|obsolete、area/data|accounting|tooling),
39
+ 每个托管方一张声明式映射表, 平台标签名不再散落在 provider 里
40
+ - Codeberg 默认仍走现有中文标签(kind/特性、status/已完成 等), 远端不动; 新增仓库级覆盖
41
+ REPO_LABELS, NextAccounting/su-zhen-erp 直接用本体英文名, 一个 provider 两种落地
42
+ - Gitee 以 su-zhen-erp 既有标签为准(feature/bug、待办/进行中/已完成/预留/搁置); 缺格的
43
+ (任务/文档/领域/作废)提示"已忽略", 不自动建标签; 表外名字(月份/模块)原样透传
44
+ - 校验收敛到 labels.check: 状态至多一个、关单必须写状态、结案状态不挂在开着的单上;
45
+ 同一本体态按平台能力落原生态 —— 搁置在 codeberg 落 closed, 在 gitee 落 progressing
46
+ - 平台名可当入参并自动归一(kind/特性 -> type/feature); list/show 按本体名显示, show 另列
47
+ 平台原始标签; 新增 label map; --dry-run 给出平台标签、丢弃项与原生状态
48
+ - README §五 重写为本体与映射表, 修正 §三 中已失效的 --label 提案/数据 示例
49
+ - 验证: codeberg label map/list/show 与 gitee(su-zhen-erp) list 读回正确; 干跑拦下双状态标签、
50
+ 缺类别标签; ruff 与 pyright 通过
51
+ - release version 0.1.24
52
+
53
+ ## [0.1.23] - 2026-10-29
54
+ ### Changed
55
+ - feat[python]:接入 Gitee 托管方(--host gitee)
56
+ - 公共部件抽到 panshi/tools/git/_base.py: 数据模型(Issue/Label/Milestone)、异常、配置读取、
57
+ 请求发送; 鉴权形态由 auth 参数区分(header=Gitea, query=Gitee)
58
+ - 新增 panshi/tools/git/gitee/_api.py: 与 codeberg 同一套函数面, 差异收在 adapter 内 ——
59
+ 建单路径 /repos/{owner}/issues(repo 在表单里)、无 closed 字段(建完再 PATCH)、
60
+ 标签传逗号分隔名字、无截止日期、状态原生含 progressing / rejected
61
+ - 结案映射: status/已完成 <-> closed, status/已拒绝 <-> rejected, status/已搁置 <-> progressing
62
+ (Gitee 没有"搁置", 只能借"进行中", 已在 README 注明)
63
+ - CLI 按 --host 分发; 状态取值随平台校验; 能力缺失显式报错(--due 在 Gitee 上报错, 干跑同样拦),
64
+ 不静默丢弃
65
+ - 验证: codeberg 全链路回归通过; gitee 的干跑报文、令牌缺失提示、--due 拒绝均符合预期;
66
+ ruff 与 pyright(panshi/tools) 通过; Gitee 的真实建单/评论待提供令牌后验证
67
+ - 关联 #16
68
+ - refactor[python]:工单工具改为 panshi/tools/git/issue, provider 用单文件模块
69
+ - 目录按"模块 + 功能 + provider"三级: panshi/tools/git/issue/{__main__,_base,codeberg,gitee}
70
+ - codeberg 与 gitee 由子包降为单文件模块: 一家的差异只在路径、鉴权头、字段名与状态枚举,
71
+ 几百行以内, 再套一层子包只会让"改一家要翻三层"; 复杂到需要拆分时再成包
72
+ - README 补目录分工与新增 provider 的落地步骤(加 github.py + HOSTS/STATES 各一行)
73
+ - 入口改为 panshi.tools.git.issue.__main__:main, 命令名 labs-git-issue 不变
74
+ - 验证: pip install -e . 后 labs-git-issue --help / list 正常; --host gitee 仍按缺令牌报错;
75
+ ruff 全通过; pyright panshi/tools 0 errors
76
+ - 关联 #16
77
+ - fix[python]:按 Gitee 实测口径修正更新路径与状态处理
78
+ - 更新接口路径改为 PATCH /repos/{owner}/issues/{number}, repo 放表单: 带 repo 的路径对该方法
79
+ 返回 404 "project or enterprise"(与建单同一约定)
80
+ - 工单编号允许字符串: Gitee 用 IKRKC9 这类编号, Issue.number 与 --index 不再限定 int
81
+ - 建单后回读一次: 建单响应缺 labels 等字段, 直接打印会误报"没有标签"
82
+ - rejected 实测不可写: 更新接口返回 400 "state does not have a valid value"(只有列表筛选认它),
83
+ 故 status/已拒绝 退化为 closed + 标签, --state rejected 显式报错并给出替代做法
84
+ - README 的 Gitee 结案映射按实测改写
85
+ - 验证: Gitee 私有仓库 quant1x/source-traceable-accounting 上 建单/查看/评论/open→progressing→closed
86
+ 全部通过, 拒绝态的报错文案符合预期; codeberg 回归通过; ruff 与 pyright 通过
87
+ - 关联 #16
88
+ - fix[python]:按 Gitee 工作项状态(id)处理结案, 并把真实状态显示出来
89
+ - 查明 Gitee 的真实状态是"工作项状态": issue_state / issue_state_detail.id
90
+ 1 待办的 ↔ open, 2 进行中 ↔ progressing, 3 已完成 ↔ closed, 4 已拒绝(无对应 state 值)
91
+ - 更新接口对 state 只收 open/progressing/closed; 已拒绝只能用未文档化的 issue_state_id=4,
92
+ 工具据此写入并把服务端拒绝原样抛出
93
+ - 实测限制: 状态按"工作项类型"限定, 默认任务类型(id=1)只有 1/2/3, 写 4 返回
94
+ 403 "状态不属于该任务的工作项类型"; 且建单的 issue_type 参数被服务端忽略(始终为任务),
95
+ 故已拒绝需在仓库设置里给任务类型加上该状态才可达
96
+ - Issue 增加 state_detail, show/list 显示真实状态, 如 closed(已完成)
97
+ - README 记录 id 对照表与上述限制
98
+ - 验证: Gitee 私有仓上 open/progressing/closed 往返通过; rejected 返回 403 且消息完整;
99
+ codeberg 回归正常; ruff 与 pyright 通过
100
+ - 关联 #16
101
+ - docs[python]:补充 Gitee 标签差异的实测口径
102
+ - 建标签: Gitee 只收 name + color(都必填), 没有描述与互斥; 名字 2-20 字, 允许 / 与汉字,
103
+ 故 status/已完成、kind/特性 这类与 Codeberg 同构的命名可直接沿用
104
+ - 打标签: 建单/改单传逗号分隔的名字, 且是整组替换(实测 feature replaced by kind/特性);
105
+ PUT .../issues/{n}/labels 要求 JSON body, 表单会 400 Problems parsing JSON, 故统一走改单接口
106
+ - 删标签: 按名字, 含 / 时必须 URL 编码, 否则被当成路径分隔符(实测 DELETE 失败, 编码后成功)
107
+ - 顺手修 README 章节编号: 此前有两个「〇」且插入段落用了「四之二」
108
+ - 验证: 建单带 status/已完成 直接落 closed(已完成); CLI label create 在 Gitee 上可用;
109
+ 探针标签与探针工单已清理
110
+ - 关联 #16
111
+ - release version 0.1.23
112
+
113
+ ## [0.1.22] - 2026-10-29
114
+ ### Changed
115
+ - fix[python]:消除 update_issue 里对可能为 None 的 current 取属性
116
+ - current 先置 None 再按需赋值的写法, 类型上恒为 Issue | None, 后面直接读 current.labels /
117
+ current.state, pyright 报 "labels is not a known attribute of None"; 运行时走不到但类型不成立
118
+ - 改为两个必然有值的局部量 known_labels / known_state: 缺哪个就把当前值补上, 都不缺就直接用
119
+ - 顺带注释说明意图: 没传的字段保持原样, 但标签与状态必须一起判, 否则放过"摘掉结案标签却没重开"
120
+ - 验证: pyright 该文件 0 errors; ruff 与 py_compile 通过
121
+ - release version 0.1.22
122
+
123
+ ## [0.1.21] - 2026-10-29
124
+ ### Changed
125
+ - build[python]:新增 MANIFEST.in, sdist 只打 panshi
126
+ - 发布前实测: wheel 干净(panshi 51KB), 但 sdist 42MB / 896 个文件, 把 docs/(477, 含 91 个 PDF)、
127
+ labs/(272)、mpr/(53)、scripts/(11) 全打进去了; 与 #14"只分发 panshi"的结论相悖
128
+ - MANIFEST.in 显式列白名单(pyproject/README/LICENSE/CHANGELOG + graft panshi), 其余目录 prune;
129
+ 根目录里只与其它语言或协作流程相关的文件(AGENTS/CONTRIBUTING/Cargo.toml/go.mod/lib.rs 等)排除
130
+ - 结果: sdist 从 42MB 降到 193KB / 60 条目, 只剩 panshi 与根级说明文件; wheel 仍为 panshi
131
+ - 验证: twine check 两个产物均 PASSED; 0.1.20 已上传 PyPI; 干净虚拟环境里从 PyPI 安装后
132
+ panshi 来自 site-packages, mpr / labs / tools 均不可导入, labs-git-issue 命令可用
133
+ - 关联 #15
134
+ - build[python]:pyproject 用 find 收口包发现, 显式排除 docs/mpr/labs
135
+ - [tool.setuptools] 由手写 packages 清单改为 [tool.setuptools.packages.find]:
136
+ include = ["panshi", "panshi.*"], exclude = docs / mpr / labs / scripts / temp / build / dist
137
+ - 好处: 新增 panshi 子包不必回来改清单; 仓库内其它目录被明确挡在 wheel 外, 与 #14 的结论一致
138
+ - MANIFEST.in 补一句交叉说明: sdist 的同一约束在 MANIFEST, 两处要一起改
139
+ - 验证: 重建后 wheel 顶层只有 panshi, 含 packages 恰为 panshi / panshi.data / panshi.data.holiday /
140
+ panshi.tools / panshi.tools.git / panshi.tools.git.codeberg; sdist 60 条目; pip install -e . 后
141
+ labs-git-issue 可用; ruff 通过
142
+ - release version 0.1.21
143
+
144
+ ## [0.1.20] - 2026-10-29
145
+ ### Changed
146
+ - feat[python]:工单工具包装为 pip 可安装的 CLI(labs-issue)
147
+ - 命令行入口: pyproject 增加 [project.scripts], 命令名 labs-issue(kebab, labs 前缀); 装好后在任意
148
+ 目录可用, 参数与原来的 -m 形态完全一致, 两者共用同一实现
149
+ - 模块迁入 labs/issue: 顶层包 tools 过于通用, 随 wheel 装到 site-packages 易与别的发行版撞名;
150
+ 收进本仓已有的 labs 顶层包, 顶层包只剩 mpr / panshi / labs
151
+ - argparse 的 prog 定为 labs-issue, 避免 usage 里露出旧模块路径
152
+ - 文档同步: labs/issue/README.md 补安装与两种调用形态; CONTRIBUTING §8 的建单命令与链接改为
153
+ labs-issue / labs/issue/README.md
154
+ - 验证: pip install -e . 后在 /d/projects 下执行 labs-issue --help 与 labs-issue list 正常;
155
+ python -m labs.issue --help 输出一致; import tools 已不可用; ruff 与 py_compile 通过
156
+ - 关联 #13
157
+ - Revert "feat[python]:工单工具包装为 pip 可安装的 CLI(labs-issue)"
158
+ This reverts commit 0ef609f3d9a83241aaa45115d09697f67cc26222.
159
+ - chore[python]:只分发 panshi, 工具挂到 panshi.tools, mpr 与 labs 移出安装清单
160
+ - packages 只留 panshi 系列: mpr/ 与 labs/ 是仓库内的存量代码与实验项目, 从源码树运行,
161
+ 不进 wheel; labs.sta 的 package-data 随之删除
162
+ - 工具从顶层 tools/ 迁到 panshi/tools/git/codeberg, 模块路径 panshi.tools.git.codeberg;
163
+ 顶层包名 tools 让出, 不再与其它发行版撞名
164
+ - 运行时依赖按 AST 逐文件核对后重写: 只留 holidays / mopr / requests; 仅 mpr 与 labs 用到的
165
+ pandas / numpy / loguru / icecream / PyYAML / python-dateutil / GitPython 收进
166
+ optional-dependencies 的 legacy extra(从源码树跑存量代码时再装)
167
+ - .env 定位改为向上找仓库根(带 pyproject.toml 或 .git 的目录): 迁一次目录 parents[N] 就指错,
168
+ 令牌会静默读不到
169
+ - 验证: pip wheel 产物顶层只有 panshi(12 条目), 无 mpr/ 与 labs/; 旧的 build/ 与 egg-info
170
+ 会带着历史 SOURCES.txt 把两者重新塞进 wheel, 必须先清干净再构建
171
+ - 关联 #13 #14
172
+ - feat[python]:工单工具包装为命令行 labs-git-issue(方案 B)
173
+ - 命令名按 domain-module-feature 分层: labs-git-issue; 托管方作参数 --host(缺省 codeberg),
174
+ 将来接 GitHub / Gitee 只加 adapter 与 host 映射, 命令本身不动
175
+ - pyproject 增加 [project.scripts]: labs-git-issue = panshi.tools.git.codeberg.__main__:main;
176
+ 模块形态 python -m panshi.tools.git.codeberg 参数完全一致
177
+ - _api 增加 HOSTS 映射与 _host()/_api_base(): 未实现的 host 直接报错并列出已支持项, 不静默落到
178
+ codeberg 上跑错仓库; CLI 的 --host 通过 LABS_GIT_HOST 传递给实现
179
+ - argparse 的 prog 定为 labs-git-issue, usage 不再露出模块路径
180
+ - README 补安装与调用、托管方支持矩阵(注明 GitHub 缺 due_date、milestone 只认 number)
181
+ - 验证: pip install -e . 后可在仓库外执行 labs-git-issue --help / list; --host github 报
182
+ "暂不支持 host='github'; 目前支持: codeberg"; ruff 通过
183
+ - 关联 #13
184
+ - release version 0.1.20
185
+
186
+ ## [0.1.19] - 2026-10-29
187
+ ### Changed
188
+ - refactor[python]:重整 panshi/data 的目录结构
189
+ - 新增 panshi/data/README.md 作为目录索引: 职责与边界、文件与子目录清单、上下游、命名约定
190
+ - 目录命名按语义定单复数: 集合用复数、模块用单数
191
+ - bank/ -> banks/: 里面是各地区银行信息的聚合, 每地区一份
192
+ - holidays/ -> holiday/: 节假日是一个功能模块, 用单数
193
+ - holiday.py 并入 holiday/__init__.py, 代码与资料同处一个目录: 模块路径 panshi.data.holiday
194
+ 对调用方不变, 且以后按地区加资料不会让 panshi/data 的列表继续膨胀
195
+ - pyproject 的 packages 登记 panshi.data.holiday(目录变成包, 不登记打包会漏)
196
+ - 同步引用: banks/*.md 的 ../holiday/<地区>.md、trading_calendar.py 注释、holiday/README.md 的
197
+ 实现说明、CONTRIBUTING.md 的目录树与命名示例
198
+ - 验证: 全仓 Markdown 相对链接零断链; import panshi.data.holiday 正常(Holiday 区间摊平、
199
+ dates_of 可用); ruff 全通过; 相关 .py 编译通过
200
+ - refactor[python]:节假日门脸与实现分离
201
+ - panshi/data/holiday/__init__.py 里的取数实现(10KB)移到 _api.py, 门脸只保留 from ._api import
202
+ 与 __all__, 不再承载业务代码; 调用方路径 panshi.data.holiday 不变
203
+ - 曝光面收敛为功能: 只留 Holiday / dates_of / get_holidays; HOLIDAY_API_URL 与私有映射表属
204
+ 实现依赖, 留在 _api 内 —— 调用方不必知道数据从哪来, 换源时也不该改到别人的代码
205
+ - 门脸 docstring 只说明模块是什么, 不复述协作规则(规则在 CONTRIBUTING §5.5, 两处会分叉)
206
+ - CONTRIBUTING §5.5 补两条: 包入口只做曝光 / 只曝光功能不曝光实现依赖; 并修正 -m 示例
207
+ (门脸没有 __main__, 可执行入口是实现模块)
208
+ - 同步 holiday/README.md 与 panshi/data/README.md 的实现说明
209
+ - 验证: import panshi.data.holiday 正常, __all__ 三项, get_holidays.__module__ 为 _api;
210
+ python -m panshi.data.holiday._api 可运行; ruff 全通过
211
+ - feat[python]:新增 Codeberg 工单工具与提案模板
212
+ - tools/git/codeberg/: 建单 / 维护 / 列单 / 评论 / 标签 / 里程碑; 字段按三类组织 —— 内容(标题与正文)、
213
+ 属性(标签 / 指派 / 截止 / 里程碑 / 状态)、时间(平台 created_at / closed_at, 接口不可回填, 不写进正文)
214
+ - 标签三维: 类别(特性 / 缺陷 / 任务 / 文档)、结案(已完成 / 已拒绝 / 已搁置)、领域(数据 / 会计 / 工具);
215
+ 工具强制"关闭必须有且只有一个结案标签, 未关闭不得带结案标签"
216
+ - 接口两处坑已避开并记在注释里: PATCH /issues/{index} 的入参没有 labels 字段, 标签要走
217
+ PUT /issues/{index}/labels 整组替换; Codeberg 的网页令牌是全权令牌, 无 scope 细分
218
+ - .gitea/ISSUE_TEMPLATE/proposal.md: 背景 / 需求 / 不在本次范围 / 验收; 标题模板 <type>[<scope>]:<一句话>
219
+ - CONTRIBUTING §8 记入"先建单, 再动手", 完成后把工单号写进提交信息正文
220
+ - pyproject 登记 tools / tools.git / tools.git.codeberg
221
+ - 验证: 12 张历史需求已回填(标题带 scope、类别/领域/结案标签、指派), 见 #1 ~ #12; ruff 全通过
222
+ - refactor[python]:标签改为作用域命名, 只让结案类互斥
223
+ - 标签三维定稿: kind/(类别, 可多选) + status/(结案, 互斥) + area/(领域, 可多选); 仓库 10 枚标签已
224
+ 按此重命名, 工单按 ID 关联, 12 张单无需重打
225
+ - exclusive 是 Forgejo 的作用域标签: 只在同一 scope 内互斥, scope 取名字最后一个 / 之前的部分,
226
+ 名字不含 / 即使标 exclusive 也不生效 —— 故只有 status/ 设互斥, 类别与领域放宽
227
+ - 实测: exclusive 只在网页界面生效, 直接用 API 仍可给同一张单打两个 status/ 标签; 因此"结案只能
228
+ 一个"由工具的 _check_labels 兜底(缺结案标签 / 未关闭却带结案 / 一次两个结案, 三者都报错)
229
+ - create_label 增加 exclusive 参数并校验名字带 scope; 新增 update_label(改名不影响已打的单);
230
+ CLI 增加 label create --exclusive、label edit, label list 输出互斥标记
231
+ - 验证: 12 张单标签已随改名更新(如 #12 = area/数据,kind/特性,status/已完成); ruff 通过
232
+ - release version 0.1.19
233
+
234
+ ## [0.1.18] - 2026-10-29
235
+ ### Changed
236
+ - chore[multi]:收敛编辑器与 git 属性配置, 删除 C++ 遗留配置
237
+ - .editorconfig 按本仓实际语言重写: 补 Rust(4 空格/100 列)与 Go(tab)两段, 把指向不存在 tests/ 的
238
+ 空规则改成 **/*_test.py, toml 并入配置文件段
239
+ - .gitattributes 删掉 mopr 的 go module export-ignore 整块与本仓不存在的 cpp/h/java/proto/cmake 类型,
240
+ 只保留按实际文件的行尾归一表(含 .githooks/* 与 bat/cmd 的 GBK 例外)
241
+ - 删除 .clang-format / .clang-tidy / .clangd: 从 mopr 拷来, 本仓无任何 C/C++ 源码
242
+ - 验证: git ls-files --eol 显示属性已生效, 工作树无 CRLF 文件, 无归一化引发的连带改动
243
+ - chore[rust]:规范化 Cargo 清单并将 crate 改名为 quant1x-foundations
244
+ - 补齐 authors / description / repository / include 白名单, 仓库地址取 pyproject.toml 的 Homepage
245
+ - crate 名加 quant1x- 前缀(foundations 已被 crates.io 占用), 库名 quant1x_foundations, 代码路径
246
+ 随之变为 quant1x_foundations::panshi::...
247
+ - include 只收根 lib.rs 与各模块的 *.rs / *.md, 避免把 Python 源码与会计准则资料打进 crate 包
248
+ - 验证: cargo metadata 显示 package/lib 名正确, cargo check 通过, cargo package --list 列出 29 项
249
+ - docs[multi]:新增协作规范 CONTRIBUTING.md
250
+ - 收录语言角色(Python spec / Rust 生产 / Go 存量冻结)、目录与多语言布局、命名与数据契约、
251
+ 代码规范、文档规范、测试规范、变更流程与版本发布
252
+ - 与 AGENTS.md 分工: 架构、语义、目录、文档、测试归本文件, git 提交规范仍以 AGENTS.md 为准,
253
+ AGENTS.md 增加一行入口指针
254
+ - 测试与临时产物分道: 入库用例放模块旁, 一次性脚本与数据进 temp/ 垃圾站, 后者不入库也不被引用
255
+ - 验证: UTF-8 无 BOM / LF, 章节锚点与文件引用已逐个核对
256
+ - chore[rust]:补齐空模块的版权与 SPDX 头
257
+ - labs/mod.rs 与 mpr/mod.rs 原为 0 字节空文件, 无版权与许可证标识, 补成与 lib.rs /
258
+ panshi/mod.rs 一致的两行头(版权声明 + SPDX-License-Identifier: MIT)
259
+ - 许可证合规核对: cargo package 产出的 crate 内含 LICENSE 且与仓库文件字节一致, 无需
260
+ license-file 字段(与 license 互斥, 同时写会触发 cargo 警告)
261
+ - 验证: cargo check 通过, 四个 .rs 文件均已带 SPDX 头
262
+ - feat[python]:接入 BCEAO 八国节假日规则并沉淀数据源文档
263
+ - trading_calendar: 新增 BJ/BF/CI/GW/ML/NE/SN/TG 八国规则块, 条目名以 holidays 库为准, 掩码按
264
+ rili 类型推定(全部 ALL, 多哥斋月首日按 NONE 处理), 2022 ~ 2032 全区间无未命中
265
+ - holidays-xof.md: 八国合写一份(共用法定框架, 差异只在独立日与国家级纪念日), 含取数配置、共同
266
+ 框架矩阵、专属日表、与 rili 的差异、参考量与 TODO
267
+ - holidays-sources.md: 沉淀数据源分层与对账方法(一手/事实/第三方/代码库), 记录八国 2026 三家对照
268
+ 结果与各源已知缺陷
269
+ - holidays.md: 索引挂载八国与数据源文档, 流程补"无 CFETS 基准时用第三方旁证"
270
+ - 验证: closed_dates_of 跑 2022 ~ 2032 零告警; US/GB/GH/SL 结果保持 10/8/14/12 天不变
271
+ - docs[python]:将 XOF 文档更名为 UEMOA 并区分货币码与地区码
272
+ - XOF 是西非法郎的货币码, 不是地区码, 原文件名 holidays-xof.md 与"holidays-<regionCode>.md"
273
+ 的约定冲突; 改名为 holidays-uemoa.md, 指向成员国所在的联盟
274
+ - 文档开头补一句口径: 地区码一律 ISO 3166-1 alpha-2, XOF 只用于币种维度描述(如 CFETS 不发布
275
+ XOF 休市日), 不作文件名与规则表的键
276
+ - 同步 trading_calendar 的注释与 holidays.md 索引: UEMOA 一行从"永远拿不到"改为"整体拿不到,
277
+ 成员国按 ISO 码分别取"
278
+ - 验证: 两份文档无断链; 八国 2026 闭市日数量不变(11/12/11/9/12/14/10/9)
279
+ - feat[python]:新增 bank 目录, 收录吉布提与 BCEAO 八国的商业银行名录
280
+ - 新增 panshi/data/bank/ 目录与 README: 文件按 ISO 3166-1 alpha-2 小写命名, 字段口径(名称/简称/
281
+ 注册号/成立/官网/备注)与收录原则(监管名录优先、只收在营持牌、官网逐个探测、不猜域名)
282
+ - dj.md: 取自吉布提中央银行「持牌机构」页, 10 家常规商业银行 + 3 家伊斯兰银行 + 1 个伊斯兰窗口,
283
+ 官网按可达性分档; 单列 CBD 与 Silk Road 两条"已不在名录"以免误用
284
+ - bj/bf/ci/gw/ml/ne/sn/tg.md: 取自 BCEAO「Liste des établissements de crédit agréés au
285
+ 31 décembre 2025」, 解析出 136 家银行(14/16/29/6/14/14/29/14), 与官方汇总表逐国吻合
286
+ - 集团官网已核对到可达(BSIC/Ecobank/Coris/Sonibank/Bange/BICICI/SIB/BDM/SUNU 等), 小行独立
287
+ 域名尚未确认的一律写"待补"; orabank.com 实测已变成域名停放页, 记入文档
288
+ - docs[python]:补 CN/HK/US/GB 的商业银行汇率页清单
289
+ - 收录口径与名录不同: 只收"能看到汇率页面"的商业银行, 并记下页面类型、验证结果与抓取难点
290
+ - 已验证: 中行 / 工行 / 招行 / 恒生 / 汇丰香港 / Wells Fargo / Bank of America / Barclays /
291
+ Lloyds / NatWest, 逐个探测状态码并在返回 HTML 里查汇率关键词
292
+ - 待核的逐条记下试过的路径与现象(404 / 302 / TLS 超时 / 前端渲染), 不猜路径
293
+ - 口径提示: 美英页面是零售换汇价(含点差与手续费), 不能当基准; 逐日基准用 Fed H.10、ECB 参考
294
+ 汇率、BoE 即期; 香港牌价现钞/现汇与客户档位不同
295
+ - refactor[python]:去掉 MarketCalendar 槽位字段的重复声明
296
+ - __slots__ 已声明 _days / _masks, __init__ 里再写 self._days: list / self._masks: list 属于重复
297
+ 声明, PyCharm 报 "Declaration '_masks' is obscured by a declaration of the same name"
298
+ - 类型注解上移到类体, __init__ 只做普通赋值; 槽位与类体注解不冲突(注解不创建类属性)
299
+ - 验证: 带掩码的排序/查询(mask_of、select、latest)、不传掩码全零、越界返回 None 三种路径与
300
+ 改动前一致
301
+ - refactor[python]:全仓统一 Optional[X] 为 X | None
302
+ - panshi: calendar / holiday / trading_calendar 共 14 处注解改写, 文档串里的 `Optional[int]`
303
+ 一并更新, 三个文件移除 typing.Optional 导入
304
+ - mpr: power.py 6 处、option.py 1 处由 ruff UP045 自动修复; waves_test.ipynb 6 处手工替换
305
+ (ipynb 整份重写会产生 788 行噪声, 只改单元格源码文本)
306
+ - panshi 顺带清掉两条既有告警: trading_calendar 的 defaultdict 死导入、TradingCalendar.__slots__
307
+ 未排序
308
+ - 验证: ruff check --select UP045 全仓通过; panshi 三模块导入正常, mpr 两模块 py_compile 通过
309
+ (power.py 依赖未安装的 TA-Lib, 无法 import)
310
+ - chore[python]:按 ruff 清理可自动修复项
311
+ - 执行 ruff check --fix (安全修复), 55 个文件 409 处: 主要是 FURB157 的 Decimal 构造简化
312
+ (Decimal('1') -> Decimal(1), 整数常量等价)、UP037 去掉多余的前向引用引号、RUF022/RUF023
313
+ 的 dunder 排序
314
+ - 有意排除: UP006(typing.List -> list, 与 pyproject 中 UP035 的保留口径一致)、UP009(删 coding 头)、
315
+ *.ipynb(整份重写会产生 788 行噪声)
316
+ - 顺带修两处存量 F821: audit.py 的 'OfficeRules' 改成实际类型 RuleBook; jurisdiction.py 补
317
+ from .asof import Span
318
+ - 未修: validate.py:225 的 rates 未定义(错误分支里的真 bug, 需先定展示哪档费率)
319
+ - 验证: 55 个改动文件 py_compile 通过; labs.sta 51 个子模块导入正常
320
+ - chore[python]:显式固定 ruff 规则集
321
+ - 之前只写了 ignore 没写 select, ruff 随版本变化启用 405 条规则, 全仓一次性冒出 2060 条告警
322
+ (1460 条 UP031、296 条 UP006 等), 与本仓既有风格冲突
323
+ - 改为显式 select = ["E4", "E7", "E9", "F", "UP037", "UP045"]: 只开已清理干净的两族加两条注解
324
+ 规则; ignore 补 E402(.githooks/scripts 先改 sys.path)与 E741(记账代码里 l 指凭证行)
325
+ - 未纳入的 UP006 / UP009 / UP031 / UP035 连原因一起写进注释, 避免下次无从判断
326
+ - 补 target-version = "py312"(与 requires-python 一致)、line-length = 120(与 .editorconfig 一致)、
327
+ extend-exclude = ["*.ipynb"](ruff --fix 会整份重写 notebook)
328
+ - 验证: 生效规则 405 -> 59, 全仓告警 2060 -> 34, panshi 保持 0
329
+ - fix[python]:修复波浪分段漏参与类型问题, 并清理 ruff 剩余告警
330
+ - 真 bug 修复:
331
+ - waves.py detect_main_wave_in_range 调 build_wave_segments 漏传 low_list, 调用即 TypeError
332
+ - casc_sync.py 的 class 属性值可能为 None, 'infoCon' in None 会抛 TypeError
333
+ - 类型问题(由 pyright basic 模式发现):
334
+ - exchange.py 返回注解 (MarketType, str, str) 不是合法类型, 改 tuple[...]
335
+ - cache.py __main__ 里 stock_name = stock_name(code) 遮蔽同名函数
336
+ - numerics.py 参数标注 float 却中途赋成 str, 改用独立变量, 保留先转字符串的原意
337
+ - period.py 的 bank 可能是 None, 标注放宽为 str | None
338
+ - api.py 类属性 service 初值 None, 标注改为 Service | None
339
+ - ruff 剩余 33 条清零: base/__init__.py 补 __all__(20 项再导出), 删 10 处无副作用死赋值,
340
+ file.py 保留 open 副作用, waves.py 的裸 except 收窄为 except Exception, reports.py 的
341
+ lambda 赋值改为 def, validate.py 消息去掉未定义的 rates
342
+ - power.py 的 params 死赋值改为文档串标注"**kwargs 暂未生效", 不擅自接语义
343
+ - 配置: [tool.pyright] 增加 exclude(build / target / temp / __pycache__), 避免旧构建副本重复计数
344
+ - 验证: ruff check 全通过; pyright 由 284 降到 135 个(剩余为 pandas/numpy stub 噪声与缺失的可选依赖);
345
+ py_compile 全通过, waves 分段实测可调通
346
+ - fix[python]:修正 RiskIndicator.trade_date 的类型注解
347
+ - 注解写的是 datetime, 而唯一构造处取的是 datetime.strptime(...).date(), 传的是 date,
348
+ pyright 报 "date is not assignable to datetime"
349
+ - 该字段只存不用(全仓无外部引用), 业务语义是交易日这类纯日期, 同文件 params 的 trade_date
350
+ 也是日期粒度, 故按构造处收紧为 date
351
+ - 验证: pyright mpr/core/option.py 0 errors; ruff 通过
352
+ - fix[python]:修正 power.py 的类型问题并补 dev 可选依赖
353
+ - 根因: 环境缺 pandas-stubs 时 Series/DataFrame 的方法类型退化成 Any/Unknown, 一处正常代码会报
354
+ 几十条假阳性; 装上后全仓 pyright 由 135 降到 117
355
+ - power.py 六处修正:
356
+ - _safe_zscore 两个分支合并为 np.asarray(x, dtype=float), np.mean/std 的类型可判
357
+ - np.tanh 作用在 Series 上运行时返回 Series, 显式包回 Series, 行为不变而类型明确
358
+ - stock_data / buy_signals 加 pd.DataFrame 标注, 布尔索引不再退化成 ndarray
359
+ - avg_return / max_drawdown 用 float() 收敛成标量, 与 BacktestResult 字段对齐
360
+ - 信号赋值由 iloc + get_loc 改为 .at[index, 'final_signal'], 绕开重载不匹配
361
+ - analyze_batch 入参改 Sequence(协变), list[str] 可传; 随之清掉未使用的 typing.List
362
+ - 新增 dev 可选依赖(ruff / pyright / pandas-stubs), 注释说明 pandas-stubs 为何必需
363
+ - 验证: power.py pyright 由 11 条降到 1 条(仅 talib 需本地 C 库, 属环境缺依赖);
364
+ ruff check 全通过; py_compile 通过
365
+ - fix[python]:BBANDS 入参显式转为 float64 ndarray
366
+ - TA-Lib 的 C 接口只接受 float64 的 ndarray; 传 Series 能跑是它内部做了转换, 类型上与
367
+ NDArray[float64] 不匹配, basedpyright 报 reportArgumentType
368
+ - 改为 df['close'].to_numpy(dtype=np.float64), 同时把精度固定住, 避免上游列是 float32/object
369
+ 时中途变形; 返回值仍是三条 ndarray, 后续算法未动
370
+ - 全仓仅此一处 talib 调用, 无同类待改点
371
+ - 验证: ruff 全通过, py_compile 通过; 本机 talib 缺 C 库装不上, 类型告警需在有 talib 的
372
+ 环境复核
373
+ - chore[multi]:把 output/ 一并纳入忽略
374
+ - output/ 是模块跑完直接落盘的产物(all_signals.csv / trades.csv / backtest_summary.json),
375
+ 与 temp/ 同属临时产物, 不该散落在工作区里等下次提交
376
+ - 验证: git check-ignore 命中 output/all_signals.csv, git status 不再显示该目录
377
+ - release version 0.1.18
378
+
379
+ ## [0.1.17] - 2026-10-29
380
+ ### Changed
381
+ - fix[multi]:调整仓库地址
382
+ - release version 0.1.17
383
+
384
+ ## [0.1.16] - 2026-10-28
385
+ ### Changed
386
+ - refactor[python]: 修改项目名称为quant1x-foundations
387
+ - fix[python]:GH 补齐非盟日与伊斯兰节日校正, 补假撞车再顺延
388
+ - _HOLIDAY_TYPES 增加 African Union Day; _HOLIDAY_YEAR_SPAN 登记为 2002 ~ 2018
389
+ - 新增 _ESTIMATED_FIX: 库标 (estimated) 且事实已证明落在别天的 7 条伊斯兰节日按事实改日期, 改完再判星期
390
+ - 新增 _next_free 与正日集合避让: 补假落在休息日、别的正日或已排休市日上时继续往后推; Public Holiday 本身就是补假结果, 不进避让集合
391
+ - 文档: holidays-gha.md 补顺延撞车证据表、估算校正说明与残差处理口径
392
+ - 验证: 2025-09-19 ~ 2026-10-27 的 15 天逐日相等; 2011 / 2013 / 2014 / 2017 ~ 2025 全中; 2010 / 2011 / 2016 的圣诞与节礼日补假与事实吻合; 2027 闭市 13 天(新增 12-28); CN / HK / MO / TW / US / GB / SG / JP / DJ / SL 逐年比对无变化
393
+ - release version 0.1.16
394
+
395
+ ## [0.1.15] - 2026-10-28
396
+ ### Changed
397
+ - chore[python]:ruff 忽略 I001 与 UP035
398
+ - pyproject.toml 新增 [tool.ruff.lint], ignore = ["I001", "UP035"]
399
+ - 只设 ignore 不设 select, 规则集沿用 ruff 默认, 不额外引入检查项
400
+ - 验证: tomllib 解析通过; panshi/data/holiday.py 的 I001 与 UP035 告警消失, 余下 UP006 / UP045 未动
401
+ - fix[python]:GH 日历按汇率历史腿校正休市日
402
+ - 新增 _HOLIDAY_YEAR_SPAN: 共和国日 07-01 收口到 2018 —— 库在 2002 ~ 2018 与 2025 起都发这条, 直接清零会把 2002 ~ 2018 改错
403
+ - 新增 _OBSERVED_SHIFT 并给 GH 打开 _RECOMPUTE_OBSERVED: 周六 +2、周日 +1 顺延到下一个工作日, 先于 US 的硬编码口径
404
+ - 新增 _MOVED_HOLIDAYS: 2026 宪法日 01-07 开市, 休市日落在 01-09
405
+ - 文档: holidays-gha.md 的验证基准改为 ~/.mopr/data/forex/bog/ghs, 修正非盟日的错述, holidays.md 同步 GH 状态
406
+ - 验证: 2025-09-19 ~ 2026-10-27 的 15 个事实闭市日与规则逐日相等; 2025 / 2026 / 2027 闭市 14 / 14 / 12; US 与 CN 结果未变
407
+ - release version 0.1.15
408
+
409
+ ## [0.1.14] - 2026-10-28
410
+ ### Changed
411
+ - refactor[python]:抽出地区码表到 calendar_zone 模块
412
+ - RiliRegion 与 _REGIONS(210 条) 从 holiday.py 搬到 calendar_zone.py, 条目内容与顺序逐字不变
413
+ - holiday.py 不再携带该表(内部本无引用, 不保留死导入), 文档中对其的提及改为指向 calendar_zone
414
+ - 字段 ISO_3166_1_alpha_2 更名为 iso_3166_1_alpha_2; 表头注释里的 regionCode 对齐为字段名 code
415
+ - 验证: 210 条目与八个分区不变, 模块导入与 Holiday.dates() 正常, calendar_zone.py 无 lint 告警
416
+ - release version 0.1.14
417
+
418
+ ## [0.1.13] - 2026-10-24
419
+ ### Changed
420
+ - refactor[python]:规则类 YAML 移出 data 归入 spec 目录
421
+ - 177 个规定类文件由 labs/sta/data 迁入 labs/sta/spec: coa/report/tax/rules/audit/geo 及 regimes/taxonomy
422
+ - data 只保留演示账套实例(opening/demo/documents/flows/fx 与实体档)与运行时缓存, sta.db 默认路径改到 labs/sta/data
423
+ - 修正 package-data 的 glob 不递归: 原 ["data/*.yaml","data/*/*.yaml"] 漏掉 47 个文件, 改为显式列出 spec 三层与 data 五子目录, auth 与 *.db 不进包
424
+ - 同步 30 处路径常量与 DESIGN/README/docs 中的路径引用
425
+ - 验证: python -m labs.sta.validate 216 项全 OK; 构建 wheel 核对 194 个 YAML 全覆盖, auth 与 *.db 未混入
426
+ - release version 0.1.13
427
+
428
+ ## [0.1.12] - 2026-10-24
429
+ ### Changed
430
+ - feat[python]:本体键由编码改名称, 补交通运输与个体户制度, 新增税费减免层
431
+ - 科目本体: 第二层键由本体码改为**科目名称**(身份), code 降为条目属性, 3 位码(1993 行业制度)
432
+ 可直接作载体; SUPPORTED_FROM 由 2001-01-01 下移到 1993-07-01; A181 改为 24 套制度逐条投影
433
+ 对平(846 条 1993 科目一条不缺); 本体 259 → 439, 再补 5 个保险组合层面科目到 444
434
+ - 1993 交通运输: 会交 01/02 按原文编制说明还原(存货含辅助营运费用, 待摊费用含船舶固定/维护与
435
+ 集装箱固定费用), 新增 fmt_1993_transport; A125 从"缺格式必须报错"改为验表
436
+ - 个体工商户(财会字〔1997〕19 号): 25 个科目 + 会个体 01/02/03 三张表; 结转适配业主投资/
437
+ 本年应税所得/留存利润, 税后列支费用单独转留存利润; 不进企业本体, A214 单独守
438
+ - 保险: 依《应用指南汇编2024》第二十五章补 5 个组合层面科目(1618 保险获取现金流量资产、
439
+ 1619/1620 分保摊回资产、2614 未到期责任负债、2615 已发生赔款负债), 会保险 01 四个合同行
440
+ 改按组合层面汇总, A188/A189 同步
441
+ - 税费减免层: 新增 relief.py + tax/reliefs.yaml, 按"税种 + 纳税人 + 起征点 + 期间"叠加
442
+ exempt/halve/base_deduct/credit 四类处理, 凭证 source 带政策文号; accrue_surcharges 支持
443
+ taxpayer, A215 验小规模 8 万/12 万/一般纳税人/留抵退税四档
444
+ - 报表映射: 把写成编码的其他综合收益、合同负债、合同资产改回语义键, 新增 A213 全量扫描;
445
+ A134 改为语义键与编码都认
446
+ - 地方教育附加 9 省按 2% 上限兜底(标注"合规兜底·上限占位", verified=false), A197 扩充;
447
+ 计划表拆出"重要但不紧急(TODO)", 不再阻塞主线
448
+ - 验证: python -m labs.sta.validate 216 项通过; python -m labs.sta.demo 勾稽正常
449
+ - release version 0.1.12
450
+
451
+ ## [0.1.11] - 2026-10-24
452
+ ### Changed
453
+ - feat[python]:新增应上交及应弥补款项表与民航利润分配表, 归档制度原文三份
454
+ - 新增 payable_table()(A212):会企 01 表附表 4,105 行三栏并排,按 `税种=` 标签在
455
+ 应交税金/其他应交款上取数(应交=贷方发生额、已交=借方发生额、年初年末=余额),
456
+ 增值税应交增值税专栏行与关税仅已交行按表样留空
457
+ - 新增 minhang_profit_distribution()(A211):民航 会企 02 表附表利润分配表,22 行,
458
+ 含应拨调节费、利润归还投资、补充流动资本、单项留用利润、应交调节费等民航特有行;
459
+ 本年利润/利润分配科目按名称取,不再写死 3141/3151(2001 制度与 1999 证券编码不同)
460
+ - 归档 1993 年民航企业会计制度报表格式(厦大转载,含会航 01 完整行次)、
461
+ 2001 年企业会计制度全文(中华会计网校 Word 版,antiword 抽取,第四章报表格式原文即「(略)」)、
462
+ 国资委 2020 年度决算编制说明中「应上交应弥补款项表(企财07 表)」一节
463
+ - 更正此前判断:附表 4 不是民航独创,也非 1993 民航制度或 2001 制度正文的附表,
464
+ 而是全国通用财政决算表(会工01-1 表 → 会附表1 → 企财07 表),民航只是列为附表 4
465
+ - 文档:minhang_tables_inventory 记五源核查与来路结论,新增 docs/finance/decai/ 目录说明
466
+ - 验证:python -m labs.sta.validate,A0–A212 共 213 项通过
467
+ - release version 0.1.11
468
+
469
+ ## [0.1.10] - 2026-10-23
470
+ ### Changed
471
+ - feat[python]:补齐会证合与证券会金融格式, 新增权益变动表(会金融04)
472
+ - 会证合 01–03: 合并资产负债表/利润表/现金流量表, 只做呈现(合并数由 worksheet 提供);
473
+ 利润表单列少数股东损益(37)与未确认投资损失(38), 现金流量表沿用 1999 会证 03 行项目(A205/A206)
474
+ - 会证股 01/02 与两张附表: 股本口径、自营证券净额、股东权益增减变动、利润分配(A203/A204)
475
+ - 会金融 04 证券版: 矩阵式 25 行 × 8 列, 利润分配在盈余公积与未分配之间对冲, 按名称取"利润分配"
476
+ 科目编码以适配 1999(3151)与 CAS(4104)(A207)
477
+ - 修正: 未分配利润取数改为 3141+3151(月末结转只到本年利润, 只看 3151 会漏), 同步修正
478
+ 2004 版权益变动表与利润分配表
479
+ - 计划表 #23 状态与下一步同步(A191–A207)
480
+ - 验证: python -m labs.sta.validate → A0–A207 全部通过(208 项)
481
+ - feat[python]:补齐会证合附表1、会保险04与银行/保险版会金融, 证券金融格式收口
482
+ - 会证合 02 附表 1: 合并利润分配表, 三段分配自算(A208), 会证合 4 张全齐
483
+ - 会保险 04: 与金险版共用计算, 行少"其他"一行(24 行)(A208), 会保险 01–04 全齐
484
+ - 会金融 01/02 银行版: 去掉证券专用行, 加存 放同业/发放贷款和垫款/吸收存款/同业存放
485
+ (fmt_2018_yinhang, A209)
486
+ - 会金融 01/02 保险版: 存出资本保证金/未到期责任准备金/保户储金/独立账户, 2019–2022 适用,
487
+ 2023 起自动切会保险格式(A210)
488
+ - 摊回三项(6201/6202/6203)仍留空: 费用减项, 映射引擎只有 credit/debit 两桶
489
+ - 计划表: #23 移入已完成, 进行中与待办清空
490
+ - 验证: python -m labs.sta.validate → A0–A210 全部通过(211 项)
491
+ - release version 0.1.10
492
+
493
+ ## [0.1.9] - 2026-10-23
494
+ ### Changed
495
+ - feat[python]:比较期间列示每股收益
496
+ - comparison.YearRow 增 eps 字段, build 支持传股本登记簿, 不传则读默认登记
497
+ - 有普通股时比较表多一列「基本每股收益」, 逐年各用各的加权股数
498
+ - 没有股本登记的主体不列空列, 与附注的"不适用"保持一致
499
+ - 新增 A118: 2025 年 10.00、2026 年 9.08; 无登记时整列不出现
500
+ - 验证: python scripts/sta_check.py 通过(A0-A118 共 119 项)
501
+ - feat[python]:合并口径每股收益
502
+ - 新增 consolidated_eps: 分子取归母净利润, 分母取母公司加权股数, 不拿净利润合计去除
503
+ - 股本登记挂在合并根节点; 根是虚拟汇总节点时返回 None(不适用), 不代选上市公司
504
+ - 接口新增 consolidations/<id>/eps, 返回 applicable/basic/diluted/weighted
505
+ - 新增 A119: 母 10000 + 子 20000×80% -> 归母 26000, EPS 26.00(错用合计会得 30.00)
506
+ - 验证: python scripts/sta_check.py 通过(A0-A119 共 120 项)
507
+ - feat[python]:加纳成员账套与合并成员语义
508
+ - entities 与期初余额补 GH-01/GH-02(本位币 GHS), GH-GROUP 从"虚拟空表"变成真账
509
+ - build_ledgers 把每条账套推进到全部业务的最晚日期: 没有本期业务的主体也要走完
510
+ 制度迁移与年结, 否则报表里还挂着 2001 制度科目(3101), 权益整块读不出来
511
+ - A72 改为两个口径都必须完整, 缺席成员用构造出来的口径验证
512
+ - A109 增加加纳口径整包导出断言, 缺席成员改用 ZZ-99 构造口径
513
+ - 合并类检查统一按 CN-GROUP 成员过滤账套, 不再把 GHS 主体一起并进 CNY 口径
514
+ - 验证: python scripts/sta_check.py 通过(A0-A119 共 120 项); GHS 230000 = CNY 138000
515
+ - docs[multi]:归档两则两制资料与工业企业会计制度科目表
516
+ - 台账 xlsx 从 cas/ 移到 docs/finance/liangze_1993/, 按目录规范改 ASCII 文件名
517
+ - 新增 scripts/liangze_ledger.py: xlsx -> md 只读镜像, 避免手抄台账出错
518
+ - 归档《工业企业会计制度》财会字〔1992〕67号 的 60 个科目表, 注明来源链接与页面截断位置
519
+ - 目录 README 写明 12 个行业制度、报表格式附件、逐科目迁移映射三处缺口
520
+ - docs/finance 索引登记新目录
521
+ - 验证: python scripts/liangze_ledger.py 生成 98 行; python scripts/sta_check.py 通过(120 项)
522
+ - docs[multi]:补齐全套工业企业会计制度全文与报表格式
523
+ - 归档 1992 年 67 号制度全文纯文本(2940 行), 来源厦大会计发展研究中心转载
524
+ - 结构化整理会工 01 资产负债表 45/90 行次与会工 02 损益表 20 行次
525
+ - 记下关键体例差异: 损益表止于利润总额, 所得税在附表 1 利润分配表
526
+ - 补记废止日 2015-02-16, 目录 README 更新三处缺口状态
527
+ - 验证: 纯文档改动, python scripts/sta_check.py 通过(120 项)
528
+ - feat[python]:接入 1993 工业企业会计制度
529
+ - 科目表 liangze_1993_industry.yaml: 财会字〔1992〕67号 60 个科目, 233 待扣税金方向如实标借
530
+ - regimes 加 1993-07-01~2000-12-31 并标 industry: 工业; 2001 制度起始前移到 2001-01-01
531
+ - 制度解析加行业维度: Book.coa 带 industry, 行业不符直接拒绝; Ledger 增 industry 字段
532
+ - 报表格式加 fmt_1993(会工 01/02): 资产负债表只映射净额避免科目重复计入
533
+ - open_books 的现金/银行存款改按科目名取, 不再假定 1002(1993 是 102)
534
+ - 新增 A120: 60 科目、试算平衡、会工 01/02 数字、未标行业拒绝、1993-07-01 前无制度
535
+ - 验证: python scripts/sta_check.py 通过(A0-A120 共 121 项)
536
+ - feat[python]:接入 1993 商品流通企业会计制度
537
+ - 科目表 liangze_1993_commerce.yaml: 财会字〔1992〕69号 65 个科目(无成本类)
538
+ - 制度解析改为按「日 + 行业」取表: 同期可并存多套分行业制度, 同行业内部才查区间重叠
539
+ - 报表格式加行业维度: _format_of/_balance_mapping/_income_mapping 带上 industry
540
+ - 会商 01/02 映射: 存货含受托代销/进销差价/削价准备, 损益表先扣销售折扣与折让
541
+ - 归档商品流通制度全文(2140 行)
542
+ - 新增 A121: 65 科目、会商 01/02 数字、两套格式按行业分派、同码不同义(135)
543
+ - 验证: python scripts/sta_check.py 通过(A0-A121 共 122 项)
544
+ - docs[multi]:补 13 个行业会计制度清单与文号
545
+ - 按财会〔2015〕3 号废止目录补齐 11 个待补制度的名称、文号与发布日
546
+ - 标注已归档(工业 67 号、商品流通 69 号)与待补, 并给出检索线索
547
+ - feat[python]:接入 1993 旅游、饮食服务企业会计制度
548
+ - 科目表 liangze_1993_service.yaml: 财会字〔1992〕68号 47 个科目, 无成本类
549
+ - 制度与报表格式按行业并存: 工业/商品流通/旅游饮食服务 同区间各一套
550
+ - 会服 01/02 映射: 营业收入-营业成本-营业费用-税金及附加, 再减管理/财务费用
551
+ - 归档制度全文(1482 行), 来源上海市财政局转载
552
+ - 新增 A122: 47 科目、无成本类、会服 01/02 数字与格式分派
553
+ - 验证: python scripts/sta_check.py 通过(A0-A122 共 123 项)
554
+ - feat[python]:接入 1993 施工企业会计制度
555
+ - 科目表 liangze_1993_construction.yaml: 财会字〔1992〕70号 65 个科目, 含四个成本类
556
+ - 会施 01/02 映射: 存货含物资采购/采购保管费/周转材料/工程施工, 临时设施单列净值
557
+ - 上海财政局与厦大站点收录的通知附件均标"略", 科目表据两处转载互校, 标 verified: false
558
+ - 新增 A123: 65 科目、成本类 401/411/421/431、会施 01/02 数字、格式分派
559
+ - 验证: python scripts/sta_check.py 通过(A0-A123 共 124 项)
560
+ - feat[python]:接入 1993 房地产开发企业会计制度
561
+ - 科目表 liangze_1993_realestate.yaml: 财会字〔1993〕2号 61 个科目
562
+ - 会开 01/02 映射: 存货含开发产品/分期收款/出租开发产品/周转房/开发成本
563
+ - 库存设备、固定资产购建支出单列; 成本类只有开发成本与开发间接费用
564
+ - 归档全文(866 行), 该页附件齐全(科目表+使用说明+报表)
565
+ - 新增 A124: 61 科目、特有科目名、会开 01/02 数字与格式分派
566
+ - 验证: python scripts/sta_check.py 通过(A0-A124 共 125 项)
567
+ - docs[multi]:归档运输企业财务制度并区分两制
568
+ - 归档《运输企业财务制度》财工字〔1992〕577号全文(344 行)
569
+ - 目录 README 增设「10 个行业财务制度」一节, 标明与 13 个会计制度不是一一对应
570
+ - 财务制度不含会计科目, 明确不进 data/coa/, 只作口径依据
571
+ - feat[python]:接入 1993 运输(交通)企业会计制度
572
+ - 科目表 liangze_1993_transport.yaml: 财会字〔1993〕1号 67 个科目
573
+ - 五个成本类(辅助营运/营运间接/船舶固定/船舶维护/集装箱固定), 收入按运输/装卸/堆存/代理/港务五对
574
+ - 来源页面只有科目表, 会交 01/02 报表格式缺失: 记账与试算可用, 出表直接报错
575
+ - 新增 A125: 67 科目、成本类清单、特有科目名、试算平衡、缺格式必须拒绝出表
576
+ - 归档全文(1267 行)
577
+ - 验证: python scripts/sta_check.py 通过(A0-A125 共 126 项)
578
+ - feat[python]:接入 1993 运输(铁路)企业会计制度
579
+ - 科目表 liangze_1993_railway.yaml: 财会字〔1993〕8号 66 个科目
580
+ - 铁路没有成本类: 运输收入/运输支出/完成工作清算全在损益类
581
+ - 会铁 01/02 映射: 制服垫款、上下级往来、运输收入往来、铁路建设基金等系统内科目
582
+ - 归档全文(1044 行), 来源页面科目表与报表格式齐全
583
+ - 新增 A126: 66 科目、无成本类、特有科目名、会铁 01/02 数字与格式分派
584
+ - 验证: python scripts/sta_check.py 通过(A0-A126 共 127 项)
585
+ - docs[multi]:复核施工制度科目表与转载来源的差异
586
+ - 河北省注协那份可解析 56 个科目, 与本仓逐条比对只发现两处转载笔误
587
+ - 156 应为固定资产清理(转载写成"固定资产资产清理"), 231 应为预提费用(转载写成"预提借款")
588
+ - 结论保留 verified: false: 两处转载互校不等于核过官方扫描件
589
+ - feat[python]:接入 1993 农业企业会计制度
590
+ - 科目表 liangze_1993_agriculture.yaml: 财农字〔1992〕344号 68 个科目
591
+ - 六个成本类(农业/工业/运输/施工/辅助生产 + 制造费用), 家庭农场往来与包干利润单列
592
+ - 农会 01/02 映射: 应收/应付家庭农场款、待转家庭农场上交款、专项应付款、应交包干利润
593
+ - 归档全文(3935 行, 含家庭农场核算章节)
594
+ - 新增 A127: 68 科目、成本类清单、农会 01/02 数字与格式分派
595
+ - 验证: python scripts/sta_check.py 通过(A0-A127 共 128 项)
596
+ - feat[python]:接入 1993 对外经济合作企业会计制度
597
+ - 科目表 liangze_1993_foreign.yaml: 财会字〔1993〕3号 68 个科目, 五类齐全
598
+ - 外经特有: 应收票据贴现(资产类贷方)、融资租入固定资产及折旧、出国人员费、
599
+ 建造费用、辅助生产费用; 收入/成本各分"本期"与"递延"两侧; 清算费用与清算损失
600
+ - 外经会 01 只映射人民币金额列(原表还有外币折美元列, 属于附注口径)
601
+ - 归档全文(2008 行)
602
+ - 新增 A128: 68 科目、五类、特有科目名、外经会 01/02 数字与格式分派
603
+ - 验证: python scripts/sta_check.py 通过(A0-A128 共 129 项)
604
+ - feat[python]:接入 1993 运输(民用航空)企业会计制度
605
+ - 科目表 liangze_1993_aviation.yaml: 财会字〔1993〕12号 62 个科目
606
+ - 民航特有: 航材消耗件/高价周转件/普通器材/机上供应品; 国际与国内票证结算两侧;
607
+ 应交民航基础设施建设基金; 无成本类, 运输/通用航空/机场服务三对收支直接进损益
608
+ - 会计视野页面科目表标"略", 62 个科目取自河北注协与上海财政局两处转载(逐条一致)
609
+ - 会航 01/02 映射: 主营业务收入=运输+通用航空+机场服务; 成本同口径
610
+ - 新增 A129: 62 科目、无成本类、特有科目名、会航 01/02 数字与格式分派
611
+ - 验证: python scripts/sta_check.py 通过(A0-A129 共 130 项)
612
+ - feat[python]:接入 1993 邮电通信企业会计制度
613
+ - 科目表 liangze_1993_post.yaml: 财会字〔1993〕13号 63 个科目
614
+ - 邮电用"收支差额/收支差额分配"(321/322)代替"本年利润/利润分配", 结账按名称回退
615
+ - 邮电特有: 营业款结算(116)、附属生产(134)、集邮商品(136)、特准储备物资/基金、
616
+ 应交/所属上交收支差额(224/225)
617
+ - 会邮 01/02 映射
618
+ - 新增 A130: 63 科目、收支差额结转后余额、损益清零、会邮 01/02 数字与格式分派
619
+ - 验证: python scripts/sta_check.py 通过(A0-A130 共 131 项)
620
+ - feat[python]:接入 1993 金融企业会计制度(银行业)
621
+ - 科目表 liangze_1993_bank.yaml: 财会字〔1993〕11号 第三章银行业 72 个科目
622
+ - 银行特有: 存放央行/同业/联行款项、拆放同业、各类贷款与呆帐准备、活期/定期/储蓄/财政性存款、
623
+ 向中央银行借款、应解汇款、外汇买卖
624
+ - 会金 01/02 映射: 存贷款分列列示, 利息收支/往来收支分开
625
+ - 第四章金融性公司 82 个科目是另一套, 尚未接入(DESIGN 已记)
626
+ - 新增 A131: 72 科目、六个特有科目名、会金 01/02 数字与格式分派
627
+ - 验证: python scripts/sta_check.py 通过(A0-A131 共 132 项)
628
+ - feat[python]:金融性公司单独成口径, 不与银行合并
629
+ - 科目表 liangze_1993_nonbank.yaml: 财会字〔1993〕11号 第四章 82 个科目
630
+ - 与银行是两套: 103 银行是贵金属、金融性公司是应收帐款; 银行有联行存放, 金融性公司有信托/委托/证券承销/租赁
631
+ - 各占一个 industry 键、各一份 COA 与报表映射; A132 钉住"同码不同义"与格式互不覆盖
632
+ - DESIGN 写明金融机构不合并成一个大类的原因(科目、报表、监管核查口径都不同)
633
+ - 新增 A132: 82 科目、六个特有科目名、银行口径未被覆盖、会金 01/02 数字
634
+ - 验证: python scripts/sta_check.py 通过(A0-A132 共 133 项)
635
+ - feat[python]:外商投资按"参照行业 + 三金叠加"接入
636
+ - 制度第70条明确不设行业科目表: 参照行业会计科目, 分类顺序编号也参照
637
+ - 新增 overlays/foreign_invested.yaml: 储备基金(314)/企业发展基金(315)/职工奖励及福利基金(215)
638
+ - Ledger 增 foreign_invested 开关, coa() 在行业科目上叠加三金; 不占 industry 键
639
+ - 报表映射改为"科目不存在则整行不列示", 普通账套不会多出 0.00 行
640
+ - 新增 A133: 三金分别列项、普通账套不受影响、把"外商投资"当行业取表必须报错
641
+ - 归档全文(909 行), 13 个行业会计制度至此全部归档
642
+ - 验证: python scripts/sta_check.py 通过(A0-A133 共 134 项)
643
+ - test[python]:校验行业映射完整性并整理待办
644
+ - 新增 A134: 12 个行业的报表映射不得引用不存在的科目, 资产负债权益科目必须都有落点
645
+ - 允许引用叠加科目(外商投资三金), 缺报表格式的行业(交通运输)由 A125 单独钉住
646
+ - 重写 DESIGN §9: 记下"科目名称作唯一事实标准、编码只是映射"的设计方向与三个待解问题
647
+ - 待办补真实汇率快照与 2001 年后金融/保险/证券制度
648
+ - 验证: python scripts/sta_check.py 通过(A0-A134 共 135 项)
649
+ - feat[python]:补 2001 企业会计制度报表格式
650
+ - 新增 balance_2001.yaml: 会企 01 表行项目, 覆盖 2001-01-01~2006-12-31
651
+ - 利润表映射补 其他业务收入/支出、补贴收入, 与会企 02 对齐
652
+ - fmt_2001 起始日从 2006-01-01 前移到 2001-01-01, 2001-2005 不再出平铺报表
653
+ - 新增 A135: 2003 年账套命中 2001 格式, 会企 01/02 数字与平衡
654
+ - DESIGN 待办移除已完成的"2001-2005 报表格式"
655
+ - 验证: python scripts/sta_check.py 通过(A0-A135 共 136 项)
656
+ - docs[multi]:明确不向 1955–1992 再扩
657
+ - 从待办移除 1955–1992 一条, 改在"范围"里写明不做的两条理由
658
+ 没有账簿需要重放; 增减记账与工商统一税无法映射到现在的借贷记账与增值税
659
+ - 往前只到 1993 的理由: 制度原文可得, 且与 2001 制度直接衔接
660
+ - feat[python]:1993→2001 科目迁移按行业显式映射
661
+ - 新增 data/coa/migrations/liangze_1993_to_2001.yaml: 工业 50 个科目对应
662
+ - migrate() 先找(旧制度,新制度,行业)的显式映射表, 找不到才退回科目 lineage
663
+ - 缺表且旧科目仍有余额时拒绝, 不把旧科目静默留在新制度里
664
+ - 新增 A136: 工业迁移后旧科目清零、新科目落位、凭证标注财会〔2000〕25 号、重复调用幂等
665
+ - DESIGN 待办改为"其余行业的迁移表待补"
666
+ - 验证: python scripts/sta_check.py 通过(A0-A136 共 137 项)
667
+ - fix[python]:按原文核对 2001 科目表并归档制度全文
668
+ - 用 AEGIS 整校的 456 页原文 PDF 逐条比对: 一级科目 85 个, 数量一致
669
+ - 删除本仓多出的 5504 营业费用(原文只有 5501), 报表映射与 2007 lineage 同步改到 5501
670
+ - 补 1815 未确认融资费用; 修正科目表头"仅收录子集"的过期说明
671
+ - 归档原文 PDF 与核对结论到 docs/finance/qiye_kuaiji_2001/
672
+ - 记下两处有意保留的差异: 3101 简写、原文 1402 误排
673
+ - 验证: python scripts/sta_check.py 通过(A0-A136 共 137 项)
674
+ - feat[python]:补齐 1993→2001 工业全表 60 科目迁移并登记行业特有科目
675
+ - 迁移表改为逐科目携带源/目标名称与 strategy(merge/split/industry_ext/out_of_scope/unmappable),
676
+ 覆盖 1993 工业全表 60 个一级科目, 补上原先缺失的 11 个损益类科目
677
+ - 新增 industry_specific_accounts.yaml: 民航 122 航材消耗件/123 高价周转件/134 机上供应品/
678
+ 204 国际票证结算/205 国内票证结算, 金融 112 信托贷款(out_of_scope)
679
+ - migrate() 对 out_of_scope/unmappable 且仍有余额的科目直接拒绝, 不再就近硬塞
680
+ - 修复 2001 科目表 56 个科目被误设 effective 2006-01-01~2006-12-31 的问题:
681
+ 该区间导致 2001-2005 只解析出 29 个科目, 现按制度区间全程生效
682
+ - 新增 A137: 校验迁移表覆盖完整、源/目标名称与科目表一致、目标科目在切换日生效,
683
+ 以及行业特有表内部一致; 全量自检 138 项
684
+ - 验证: python -m labs.sta.validate 138 项全绿; A137 用三处故意破坏做过负向验证
685
+ - docs[multi]:归档民航企业会计核算办法并按原文定版行业科目归宿
686
+ - 新增 docs/finance/minhang_2003/: 通知与附件原件、11 个补充科目摘录、与 1993 民航科目的对应表
687
+ - 附件 .doc 只含总说明 + 1215/1216 使用说明, 在 1216 账务处理中途截断; 票证结算与民航基金两节
688
+ 取自维基文库转载并标注待原文复核
689
+ - industry_specific_accounts.yaml 按原文改判: 122→1215、123→1216、204→2128、205→2126、
690
+ 新增 224→2173; 票证结算与民航基金由 merge 改为 industry_ext —— 2003 办法专设科目,
691
+ 并入应付账款/其他应交款会把待结算票款与一般应付款混在一起
692
+ - 134 机上供应品保留 merge→1231: 2003 办法未为它设科目
693
+ - 两个 README 补充制度替代关系: 1993 民航制度 2003-01-01 起不再执行
694
+ - 验证: python -m labs.sta.validate 138 项全绿, A137 校验行业表名称与目标科目一致
695
+ - docs[multi]:归档金融企业会计制度全文并确认其不设会计科目表
696
+ - 新增 docs/finance/jinrong_2001/: 财会〔2001〕49 号全文(15 章 164 条, 财政部文告 2002 年第 5 期转录)
697
+ 与 README; 施行 2002-01-01 限上市金融企业, 2011-02-21 废止
698
+ - 核对结论: 正文不含会计科目表与报表格式, 科目由金融企业自设(第 157 条), 因此
699
+ "1993 三位码 → 2001 四位码"在 49 号口径下没有官方映射; 网上流传的四位表
700
+ (1001 库存现金/2011 吸收存款/6011 利息收入/6601 业务及管理费)属 2006 年企业会计准则应用指南
701
+ - 信托贷款条目的目标改为引用第 159 条: 短期/长期信托贷款是信托资产运用的类别名称, 不是科目编号
702
+ - 银行与金融性公司两个行业的 1993→2001 迁移表不做, 理由写入 README
703
+ - 验证: python -m labs.sta.validate 138 项全绿
704
+ - docs[multi]:出 1993 金融→49 号条文项目对照并加 A138 回原文校验
705
+ - 新增 docs/finance/jinrong_2001/mapping_1993_to_49_items.yaml: 1993 银行 72 科目 + 金融性公司
706
+ 82 科目逐条落到财会〔2001〕49 号的条文项目/核算类别, 不出现任何 4 位科目码
707
+ - 三类策略: itemize(条文明确列举) / category_only(只给类别名, 科目企业自设) / no_item(无对应列举)
708
+ - 新增 A138: 逐条回原文核对 clause 存在且 item 是该条字面词, 同时强制两行业科目全覆盖、
709
+ 禁止 4 位码混入、no_item 必须写明理由; 故意改错两处做过负向验证
710
+ - README 补两代制度的定科目权对照: 1993 第六条先给法定科目表再容许增减, 49 号第 157 条只给口径
711
+ - 验证: python -m labs.sta.validate 139 项全绿
712
+ - feat[python]:为民航 2003 办法建制度并按基表继承科目表
713
+ - regimes.yaml 新增 minhang_2003(行业民航, 2003-01-01~2006-12-31), 不复制 85 行基表
714
+ - contracts.Regime 增加 coa_base: 继承基表科目并按本制度区间重设生效期, 补充科目与基表重码直接报错
715
+ - 新增 coa/minhang_2003_supplement.yaml: 财会〔2003〕18 号增设的 1215 航材消耗件、
716
+ 1216 高价周转件、2126 国内票证结算、2128 国际票证结算、2173 应交民航基础设施建设基金、
717
+ 5403 民航基础设施建设基金; 科目数 85 → 91
718
+ - 新增 A139: 基表科目不丢不改名、六个增设科目与办法原文一致、无重码、区间正确
719
+ - 行业特有表里民航五条目标挂上 regime: minhang_2003, 由 A137 连带校验名称
720
+ - A134 跳过带 coa_base 的行业制度: 民航企 01–22 未录入, 会企 01/02 没有新科目的行
721
+ - 2001-01-01~2002-12-31 民航按通用企业会计制度解析
722
+ - 验证: python -m labs.sta.validate 140 项全绿
723
+ - feat[python]:补民航 2003 会企 01/02 报表格式并归档办法全文
724
+ - 归档财会〔2003〕18 号全文(约 6 万字): 六个增设科目、会企 01/02 民航版格式与编制说明、
725
+ 民航企 01–22 报表目录; 通知页那份附件只到 1216 科目, 不再以它为准
726
+ - 新增 balance_2003_aviation.yaml / income_2003_aviation.yaml: 负债侧在应交税金之后单列
727
+ 国际票证结算(76)、国内票证结算(77)、应交民航基础设施建设基金(78), 存货含航材消耗件与高价周转件,
728
+ 利润表在主营业务税金及附加之后增加"转作民航基础设施建设基金"(6)
729
+ - formats.yaml 增加 fmt_2003_aviation(行业民航, 2003-01-01~2006-12-31)
730
+ - 修复报表格式解析: 行业专用格式原先排在通用格式之后, 民航 2003 会解析成 fmt_2001;
731
+ 现与制度解析同一口径, 精确行业优先
732
+ - A134 重新覆盖民航; A139 增加三处报表差异校验(三行负债、存货含航材、基金减项)
733
+ - 验证: 140 项全绿; 民航账套冒烟(购航材、计提基金)资产负债表与利润表出数正确
734
+ - fix[python]:委托贷款改按长期列示并把列示口径缺口记成 TODO
735
+ - balance_2001.yaml: 1431 委托贷款从短期投资改列长期债权投资 —— 会企 01 编制说明按 1 年期限分列,
736
+ 账簿只有科目余额分不出期限, 整体按长期列示, 表内留 T1 标记
737
+ - 1815 未确认融资费用并入长期应付款按净额列示(会企 01 未单列该项目), 表内留 T2 标记
738
+ - balance_2003_aviation.yaml 同口径, 表头"与通用表的差异"从三处改为两处
739
+ - DESIGN §9 重写迁移映射条目: 民航目标制度已建但迁移表未给, 银行/金融性公司明确不做科目级迁移;
740
+ 新增 T1 到期期限重分类、T2 未确认融资费用列示、T3 民航企 01–22、T4 民航 2001–2002 归属、
741
+ T5 金融报表格式, 每项写明找到依据后按编号调整的位置
742
+ - 验证: 140 项全绿
743
+ - feat[python]:补商品流通 1993→2001 科目级迁移并记录各行业 2003 核算办法边界
744
+ - migrations/liangze_1993_to_2001.yaml 增加商品流通块: 65 个一级科目全表覆盖,
745
+ 商品削价准备→存货跌价准备、加工商品→委托加工物资、出租商品/特准储备物资并入库存商品、
746
+ 经营费用→营业费用、汇兑损益→财务费用等, 逐条带 note
747
+ - A137 自动校验通过: 源/目标名称与两张科目表逐字一致、目标科目在 2001-01-01 生效、无遗漏
748
+ - 冒烟: 商品流通账套 2001-01-01 切换, 库存商品 30000 落到 1243, 旧科目清零
749
+ - DESIGN §9 记录 T6: 施工有财会〔2003〕27 号办法(增设周转材料 1233、临时设施、工程结算、
750
+ 工程施工、机械作业等 7 个科目), 房地产/交通/铁路/农业/外经/邮电需逐个确认后再决定目标端,
751
+ 在此之前不给这些行业的科目级迁移表
752
+ - 验证: 140 项全绿
753
+ - feat[python]:按财会〔2003〕27 号建施工 2004 制度并归档办法原件
754
+ - 新增 shigong_2004(行业施工, 2004-01-01~2006-12-31), 以 qiye_kuaiji_2001 为基表,
755
+ 增设 1233 周转材料、1506 临时设施、1507 临时设施摊销、1702 临时设施清理、
756
+ 2123 工程结算、4104 工程施工、4110 机械作业, 科目数 85 → 92
757
+ - A139 从只查民航改为按表检查各行业办法的科目继承: 基表不丢不改名、增设科目与原文一致、无重码
758
+ - 归档 docs/finance/shigong_2004/: 财政部会计司附件原件与 7 个增设科目的说明;
759
+ 该附件不含"三、会计报表", 施工版报表格式记入 T7
760
+ - A134 的跳过条件收紧为"基表继承且解析到通用格式": 民航已有行业格式照常检查, 施工等表补上再纳入
761
+ - DESIGN §9 更新 T6 并新增 T7
762
+ - 验证: 140 项全绿
763
+ - fix[python]:拦住跨制度切换时没有去处的旧科目余额
764
+ - migrate(): 无显式迁移表时, 先扫账上所有凭证科目, 凡在新制度科目表里没有对应且仍有余额的,
765
+ 直接拒绝并列出科目码 —— 原先只查"上一条制度"的科目表, 中间那次切换没做的账套会一路
766
+ 静默通过, 余额留在账上却不在任何报表里
767
+ - 同一处补上基表继承的恒等切换: new.coa_base == 旧制度 时余额原样结转, 不生成重分类凭证
768
+ (企业会计制度 → 民航 2003 / 施工 2004 都是只增设科目)
769
+ - 新增 A140: 施工 1993 直切 2004、民航 1993 直切 2003 都必须被拦下; 企业会计制度切民航 2003
770
+ 必须放行且不出凭证
771
+ - DESIGN §9 新增 T8 自设科目: 行业办法允许企业自设的科目(拨付所属资金/内部往来等)没有容器,
772
+ 施工跨 2001 这一段因此走不通, 在 T8 落地前不给施工的科目级迁移表; T7 施工报表格式保留
773
+ - 验证: 141 项全绿
774
+ - feat[python]:支持企业自设科目并按 parent 归并报表
775
+ - ledger.py 新增 ExtensionAccount 与 Ledger.extend(code, name, parent, category, direction):
776
+ 自设科目接在科目表末尾, 有名字、类别、方向, 没有国家编码
777
+ - reports._mapped_balance: 自设科目按登记的 parent 归并到法定科目, 不再单列成"其他-"行
778
+ - period.migrate: 自设科目原样结转, 既不参与重分类, 也不计入搁浅余额拦截
779
+ - 新增 A141: 自设科目进得了科目表、报表归并到 parent、换制度不出凭证且余额保留
780
+ - DESIGN §9 T8 标记为已实现, 同时记下仍缺的一环: 跨制度后自设科目要不要改挂新设法定科目
781
+ (施工临时设施 2001-2003 挂 1501, 2004 后应改挂 1506), 引擎只做原样结转
782
+ - 验证: 142 项全绿
783
+ - feat[python]:补施工 1993→2001 迁移, 施工特有科目走自设科目承接
784
+ - migrations 增加施工块: 65 个一级科目全覆盖, 其中 8 个走 extension(内部往来、周转材料、
785
+ 拨付所属资金、临时设施、临时设施摊销、上级拨入资金、工程施工、机械作业), 各带 parent 建议
786
+ (1133/1231/1133/1501/1502/3101/4101/4101) 与 2004 年改挂目标
787
+ - period._STRATEGIES 增加 extension: 无 target_code 但不算 unmappable, 账套登记后原样结转
788
+ - 新增 A142: 登记自设科目的施工账套 1993→2001 切换后, 临时设施与工程施工余额原样保留、
789
+ 法定科目照常搬迁; 未登记时直接拒绝, 不会硬塞进固定资产
790
+ - shigong_2004/README 补账套登记示例; DESIGN §9 更新已接行业清单
791
+ - 验证: 143 项全绿
792
+ - feat[python]:补民航 1993→2001 迁移并打通到 2003 办法的两段切换
793
+ - migrations 增加民航块: 62 个一级科目全覆盖; 航材消耗件、高价周转件、国际/国内票证结算、
794
+ 应交民航基础设施建设基金 5 个走 extension, parent 分别为 1211/1231/2121/2121/2176,
795
+ note 写明 2003 年改挂 1215/1216/2128/2126/2173
796
+ - 同一账套连穿两次切换: 2001 年到企业会计制度时法定科目搬迁、自设科目保留;
797
+ 2003 年到 minhang_2003 时按基表继承恒等放行, 不再生成凭证
798
+ - 新增 A143: 校验两段切换的余额走向与报表归并(航材并入存货、票证结算并入应付账款)
799
+ - industry_specific_accounts.yaml 收缩为民航/施工之外的例外(金融 out_of_scope),
800
+ 民航与施工的行业科目改由迁移表登记, 避免同一科目两处给答案
801
+ - DESIGN §9 更新已接行业清单
802
+ - 验证: 144 项全绿
803
+ - feat[python]:按财会〔2004〕4 号建铁路 2004 制度并补行业办法调研结论
804
+ - 新增 tielu_2004(行业铁路, 2004-01-01~2006-12-31), 以 qiye_kuaiji_2001 为基表, 增设
805
+ 1453 拨付所属投资、1902 特准储备物资、2178 应交铁路建设基金、2185 运输进款结算、
806
+ 2236 内部往来、2332 特准储备资金、3102 上级拨入投资、5103 完成工作清算, 科目数 85 → 93
807
+ - A139 的行业办法清单增加铁路; 归档 docs/finance/tielu_2004/
808
+ - DESIGN §9 T6 补调研结论: 铁路/施工/民航已落; 农业财会〔2004〕5 号(2005-01-01,
809
+ 生物资产和农产品 + 社会性收支)已确认存在但未落; 房地产/交通/外经/邮电待确认
810
+ - 验证: 144 项全绿
811
+ - feat[python]:补房地产 1993→2001 迁移, 开发类科目走自设科目
812
+ - migrations 增加房地产块: 61 个一级科目全覆盖; 开发成本、开发产品、出租开发产品、周转房、
813
+ 开发间接费用 5 个走 extension, parent 分别为 4101/1243/1243/1243/4105
814
+ - 依据: 房地产没有 2003 年前后的专门核算办法, 财会〔2004〕3 号 解答(四)只规范出租开发产品,
815
+ 其余由企业在企业会计制度上自行增设; 该判断写进迁移表文件头
816
+ - DESIGN §9 T6 补调研: 邮电对应《电信企业会计核算办法》财会〔2002〕17 号(2003-01-01, 5 个增设科目),
817
+ 农业财会〔2004〕5 号仍待落; 交通、外经待确认
818
+ - 冒烟: 房地产账套 2001-01-01 切换, 开发成本 40000 原样保留, 银行存款 60000 落到 1002
819
+ - 验证: 144 项全绿
820
+ - feat[python]:补铁路 1993→2001 迁移, 铁路口径科目走自设科目
821
+ - migrations 增加铁路块: 66 个一级科目全覆盖; 拨付所属投资、特准储备物资、上下级往来、
822
+ 运输收入往来、特准储备资金、上级拨入投资、铁路建设基金、所属上交利润、完成工作清算
823
+ 9 个走 extension, parent 与 2004 年改挂目标逐条写在 note 里
824
+ - 铁路建设基金(权益类)在 2004 办法里没有对应科目——办法只有 2178 应交铁路建设基金(负债),
825
+ 性质不同, 保留自设并在 note 说明
826
+ - 冒烟: 铁路账套 1993→2001 生成 8 行迁移凭证, 运输支出 30000 落到 5401;
827
+ 2004 切到 tielu_2004 恒等放行, 完成工作清算与上下级往来原样保留
828
+ - DESIGN §9 更新已接行业清单
829
+ - 验证: 144 项全绿
830
+ - feat[python]:按财会〔2002〕17 号建电信 2003 制度
831
+ - 新增 dianxin_2003(行业邮电, 2003-01-01~2006-12-31), 以 qiye_kuaiji_2001 为基表,
832
+ 增设 1132 营业款结算、1212 库存材料、1245 出租商品、1902 特准储备物资、5403 共同费用,
833
+ 科目数 85 → 90
834
+ - A139 的行业办法清单增加电信; 归档 docs/finance/dianxin_2003/
835
+ - 记录一处同码不同义: 5403 在民航 2003 办法里是"民航基础设施建设基金", 两套制度各自编号
836
+ - DESIGN §9 T6 更新: 邮电已落, 只剩农业财会〔2004〕5 号待做
837
+ - 验证: 144 项全绿
838
+ - feat[python]:补邮电 1993→2001 迁移, 收支差额改按利润核算
839
+ - migrations 增加邮电块: 63 个一级科目全覆盖; 321 收支差额 → 3131 本年利润、322 收支差额分配
840
+ → 3141 利润分配, 对应 2003 年电信办法「收支差额核算改为利润核算」
841
+ - 营业款结算、拨付所属资金、特准储备物资、应交/所属上交收支差额、特准储备基金、上级拨入资金、
842
+ 共同费用 8 个走 extension, parent 与 2003 年改挂目标逐条写在 note 里
843
+ - 冒烟: 邮电账套 1993→2001 生成 6 行迁移凭证, 营业款结算与共同费用原样保留;
844
+ 2003 切到 dianxin_2003 恒等放行
845
+ - DESIGN §9 更新: 只剩农业、交通、外经
846
+ - 验证: 144 项全绿
847
+ - feat[python]:按财会〔2004〕5 号建农业 2005 制度并记录附件重码
848
+ - 新增 nongye_2005(行业农业, 2005-01-01~2006-12-31), 以 qiye_kuaiji_2001 为基表, 科目数 85 → 100,
849
+ 并入附件1 生物资产和农产品的 15 个科目: 1135 应收家庭农场款、1246 农产品、1247 幼畜及育肥畜、
850
+ 1504 生产性生物资产、1506 生物资产累计折旧、1508 成熟生产性生物资产减值准备、
851
+ 1607/1608 生物性在建工程及减值、1821/1822 消耗性林木资产及跌价、1905 公益林、
852
+ 2183/2221 家庭农场往来、3151 公益林基金、4102 农业生产成本
853
+ - 发现并记录原文冲突(T9): 附件2 的 1508 社会性固定资产与附件1 的 1508 成熟生产性生物资产减值准备
854
+ 同号, 会计视野与维基文库两处转载一致; 附件2 的 4 个科目暂不并入, 待确认后补齐
855
+ - A139 的行业办法清单增加农业; 归档 docs/finance/nongye_2005/
856
+ - 验证: 144 项全绿
857
+ - feat[python]:补农业 1993→2001 迁移, 家庭农场往来走自设科目
858
+ - migrations 增加农业块: 68 个一级科目全覆盖; 应收家庭农场款、内部往来、幼畜及育肥畜、
859
+ 应付家庭农场款、待转家庭农场上交款 5 个走 extension, parent 与 2005 年改挂目标写在 note 里
860
+ - 401 农业生产成本 → 4101 生产成本, note 标明 2005 年起应改挂 4102;
861
+ 411/421/431/441 四个成本类一并归 4101
862
+ - 冒烟: 农业账套 1993→2001 生成 8 行迁移凭证; 2005 切到 nongye_2005 恒等放行,
863
+ 家庭农场往来与幼畜原样保留, 农业生产成本留在 4101
864
+ - DESIGN §9 更新: 只剩交通 67、外经 68
865
+ - 验证: 144 项全绿
866
+ - feat[python]:补交通、外经、旅游饮食服务迁移, 13 个行业定性完毕
867
+ - 交通运输 67: 运输/装卸/堆存/代理/港务管理五对收支并入 5101/5401(业务类别靠明细),
868
+ 营运间接费用 → 4105, 船舶与集装箱费用 → 4101
869
+ - 对外经济合作 68: 内部往来走 extension; 递延营业收入 → 2131 预收账款、递延营业成本按完工
870
+ 百分比并回 5401; 清算费用与清算损失标 out_of_scope(清算会计不在企业会计制度范围内)
871
+ - 旅游饮食服务 47: 没有行业特有科目, 全部是通用科目改名或归并
872
+ - A136 的负向用例从交通运输改为银行: 交通已有迁移表, 而银行按 49 号不做科目级迁移
873
+ - 迁移表现有 11 块、692 个科目; DESIGN §9 记录 13 个行业的最终定性
874
+ - 验证: 144 项全绿
875
+ - docs[multi]:补财务资料索引与制度时间轴, 并记录会企 01/02 格式核对结论
876
+ - docs/finance/README.md 补齐 6 个缺失目录条目(金融 2001、民航/施工/铁路/电信/农业办法),
877
+ 增加制度时间轴: 两则两制 → 企业会计制度 → 各行业核算办法 → CAS, 金融另走 49 号线
878
+ - qiye_kuaiji_2001/README.md 增加会企 01/02 格式核对: 按 PDF 第 192–193 页逐行比对,
879
+ 列出固定资产三行合一、已归还投资并入实收资本、一年内到期项目未单列、待处理财产损溢多一行
880
+ 等六处差异, 全部标注为有意简化而非漏配
881
+ - 验证: 144 项全绿(本次只改文档)
882
+ - fix[python]:委托贷款改回短期投资口径, A134 改为显式待补名单
883
+ - 1431 委托贷款从长期债权投资改回短期投资: 制度正文「委托贷款应视同短期投资进行核算」,
884
+ 会企 01 编制说明(第 202/203 页)才按到期日分列; 账簿没有到期日, 按正文口径整体列示(T1 仍未解)
885
+ - T2 结案: 第 204 页第 39 项明确「长期应付款」项目按减去未确认融资费用后的金额填列,
886
+ 与 balance_2001.yaml 把 2321/1815 同列一行的净额口径一致
887
+ - 2001 报表核对表补两行: 委托贷款列短期投资、其他流动资产/其他长期资产无余额可兜底
888
+ - A134 不再按"有没有 coa_base"静默跳过, 改为显式 _REPORT_PENDING 名单: 新加行业制度若忘配
889
+ 报表格式会直接报错; 负向验证把 tielu_2004 移出名单后报出 7 个未映射科目
890
+ - 验证: 144 项全绿
891
+ - docs[multi]:T3 民航专表记录真实卡点——缺的是明细维度不是原文
892
+ - 民航企 01 是「项目 × 航线」矩阵(国内/国际/香港/澳门航线、通用航空、机场服务六栏),
893
+ 靠 5101/5401 的航线明细出数; 账套模型只有科目余额, 没有航线与机型维度, 录了表样也出不了数
894
+ - 表结构与编制说明已在 minhang_2003_18_fulltext.md 里, 原文不是缺口
895
+ - 与 T1 的到期日同属"缺账套侧维度"这一类, 落地前先解决维度模型
896
+ - 验证: 144 项全绿(本次只改文档)
897
+ - feat[python]:按到期日拆分委托贷款, 落实资产侧期限重分类
898
+ - Line.aux 支持"到期日=YYYY-MM-DD"标签; Ledger.maturity_split 把科目余额拆成 1 年内与超过 1 年,
899
+ 没标到期日的按制度正文"委托贷款应视同短期投资进行核算"整体算短期
900
+ - 报表行可声明 maturity_long_to: 短期投资行的超过 1 年部分自动挪到长期债权投资,
901
+ 未标到期日时行为不变(不影响既有报表)
902
+ - Ledger.balance_by(account, dim) 提供通用维度汇总, 供后续航线/机型等 T3 维度使用
903
+ - 新增 A144: 短期 5000(2006-12-31 到期) + 未标 2000 进短期投资 7000,
904
+ 长期 10000(2009 到期) 进长期债权投资
905
+ - DESIGN §9 T1 改为"资产侧已实现", 记下负债侧一年内到期部分仍未做
906
+ - 验证: 145 项全绿
907
+ - fix[python]:到期口径改为 12 个月, 满 12 个月的算短期
908
+ - maturity_split 的期限从 as_of+365 天改成按日历加 12 个月: 官方口径的"1 年"就是 12 个月,
909
+ 365 天在闰年会差一天
910
+ - 新增 _add_months: 月末溢出退到当月最后一天(2 月 29 日 → 次年 2 月 28 日, 1 月 31 日 → 次年 1 月 31 日)
911
+ - A144 增加边界用例: 2006-06-30 起算, 到期日 2007-06-30 正好满 12 个月, 计入短期投资
912
+ - 报表注释与 DESIGN T1 的措辞统一为 12 个月
913
+ - 验证: 145 项全绿
914
+ - feat[python]:负债侧与长期债权投资也按 12 个月转列, 期限重分类收口
915
+ - 报表行新增 maturity_short_to: 长期借款/应付债券/长期应付款的 12 个月内到期部分转到
916
+ "一年内到期的长期负债", 长期债权投资的同期部分转到"一年内到期的长期债权投资"
917
+ - _mapped_balance 把两段逻辑合成按 section 处理, 资产取正、负债取反, 方向不再各写一套
918
+ - 两张表补上"一年内到期的长期债权投资/长期负债"行(会企 01 第 21、86 行)
919
+ - A144 增加 1402 用例: 长期债权投资 = 1431 长期 10000 + 1402 长期 6000 = 16000;
920
+ A145 覆盖负债侧: 长期借款 70000、一年内到期的长期负债 40000(含未标到期日 10000)
921
+ - DESIGN §9 T1 标记为已实现, 2001 报表核对表同步
922
+ - 验证: 146 项全绿
923
+ - feat[python]:按受托人与委托人区分委托业务, 行业特有表并入条文对照
924
+ - 口径写入 DESIGN §11: 受托人(1993/2001 金融企业)的委托贷款、委托投资、委托存款、信托存款
925
+ 是代理/信托业务, 不列自营投资; 委托人(2001 企业会计制度下的一般企业)才设 1431,
926
+ 核算视同短期投资、列报按 12 个月拆到短期/长期。同一笔钱两套表不能互相映射
927
+ - mapping_1993_to_49_items.yaml 的 112/116/117/213 四条 note 补上"受托人维度"与业务性质
928
+ - 删除 industry_specific_accounts.yaml: 民航、施工的行业科目已由迁移表的 extension 承接,
929
+ 金融的由条文对照表承接, 再留一份登记就是第三个事实源; A137 相应的校验段与 linked 变量一并移除
930
+ - 三处 README 里的旧引用改成迁移表/条文对照表
931
+ - 验证: 146 项全绿
932
+ - fix[python]:把委托贷款的出处钉到条文, 并给条文对照加受托人角色
933
+ - A138 的 116 委托贷款改引第十三条(三): 归档原文里"自营贷款与委托贷款分别核算"只在第十三条,
934
+ 第十二条只分短/中/长期贷款; 起草时按"第十二条(三)"引用被 A138 当场拦住, 说明回原文核对有效
935
+ - 112/116/117/213 增加 role: trustee 字段, A138 校验取值只能是 trustee / principal,
936
+ 受托人与委托人的区分从注释变成机器可查的字段, 不再另建一张 agency 表
937
+ - binding note 补上"只收手续费、不得代垫资金、风险由委托人承担"
938
+ - 「委托贷款应视同短期投资进行核算」统一标注为财会〔2000〕25 号第十六条(委托人口径),
939
+ 49 号里没有这句话; DESIGN §11 同时记下第四十八条与"不承担风险的委托贷款不计提损失准备"
940
+ - jinrong_2001/README 增加「委托贷款:49 号只定义、不给科目」一节
941
+ - 验证: 146 项全绿
942
+ - feat[python]:代理类科目标 role 并加"列举项≠业务定性"校验
943
+ - mapping_1993_to_49_items.yaml 给 122/123/124/125/212/221/222/223/224 补 role: trustee,
944
+ note 写明代理业务性质与配对关系(122↔221、123↔222、124↔223、125↔224)
945
+ - A138 新增规则: role 为 trustee 且引第十一条或第六十三条(报表项目列举)时, note 必须写明
946
+ "代理"性质 —— 这两条是列举不是定性, 光引用会把代理业务当成自营资产/负债;
947
+ 负向验证去掉 note 里的"代理"二字, A138 立即报错
948
+ - 新增 docs/finance/jinrong_2001/trustee_accounts_1993_financial.md: 13 个受托类科目逐条标
949
+ 49 号能给什么(条文/列举项/无), 225 卖出回购证券款标注为自营不属受托;
950
+ 人类说明进 md, YAML 只留机器字段, 不建第三张表
951
+ - 验证: 146 项全绿
952
+ - fix[python]:修好条文表里被半角逗号截断的 21 条 note, 并补 117/127 的处理
953
+ - mapping_1993_to_49_items.yaml 的 flow 映射里写了半角 ", ", YAML 把它当成新的键值对,
954
+ 21 条 note 在逗号处被静默截断(包括刚加的受托人说明); 现在全部改成全角逗号并复查解析结果
955
+ - 117 委托投资: note 补全"委托人出资、风险收益归委托人、不并入自营投资", 保留 no_item
956
+ (49 号没有委托投资条文, 与 124/125 同性质)
957
+ - 127 存出证券: role 标 principal_or_custody —— 券/权利既不是钱(清算备付金)也不是担保(存出保证金),
958
+ 可能与自营头寸或代客保管都有关, 不硬归 trustee
959
+ - A138 三条新规则: role 扩到 trustee/principal/principal_or_custody; principal_or_custody 不得有目标;
960
+ trustee 的 no_item 必须在 note 写明代理性质(213 据此补全)
961
+ - trustee_accounts_1993_financial.md 补 127 与三层角色的说明
962
+ - 验证: 146 项全绿
963
+ - docs[multi]:清理 DESIGN §9 里两处重复段落
964
+ - 迁移条目末尾重复了一段"银行/金融性公司不做科目级迁移",与条目正文重复
965
+ - T6 末尾的"交通、外经仍待确认"与段首重复
966
+ - 验证: 146 项全绿(仅文档)
967
+ - feat[python]:按农业办法的报表说明落地会企 01, A134 覆盖农业
968
+ - 查了三个行业的报表部分: 农业有完整的「三、补充报表格式及编制说明」, 铁路只有章节标题
969
+ (正文在标题处截断、附件区为空), 电信的转载根本没有报表章节
970
+ - 新增 balance_2005_nongye.yaml + fmt_2005_nongye(行业农业, 2005-01-01~2006-12-31):
971
+ 生产性生物资产、生物资产累计折旧、成熟生产性生物资产减值准备、生物性在建工程、
972
+ 消耗性林木资产、公益林、公益林基金、农产品/幼畜及育肥畜/农业生产成本各按其位落行
973
+ - 原文要求"应收家庭农场款减待转家庭农场上交款后列其他应收款", 引擎按科目类别定向,
974
+ 两个科目分列两侧并在文件末注明口径比原文粗一档
975
+ - A134 的待补名单删掉 nongye_2005, 农业纳入常规检查
976
+ - DESIGN §9 新增 T10 记录铁路/电信报表说明未取得; 三份行业 README 同步
977
+ - 顺手清掉 balance_2001.yaml 里已过期的 T2"待复核"注释
978
+ - 冒烟: 生产性生物资产 30000、折旧 -2000、存货 5000, 资产与负债权益合计均为 201000
979
+ - 验证: 146 项全绿
980
+ - docs[multi]:新增原文缺口登记, 逐份说明缺在哪一节
981
+ - docs/finance/source_gaps.md: 按"已有什么/缺什么/缺在哪/影响哪个 TODO"登记 5 份行业办法、
982
+ 金融 49 号、1993 三份不完整制度、4 份待补财务制度、未归档的保险证券办法
983
+ - 判断标准写明: 页面上真实存在的文字才算有, 标题留下而正文截断的一律记为缺
984
+ - 民航 18 号单列说明: 19 张专表齐全但来源是九段转载而非原件, 已见"贷币资金""天形资金"等错字
985
+ - docs/finance/README.md 增加入口
986
+ - 验证: 146 项全绿(仅文档)
987
+ - docs[multi]:补齐原文底稿与转换稿, 缺口登记移入 cas
988
+ - docs/finance/source_gaps.md 移到 docs/finance/cas/source_gaps.md, 索引链接同步
989
+ - 7 个资料目录的 README 统一增加「资料说明」: 来源 / 原文标题 / 原文件底稿 / 转换稿, 逐项写实
990
+ - 补齐底稿: 铁路与电信的网页存档、农业两份 .doc 落到 raw/, 施工 .doc 移入 raw/;
991
+ 新增 tielu/dianxin/nongye(2)/shigong 五份转换稿, 并在转换稿里保留截断位置说明
992
+ - 删除 README 中与「资料说明」重复的原文 URL 行, 避免两处各写一份
993
+ - 文档解析工具链: pymupdf 1.28 / pdfplumber 0.11 已在用; 新装 opencv-python-headless 5.0、
994
+ cn2num、pytesseract; PaddleOCR 与 MinerU 因 Python 3.15 没有 paddlepaddle/torch 轮子无法安装,
995
+ Tesseract 缺系统级二进制, 结论与替代路径写进 docs/finance/README.md
996
+ - 验证: 146 项全绿(仅文档改动)
997
+ - docs[multi]:把工具链说明改成实测结论, 去掉装不上的路径
998
+ - 逐一实测 torch / onnxruntime / openvino / paddlepaddle 在 Python 3.15 下均无轮子,
999
+ 清华源与官方源结论一致; PaddleOCR、RapidOCR、EasyOCR 包本身能装但推理后端装不上
1000
+ - 卸载 pytesseract: 纯 Python 包装, 缺系统级 tesseract 二进制, 留着只会误导
1001
+ - 工具链表改成"已装且在用"的四项, 并写明扫描件暂不接入, 等后端出 3.15 轮子即可
1002
+ - 验证: 146 项全绿(仅文档)
1003
+ - docs[multi]:国内会计资料统一收进 cas 目录
1004
+ - docs/finance 下 8 个制度目录(两则两制、企业会计制度 2001、金融 2001、民航/施工/铁路/电信/农业办法)
1005
+ 全部移入 docs/finance/cas/, finance 本身不再按制度分目录
1006
+ - finance/README 索引改成两级: finance → cas → 各制度版本; cas/README 增加"历次制度版本"段
1007
+ - 同步路径: A138 读取 49 号原文的目录、5 份科目表补充文件的"依据"注释、DESIGN 与各 README 的引用
1008
+ - 验证: 146 项全绿
1009
+ - feat[python]:补齐施工办法报表部分, 落地施工版会企 01
1010
+ - 原文: 江苏财经信息网完整版补齐「补充报表项目及编制说明」四条; 底稿 raw/jscj_6273.html,
1011
+ 转换稿重写为 GBK 网页解码版(原先会计司 .doc 版到科目说明结束)
1012
+ - 新增 balance_2004_shigong.yaml + fmt_2004_shigong: 周转材料并入存货、临时设施单列
1013
+ (1506+1702−1507)、工程施工与工程结算按原文分列两侧; A134 的待补名单只剩铁路与电信
1014
+ - 修复一个真 bug: _mapped_balance 按类别分流时漏掉成本类, 生产成本/工程施工余额整块不进
1015
+ 资产负债表, 导致资产合计与负债权益合计差出同额; 现在成本类按存货处理, 新增 A146 钉住
1016
+ - 更新施工 README、DESIGN T7(结案)、source_gaps 的施工行与优先级列表
1017
+ - 验证: 147 项全绿; 施工冒烟 存货 100000、预收账款 50000、临时设施 90000, 两侧均 551000
1018
+ - docs[multi]:存档两个降级副本源, 施工办法有两处转载互校
1019
+ - 新增 docs/finance/cas/mirrors/: 江苏财经信息网行业会计、正保会计网校法规库两个入口页存档,
1020
+ 写明编码(jscj 为 GBK、chinaacc 为 UTF-8)、路径特征与"只作副本、以财政部为准"的引用约定
1021
+ - 你给的示例页经核实就是《施工企业会计核算办法》财会〔2003〕27 号, 与 jscj 那份完全对应
1022
+ (同样含补充报表项目四条), 存为 chinaacc_shigong_27.html 作为互校副本
1023
+ - 施工 README 的资料说明补一行"副本互校"; cas/README 增加降级副本源入口
1024
+ - 验证: 147 项全绿(仅文档)
1025
+ - docs[multi]:存档铁路办法的文告版, 确认第三节在四个来源里都止于标题
1026
+ - 新增底稿 raw/wengao2004_7_t20080519_20231.html(财政部文告 2004 年第 7 期)
1027
+ - 与政府信息公开页、会计视野法规库、常州财政局转载四处比对: 全部止于「三、补充会计科目表及
1028
+ 报表披露说明」标题, 正文应是随文附件, 网页转载里没有; 这比"页面截断"的结论更准确
1029
+ - tielu README 的资料说明与缺口语述、source_gaps 的铁路行同步改写
1030
+ - 补回 T10: 上一轮用区间替换改 T7 时把它一起删掉了, 现在重新写入 DESIGN
1031
+ - 验证: 147 项全绿(仅文档)
1032
+ - docs[multi]:用第二份官方附件确认农业 1508 重码属原文冲突
1033
+ - 存档财政部信息公开页与两份附件(11865.1.doc、11885.doc)到 nongye_2005/raw/
1034
+ - 与会计司那份逐字互证: 附件1 写「1508 成熟生产性生物资产减值准备」, 附件2 写「1508 社会性固定资产 /
1035
+ 1509 社会性固定资产累计折旧」, 两份文件来源不同、体积不同、编号一致 —— 排除转载错误
1036
+ - nongye_2005 README、source_gaps、DESIGN T9 的结论从"两处转载一致"升级为"两份官方附件互证"
1037
+ - 附件2 的四个科目仍不并入, 等财政部对重码的处理口径
1038
+ - 验证: 147 项全绿(仅文档)
1039
+ - docs[multi]:同步已补齐文件的 TODO 状态
1040
+ - 施工(T7)、农业(1508 重码)在 TODO 与缺口登记里标记为资料已齐: 施工补报表、农业补附件互证
1041
+ - T9 改写为"资料已齐, 缺的是口径": 两份附件全文都在仓里, 只剩财政部对重码的处理口径
1042
+ - T6 把交通/外经从"待确认"改成检索结论: 两轮未见专门办法, 按无办法处理, 假设写进迁移表文件头
1043
+ - 民航 README 修正专表数量: 目录编号到 22, 实际只发 01–16 与 20–22 共 19 张, 17–19 号原文没有
1044
+ - 施工 README 的改挂条目补上 T8 指向, 说明 T8 只解决"能挂"未解决"自动改挂"
1045
+ - 验证: 147 项全绿(仅文档)
1046
+ - feat[python]:农业 1508 重码定论并并入社会性收支, 民航过渡期写成定论
1047
+ - 1508 成因查清: 附件1 用 1504/1506/1508 间隔取偶数, 附件2 用 1508/1509 连号成对,
1048
+ 两套编号各自自洽, 是两个模块独立起草撞号, 不是单字排错
1049
+ - 5311 社会性收入、5611 社会性支出与附件1 无冲突, 并入 nongye_2005(85 → 102 科目);
1050
+ 新增 income_2005_nongye.yaml 把两项列进利润表, 农口冒烟 8000/3000 正确
1051
+ - 1508/1509 不并入, 农垦企业按账套自设科目登记(1510/1511, parent=1501/1502), 写进 README 与 T9
1052
+ - T4 定论: 2001-2002 民航按企业会计制度执行、专用科目自设, 18 号是对实践的正式化;
1053
+ regimes.yaml 的 minhang_2003 上加过渡期注释, 区间不动
1054
+ - 验证: 147 项全绿
1055
+ - docs[multi]:归档证监发〔2000〕76 号, T5 方向从"缺财政部附件"改为监管口径
1056
+ - 新增 docs/finance/cas/jinrong_2001/regulatory/: 第 4 号保险公司财务报表附注特别规定
1057
+ (证监发〔2000〕76 号) 的底稿与转换稿; 通篇是附注表样, 不含资产负债表/利润表主表
1058
+ - 该号第七条引用同系列第二号(商业银行), 据此确认系列结构: 第2号银行、第4号保险、第3号证券待核
1059
+ - T5 重写: 49 号本来就没有格式附件, 格式与披露在证监会编报规则; 第2/3号待补, 补到前金融两行业不出报表
1060
+ - source_gaps 与 jinrong README 同步; mirrors 补上中国 CFO 网这一源及其 GB2312/截断特征
1061
+ - 验证: 147 项全绿(仅文档)
1062
+ - docs[multi]:补齐证监会编报规则第 2、6 号, T5 定论为"监管只管附注"
1063
+ - 归档第 2 号(商业银行财务报表附注)、第 6 号(证券公司财务报表附注)的底稿与转换稿,
1064
+ 与第 4 号(保险)同属证监发〔2000〕76 号 2000-11-02 同批发布; 系列里第 1/5 号是招股说明书, 不属报表口径
1065
+ - 三份齐后 T5 定论: 监管只规定附注披露, 主表没有统一模板; 金融企业出报表只能沿用会企 01/02
1066
+ 行次并按 49 号分类拆细
1067
+ - 如实记录第 2 号的缺陷: 三个转载(中国 CFO 网、法律快车、110 网)都只剩条款文字, 格式表样缺失
1068
+ - regulatory/README 重写为三份总表 + 各自内容 + 完整度; DESIGN T5 与 source_gaps 同步
1069
+ - 验证: 147 项全绿(仅文档)
1070
+ - feat[python]:行业办法生效时按名称自动改挂自设科目
1071
+ - period._adopt_extensions: 切到 coa_base 制度时, 在本次新增的法定科目里按名称完全相同匹配
1072
+ 账套自设科目, 命中则出「改挂」凭证把余额转过去; 对上多个同名科目时拒绝, 不猜
1073
+ - A142/A143 改为断言改挂结果: 施工临时设施 5000 → 1506、工程施工 3000 → 4104;
1074
+ 民航航材 20000 → 1215、国际票证结算 −3000 → 2128(报表上单列"国际票证结算")
1075
+ - A142 的取数时点改成 2004-06-30, 否则历史时点上看到的是改挂前的余额
1076
+ - DESIGN T8 补齐"自动改挂已实现", 施工 README 的"需人工重新登记"改成实际行为
1077
+ - 验证: 147 项全绿
1078
+ - docs[multi]:归档证监会年报准则第 2 号修订稿, 与金融附注规则分线存放
1079
+ - 新增 docs/finance/cas/regulatory/: 年报内容与格式准则第 2 号修订稿的 PDF 底稿与文本转换稿(63 页)
1080
+ - 归档说明写清版本: 修订稿, 施行后废止 2021 年修订版(证监会公告〔2021〕15 号); 修订稿自身发布日期文中未标
1081
+ - 该准则第七十条只列要披露哪几张表(比较式资产负债表/利润表/现金流量表/权益变动表+附注),
1082
+ 附注格式再转引证监会的财务报告规定, 全文无"会企01"字样 —— 再次印证 T5 的结论
1083
+ - cas/README 增加"监管披露口径"段, 区分通用年报准则与分行业附注特别规定
1084
+ - 验证: 147 项全绿(仅文档)
1085
+ - docs[multi]:归档民航统计报表制度, 补 T3 的维度枚举出处
1086
+ - 新增 minhang_2003/reference/: 《民航综合统计报表制度》(民航局制定、统计局批准, 2015-12, 132 页)
1087
+ 的 PDF 底稿与文本转换稿
1088
+ - 如实定性: 这是统计报表制度(36 张统计表), 不是会计制度, 不含民航企 01–22 会计表样
1089
+ - 对 T3 的用处写清: 航线分国内/国际/香港/澳门、分机型、运输总周转量等指标名称有官方出处,
1090
+ 设计维度模型时可直接采用; 但会计表样仍缺, 两者口径不同不能互相替代
1091
+ - DESIGN T3 与民航 README 同步
1092
+ - 验证: 147 项全绿(仅文档)
1093
+ - docs[multi]:补齐民航 1993 制度全文, 62 个科目逐字核对一致
1094
+ - 上海市财政局那份是全文: 62 个科目表、会航 01/02/03 与两张附表、编制说明齐全;
1095
+ 原文自己标注「会计科目使用说明(略)」, 该节仍缺
1096
+ - 与仓里摘要版(aviation_accounting_1993_12.md)逐字比对: 62 个科目编号与名称全部一致, 无差异
1097
+ - 新增 aviation_accounting_1993_12_fulltext.md + raw 底稿, 两则两制索引与 source_gaps 同步
1098
+ - DESIGN T3 补一条: 航线矩阵不是 2003 年才有, 1993 会航 02 表附表 2 就是按航线分栏的主营业务收支明细表
1099
+ - 验证: 147 项全绿(仅文档)
1100
+ - docs[multi]:核对三个民航来源, 确认官方附件只到 1216 科目
1101
+ - 会计准则委员会通知页(站内标注来源会计司)已存档; 其附件与仓里的 notice_2003_18.doc
1102
+ MD5 完全一致(ae0096cd...), 可确认本仓那份是会计司原件镜像而非第三方改版
1103
+ - 但该附件只有总说明与 1215/1216, 22 张专表的表样仍只有卫税科技转载一个来源
1104
+ - 会计视野 mview/16198 经核对是 1993 年《运输(民用航空)企业会计制度》, 不是 2003 办法;
1105
+ 维基文库那条抓取失败(HTTP 000), 本机访问不通
1106
+ - minhang README 资料说明与 source_gaps 的民航行同步改写
1107
+ - 验证: 147 项全绿(仅文档)
1108
+ - docs[multi]:归档中国航空集团 2023 半年报样本, 记录其可用边界
1109
+ - 上交所债券公告的 69 页 PDF 存为 minhang_2003/reference/raw/, 附注部分转文本
1110
+ - 如实记录: 第 1–10 页四大主表全是扫描图片无文本层, 本仓无 OCR 引擎取不出行次;
1111
+ 且执行 2023 年 CAS, 不能当 2003 年办法的报表格式依据
1112
+ - 定位: 只作行业列报惯例的旁证(航材、票证结算、航线补贴等附注口径)
1113
+ - 验证: 147 项全绿(仅文档)
1114
+ - docs[multi]:补维基文库校对稿, 民航 19 张专表有两个独立来源
1115
+ - 直连 HTML 页仍超时, 改用 index.php?action=raw 取到 121 KB wikitext, 存为 raw 底稿
1116
+ - 转换后 66,495 字, 含会企 01/02 民航版、19 张民航企表与编制说明; 航线维度出现 114 次
1117
+ - 与卫税科技那份互校: 维基版是"货币资金""无形资产", 卫税版是"贷币资金""天形资产";
1118
+ 两处错字在维基版不存在, 逐字引用改以维基版为准
1119
+ - minhang README 的转换稿与来源说明、source_gaps 的民航行同步
1120
+ - 验证: 147 项全绿(仅文档)
1121
+ - docs[multi]:建民航专表清单, 把"17–19 缺失"改口为编号跳号
1122
+ - 新增 minhang_tables_inventory.md: 4 张通用表 + 19 张民航企专表, 逐表列填报主体/编报期/
1123
+ 维度/建议取数科目; 开头写死"19 张, 最大编号 22, 17–19 从未发布"
1124
+ - 原文依据是 18 号文件表一的目录, 编制说明里"本三张表"(20/21/22)的说法也一并记下
1125
+ - T3 从"民航企 01–22 报表"重写为"民航专表的维度投影": 只需 03/12/20/22 四张的维度,
1126
+ 一维靠 balance_by, 二维(航线×机型)还没有; 明确不留"补 17–19"的幽灵条目
1127
+ - minhang README 与 source_gaps 的表述同步
1128
+ - 验证: 147 项全绿(仅文档)
1129
+ - docs[multi]:确认会计司三处路径指向同一份 45KB 残件
1130
+ - 会计司页(t20080522_33558)的附件 P020080522637095987855.doc 与本仓 notice_2003_18.doc
1131
+ MD5 完全一致(ae0096cd...), 与会计准则委员会页的附件也是同一份
1132
+ - 该附件不是"长文档": Word 元数据 1 页、923 字、5,266 字符, 只有总说明与 1215/1216,
1133
+ 到 1216 账务处理就结束 —— 是会计司上传的残件, 不是下载截断
1134
+ - 存档会计司通知页, README 的资料说明与附件说明改写
1135
+ - 验证: 147 项全绿(仅文档)
1136
+ - docs[multi]:补第三份民航全文来源, 三份互相校对
1137
+ - 汇报书法规库的转载存为 minhang_2003_18_huibaoshu.md + raw 底稿, 48,720 字
1138
+ - 三份在 6 个增设科目、19 张民航企表目录上完全一致; 汇报书与维基都没有"贷币资金""天形资产"错字
1139
+ - README 与 source_gaps 的引用规则改成"以两份一致的为准", 不再单点依赖维基
1140
+ - 验证: 147 项全绿(仅文档)
1141
+ - feat[python]:维度汇总支持二维键, 落地民航企01 矩阵表
1142
+ - Ledger.balance_by 的 dim 参数接受维度名或维度元组: 一维返回 {值: 金额}, 二维返回 {(值1, 值2): 金额};
1143
+ 缺任何一维标签的分录不计入, 不做"未分类"兜底
1144
+ - reports 增加 Matrix 类型与 minhang_01(): 民航企01 的 7 个财务行 × 6 个航线/业务栏,
1145
+ 收入按贷方取正、成本费用按借方取正、营业利润逐列算, 不出合计(列间不可加)
1146
+ - A147 钉住一维/二维汇总, A148 钉住矩阵: 国内 80万收入-60万成本=20万利润, 国际 20-15=5万,
1147
+ 没有明细的香港栏留空
1148
+ - 清单里民航企01 标为已实现, 03/12/20/22 的维度能力注明; DESIGN T3 同步
1149
+ - 验证: 149 项全绿
1150
+ - docs[multi]:民航项目整体搁置, 重写 TODO 章节去掉重复段
1151
+ - DESIGN §9 开头标注"民航项目整体搁置(2026-10-21)", T3 改为搁置, 材料留在 minhang_2003/ 备查
1152
+ - §9 因前面几轮区间替换被写坏, 同一批条目重复 2–3 次(T1/T2/T8 各 3 处), 整段重写为一份
1153
+ - 民航专表清单头部同步"不做"状态
1154
+ - 验证: 149 项全绿(仅文档, 单独跑过)
1155
+ - refactor[python]:删除民航专用的矩阵实现, 明确民航专表不属财务系统范围
1156
+ - 用户指出民航企 22 这类是航线经营成果分析(生产量/吨公里/飞行小时), 与财务报表无关, 公开年报也只披露通用财报
1157
+ - 删除 reports 里的 Matrix/MINHANG_* / minhang_01 与 A148: 它们是我今天为 T3 加的, 现在没有消费方
1158
+ 且不属于财务系统范围; 通用的 Ledger.balance_by(含二维键) 保留
1159
+ - DESIGN §9 与民航专表清单改口: 19 张是行业管理/统计报表, 报行业主管部门, 不进对外财报
1160
+ - 验证: 148 项全绿
1161
+ - feat[python]:恢复民航矩阵并实现民航企22 的表内公式
1162
+ - 你说得对: 民航企22 有收入、民航基金、税金、变动/固定成本、利润与单位水平, 是航线盈利分析(管理会计),
1163
+ 不是纯统计表; 之前"不属财务系统"的判断收回
1164
+ - 恢复 Matrix / MINHANG_01_ROWS / minhang_01 与 A148, 新增 minhang_22_row(): 按原文栏号实现
1165
+ L28 收入净额、L46 贡献毛益、L47 毛益率、L64 利润与 L65–L94 各项单位水平, 分母为 0 给 0
1166
+ - A149 用一组数钉住: L28 169万、L46 79万、L64 29万、L93 16.11%, 另测分母为零
1167
+ - finance/README 按你的规则重写: 只讲本层直接包含的 README.md 与 cas/; 制度版本表、工具链、
1168
+ 时间轴全部搬进 cas/README.md, 并修掉搬过去后多出来的 cas/ 前缀
1169
+ - DESIGN §9 与专表清单恢复"进行中", 写明还差跨表分摊模型
1170
+ - 验证: 150 项全绿
1171
+ - feat[python]:实现民航企20 分航线、机型收入采集表
1172
+ - minhang_20(): 一行一个(航线, 机型), 12 栏照表样: 航线/国内国际/机型/运输收入合计/
1173
+ 客运/行李/货运/邮件/民航基金/税金及附加/收入净额/起降费
1174
+ - 收入按 `运输类型=` 标签拆四栏, 基金与税金按(航线,机型)取, 起降费从 5401 按 `费用项=起降费`;
1175
+ 净额 = 合计 − 基金 − 税金; 港澳按原文含在国际; 只出真实出现过的(航线,机型)组合
1176
+ - A150 用一组数钉住 12 栏, 含"四类收入合计=运输收入合计"的勾稽
1177
+ - 清单与 DESIGN T3 更新已实现范围
1178
+ - 验证: 151 项全绿
1179
+ - feat[python]:实现民航企22 的成本分摊模型
1180
+ - allocate_by(total, weights): 按权重分摊, 分项之和严格等于原合计, 尾差落权重最大的项;
1181
+ 权重全为零时不分摊(不平均分, 平均分等于编数据)
1182
+ - minhang_22_allocate(costs, volumes): 按原文权重把各成本费用表合计分到航线 —— 飞行小时费/航材/
1183
+ 飞发日常修理/高价周转件/折旧/保险/租赁/训练按飞行小时, 航油按耗油量, 餐食按旅客人数,
1184
+ 工资福利制服/其他直接/间接/管理/租机利息/其他财务/大修理/客舱服务按最大吨公里,
1185
+ 行李货物赔偿按货邮行运量, 客运代理费按客运收入、货运代理费按货邮行收入; 起降费不参与分摊
1186
+ - A151 钉住: 三等分合计不变、零权重不分、工资 300 按 60:40 得 180/120、航油按耗油量 30/60
1187
+ - 清单更新已实现范围
1188
+ - 验证: 152 项全绿
1189
+ - feat[python]:新增业务量容器, 民航22 的分摊权重有了来源
1190
+ - volumes.Volumes: 15 个业务量指标(班次/飞行小时/耗油量/旅客人数/最大吨公里等), 按(航线,机型)
1191
+ 登记、按航线汇总; 业务量没有借贷方向, 不进分录, 否则破坏试算平衡
1192
+ - load_volumes() 从 YAML 读, 未知指标直接报错, 不静默忽略
1193
+ - minhang_22_allocate 的权重参数改成"权重名 → {航线: 数值}", 与 volumes.by_route() 直接对接;
1194
+ 成本项到权重的映射照原文(飞行小时/耗油量/旅客人数/最大吨公里/收入比例)
1195
+ - A152 钉住: 按航线汇总、航线清单、未知指标报错、用业务量分摊工资 200 → 100/100
1196
+ - 清单与 DESIGN T3 更新
1197
+ - 验证: 153 项全绿
1198
+ - feat[python]:民航企22 端到端跑通, 94 栏整表输出
1199
+ - minhang_22(book, ledger, volumes, costs, as_of): 20 表收入侧按航线跨机型汇总 + 业务量按航线汇总
1200
+ + 成本按原文权重分摊, 逐航线跑表内公式, 输出 L1–L94 全栏
1201
+ - 变动成本 = 起降费(直接取 20 表) + 九项分摊; 固定成本 = 十五项分摊; 列名用栏号, 与原文公式一致
1202
+ - A153 端到端钉住两条航线: 国内 L21 90万、净额 86.5万、变动 40.49万、固定 20万、利润 26.01万、
1203
+ 吨公里收入 0.50; 国际 L21 22万、变动 23.51万、固定 10万、利润 −12.41万、吨公里收入 0.275
1204
+ - 清单里 22 表标为已实现, DESIGN T3 同步
1205
+ - 验证: 154 项全绿
1206
+ - feat[python]:实现民航企03 运输成本表
1207
+ - minhang_03(): 24 个成本项 × 机型列, 末列"所有机型"为各机型之和; 成本项按 `机型=`+`费用项=`
1208
+ 从 5401 取, 生产指标(飞行小时/周转量)来自 volumes.by_plane
1209
+ - 行次结构照原文: 1 运输成本 = 2 直接营运费 + 25 间接营运费; 4 空勤伙食/5 地勤伙食是 3 的
1210
+ "其中"项, 不重复计入; 29/30 单位成本 = 成本 ÷ 对应生产指标, 分母为零给 0
1211
+ - A154 钉住: 成本合计 65万 = 直接 52万 + 间接 13万, 每飞行小时成本 216.67、A320 200、
1212
+ 每吨公里成本 0.270833
1213
+ - 清单与 DESIGN 更新
1214
+ - 验证: 155 项全绿
1215
+ - feat[python]:实现民航企 07/08/09 三张费用表
1216
+ - 07 营业费用 50 行、08 管理费用 38 行、09 财务费用 13 行, 行次照原文逐行录入
1217
+ - 明细按 `费用项=` 标签从 5501/5502/5503 取; 合计取科目总账余额: 有费用没打标签时,
1218
+ "明细之和 ≠ 合计" 会直接暴露在表上, 比把差额摊进某一行诚实
1219
+ - 小计行与"其中"行按标签取, 不自动累加 —— 原文是"小计 + 其中"的层级, 自动累加会把其中项算两遍
1220
+ - A155 钉住: 07 合计含未打标签的 2000(37000)、工资行 30000、08 合计 40000、09 合计 70000 与租机利息 60000
1221
+ - 清单与 DESIGN 更新
1222
+ - 验证: 156 项全绿
1223
+ - feat[python]:22 表成本项改为从 03/08/09 自动取数
1224
+ - 两套表叫法不同(03"飞机、发动机折旧费" = 22"飞发折旧"), 建显式对照 MINHANG_22_FROM_03,
1225
+ 含正负系数: 工资按原文 = 行3 工资奖金 − 行6 飞行小时费
1226
+ - minhang_22_costs(three, eight, nine): 03 出 18 项成本, 08 出管理费用, 09 拆出租机利息与
1227
+ 其他财务费用(合计 − 租机利息); 07 的代理费口径依赖"国内/国际×客/货×BSP/CASS"交叉, 不猜, 由调用方传
1228
+ - minhang_22 的 costs 改成可选, 不传就自动走这条链; tables 参数可传已算好的三张表免得重复计算
1229
+ - A156 钉住 8 个成本项的取数与工资的减法口径
1230
+ - 验证: 157 项全绿
1231
+ - feat[python]:实现民航企 04 通用航空成本表与 06 机场服务费用表
1232
+ - 04 与 03 同构: 24 个成本项 × 机型列, 少了国际口径几行、多了作业准备费与作业赔偿费;
1233
+ 单位成本按飞行小时(原文没有吨公里口径), 另有每飞行小时耗油量
1234
+ - 06 是 5401 里按 `业务=机场服务` 切出的一段, 27 行; 合计不含 2–4 三个"其中"行
1235
+ - A157 钉住: 04 成本 16万 = 直接 14万 + 间接 2万, 每飞行小时成本 160、耗油 200;
1236
+ 06 合计 4万 = 工资 3万 + 保险 1万
1237
+ - 清单与 DESIGN 更新(04/06 标为已实现)
1238
+ - 验证: 158 项全绿
1239
+ - feat[python]:实现民航企 05 间接营运费用明细表
1240
+ - 行按费用性质细分 21 项, 列是运输成本/通用航空成本/合计; 明细要求分录带 `业务=` 与 `费用项=` 两个标签
1241
+ - 22 行合计取明细之和, 4 个"其中"行不进合计; 与 03 行25、04 行23 的勾稽留给调用方核对
1242
+ - A158 钉住: 运输 25000、通用 8000(其中行 2000 未计入)、合计 33000, 福利费落在行5
1243
+ - 清单与 DESIGN 更新, 民航专表已实现 8 张
1244
+ - 验证: 159 项全绿
1245
+ - fix[python]:清掉 2001 科目表核对中断留下的 57 条 verified:false, 未核实改为按制度分组
1246
+ - 起因: 用户问"101/102 这么普遍的科目为什么提示未核实"
1247
+ - 查明有两拨: 施工 1993 整表 65 条(官方附件缺失, 据两处转载互校, 属实);
1248
+ 企业会计制度 2001 的 57 条 —— 前 27 条 true、后 57 条 false, 是核对做到一半留下的
1249
+ - 用脚本把 85 个科目名逐一回查 PDF 文本层, 全部命中, 清掉 57 条 false 并在表头写明核对方式
1250
+ - 未核实输出从逐条 554 行改成按制度分组, 现在 6 行, 能看出是整张表缺原件还是零散漏标
1251
+ - 验证: 159 项全绿
1252
+ - fix[python]:用江苏财经的施工制度全文补齐科目表, 去掉 65 条 verified:false
1253
+ - 之前我只查了上海市财政局与厦大站点就断言"附件全是略", 实际没搜够 —— 江苏财经信息网的
1254
+ kjzd3.htm 有全文, 65 个科目齐全
1255
+ - 解析后与本仓逐条比对: 编号与名称 65/65 全一致, 无多无缺, 据此去掉 verified: false 并改表头来源
1256
+ - 该页只到科目表, 没有会施 01/02 报表格式, source_gaps 里未核实改为"报表格式仍缺"
1257
+ - 未核实契约从 212 条降到 143 条(只剩 CAS 科目表与 3 票种 1 税率)
1258
+ - 验证: 159 项全绿
1259
+ - docs[multi]:补会计准则委员会的施工办法 wps 官方完整版
1260
+ - casc 页附件「施工企业会计核算办法.wps」(39 KB, UTF-16LE) 存为 raw 底稿并解码为 md
1261
+ - 它含总说明 + 7 个增设科目 + 补充报表项目及编制说明**六条**, 比会计司那份 .doc(只到科目说明)完整
1262
+ - 关键差异: 第(二)条 jscj 版漏了"减'工程结算'科目余额", 官方 wps 写全了 ——
1263
+ 证实 balance_2004_shigong 把"已完工尚未结算款"按 工程施工 − 工程结算 处理是对的, 已在 YAML 注释注明出处
1264
+ - README 资料说明改为三来源(会计司 .doc / 会计司 .wps / 江苏财经), 以官方 wps 为准; source_gaps 同步
1265
+ - 验证: 159 项全绿(仅文档)
1266
+ - feat[python]:实现民航企02 主营业务收入表
1267
+ - 55 行按收入类别展开: 运输(四航线×四类)、应扣基金、通用航空、机场服务、代理手续费、其他
1268
+ - 四条航线下的"客运收入"等同名项目靠标签前缀区分(国内航线/客运收入), 否则四段会互相串数
1269
+ - 小计自下而上累加, 行1 运输收入 = 行2 未扣基金的收入 − 行23 应扣基金(原文是相减关系)
1270
+ - A159 钉住: 国内 60万、未扣基金 68万、应扣 5万、运输 63万、通用 20万、机场 30万、合计 120万
1271
+ - 清单与 DESIGN 更新, 民航专表已实现 10 张
1272
+ - 验证: 160 项全绿
1273
+ - feat[python]:加一套造数的民航演示账套, 十张表端到端可跑
1274
+ - data/demo/minhang_2004.yaml: 16 笔凭证(国内/国际两条航线、B737、收入/基金/税金/成本/三项费用)
1275
+ + 两条航线的业务量; 数字是造的, 科目与标签照真实业务结构摆
1276
+ - labs/sta/demo.py: 从 YAML 建账簿与业务量, tables() 一次算出 02/03/04/05/06/07/08/09/20/22;
1277
+ python -m labs.sta.demo 直接打印 22 表逐航线结果
1278
+ - A160 勾稽: 22 逐航线"利润 = 收入净额 − 变动 − 固定", 02 合计 = 20 表收入 = 5101 贷方合计
1279
+ - 演示结果: 国内 收入 107万/利润 37.35万/吨公里收入 0.51; 国际 收入 30万/利润 −1.35万
1280
+ - 验证: 161 项全绿
1281
+ - feat[python]:实现民航企10 其他业务利润、营业外收支明细表
1282
+ - 左半其他业务(5102/5405)、右半营业外(5301/5601), 共 38 行; 取数标签用行名去掉序号(如"价拨材料收入")
1283
+ - 小计按原文: (三)其他业务利润 = 收入 − 支出, 一 = (三); 营业外收支净额 = 收入 − 支出;
1284
+ 行 34"其中:工资"是 33 的明细, 不进合计
1285
+ - 演示账套补四笔(其他业务收入/支出、营业外收入/支出), demo.tables() 增加 '10'
1286
+ - A161 钉住: 其他业务收入 6万、支出 2万、利润 4万; 营业外收入 8千、支出 3千、净额 5千
1287
+ - 民航专表已实现 11 张
1288
+ - feat[python]:实现民航企12 机型收支明细表
1289
+ - 34 行: 收入(四航线+通用航空)、机型总成本(运输/通用/三项期间费用)、生产情况、四项单位指标; 列按机型
1290
+ - 03/04 增加 business 参数: 两张表共用 5401, 不按业务线切会把同一笔成本同时算进运输与通用
1291
+ - 期间费用按各机型吨公里分摊; 单位指标在"所有机型"列上按合计算, 不是把各机型比率平均
1292
+ - A162 钉住: 收入 100万、运输成本 55万、通用 0、管理费 8万、总成本 63万,
1293
+ 每吨公里收入 0.384615、每吨公里成本 0.242308、每飞行小时成本 196.875
1294
+ - 演示账套 tables() 增加 '12'
1295
+ - 民航专表已实现 12 张, 验证 163 项全绿
1296
+ - feat[python]:实现民航企15 基建借款及专用借款表
1297
+ - Ledger.flow_by: 区间内按标签分组的发生额(借/贷两侧), balance_by 只给净额, 借款表要"本年借入多少、归还多少"
1298
+ - 六类借款各四行(年初/增加/减少/年末), 行次照原文写死(每组夹着借入数/利息/外币折差三个子项, 行次不连续)
1299
+ - 年末 = 年初 + 增加 − 减少, 由 A163 钉住; 原文再分解的三个子项未拆, 需要更细标签
1300
+ - 民航专表已实现 13 张, 验证 164 项全绿
1301
+ - feat[python]:实现民航企16 固定资产、存货及运输生产指标表
1302
+ - 72 行按三块排列: 固定资产情况(1-39)、流动资产(40-43)、主要生产指标(44-72)
1303
+ - 能落到科目的行取余额: 原价 1501、累计折旧 1502、高价周转件 1216、航材消耗件 1215; 净值 = 原价 − 折旧
1304
+ - 生产指标取业务量: 座位数、最大吨公里/客公里、飞行小时、客公里、旅客与货邮运量, 航线口径按 49-63 拆
1305
+ - 如实标注: 固定资产增减明细、类别拆分、客座率/载运率/日利用率共 12 行没有取数来源, 保持 0, 不冒充真实数据
1306
+ - 另记: 民航企14 工资基金表三份全文都只有编制说明、没有表样, 已写进清单
1307
+ - A164 钉住 12 个可算行与净值勾稽; 民航专表已实现 15 张, 验证 165 项全绿
1308
+ - feat[python]:实现民航企21 生产业务数据采集表
1309
+ - 一行一个(航线, 机型), 列是 15 项业务量, 全部取 Volumes 不碰账簿——这张本来就是生产口径录入表
1310
+ - 原文栏 16–22 把周转量按客运/行李/货物/邮件再拆四份, 本仓只有合计, 不列而不是填 0
1311
+ - 演示账套 tables() 增加 '16' 与 '21'
1312
+ - A165 钉住国内/国际两行与"缺失指标按 0"
1313
+ - 民航专表已实现 16 张, 验证 166 项全绿
1314
+ - feat[python]:实现民航企13 任务成本表
1315
+ - 四条航线各七行: 成本费用合计、运输成本、其中油料、其中折旧、营业、管理、财务
1316
+ - 分摊依据照原文"总额除以运输飞行总周转量再乘以各航线周转量", 权重统一取吨公里;
1317
+ 成本池取 03 行1/9/12 与 07/08/09 合计
1318
+ - 「其中」两行是运输成本的明细, 不进合计; A166 除逐栏断言外, 还验两条航线合计 = 成本费用总额 57万
1319
+ - 演示账套 tables() 增加 '13'
1320
+ - 民航专表已实现 17 张, 验证 167 项全绿
1321
+ - feat[python]:业务量加周转量拆分, 实现民航企11 收入水平情况表
1322
+ - Volumes 增加 5 个指标: 客运客公里/客运吨公里/行李吨公里/货物吨公里/邮件吨公里,
1323
+ 对应 21 表栏 16–22 与 11 表的客运、货邮运口径
1324
+ - minhang_11(): 周转量、运输收入、吨公里收入水平三段共 63 行; 收入水平 = 收入 ÷ 周转量,
1325
+ 客运按客运吨公里、货邮运按行李+货物+邮件吨公里
1326
+ - 专包机相关的 4 组行没有取数来源(业务量里分不出专包机), 保持 0 并在文档写明
1327
+ - A167 钉住 210万周转量、92万收入、0.438095 综合水平、0.444444 客运、0.4 货运
1328
+ - 演示账套补上拆分指标并接入 '11'
1329
+ - 民航专表 18/19 已实现(只剩 14 无表样), 验证 168 项全绿
1330
+ - feat[python]:21 表补齐周转量拆分栏, 演示命令输出全部表
1331
+ - MINHANG_21_COLUMNS 从 15 项扩到 20 项: 加上客运客公里/客运吨公里/行李/货物/邮件吨公里,
1332
+ 对应原文栏 16–22; 没录的指标是 0, 不再"不列"
1333
+ - demo.main() 改为两段输出: 先看 22 表逐航线结果, 再列 16 张表的行列数
1334
+ - 演示账套现覆盖 02 03 04 05 06 07 08 09 10 11 12 13 16 20 21 22
1335
+ - 验证: 168 项全绿
1336
+ - feat[python]:业务量加期间维度, 11 表补上年栏
1337
+ - Volumes.put/by_route/by_plane 增加 period 参数(默认"本年"), 11 表要本年/上年两栏对比
1338
+ - minhang_11 改成两栏输出, 上年数由 prior 参数给; 客运/货运收入水平分别用各自的收入和吨公里,
1339
+ 不再拿总收入除总周转量
1340
+ - 演示账套加 prior 段(上年周转量与收入), demo 透传
1341
+ - A167 增加上年栏断言: 上年综合水平 0.440000、客运 0.447059
1342
+ - 验证: 168 项全绿
1343
+ - feat[python]:维度取数支持区间, 民航企20 可按季度出数
1344
+ - Ledger.balance_by 增加 since: 传了只算区间内发生额, 不传仍是建账以来的累计
1345
+ - minhang_20 透传 since, 季度表的收入/基金/税金/起降费按区间取
1346
+ - A168 用两笔跨季度收入验证: 累计 30万、二季度 20万
1347
+ - 文档写明只有 20 表支持, 03/07/08/09/22 仍是累计口径, 出年度表不受影响
1348
+ - 验证: 169 项全绿
1349
+ - docs[multi]:民航专表清单补演示账套与期间口径两节
1350
+ - docs[multi]:拿到铁路办法的会计司附件, 但报表披露节不是纯文本
1351
+ - 会计准则委员会 2004/0701/203831 的「铁路运输企业会计核算办法.doc」(46 KB) 已存档
1352
+ - 它比网页版完整: 多出 8 个增设科目的使用说明(约 1.3 万字)
1353
+ - 但「三、补充会计科目表及报表披露说明」标题之后是字节错位的二进制(疑似图片或嵌入对象),
1354
+ 文本层里没有该节内容; 全文检索"资产负债表"0 次佐证
1355
+ - 新建 tielu_2004_casc_text.md 记录可提取部分与提取限制; README 与 source_gaps 同步
1356
+ - 这条线到此为止: 要读那节只能人工用 Word 打开原件
1357
+ - docs[multi]:查明铁路办法报表节是图片而非文本(有 Adobe Photoshop 标记)
1358
+ - feat[python]:补齐民航企14 工资总额及工资基金表(行次自拟)
1359
+ - 三份全文都只有编制说明、没有表样网格, 行次按说明的项目顺序自拟, 表标题与文档都标注"行次自拟"
1360
+ - 工资总额取五项构成之和(岗位/绩效/年功/基础/加班), 工资基金五项按 `项目=` 从 2151 取;
1361
+ 年末结余 = 年初 + 调整 + 提取 − 支出
1362
+ - 本年支出数是借方发生, 取正; 其余是贷方余额, 取负后再取反
1363
+ - A169 钉住五项与结余等式; 民航专表 19/19 全部实现(其中 14 为自拟行次)
1364
+ - 验证: 170 项全绿
1365
+ - feat[python]:加报表表内勾稽, 任意账套都能跑
1366
+ - 新增 labs/sta/tieout.py: check_minhang(tables) 检查 02/03/04/10/11/12/13/22 的小计与明细等式,
1367
+ 22 逐航线核 净额/毛益/利润 三式
1368
+ - 与 validate 里的 A 断言分工: A 系列用固定数据钉某次改动, tieout 是恒等式, 换数据也能跑
1369
+ - demo 每次输出勾稽结论; A170 拿演示账套钉住
1370
+ - 清单文档补"表内勾稽"一节
1371
+ - 验证: 171 项全绿
1372
+ - docs[multi]:补民航表的取数标签指南, 机场服务标签改用项目名
1373
+ - 新增 usage.md: 每个辅助核算键(航线/机型/运输类型/收入项/费用项/业务/项目/借款种类)喂养哪几张表、
1374
+ 三笔典型分录怎么写、漏打/错打/少打业务标签各自会出什么事
1375
+ - 机场服务那 18 行的 `收入项` 标签从行号(机场服务/35)改成项目名(机场服务/国内飞机起降服务收入),
1376
+ 行号外部没人认得; 演示账套与 A159 同步
1377
+ - 验证: 171 项全绿
1378
+ - fix[python]:清掉 reports.py 里 5 个重复函数, 补 16 表的架数与三项比率
1379
+ - reports.py 里 minhang_12/13/15/16/21 各有两份完全相同的定义(前面反复追加导致),
1380
+ Python 取最后一份, 前面的改动实际上被覆盖; 删掉重复块(250 行)
1381
+ - 16 表补齐: 45 期末飞机架数(新业务量指标"飞机架数")、65 正班客座率、70 正班载运率、
1382
+ 71 飞机日利用率、66-69 分航线客座率; 公式是民航统计通用口径, 原文表样只给项目名
1383
+ - 新增 A171 钉住 10 架、80% 客座率、80.77% 载运率、0.658 小时/日
1384
+ - 验证: 172 项全绿
1385
+ - fix[python]:CAS 科目表按 2006 附录核对, 未核实从 143 条降到 15 条
1386
+ - 用 cas_appendix_2006.pdf 的表格(pdfplumber)抽出官方 156 个一级科目, 与 zhunze_2007.yaml 逐条比对:
1387
+ 官方科目**一个不缺**, 名称只有 1 处不同(6403 官方 2006 叫「营业税金及附加」, 仓里用的是 2016 改名后的「税金及附加」)
1388
+ - 仓里另有 15 个后续修订新增的科目(合同资产/合同负债/使用权资产/租赁负债/其他综合收益等),
1389
+ 不在 2006 附录里, 保留 verified: false 并注明来源; 其余全部去掉 false
1390
+ - 表头写明三条事实: 156 官方全收、15 个后续新增待核、6403 改名口径
1391
+ - DESIGN §12 的"科目为五类业务子集待补全"改成实际状态
1392
+ - 验证: 172 项全绿
1393
+ - fix[python]:地方教育附加按财综〔2010〕98号拆成两段
1394
+ - 全国统一 2% 自 2011-01-01 起(财综〔2010〕98号要求各省 2010-12-31 前报批开征方案), 该行标 verified
1395
+ - 2006-2010 各省自定(有的未开征、有的低于 2%), 保留 2% 的占位行以维持区间连续, 明确标 verified: false
1396
+ 并注明"实际以地方口径为准"——不冒充已核实
1397
+ - 验证: 172 项全绿; 未核实项从"地方教育附加(口径不明)"变成"2011 前的占位行(原因明确)"
1398
+ - fix[python]:三个电子发票票种按税务总局公告核实
1399
+ - 增值税电子普通发票: 2015 年第 84 号 第七条 自 2015-12-01 起全国推行(票样监制章经 2018 年第 31 号 修改)
1400
+ - 增值税电子专用发票: 2020 年第 22 号 自 2020-12-21 起在 11 个地区新办纳税人中实行, 2021-01-21 扩至 25 个地区, 受票方全国
1401
+ - 全面数字化电子发票: 2024 年第 11 号 第十二条 自 2024-12-01 起全国推广; 2021-12-01 起广东/上海/内蒙古试点
1402
+ - 三条都标 verified 并把批次、范围写进 note; 未核实契约从 5 条降到 2 条(15 个 CAS 后续新增科目 + 2011 前的税率占位行)
1403
+ - 验证: 172 项全绿
1404
+ - docs[multi]:原文缺口登记补'非文件类缺口'一节, 说明汇率/OCR/维度/CAS修订各自缺什么
1405
+ - feat[python]:加跨表勾稽, 修 03/04 共用 5401 导致的重复计成本
1406
+ - tieout.check_cross: 02 合计 = 20 表收入、03/04 = 12 表的运输/通用成本、12 三项费用 = 07/08/09 合计、
1407
+ 13 四段合计 = 运输成本 + 三项费用; A172 用演示账套钉住
1408
+ - 修一个真 bug: 03 与 04 都从 5401 按"全部费用"取数, 同一笔运输成本同时进了运输成本表和通用航空成本表
1409
+ (跨表勾稽报 04=88万 ≠ 12 表的 0)。现在两表分别默认 `业务=运输`/`业务=通用`,
1410
+ 账上一条业务线标签都没有时才回退到不分业务(老账套不受影响)
1411
+ - demo 输出分成"表内勾稽/跨表勾稽"两行
1412
+ - 验证: 173 项全绿
1413
+ - feat[python]:跨表勾稽补 20/21/22 与 11/16 四条, 修起降费漏计
1414
+ - 20 表的"起降费合计"原来按 `费用项=起降费` 精确匹配, 而 03 表里叫"国内/国外机场起降服务费",
1415
+ 结果 20 的起降费恒为 0, 22 的变动成本里整块少了起降费; 改成按"费用项含'起降'"归集
1416
+ - 22 表补 L34(起降费) 栏: 原先只把它并进 L29, L34 恒为 0, 表样里那一栏是空的
1417
+ - 修完后 20 起降费 6万/3万、22 L34 同额, 国内 L29 从 37.6万变 43.6万(补上了起降费)
1418
+ - 跨表勾稽新增: 20 起降费 = 22 L34; 21 的班次/小时/耗油/旅客/吨公里按航线 = 22 的 L1-L4/L15;
1419
+ 11 总周转量 = 16 四条航线吨公里之和
1420
+ - 173 项全绿
1421
+ - feat[python]:表内勾稽补 03/04/05 的"明细之和"校验
1422
+ - 03/04: 直接营运费 = 3 号行 + 6..24(22) 各明细之和, 4、5 是 3 的"其中"不重复计
1423
+ - 05: 间接营运费合计 = 各明细之和(排除 2/3/4/12 四个"其中"行)
1424
+ - 与已有的"成本 = 直接 + 间接"合起来, 把两级的加总都盯住; 演示账套无差异
1425
+ - 文档同步
1426
+ - 验证: 173 项全绿
1427
+ - feat[python]:07/08 的小计行改为按明细自动累加
1428
+ - 原先小计行(07 的国内/驻外两段、代理业务手续费, 08 的公司经费与税金)只能靠标签取值,
1429
+ 没打标签就是 0, 表上出现"明细合计 5 万、小计 0"的怪相
1430
+ - 改成按明细累加, 并按依赖顺序先算子级(代理业务手续费)再算一级段; 合计仍取科目余额,
1431
+ 因而"小计之和 ≠ 合计"正好暴露没打标签的费用
1432
+ - 表内勾稽补 5 条(07 四段与合计、08 三项); 演示账套无差异
1433
+ - 验证: 173 项全绿
1434
+ - feat[python]:勾稽补 22/15/14 的恒等式
1435
+ - 22: 逐航线加核"小计 = 分项"(客公里成本 L75=L76+L77、每班次 L81=L82+L83、飞行小时 L85=L86+L87)
1436
+ 与代理费合计 L38 = L39 + L42
1437
+ - 15: 六类借款逐段 年初 + 增加 − 减少 = 年末; 段位行次按原文写死(每组中间夹着借入数/利息/汇差)
1438
+ - 14: 工资总额 = 五项构成之和, 年末结余 = 年初 + 调整 + 提取 − 支出
1439
+ - 写第一版时把 22 段(车船飞机借款, 减少 28/年末 29)归到了错误的分支, 演示数据全零没暴露,
1440
+ 用一笔 40 万借入 + 10 万归还单独验过
1441
+ - 验证: 173 项全绿
1442
+ - feat[python]:勾稽补 20↔22 分航线与 13 的油料折旧
1443
+ - 20 表按航线的运输收入 = 22 表该航线的 L21(原先只核了总数)
1444
+ - 13 表四段的"其中油料""其中折旧"之和 = 03 表行 9 / 行 12 —— 分摊不重不漏
1445
+ - 文档新增"看起来该相等、其实不该的"一节: 16 的 47/48 是可供运力、12 的 14 是实际产出;
1446
+ 22 的 L21 与 02 的 55 口径不同; 11 的 22 要减应扣基金。判据是"口径是否同源"
1447
+ - 验证: 173 项全绿
1448
+ - fix[python]:修正 16 表 49–52 的取数归属与 01 表业务线列
1449
+ - 16 表 49–52 是第 48 行「最大客公里投入」的航线拆分, 原先按吨公里取数, 与 48 恒不相等
1450
+ - 01 表「通用航空/机场服务」两列改按 `业务=` 取数, 机场服务的收支不再落进航线列
1451
+ - 02↔20 勾稽改对 02 第 1 行运输收入: 20 表只采运输收入, 不含机场服务与通用航空
1452
+ - 新增表内等式: 16 表三组「其中」之和、年末净值; 新增跨表: 01↔02 逐列、16↔21、11↔21
1453
+ - 演示账套: 机场服务收入改打业务标签, 补机场服务成本与最大客公里/可供座位
1454
+ - 新增 A173; A160/A164 按新口径更新; README 的断言区间改为 A0–A173
1455
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1456
+ - docs[multi]:修正民航 T3 进度与 10 表的实现标记
1457
+ - DESIGN §9 的 T3 原写"分摊模型未做、01 之外 17 张未实现", 与现状不符: 19 张已全部实现
1458
+ - 缺口收窄为三处: 11 表专包机 4 组行、16 表增减明细与类别拆分 10 行、14 表原文表样
1459
+ - 民航表清单里 10 表补上"已实现"标记(A161)
1460
+ - feat[python]:接通 11 表的专包机口径
1461
+ - 11 表专包机 8 组行原恒为 0: 收入其实已有 `收入项=专包机客运/货邮运收入` 标签可读, 周转量无来源
1462
+ - `Volumes` 增 `专包机客运吨公里`/`专包机货邮吨公里`: 独立口径, 已含在 `吨公里` 合计里,
1463
+ 21 表原文无此两栏, 只在 11 表用
1464
+ - `_minhang_11_values` 改为按 (合计, 客运, 专包机客运, 货邮, 专包机货邮) 五段取值,
1465
+ 入参由 6 个字典降为 2 个, 周转量/收入/收入水平三段共用同一套行偏移
1466
+ - 表内勾稽增 11 表四段周转量与四段收入的「合计 = 四项之和」, 共 9 条
1467
+ - 演示账套补专包机客运收入 5 万、专包机周转量 7 万吨公里, 国内吨公里改为 217 万
1468
+ - A160 收入基线改 127 万; A167 扩展覆盖专包机周转量/收入/收入水平
1469
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1470
+ - docs[python]:修正 14 表前的节标题
1471
+ - reports.py 里 14 表的节标题误写成「12 机型收支明细表」, 与上面的 12 表重复, 14 表没有自己的标题
1472
+ - 改为「14 工资总额及工资基金表: 行次自拟(原文表样未取得)」
1473
+ - 验证: A169 通过
1474
+ - fix[python]:02 表的应扣基金改从 5403 取数
1475
+ - 行 23–27 原读 5101 的 `收入项=应扣基金/…`, 但基金是 5403 的计提额, 行 23 恒为 0,
1476
+ 行 1 因此等于行 2, 与 22 表 L26 的 4 万对不上
1477
+ - 24–27 改为 5403 按 `航线=` 的余额, 行 23 = 四航线之和; 演示账套行 1 = 123 万, 行 55 = 138 万
1478
+ - 02↔20 勾稽改对行 2「未扣基金的收入」: 行 1 已扣基金, 与 20 表运输收入口径不同
1479
+ - 新增跨表勾稽: 02 行 23 = 22 表 L26 合计
1480
+ - A159 的基金分录改记 5403(原为 5101 贷方, 与 18 号口径不符); A160 增 行1 = 行2 − 行23
1481
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1482
+ - fix[python]:12 表补四航线吨公里与飞行小时
1483
+ - 行 15–18(四航线吨公里)、22–25(四航线飞行小时)原恒为 0: 代码只取 `by_plane` 合计,
1484
+ 数据其实在 `Volumes` 的(航线, 机型)键上
1485
+ - 14 行改为四航线之和(运输飞行总周转量不含专业飞行), 21 行改为 22–26 之和,
1486
+ 26 行取 `通用航空` 航线的飞行小时
1487
+ - 19 行专业飞行换算吨公里(缺换算系数)与 27–29 熟练/公务/训练小时保持 0, 已在 docstring 注明
1488
+ - 表内勾稽增 12 表 5 条(收入/总成本/周转量/飞行小时合计/生产飞行小时)
1489
+ - 跨表勾稽增: 12 各机型周转量 = 11 表运输总周转量; 12 飞行小时 = 16 表完成飞行小时
1490
+ - A162 增 14/15/16/20/21/22/23 行断言
1491
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1492
+ - feat[python]:16 表的固定资产段改由台账汇总
1493
+ - 行 3–30、33–39 原先只有 13/31/32 有数, 其余 34 行(增减明细与类别拆分)恒为 0
1494
+ - `FixedAsset` 增五个台账字段: 类别、用途、取得方式、处置方式、湿租; `assets_from_rows()` 供账套文件内嵌台账
1495
+ - 新增 `minhang_16_assets()`: 年初/本年增加(购入/融资租入/盘盈/其他)/本年减少(报废/盘亏/其他)/年末,
1496
+ 年末再按用途与类别拆分, 融资租入另按 33–38 再筛一遍, 湿租单列 39; 台账合计 = 1501
1497
+ - 演示账套补 8 张卡片与对应凭证(期初、购入、融资租入、湿租、报废), 16 表 13 行 = 1501 = 3780 万
1498
+ - 表内勾稽增 16 表 7 条(增减与年末原价的分解式), A164 增台账口径 18 行断言与 1501 勾稽
1499
+ - 民航表清单、DESIGN T3: 16 表改为已实现, 仅 14 表还缺原文表样
1500
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1501
+ - feat[python]:14 表改为模拟表样并注明出处状态
1502
+ - 原文只有编制说明、没有表样, 行次与项目按说明自拟: 表标题写「模拟表样:行次与项目自拟, 原文未取得」
1503
+ - 表体从 14 行扩到 19 行: 工资总额按两种切法各列一遍(项目=五项构成、人员=五类人员),
1504
+ 工资基金五项(年初/调整/提取/支出/年末结余), 结余 = 年初 + 调整 + 提取 − 支出
1505
+ - 人员类别取 2151 的 `人员=` 标签, 与按构成的合计同为行 1, 由勾稽核对
1506
+ - 新增表内勾稽 14 表 3 条(两种切法各自等于行 1、基金结余式)
1507
+ - A169 改为两种切法 + 结余式 + 标题必须带「模拟表样」
1508
+ - 民航表清单与 DESIGN T3: 14 表标为模拟表样, 不再写"缺表样"
1509
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1510
+ - fix[python]:03/04 的间接营运费改为 05 表明细合计
1511
+ - 05 表原先取不到数: 03/04 的"间接营运费"读单列标签 `费用项=间接营运费`, 而 05 按自己的
1512
+ 21 个费用项标签取数, 同一个池子两套口径, 演示账套里 03 行 25 = 9 万、05 合计 = 0
1513
+ - 03 行 25、04 行 23 改为按 05 的明细标签(排除"其中"行)汇总, 三张表同源
1514
+ - 跨表勾稽增: 05 运输合计 = 03 行 25、05 通用合计 = 04 行 23
1515
+ - 演示账套把 9 万改打 `1.工资、奖金、津贴和补贴`; A154/A156/A157/A162 的造数同步补 `业务=` 标签
1516
+ - 民航表清单: 03/05 的取数说明按新口径改写
1517
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 174 项全绿
1518
+ - docs[python]:自检项数改为 A0–A173
1519
+ - fix[python]:部分处置只结转已处置份额的折算差额
1520
+ - 丧失控制权但保留股权时, 折算差额原按全部持股比例(80 个点)结转, 保留的 30 个点也被转进损益
1521
+ - 改为按 (持股 − 保留持股) 的比例结转, 与 CAS 19 第十四条「按处置的比例计算」一致
1522
+ - 新增 A174: 持 80% 卖 50 个点、留 30%, 累计折算差额 500 → 只转 250;
1523
+ 全资/整笔处置的 A103 不受影响, 处置后合并资产负债表仍平
1524
+ - DESIGN §13.5 记下仍未建模的情形: 不丧失控制权的持股下调(边不终止, 差额进权益性交易)
1525
+ - README 与 DESIGN 的自检区间改为 A0–A174(175 项)
1526
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 175 项全绿
1527
+ - feat[python]:留存收益按各期平均汇率逐年累计折算
1528
+ - CAS 19 第十三条: 未分配利润应由折算后的利润表累加, 原实现让留存收益走期末汇率,
1529
+ 折算差额因此混了"期末汇率与历史汇率之差", 不是真实的外币报表折算差额
1530
+ - `translate_balances`: 盈余公积/未分配利润/本年利润/利润分配按各年发生额 × 该年平均汇率累加;
1531
+ 实收资本与资本公积仍走历史汇率, 其余期末汇率, 差额照旧由 OCI 承接
1532
+ - `attribute_components`: 权益成分改用折算后的本币权益变动(不再自己乘期末汇率),
1533
+ 并删掉"取得日净资产汇率变动"那笔补记 —— 取得日在折算时已固化, 补记会重复计量
1534
+ - 顺带删掉因此失效的 `_equity_fc`
1535
+ - 新增 A175: 2020 年赚 100 美元(平均 6.6)、2026 年末 7.0 → 利润分配折算 660 而非 700,
1536
+ 折算差额 440; A114 的两层外币 OCI 仍为 54(两处改动正好抵消)
1537
+ - README/DESIGN 自检区间改为 A0–A175(176 项)
1538
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 176 项全绿
1539
+ - fix[python]:期初余额按结转日汇率折算, 且不再与建账撞票号
1540
+ - 期初导入的凭证 doc_id 原为 `OPENING`, 与 open_books 的建账凭证同号, 同一本账里两者并存
1541
+ 时第二笔会被当重复票据拒收; 改为 `OPENING-BALANCE`(仍以 OPENING 开头, 内部凭证识别不变)
1542
+ - `_accumulated_translation` 对期初导入那笔改用**结转日即期汇率**, 其余仍按各年发生额 ×
1543
+ 该年平均汇率: 期初是以前年度累计的结转, 没有逐年发生日汇率, 用建账当年平均是近似
1544
+ - 新增 A176: 期初 100 美元(6.60) + 2020 年利润 100(平均 6.783333) → 利润分配 1338.33,
1545
+ 而非 1356.67; 折算差额 461.67
1546
+ - translation.py 口径说明与 DESIGN §12 待办同步
1547
+ - README/DESIGN 自检区间改为 A0–A176(177 项)
1548
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 177 项全绿
1549
+ - fix[python]:按财政部解读核实 4 个持有待售科目, 6115 更名
1550
+ - 原文存档 `docs/finance/cas/raw/casc_20180314_持有待售准则解读.md`(来源 URL、日期、用途)
1551
+ - 1481/1482/2245/6115 由"未核实"改为已核实, 出处为财政部会计司 2018-03-14
1552
+ 《关于持有待售准则有关问题的解读》一、关于会计科目——四个科目都写明了编号
1553
+ - 6115 科目名由"资产处置收益"更正为**"资产处置损益"**: 科目名是损益, 利润表行名才是收益
1554
+ (财会〔2017〕30号); `held_for_sale` 按科目名取数, 同步改
1555
+ - 未核实科目 15 → 11(剩 1124/2204/1612–1616/2703/4003/6117/6702, 编号取决于应用指南附录)
1556
+ - docs/finance/cas/README 增 raw/ 目录说明; DESIGN §12 进度同步
1557
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 177 项全绿
1558
+ - fix[python]:不丧失控制权的持股下调改为显式拒绝
1559
+ - 股权图用两条不同 stake 的边表示持股下调(80% [start, D−1]、70% [D, …])时, 合并利润表
1560
+ 会把前一段边当全处置: 净利润出来是母公司的处置收益 100, 按 70/30 分给少数股东 30,
1561
+ 合并底稿则把差额挤进「合并价差」70 —— 三处都是错的
1562
+ - 新增 `ownership.stake_cuts()` 识别这种配置; 合并利润表与合并资产负债表命中即报错,
1563
+ 说明正确口径(差额调资本公积)并拒绝出数, 不再默默出表
1564
+ - 新增 A177 守住这条拒绝, 并校验报错里点明了"资本公积"
1565
+ - DESIGN §13.5 写出落地还差什么: 权益性交易进 worksheet 的抵销链, 再用反向断言替换 A177
1566
+ - README/DESIGN 自检区间改为 A0–A177(178 项)
1567
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1568
+ - docs[python]:按财政部解读核实 6117 其他收益
1569
+ - 原文存档 `docs/finance/cas/raw/kjs_20180222_政府补助准则解读.md`(来源 URL、日期、用途)
1570
+ - 6117 其他收益 由未核实改为已核实, 出处为财政部会计司 2018-02-22
1571
+ 《关于政府补助准则有关问题的解读》三、关于"其他收益"科目——原文写明"6117 其他收益"
1572
+ - 生效日仍留 2018-01-01: 解读只说准则 2017 年 5 月印发, 没写 6117 的启用日, 不擅自改
1573
+ - 未核实科目 11 → 10(剩 1124/2204/1612–1616/2703/4003/6702)
1574
+ - DESIGN §12 进度同步
1575
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1576
+ - chore[multi]:.githooks 的两个钩子补执行位
1577
+ - commit-msg / pre-commit 由 100644 改为 100755: 克隆到 Linux/macOS 时才能直接执行
1578
+ core.hooksPath 下的钩子
1579
+ - 两个 .py 校验脚本仍保持 100644: 钩子用 `python <脚本>` 调用, 不需要自身可执行
1580
+ - feat[python]:实现不丧失控制权的部分处置
1581
+ - 股权图里持股下调用两条相邻边表示(80% [start, D−1]、70% [D, …]), `stake_cuts()` 识别后
1582
+ 不再当"退出合并"处理
1583
+ - 合并利润表: 该成员的损益与取得日用 `holding_start()` 沿连续边链回溯 —— 原先取得日被重置成
1584
+ 下调日、损益被 until 截断在下调日, 净利因此少算 100; 母公司处置收益从合并损益剔除,
1585
+ 折算差额按处置比例结转(CAS 19 第十四条)
1586
+ - 合并资产负债表: 权益性交易差额 = 价款 − 让渡份额 × 处置日净资产, 调资本公积
1587
+ (CAS 33 第四十九条); 处置掉那部分对应的留存补回, 母公司处置收益从留存剔除
1588
+ - A177 由"必须报错"改为正向断言: 净利 100(归母 70/少数 30)、处置损益调整 −100、
1589
+ 权益 800 实收 + 90 资本公积 + 80 留存 = 970、少数股东 330、资产 1300
1590
+ - DESIGN §13.5 由"显式拒绝"改为已实现, 记下三处口径
1591
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1592
+ - feat[python]:汇率表换成人行定盘价快照
1593
+ - USD/HKD 由示例值改为 mopr 取到的人行(PBOC)中间价: 2006–2025 每年取 12-31 的定盘价,
1594
+ 末段用 2026-10-20 的最近一次(2026 年 12-31 还没到定盘日); 每条带 publish_date 与来源
1595
+ - GHS 仍是示例值: BOG 缺 2024 起的人民币报价, 逐条 source 已标明, 不混着引用
1596
+ - A30/A32 的汇兑差额改为按同一 FxBook 的公式核对(原币 × (期末 − 交易日)汇率), 不再写死 400/-600
1597
+ - A49/A50 的平衡判断与"合计÷汇率"比较给 5 分容差: 逐科目折算四舍五入后会积累几分钱
1598
+ - A113 基线随快照重设(留抵额含外币采购的进项): 1491.95 / 330455.95 / 26052.56
1599
+ - DESIGN §12 与"外币折算"行同步
1600
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1601
+ - fix[python]:16 表的飞机架数按机型去重
1602
+ - 架数是机队存量: 同一机型飞多条航线时, 各航线登记的是同一批飞机, 原实现 `by_plane` 求和
1603
+ 会把 10 架算成 20 架, 日利用率跟着腰斩
1604
+ - 改为按机型取各航线登记值的最大值, 再跨机型相加
1605
+ - A171 增一条国际航线(同机型、架数 10)守住: 行 45 = 10 而不是 20, 日利用率 0.986301
1606
+ - 演示账套补 `飞机架数: 2`(两条航线都登记同一批), 16 表 45 = 2、71 = 4.931507
1607
+ - 民航表清单注明"架数是机队存量, 不按航线相加"
1608
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1609
+ - docs[python]:核实 1124/2204, 并把"编号自定"与"未核实"分开
1610
+ - 收入准则应用指南(维基文库转录,已存档 docs/finance/cas/raw/)三、(十)/(十二) 给出了
1611
+ "合同资产""合同负债"的名称与核算内容, 但**通篇没有 4 位科目编号**
1612
+ - 1124/2204: verified 改为 true(名称与内容已核), 新增 `code_source: 本系统自定`,
1613
+ source 指向指南的条目号 —— 名称可核、编号不可核, 两件事不再混成一个开关
1614
+ - Account 增 `code_source` 字段; `validate` 增 [INFO] "科目编号自定 N 条", 与 [WARN] 未核实分开列
1615
+ - 未核实科目 10 → 8(剩 1612–1616/2703/4003/6702, 那几本应用指南尚未取得)
1616
+ - DESIGN §12 进度同步
1617
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1618
+ - fix[python]:合同资产/合同负债改正为 1462/2205
1619
+ - 原写 1124/2204 是错的: 最终版应用指南里没有 1124, 且 1124 会与预付账款减值准备撞号
1620
+ - 按《企业会计准则应用指南(2021 年版)》: 合同资产 1462(资产类一级科目)、合同负债 2205(负债类)
1621
+ - 三张报表格式的映射同步: balance_2019_a1/a2、balance_2027 的 1124/2204 → 1462/2205
1622
+ - 名称与核算内容仍指向《收入》应用指南 三、(十)/(十二); 备注写明更正缘由与日期
1623
+ - 去掉这两条的 `code_source: 本系统自定`(编号现在有出处)
1624
+ - DESIGN §12 与原始文献节录同步更正
1625
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 178 项全绿
1626
+ - feat[python]:科目身份层 key + aliases
1627
+ - `Account` 增 `key`(稳定身份, 默认取首个编码)与 `aliases`(该科目在其它时期的编码)
1628
+ - `resolve_key(accounts, code, day)`: 对外编码 → 身份, 同一时期一个编码指向两个科目直接报错
1629
+ - `code_for(accounts, key, day)`: 身份 → 当期编码; 主编码在别名段**退役**——
1630
+ 1001 库存现金 2027 起改叫 cash, 之后再用 1001 是查不到, 不是"还认"
1631
+ - `Book.key_of()/code_of()` 两个便捷入口; 加载时做别名撞车校验
1632
+ - 新增 A178: 1001→cash 换号前后解析到同一身份、出表取当期编码、旧号退役、撞号报错
1633
+ - DESIGN §9: "科目名称作唯一事实标准"改为"科目身份层", 写明第一步已落地与剩余范围
1634
+ - 业务取数暂不改(仍走 code), 这一步先把两套编号的转换与校验建立起来
1635
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 179 项全绿
1636
+ - feat[python]:报表映射改按科目身份 key 取数
1637
+ - 三张资产负债表格式的 `accounts` 由编码改为 key: 合同资产 → contract_asset、合同负债 →
1638
+ contract_liability; 其余科目 key 默认等于编码, 数据不用动
1639
+ - 报表取数新增 `_resolve_codes()`: 按**账套当期科目表**把 key 换成编码, 认不出的科目
1640
+ (分行业/增设科目)整行跳过 —— 用 `ledger.coa()` 而不是 `book.coa()`, 否则 1993 会工/会商
1641
+ 的行业专用科目会被通用科目表筛掉
1642
+ - 利润表与资产负债表的四处映射消费点(收入行、资产项目、到期重分类两支)全部走这个解析
1643
+ - 效果: 科目换号只加一行别名, 报表格式不用改; 上次 1124→1462 那种事不会再传染到三张表
1644
+ - DESIGN §9 更新进度: 映射已切 key, 剩余规则 yaml 与断言
1645
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 179 项全绿
1646
+ - feat[python]:校验规则里的科目引用在同期科目表存在
1647
+ - 规则 era 里写的是编码(role → 编码), 换号或改名后规则会静默指空, 出账时才炸
1648
+ - 新增 A179: 遍历 data/rules/*.yaml 的每个 era, 按该段起始日核对编码是否在同期科目表里,
1649
+ 缺一个就报出文件名+段号+角色
1650
+ - 负向验证过: 把某段写成 1124(已废编码), 报 "bad.yaml 第1段 expense=1124 在 2007-01-01 的
1651
+ 科目表里不存在"
1652
+ - DESIGN §9 补充: 规则仍写编码, 但换号漏改会当场报错; 规则本身切 key 仍待做
1653
+ - README/DESIGN 自检区间改为 A0–A179(180 项)
1654
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1655
+ - docs[python]:按租赁应用指南核 6 条科目, 只剩 2 条待核
1656
+ - 原文存档 `docs/finance/cas/raw/wikisource_租赁准则应用指南_会计科目.md`(维基文库转录,
1657
+ 含来源 URL 与用途), 节录"三、应设置的相关会计科目和主要账务处理"的六个科目条目
1658
+ - 1612 使用权资产累计折旧、1613 使用权资产减值准备、2703 租赁负债(承租人);
1659
+ 1614 融资租赁资产、1615 应收融资租赁款、1616 应收融资租赁款减值准备(出租人)
1660
+ 六条改为 verified: true, source 指到指南的具体小节
1661
+ - 该指南与收入准则应用指南一样**只列科目名称、没有 4 位编号**, 六条标
1662
+ `code_source: 本系统自定`; validate 的 [INFO] 随之从 2 条变 6 条
1663
+ - 未核实从 8 条降到 2 条: 只剩 4003 其他综合收益、6702 信用减值损失
1664
+ - DESIGN §12 进度同步
1665
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1666
+ - docs[python]:按金融工具应用指南核 6702, 未核实只剩 4003
1667
+ - 原文存档 `docs/finance/cas/raw/wikisource_金融工具准则应用指南_会计科目.md`
1668
+ - 6702 信用减值损失: 指南"四、关于应设置的会计科目"第 23 项原文就是 "6702 信用减值损失",
1669
+ **带编号**, 所以 verified 改 true 且不标 code_source
1670
+ - 该节只有 24 项, 4 位编号零星出现: 1501 债权投资、1502 债权投资减值准备(由持有至到期投资
1671
+ 改名)、1503 其他债权投资、1504 其他权益工具投资、6702
1672
+ - 记下待核: 1503 是改名还是新设、1504 是否新增, 该页在"十一、关于金融工具的减值"处截断,
1673
+ 未动这两条
1674
+ - 未核实 2 → 1(只剩 4003 其他综合收益)
1675
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1676
+ - feat[python]:按 2018 金融工具指南改名 1501–1503 并新增 1504
1677
+ - 1501 持有至到期投资 → 债权投资、1502 持有至到期投资减值准备 → 债权投资减值准备、
1678
+ 1503 可供出售金融资产 → 其他债权投资: 旧名称的生效区间截到 2017-12-31, 2018-01-01 起
1679
+ 用新名称, 同一编号延续(指南 四、第 12–14 项)
1680
+ - 新增 1504 其他权益工具投资(第 15 项; 核算内容按指定为 FVOCI 的非交易性权益工具投资)
1681
+ - 三张格式补行: 债权投资(1501 减 1502)、其他债权投资(1503)、其他权益工具投资(1504)——
1682
+ 原先这些科目的余额只能落进"其他-"兜底行
1683
+ - 1503 的措辞仍存疑(该页在"十一、关于金融工具的减值"截断), 备注里写明: 编号延续、
1684
+ 核算内容按其他债权投资, 未见"改名/新设"的明确表述
1685
+ - 6702 已在上一提交核实; 未核实只剩 4003
1686
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1687
+ - docs[python]:记录其他综合收益的编号冲突, 4003 标为无原文依据
1688
+ - 会计百科(dongkuaiji)把"其他综合收益"定为 4004, 并把 4003 给了"上级拨入资金";
1689
+ 财办会〔2026〕35号 附录用 4501; 本仓现行是 4003 —— 三个编号, 准则正文一个都没给
1690
+ - 原文摘录存档 `docs/finance/cas/raw/dongkuaiji_其他综合收益_编号冲突.md`, 列三个候选与出处
1691
+ - 4003 加 `key: other_comprehensive_income`, source 改为"第三十三条给出定义; 编号无原文依据",
1692
+ 备注写明三处冲突, 暂不改号(改号会牵动报表映射与断言, 且没有哪一个是准则规定)
1693
+ - 未核实仍是 1 条(4003), 这是如实状态: 名称可核、编号不可核
1694
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1695
+ - docs[python]:按 2018 报表格式核对三行口径, 其他综合收益行改按 key
1696
+ - 原文存档 `docs/finance/cas/raw/wikisource_2018报表格式_金融资产行.md`(财会〔2018〕15号,
1697
+ 2018-06-15 发布施行), 节录债权投资/其他债权投资/其他权益工具投资/交易性金融资产的填列说明
1698
+ - 核对结果: 三行的科目口径与本仓一致——债权投资 = 债权投资科目 − 债权投资减值准备,
1699
+ 其他两行按各自科目余额填列
1700
+ - 该格式全文同样没有 4 位科目编号; "其他综合收益"这一**资产负债表行没有官方填列说明**,
1701
+ 只有利润表明细项目要求按该科目明细分析填列
1702
+ - 三张格式的"其他综合收益"行改按 key `other_comprehensive_income` 取数, 编号之争(4003/4004/4501)
1703
+ 不再影响报表
1704
+ - DESIGN §12 同步
1705
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1706
+ - fix[python]:其他综合收益更正为 4004, 科目表全部核实
1707
+ - 按 docs.maoyanqing.com 的科目表(带"规范文件"列): 所有者权益类里**没有 4003**,
1708
+ 其他综合收益是 **4004**, 出处《企业会计准则应用指南汇编 2024》"第三章 长期股权投资"等
1709
+ - 4003 → 4004, verified 改 true, 备注写明原号错误与 2026 征求意见稿拟改 4501
1710
+ - 四张利润表格式(zhunze_2014/2017/2019_a1/a2)与所有者权益变动表(equity.py 的 COMPONENTS)
1711
+ 里的 4003 一律改成 key `other_comprehensive_income`; `_balances()` 改为按 key 解析
1712
+ - 原文节录存档 docs/finance/cas/raw/maoyanqing_科目表_权益与租赁.md, 同时记下租赁类的编号差异:
1713
+ 融资租赁资产是 1461(我们 1614)、未担保余值已并入应收融资租赁款明细(我们仍是 1611 单列)
1714
+ - 未核实科目清零(只剩税率一条 surtax_local_edu_pre2011)
1715
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1716
+ - fix[python]:整理租赁科目块——1611 改使用权资产、删重复的 1614
1717
+ - 科目表里根本没有"使用权资产"一级科目, 只有 1612 累计折旧、1613 减值准备;
1718
+ 而三张格式的"使用权资产"行却映射到 ["1611","1612","1613"] —— 1611 当时是"未担保余值",
1719
+ 相当于把未担保余值并进了使用权资产行
1720
+ - 按《应用指南汇编 2024》租赁一章: 未担保余值已并入"应收融资租赁款"的明细科目。
1721
+ 故 1611 的 2007–2020 段保留"未担保余值", 2021 起改为"使用权资产", 与 1612/1613 成块
1722
+ - 1614 融资租赁资产与 1461 重复(1461 从 2006 附录起就是融资租赁资产), 删除 1614,
1723
+ 并在 1461 备注里写明"曾另立 1614, 已删"
1724
+ - 三张格式的使用权资产行改按 key `right_of_use_asset` 取数, 不再写死 1611
1725
+ - 未核实科目仍为零(只剩税率一条)
1726
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1727
+ - docs[python]:钉死 1611 的旧科目去向, 记下 1615/1616 的结构性判断
1728
+ - 1611 使用权资产(2021 起)的备注写明: 原 1611 未担保余值自 2021-01-01 起不再作为一级科目,
1729
+ 并入 1531 长期应收款下的"应收融资租赁款"明细——避免以后有人以为漏了旧科目
1730
+ - 1615/1616 备注记下判断依据: 2019 租赁应用指南在出租人一节把"应收融资租赁款"与
1731
+ "应收融资租赁款减值准备"独立成条(且该指南没有 4 位编号, 故 code_source), 本仓按一级科目
1732
+ 处理; 等科目表支持明细层级再归到 1531 之下, 现在单列不会重复出数
1733
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 180 项全绿
1734
+ - feat[python]:科目按名称检索, 补 scope/keywords
1735
+ - 定位: 身份是名称, 编码是载体。政策文件只写名称与归类, 报表也只有名称; 重名靠"制度 + 生效区间"消歧
1736
+ - `Account` 增 `scope`(通用/民航/铁路/电信/施工/农业/金融)与 `keywords`(旧名、行业叫法、英文名)
1737
+ - 新增 `find_by_name()` 与 `Book.find()`: 按名称精确匹配 → key/编码/别名/关键字 → 名称子串,
1738
+ 多命中时全部返回, 不替调用方挑一个
1739
+ - 首批标注: 1001 库存现金(现金/cash)、1002 银行存款、1461 融资租赁资产、1462 合同资产、
1740
+ 2205 合同负债、4004 其他综合收益(OCI)、6702 信用减值损失; 5403 在民航与电信各标 scope
1741
+ - 新增 A180: 按"现金""cash""合同资产""OCI"都能检索到; 5403 在民航是"民航基础设施建设基金"、
1742
+ 在电信是"共同费用", 同一个码两个意思, 只能按名称区分
1743
+ - DESIGN §9 把这条原则写清楚(姓名/身份证号 + 户籍的类比)
1744
+ - README/DESIGN 自检区间改为 A0–A180(181 项)
1745
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 181 项全绿
1746
+ - docs[multi]:生成 COA 本体草案(只读, 未接入 loader)
1747
+ - 按"名称是身份、编码是载体"归并 20 套制度: 1575 条科目行 → 441 个名称 → 243 条可立本体
1748
+ - 编号沿用 CAS 四位码; 1993 的三位码科目若找不到四位码对应, 单列到 pending(193 条),
1749
+ 典型是"产成品"→库存商品、"产品销售收入"→主营业务收入、"专项工程支出"→在建工程这类同义名
1750
+ - 结构冲突 4 条(同名称不同类别/方向): 运输成本、内部往来、汇兑损益、未确认融资费用、工程结算
1751
+ 中的四类, 已在条目里打 conflict 标记, 等人工裁决
1752
+ - 产出 `docs/finance/coa_body_draft.yaml` 与 `coa_body_pending.yaml`, 生成器 `scripts/coa_body_draft.py`
1753
+ - 只读产出, 不改 loader、不动现有 20 套科目表; 181 项自检不受影响
1754
+ - 下一步: 人工归并 193 条同义名 → 定本体; 再建"本体→各期编码"映射表并做等价回放
1755
+ - docs[multi]:本体归并的不确定项全部列入 TODO
1756
+ - 新增 `scripts/coa_body_todo.py` → `docs/finance/coa_body_todo.yaml`
1757
+ - 197 条待人工决策: 193 条待定编号(1993 三位码科目) + 4 条结构冲突(同名不同类别/方向)
1758
+ - 其中 170 条给出候选(按类别/方向一致 + 名称相似度排序), 23 条无候选;
1759
+ 候选只作参考, 不做自动合并——"产成品→库存商品"这种要靠人认
1760
+ - 第一轮自动部分已定: 243 条可直接立本体; 不确定的一律 status: todo/conflict, 等第一轮结束后人工裁
1761
+ - 验证: 只读产出, 不影响 181 项自检
1762
+ - feat[multi]:固化 243 条本体, 回放冒烟通过 2026、1993 阻断
1763
+ - Step 1: `docs/finance/coa_body_draft.yaml` 的 243 条提升为 `labs/sta/data/coa/body.yaml`
1764
+ (本体码 + 名称 + 类别 + 方向 + scope + keywords + regimes + map), 暂不接 loader
1765
+ - TODO 清单每条加 `candidate_note` 空字段, 供人工填 合并/拆分/新建/废弃;
1766
+ 23 条无候选的状态改为 `no_cas_equivalent_candidate`
1767
+ - Step 2: 新增 `scripts/coa_body_replay.py`, 用本体回放某套制度并逐条比对:
1768
+ 2026 通用版 176 条 → 投影 176 条, 缺 0 多 0, 通过
1769
+ 1993 工业 60 条 → 投影 50 条, 缺 15 多 5, **BLOCKED**
1770
+ - 1993 的差异集中在异体字: 原表"应收帐款/坏帐准备/预付帐款", 本体归一为"应收账款/坏账准备/预付账款";
1771
+ 另有"产成品""长期投资"等尚未归并 —— 正是要人工裁的部分
1772
+ - 口径按用户要求: 覆盖不全的年份直接抛异常阻断, 不出半张表
1773
+ - 验证: 现有 181 项自检不受影响
1774
+ - feat[multi]:本体映射带上各期名称写法, 回放 7 套通过 13 套阻断
1775
+ - `map` 由"只存编码"改为"存该期实际名称+编码+起始日": 1993 写"应收帐款"、2006 写"应收账款",
1776
+ 同一制度内分段更名(1501 持有至到期投资→债权投资)也能各存一条
1777
+ - 回放改为按该期名称投影; 2001 通用/民航/施工/铁路/电信/农业/2026 七套**逐条 100% 一致**
1778
+ - 13 套 1993 行业表全部阻断: 缺 7–48 条不等, 金融三套(银行/非银/外企)缺得最多,
1779
+ 缺的都是待归并科目(产成品、长期投资、委托资产、贴现、买入返售…)
1780
+ - 帐/账 异体字问题解决: 1993 工业从"缺 15 多 5"变成"缺 10 多 0", 剩下的都是真待归并
1781
+ - `scripts/coa_body_draft.py` 同步: 草案 map 也带名称与起始日
1782
+ - 验证: 现有 181 项自检不受影响
1783
+ - feat[python]:本体投影层落地, 覆盖 2001 起、1993 显式拒绝
1784
+ - 新增 `labs/sta/coa_body.py`: `load_body()` + `project(regime, since)`, 本体路径的正式入口
1785
+ (`scripts/coa_body_replay.py` 改为调用它, 不再自己解析 YAML)
1786
+ - 划定覆盖范围 `SUPPORTED_FROM = 2001-01-01`: 企业会计制度 2001、民航/施工/铁路/电信/农业
1787
+ 四套行业办法、CAS 2006+ 共 7 套; 早于此日一律抛 `UnsupportedForBody`, 不拿 2001 口径顶 1993
1788
+ - 1993 的 13 套行业表走原 COA 路径, 本体这条路暂不覆盖——那批要纸质材料佐证, 官方不提供早期文本
1789
+ - 新增 A181: 7 套制度逐条还原(投影集合 = 原科目表), 且 1993 投影必须被拒绝
1790
+ - DESIGN 补上"COA 本体与投影"一节; 自检区间改为 A0–A181(182 项)
1791
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1792
+ - docs[multi]:本体 YAML 按四位码排序, 顺带合并分段更名
1793
+ - body.yaml / coa_body_draft.yaml 按 code 升序(1001 → 6901), 不再按名称乱序
1794
+ - pending 按 类别 → 名称 排; todo 按 类别 → 名称 排
1795
+ - 顺带合并"同码且落在同一制度"的分段更名条目(1501 持有至到期投资→债权投资 等),
1796
+ 本体 243 → 232 条, 结构冲突 4 → 3 条
1797
+ - 同码不同义(如 1132 在电信是营业款结算、在 CAS 是应收利息)不合并, 已列入 TODO 的
1798
+ duplicate_body_code, 共 25 组, 等人工裁决
1799
+ - 回放仍全绿: 7 套制度逐条一致
1800
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1801
+ - docs[multi]:本体改为"大类 → 编码"两层 map, 1001 只留一条
1802
+ - 结构: 第一层是大类(1 资产 98 条 / 2 负债 53 / 3 共同 8 / 4 所有者权益 8 / 5 成本 14 /
1803
+ 6 损益 36), 第二层是四位码 → 科目。**用 map 不用 list, 同一大类下编码结构上不可能重复**
1804
+ - 1001 合并为一条: 标准名"库存现金", "现金"进 keywords, map 里保留各期编码与写法
1805
+ (1993 是 101/现金, 2006 起是 1001/库存现金)
1806
+ - 同码条目合并后 232 → 217 条; `load_body()` 负责把两层结构展平成 [{code, ...}]
1807
+ - 投影回放不变: 2026 通用版 176 条逐条一致
1808
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1809
+ - docs[multi]:本体只留一个文件, 生成器直接产出两层 map
1810
+ - 之前有两份: `docs/finance/coa_body_draft.yaml`(扁平) 与 `labs/sta/data/coa/body.yaml`(两层),
1811
+ 容易看错文件; 现在删掉草案, 生成器直接写 body.yaml, 只有一处权威
1812
+ - `scripts/coa_body_draft.py` 输出: 大类 → 编码 两层 map; 撞码按"最新一段的写法"定 name,
1813
+ 其余名称进 keywords, map 按制度合并 — 1001 只剩一条(库存现金, 关键词"现金",
1814
+ map 里 2001/2003/2004/2005 叫现金、2007 起叫库存现金、1993 是 101)
1815
+ - `scripts/coa_body_todo.py` 改读新结构; TODO 193 条(仅剩待归并, 结构冲突与撞码已清零)
1816
+ - 七套制度回放逐条一致: 2001(85) / 民航(91) / 施工(92) / 铁路(93) / 电信(90) / 农业(102) / 2026(176)
1817
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1818
+ - docs[multi]:本体第一层改为数字大类节点, 每类带"其他"兜底
1819
+ - 第一层键从 "资产/负债…" 改为数字 1–6: 大类本身也是科目节点(is_group: true), 可以挂余额
1820
+ - 每个大类下固定一个 "其他"(is_default: true) 作为兜底: 归不进具体科目的退到这里,
1821
+ 报表归类不会因为找不到科目而丢金额; 大类节点上标 `fallback: 其他` 说明退路在哪
1822
+ - load_body() 只取带 map 的子节点, 大类节点与其元数据不参与投影
1823
+ - 生成器与 TODO 生成器同步适配; 七套制度回放仍逐条一致(85/91/176…)
1824
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1825
+ - fix[multi]:本体补回损益类别 pl_class
1826
+ - 之前生成本体时只留了 name/category/direction/scope/keywords/map, 把源表的 `pl_class`
1827
+ (损益类别: 经营/投资/筹资/所得税) 丢了 —— 6 大类 36 条损益科目全部为空
1828
+ - 生成器现在带上 pl_class, 撞码合并时保留非空值; 现有 45 条叶子有类别
1829
+ (经营 37 / 投资 4 / 所得税 2 / 筹资 2)
1830
+ - 头部说明同步; 回放 2026 通用版仍 176 条逐条一致
1831
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1832
+ - feat[multi]:本体补二级类别 sub_category
1833
+ - 一级大类下的**二级类别**: 流动资产/非流动资产、流动负债/非流动负债、共同类、所有者权益、
1834
+ 成本、损益; 报表的流动/非流动归类靠它, 也是"这个科目到底算什么"的指引
1835
+ - 按编码段落推: 资产 1xxx 中 1505 以前为流动(持有待售 1481/1482 归流动), 1505 起非流动;
1836
+ 负债 2xxx 中 2505 以前流动, 2505 起非流动; 其余大类本身就是类别
1837
+ - 分布: 流动资产 60 / 非流动资产 38 / 流动负债 43 / 非流动负债 10 / 共同 8 / 权益 8 /
1838
+ 成本 14 / 损益 36, 合计 217
1839
+ - 推不准的(持有待售是否算流动、租赁负债是否全非流动)在脚本 docstring 里留了口子, 由人改
1840
+ - 回放 2026 通用版仍 176 条逐条一致; 182 项自检全绿
1841
+ - docs[multi]:整理会计科目层级全景表(六类/双表映射/税会差异)
1842
+ - 新增 `docs/finance/coa_科目层级全景表.md`: 六张大表(资产/负债/共同/所有者权益/成本/损益),
1843
+ 统一成"二级类别 → 三级类别 → 一级科目 → 明细科目 → 报表列示 → 准则/税会易错点"
1844
+ - 开头补七级结构说明与读法: 纵向六层落地, 横向三轨并行(会计账轨/报表轨/税会差异轨)
1845
+ - 内容按原文整理, 未增删科目; 表格改为标准 markdown(GitHub/most 渲染器可直接看)
1846
+ - 共 129 行表体, 覆盖 108 个一级科目条目
1847
+ - feat[multi]:按层级全景表给科目定二级/三级类别
1848
+ - 新增 `labs/sta/data/coa/sub_categories.yaml`: 科目名称 → [二级类别, 三级类别],
1849
+ 依据 docs/finance/coa_科目层级全景表.md, 共 96 条映射
1850
+ - 生成本体时套用: 85 条叶子同时有二级与三级类别(如 库存现金 → 流动资产/货币资金类,
1851
+ 债权投资 → 非流动资产/债权投资类, 应付职工薪酬 → 流动负债/应付职工薪酬类)
1852
+ - 文档未覆盖的 132 条(主要是 1993 行业科目与金融类科目)保留按编码推导的二级类别,
1853
+ 三级留空 —— 等文档补齐后再填, 不猜
1854
+ - 头部说明与字段同步; 回放 2026 通用版仍 176 条一致; 182 项自检全绿
1855
+ - fix[multi]:二级类别按编码方案表的分类口径对齐
1856
+ - 该表的编码不用(1101 库存现金 vs 我们 1001), 只看它给科目定的**二级类别**
1857
+ - 与本体重名的 83 个科目里, 82 个二级类别本来就一致; 另有 7 个按它改:
1858
+ 衍生工具→衍生工具类、套期工具→套期工具类、被套期项目→被套期项目类、
1859
+ 清算资金往来/货币兑换→清算结算类(共同类下不再统一叫"共同类"), 营业外收支→
1860
+ 直接计入当期利润的利得和损失
1861
+ - 该表两处不采纳并记在文件头: 库存股(它归留存收益, 实为权益减项)、
1862
+ 递延所得税负债(它归非流动资产, 应为非流动负债)
1863
+ - 验证: PYTHONPATH=. python -m labs.sta.validate 182 项全绿
1864
+ - docs[multi]:抽出 2006 科目表的核算内容与余额含义, 供二级类别判读
1865
+ - docs[multi]:归档 2026 版会计科目和主要账务处理原文(2027-01-01 起上市公司执行)
1866
+ - docs[multi]:换码按施行档位分, 2027 不是全国同日生效
1867
+ - fix[multi]:按名称归并+同码扩码, 七套制度回放逐条一致
1868
+ - docs[multi]:记下换码分档的待办与改法约束
1869
+ - feat[python]:投影加日期闸, 换码按生效日生效, A181 改为按时点比对
1870
+ - feat[python]:投影加档位闸, 非上市 2027 不提前换码
1871
+ - feat[multi]:1462/2205 写 2027/2029/2030 三档别名, 回放按时点比
1872
+ - docs[multi]:三档别名已落地, 文档同步
1873
+ - feat[multi]:TODO 增列缺二级类别的科目, 共 150 条
1874
+ - fix[multi]:生成器加护栏, 有 tier 别名段时拒绝重跑
1875
+ - docs[multi]:换码别名独立成册, 分档施行不再手改 body.yaml
1876
+ - docs[multi]:1993 的 COA 映射明确暂不做
1877
+ - feat[multi]:补齐二级类别, 217 条中 216 条已定, 仅内部往来待判
1878
+ - feat[multi]:二级类别全量补齐, 内部往来单列(双向按余额列示)
1879
+ - docs[multi]:生成器标记冻结, body.yaml 为权威源
1880
+ - feat[multi]:三级类别补齐, 238 条全部有二级与三级
1881
+ - docs[multi]:建立 COA 计划表, 标明完成/进行中/待办/不做
1882
+ - fix[multi]:二级类别改按会计分类, 修正存款误判
1883
+ - fix[multi]:剩余 29 条按科目性质归入会计分类, 不再用流动性口径
1884
+ - fix[multi]:修正代销与长期应付款的二级类别, 复核清单收窄到 3 条
1885
+ - docs[multi]:计划表更新, 二级/三级类别复核已完成
1886
+ - feat[python]:补齐证券保险报表与省级附加费口径, 解冻科目本体生成器
1887
+ - 科目本体: 242 → 259 条(保险 4 + 证券/保险中介 17); 生成器合并 code_aliases 的 tier 段,
1888
+ 新增 NAME_ALIAS 把 25 个改名科目并回同一本体, sub_categories 改由 body 反向导出(A188)
1889
+ - 行业格式: 铁路 2004 披露、电信 2003 会企 01/02 与附表 2–5、保险中介 2004、保险 2023 会保险 01/02/03、
1890
+ 证券 2000/2004 会证 01/02、2018 证券版会金融 01/02/03
1891
+ - 证券报表: 会证 03 两版、资产减值准备、利润分配、分部(业务/地区)、受托投资管理、
1892
+ 所有者权益增减变动、会证股 6 张、会证合 01 呈现层
1893
+ - 税费: 教育费附加 1%/2%/3% 三档(A185); 地方教育附加 2011 年前 22 个地区省级政策
1894
+ (湖北 1.5%、江西 2010-07 起 2%、新疆兵团 1%), A197 钉边界日
1895
+ - 净投资折算差额: 4004 挂项目标签按比例转投资收益, 只转不伪造累计(A200)
1896
+ - 契约: 基表继承改为"取制度起始日有效的科目"(修 1611 同名撞车); 合并折算尾差 ≤0.05 记未分配利润
1897
+ - 文档: 新增 docs/finance/tax/、net_investment_u8.md、证券/保险/电信/铁路各制度原文归档;
1898
+ 计划表、DESIGN 与 source_gaps 同步
1899
+ - 验证: python -m labs.sta.validate → A0–A205 全部通过(206 项)
1900
+ - release version 0.1.9
1901
+
1902
+ ## [0.1.8] - 2026-10-20
1903
+ ### Changed
1904
+ - feat[python]:新增每股收益与股本登记
1905
+ - eps.py: 加权平均股数按天算, 股数变更登记"变更后的累计股数", 不写增量
1906
+ - 基本 EPS = 归母净利润 ÷ 加权股数; 稀释按契约 dilutive_shares, 未给则等于基本
1907
+ - data/report/shares.yaml 默认空: 演示主体都是有限责任公司, 附注直接写"不适用"
1908
+ - 附注新增第十一节; 登记日之前取股数、变更日倒序、重复登记一律拒绝
1909
+ - 新增 A117: 1000→1200 股加权 1100.82、基本 9.08、稀释 8.33; 无登记写不适用
1910
+ - 验证: python scripts/sta_check.py 通过(A0-A117 共 118 项)
1911
+ - release version 0.1.8
1912
+
1913
+ ## [0.1.7] - 2026-10-20
1914
+ ### Changed
1915
+ - feat[python]:账面价值法偏差按折价/溢价分级
1916
+ - 折价超 10%: 发 BookValueDivergence 告警, 差额会抬进合并权益、污染合并价差
1917
+ - 溢价超 20%: 只记诊断, 不发告警, 差额进商誉、合并价差本身干净
1918
+ - worksheet 返回 diagnostics, 把每条边的方向与偏差留成结构化数据
1919
+ - A114 断言: 溢价场景零告警且诊断只有 premium; 折价场景必须报 S1->S2 -33.3%
1920
+ - DESIGN 改成两级阈值表, 并写明购买法已实现、告警建议可执行
1921
+ - 验证: python scripts/sta_check.py 通过(A0-A114 共 115 项)
1922
+ - feat[python]:不再满足条件时退出持有待售
1923
+ - 新增 unclassify: 按"假定从未划分"计量, 重分类回 1601/1602 并冲销 1481
1924
+ - 持有期间未提的折旧一次性补提(折旧费用科目), 已计提减值随分类转回一并冲回
1925
+ - 三张凭证各管一件事, 不轧成一张轧差凭证; 按凭证号幂等, 已转回再转直接拒绝
1926
+ - 新增 A115: 净值等于"假定未划分"的金额, 6701 清零, 重复转回被拒
1927
+ - DESIGN 与模块说明同步, 待办里"不再满足条件转回"一项关闭
1928
+ - 验证: python scripts/sta_check.py 通过(A0-A115 共 116 项)
1929
+ - feat[python]:未实现利润按期末结存比例拆分
1930
+ - eliminations 新增 ledgers 参数: 比例 = min(1, 买方期末存货 ÷ 本期内部购入净额)
1931
+ - 同一买方多笔内部采购按比例分摊; 全部售出时不冲回, 全部结存时全额冲回
1932
+ - 拿不到账套时退回旧口径(全额冲回), 不静默变成零
1933
+ - consolidated_summary / 合并利润表 / 年度比较 / A29 四处调用点补传账套
1934
+ - 新增 A116: 存一半冲 2500、全存冲 5000、全售不冲、无账套退回 5000
1935
+ - 验证: python scripts/sta_check.py 通过(A0-A116 共 117 项)
1936
+ - release version 0.1.7
1937
+
1938
+ ## [0.1.6] - 2026-10-20
1939
+ ### Changed
1940
+ - fix[python]:合并报表不再跨主体抵消应交税费
1941
+ - consolidated 先按主体把应交税费轧差, 借方净额改记 TAX-ASSET 明细, 不与他人对冲
1942
+ - 报表层把该明细单列为「留抵税额」资产项, 应交税费按毛额列负债, 两侧同增
1943
+ - 报表 API 新增 extra_assets, 只用于外部送入的资产列项, 不参与科目映射
1944
+ - A107 收紧: 资产/负债抵销各等于内部往来 5300, 不再含税额轧差
1945
+ - 新增 A113: 上海留抵 1552.32 与北京应交 5892.56 各列一侧, 合并合计 331414.82/27192.56
1946
+ - 验证: python scripts/sta_check.py 通过(A0-A113 共 114 项)
1947
+ - fix[python]:外币中间层投资按折算后金额抵销
1948
+ - worksheet 抵销改用 investment_at: 持有方为外币时, 长期投资按期末汇率折算,
1949
+ 与资产负债表上那笔投资同口径; 此前用记账金额抵销, 资产与权益差一个折算差
1950
+ - translate_balances 增加 rate_day 参数, 供"取得日余额按当期汇率再折一次"使用
1951
+ - 外币多层持股的成分分列仍未放开: 增量口径把取得日净资产的折算差留在合并价差,
1952
+ 注释写明, equity 侧继续显式拒绝
1953
+ - 验证: python scripts/sta_check.py 通过(A0-A113 共 114 项)
1954
+ - feat[python]:成分归属改为按功能货币拆分后折算
1955
+ - 新增 attribute_components: 每个主体先取本币成分, 减取得日成分, 再按成分汇率折一次
1956
+ - 取得日净资产按取得日汇率固化, 其重折差归 OCI, 不再落进合并价差
1957
+ - 折算差额剔除被抵销内部投资自身的折算差, 避免同一笔汇率变动重复计量
1958
+ - worksheet 统一调用该函数, 删掉原"子节点成分差"递归与单币种分支
1959
+ - 单层/同币种自然退化: 折算率为 1、无可剔投资, 三层人民币用例与旧口径逐分相同
1960
+ - 新增 A114: 人民币基线逐分不变; 外币两层合并价差 = 商誉 280; 取得日留存只把汇率变动计入 OCI
1961
+ - 验证: python scripts/sta_check.py 通过(A0-A114 共 115 项)
1962
+ - feat[python]:账面价值法投资偏差告警
1963
+ - 新增 check_book_value: 投资与"持股×取得日净资产"偏离超 10% 时发
1964
+ BookValueDivergence 告警, 不阻塞运行, 打出投资、应享净资产、持股与偏差百分比
1965
+ - 注释补上 OCI 的构成示例: 0.8×(50−35) + 0.56×50 = 12 + 28 = 40
1966
+ - A114 增加两条断言: 一致边只有商誉告警, 折价收购边必须报 -33.3%
1967
+ - DESIGN 写明告警阈值与"合并价差 -98"的拆解
1968
+ - 验证: python scripts/sta_check.py 通过(A0-A114 共 115 项)
1969
+ - release version 0.1.6
1970
+
1971
+ ## [0.1.5] - 2026-10-20
1972
+ ### Changed
1973
+ - feat[python]:新增合并现金流量表附注
1974
+ - notes.consolidated_cashflow_note:折算政策、汇率来源、汇率影响行调节、
1975
+ 内部收付抵消明细与 OCI 边界五项披露
1976
+ - 数字全部取自主表:流量/余额来自 statements.consolidated_cashflow,
1977
+ OCI-FX 余额来自 multi.consolidated,不另算一套口径
1978
+ - 政策随 rate_policy 变化(期间平均 / 交易发生日即期),期间标签与抵消
1979
+ 范围随 period 走
1980
+ - 接口新增 /api/consolidations/<id>/cashflow-note,返回 JSON + markdown
1981
+ - A85 校验:政策与来源披露、五个金额与恒等式、抵消台账逐个列出、
1982
+ OCI 与合并试算一致、换政策/换期间后数字仍与主表一致
1983
+ - 文档验收编号同步到 A0–A85;验证 python scripts/sta_check.py,86 项全绿
1984
+ - feat[python]:新增注销清算的结清检查与剩余财产分配
1985
+ - 新增 liquidation.py:outstanding 逐项列出未处置的非现金资产、未清偿负债、
1986
+ 未结转的损益与成本(按试算平衡取数,旧制度科目码不会漏掉)
1987
+ - distribute_remainder 只在终止日执行:先要求上述事项全为零,再按各权益科目
1988
+ 账面余额逐项冲销、现金按各现金科目转出;借贷必须自然相等,不做轧差
1989
+ - 分配凭证 LIQUIDATE-* 按筹资活动进入现金流量表;重复执行返回 None
1990
+ - 处置资产、清偿债务、清算费用仍是普通票据,系统不假设按账面价值变现,
1991
+ 也不虚设处置损益;被合并主体走承接而不是注销分配
1992
+ - 新增 A86:干净账套分尽后现金与权益归零、四类拒绝路径(资产/成本/终止日前/
1993
+ 被合并)、现金流量表列报为筹资活动、重复分配不重复出表
1994
+ - 文档验收编号同步到 A0–A86;验证 python scripts/sta_check.py,87 项全绿
1995
+ - feat[python]:新增吸收合并的账面价值余额划转
1996
+ - 新增 merger.py:同一控制下把转出方的资产、负债、权益按账面价值逐科目搬到
1997
+ 承接方,转出方归零,承接方等额承接,不确认损益、不产生新的计量基础
1998
+ - 与注销清算严格分开:注销是权益与现金对冲归零,合并是余额原样承继
1999
+ - 前置条件:合并日 = 生命周期终止日、承接方一致且可记账、双方本位币与会计
2000
+ 制度一致、损益与成本已结转、内部往来已结清;任一项不满足直接拒绝
2001
+ - 权益按原科目承接,不在划转里重划注册资本;合并协议另有约定的单独出调整凭证
2002
+ - 转出/转入凭证 TRANSFER-OUT-* / TRANSFER-IN-* 成对生成;幂等,只有一侧入账
2003
+ 视为数据缺陷
2004
+ - 新增 A87:转出方清零、承接方等额、辅助核算保留、凭证无损益科目、重复划转
2005
+ 返回 None,以及承接方不符/内部往来/损益未结转三类拒绝
2006
+ - 文档验收编号同步到 A0–A87;验证 python scripts/sta_check.py,88 项全绿
2007
+ - feat[python]:新增画像/生命周期/词表只读接口
2008
+ - GET /api/entities/<id>/profile:按 as_of 返回当日事实画像、推导出的准则口径、
2009
+ 申报期限与全部版本段
2010
+ - GET /api/entities/<id>/lifecycle:返回状态区间、当日状态、能否记账、终止日与终期
2011
+ - GET /api/taxonomy?kind=&as_of=:分类词表按日过滤,不传 kind 返回四类全量
2012
+ - 三类资源只读,写方法返回 405;日期越界、未知词表种类返回 400;
2013
+ 未知主体或没有画像/生命周期记录返回 404
2014
+ - 与契约解析同源:直接调用 profile / lifecycle / taxonomy,不另写判断
2015
+ - 新增 A88:画像口径与申报期限、活跃主体无终期、1990 年无增值税身份、
2016
+ 2026 年两类齐全、越界与未知种类被拒、POST 被拒
2017
+ - 文档验收编号同步到 A0–A88;验证 python scripts/sta_check.py,89 项全绿
2018
+ - feat[python]:新增持有待售非流动资产的重分类与减值
2019
+ - 科目表补 1481 持有待售资产 / 1482 持有待售资产减值准备,自 CAS 42
2020
+ 施行日 2017-05-28 生效;编号取自财会〔2026〕11 号附录,标 verified: false
2021
+ - held_for_sale.classify:月末分类,先把账面价值从 1601/1602 转入 1481,
2022
+ 再按「账面价值 vs 公允价值 − 出售费用」孰低确认 6701/1482 减值
2023
+ - 分类前必须已计提当月折旧,否则 1602 会被多冲一次,直接拒绝;
2024
+ 决议/协议编号写入凭证来源
2025
+ - 折旧以账上 1481 分录的 sub=资产 id 为标记:分类当月照提,次月起跳过
2026
+ - 2019 a1/a2 与 2027 资产负债表增加「持有待售资产」行(1481 + 1482)
2027
+ - 新增 A89:重分类余额、减值金额、重复分类幂等、当月照提/次月停提、
2028
+ 可收回净额高于账面不确认减值、非月末与未计提折旧被拒、1481 生效日、
2029
+ 报表单列净额
2030
+ - 范围只做单项非流动资产;含负债的处置组、减值转回、转回固定资产、
2031
+ 处置损益尚未接入
2032
+ - 文档验收编号同步到 A0–A89;验证 python scripts/sta_check.py,90 项全绿
2033
+ - feat[python]:导出接报告期间
2034
+ - export_entity / export_all 增加 period:资产负债表日取区间结束日,
2035
+ 利润表、现金流量表、增值税申报表都按该区间取数
2036
+ - 未给 period 时保持按月/按年行为;多年度比较只取报告日及以前的年份
2037
+ - 申报表走 filing.span,季度导出标题显示 2026-04-01~2026-06-30
2038
+ - CLI 增加 --period / --as-of / --out,可直接导出季度或自定义区间
2039
+ - 新增 A90:季度利润表/现金流/申报与内存报表逐字一致、资产负债表日、
2040
+ 期间标注、未给 period 的月度行为、自定义区间标题
2041
+ - 文档验收编号同步到 A0–A90;验证 python scripts/sta_check.py,91 项全绿
2042
+ - feat[python]:新增集团股权图与归母/少数股东分配
2043
+ - 新增 ownership.py / data/ownership.yaml:持股比例、表决权、生效区间、取得方式
2044
+ 全部配置化,不预设全资或同一控制;支持虚拟节点与实体母公司两种根节点
2045
+ - 有效持股按路径相乘、多路径相加;同一对 parent/child 区间重叠与环状持股直接拒绝
2046
+ - 购买法边必须给出对价、可辨认净资产公允价值与 NCI 计量基础,缺一项加载即失败
2047
+ - consolidation.allocate:全额并表后按有效持股拆损益与权益;
2048
+ 合并权益 = Σ成员权益 − Σ母公司对合并范围内子公司的长期股权投资,
2049
+ 少数股东权益 = Σ(成员权益 × 少数股东比例),归母权益为差额
2050
+ - 虚拟根与实体母公司走同一公式:80% 造数下两侧归母/少数股东结果逐分一致
2051
+ - 购买法在计算层显式拒绝,商誉与 PPA 调整留待下一阶段,不静默按账面价值
2052
+ - 新增 A91:有效持股、虚拟/实体根一致性、投资扣除、购买法缺 PPA、环状持股、
2053
+ 缺席成员
2054
+ - 合并报表上的归母/少数股东行尚未接入;计算层已给出 parent/nci 四项
2055
+ - 文档验收编号同步到 A0–A91;验证 python scripts/sta_check.py,92 项全绿
2056
+ - feat[python]:合并报表增加归母与少数股东行
2057
+ - consolidated_balance_sheet 增加 spec/ownership/currency:按股权图追加
2058
+ 「归属于母公司所有者权益合计」「少数股东权益」,并校验两者之和 = 权益合计
2059
+ - consolidated_income_statement 追加归母净利润与少数股东损益(本期/本年累计),
2060
+ 以合并净利润减去少数股东损益倒推归母,内部抵销差额归母承担
2061
+ - allocate 支持 currency 覆盖与本期/累计两栏,列报币种与报表一致
2062
+ - API 合并资产负债表/利润表传入 spec,接口输出同步带上归母/少数股东
2063
+ - 实体母公司的投资与子公司权益抵销工作底稿尚未接入,报表层显式拒绝,
2064
+ 不出不平的表;虚拟根(当前部署)可直接出表
2065
+ - 新增 A92:80% 造数下归母 1920 / 少数股东 480、归母净利润 320 / 少数股东 80、
2066
+ 两者与合计勾稽、未给 spec 时不出现新行、实体母公司被拒
2067
+ - 文档验收编号同步到 A0–A92;验证 python scripts/sta_check.py,93 项全绿
2068
+ - feat[python]:实体母公司合并接入投资抵销
2069
+ - consolidation.equity_breakdown:按科目拆归母/少数股东权益
2070
+ 虚拟根取成员权益 × 有效持股;实体母公司保留自身权益科目、子公司权益整体抵销、
2071
+ 少数股东只留 NCI 份额
2072
+ - 合并资产负债表从资产侧剔除长期股权投资,按拆分结果重建所有者权益段,
2073
+ 并校验 归母 + 少数股东 = 资产 − 负债
2074
+ - 利润表归母/少数股东行保持与资产负债表同源
2075
+ - 扁平股权(子公司之间不再互相持股)已跑通;多层持股与商誉/负商誉显式拒绝
2076
+ - A92 扩展:实体母公司资产 2400(已剔除 1511 投资)、归母 1920、少数股东 480,
2077
+ 与虚拟根逐项一致;权益段按母公司自身科目列示
2078
+ - 文档验收编号保持 A0–A92;验证 python scripts/sta_check.py,93 项全绿
2079
+ - feat[python]:合并权益改用多层工作底稿
2080
+ - consolidation.worksheet:自下而上逐层抵销
2081
+ 调整后权益 = 自身权益 + Σ(持股 × 子公司调整后权益 − 投资)
2082
+ 少数股东 = Σ[(1−持股) × 子公司调整后权益 + 子公司下层的少数股东]
2083
+ - allocate 的权益合计改用工作底稿;利润仍按有效持股分配
2084
+ - 合并资产负债表按工作底稿列示:扁平股权保留逐科目,多层持股列归母合计与少数股东
2085
+ - 长期股权投资按全部层级汇总从资产侧剔除;校验 归母 + 少数股东 = 资产 − 负债
2086
+ - A92 增加 A→B 80%、B→C 70% 用例:资产 150、归母 100、少数股东 20+30=50
2087
+ - 购买法商誉、负商誉与年内股权变动仍显式拒绝
2088
+ - 验证 python scripts/sta_check.py,93 项全绿
2089
+ - feat[python]:购买法合并接入商誉与两种 NCI 基础
2090
+ - ownership.Edge 增加 nci_fair_value;完整商誉缺该值加载即失败
2091
+ - worksheet 支持 method=acquisition:
2092
+ 母公司商誉 = 对价 − 持股 × 购买日可辨认净资产
2093
+ 按份额 NCI = 少数股东比例 × 调整后权益
2094
+ 完整商誉 NCI = NCI 公允价值 + 少数股东比例 × 购买后权益变动
2095
+ - 合并资产负债表把商誉计入 1711;资产 = 子公司净资产 + 商誉,权益仍平衡
2096
+ - 负商誉、期中取得、非实体母公司购买法均显式拒绝,不静默按账面价值
2097
+ - A93 验证:按份额商誉 20/少数股东 20;完整商誉 30/少数股东 30;
2098
+ 资产分别为 120/130 且平衡;负商誉、期中取得、缺 nci_fair_value 被拒
2099
+ - 文档验收编号同步到 A0–A93;验证 python scripts/sta_check.py,94 项全绿
2100
+ - feat[python]:期中取得按取得日并入损益
2101
+ - 利润表增加 since:本期与本年累计的起点都可被取得日截断
2102
+ reports.income_statement / profit_by_class / 分类口径同步支持
2103
+ - consolidation.acquisition_since 取成员的购买法并表起点;
2104
+ allocate 与合并利润表按取得日后的损益计算
2105
+ - 合并内部交易只纳入取得日后的单据,取得日前的内部购销不再抵销
2106
+ - 合并资产负债表仍按期末净资产与取得日商誉计量,报表保持平衡
2107
+ - A94 验证:1 月 250、8 月 300,7 月 1 日取得 80%
2108
+ 合并净利润 300、归母 240、少数股东 60;资产 1550、归母 1240、少数股东 310
2109
+ - 负商誉、年内处置与丧失控制权仍显式拒绝
2110
+ - 文档验收编号同步到 A0–A94;验证 python scripts/sta_check.py,95 项全绿
2111
+ - feat[python]:购买法支持负商誉
2112
+ - worksheet 对价低于应享有可辨认净资产份额时不再拒绝
2113
+ 母公司商誉调整取 max(0, 对价 − 持股 × 可辨认净资产)
2114
+ 差额作为负商誉收益,计入取得当期损益,不分配给少数股东
2115
+ - allocate 在取得日落在本期/本年时,把负商誉收益计入合并净利润与归母净利润
2116
+ - 合并利润表增加「其中:负商誉收益」并在净利润中包含
2117
+ - A93 验证:对价 70、应享有 80、持股 80%
2118
+ 资产 130、归母 110、少数股东 20;净利润 10、归母 10、少数股东 0
2119
+ - 完整商誉下的负商誉仍显式拒绝,避免把 NCI 公允价值差额混入损益
2120
+ - 文档验收编号保持 A0–A94;验证 python scripts/sta_check.py,95 项全绿
2121
+ - feat[python]:全处置子公司接入合并范围变动
2122
+ - 所有权边截止日即处置日:处置日前损益并入,处置日后资产负债表出表
2123
+ - 利润表增加 until,本期与本年累计都在处置日截断;内部交易按成员处置日过滤
2124
+ - 全处置要求 disposal_proceeds,且母公司处置分录带 sub='处置:<子公司 id>'
2125
+ 合并层用合并处置损益替换母公司已确认数:
2126
+ 合并处置损益 = 价款 − 应享有处置日净资产 − 商誉
2127
+ - 资产负债表剔除已处置成员,母公司长期股权投资已随处置转出
2128
+ - A95 验证:子公司处置前利润 200、处置价款 1200、投资成本 1000
2129
+ 合并净利润 200、归母 200、少数股东 0;资产 1200、权益 1200
2130
+ 处置价款 1300 时合并净利润 300;缺少处置标记被拒
2131
+ - 当前只支持 100% 全处置;含少数股东权益的处置、保留股权重计量、
2132
+ 外币 OCI 结转仍显式拒绝
2133
+ - 文档验收编号同步到 A0–A95;验证 python scripts/sta_check.py,96 项全绿
2134
+ - feat[python]:全处置支持少数股东权益
2135
+ - 处置成员仍并入处置日前的损益,少数股东按持股比例分配;期末权益不再包含该成员
2136
+ - allocate 增加 profit_participants:已处置成员按处置日持股参与损益分配,
2137
+ 权益工作底稿仍只取期末在范围内的成员
2138
+ - 处置损益按持股比例计算应享有净资产与商誉,不再限定 100%
2139
+ - A95 增加 80% 全处置用例:
2140
+ 子公司处置前利润 200、价款 960、投资 800
2141
+ 合并净利润 200、归母 160、少数股东 40
2142
+ 资产 1160、少数股东权益 0
2143
+ - 保留股权重计量、外币子公司 OCI 结转仍显式拒绝
2144
+ - 验证 python scripts/sta_check.py,96 项全绿
2145
+ - feat[python]:支持保留股权的丧失控制权处置
2146
+ - 所有权边增加 retained_stake / retained_fair_value
2147
+ - 处置后不再控制但保留股权时:
2148
+ 合并处置损益 = 价款 + 剩余股权公允价值 − 应享有处置日净资产 − 商誉
2149
+ 剩余股权按公允价值重计量,差额计入合并权益
2150
+ 母公司处置损益只按已处置部分计算,再用合并口径替换
2151
+ - 合并资产负债表把剩余股权从账面成本调到公允价值,资产与权益同步调整
2152
+ - A96 验证:原持股 100%、处置 60%、保留 40%
2153
+ 子公司处置前利润 200、价款 700、剩余股权公允价值 500
2154
+ 合并净利润 200、归母 200;资产 1200、权益 1200
2155
+ 剩余股权重计量 100;缺公允价值与非 100% 持股的保留股权均拒绝
2156
+ - 当前只支持原持股 100% 的保留股权;非 100% 保留、外币 OCI 结转仍拒绝
2157
+ - 文档验收编号同步到 A0–A96;验证 python scripts/sta_check.py,97 项全绿
2158
+ - feat[python]:保留股权处置支持非全资持股
2159
+ - 取消保留股权处置必须原持股 100% 的限制
2160
+ - 剩余股权按 retained_stake / 原持股比例取账面成本,与 retained_fair_value 比较
2161
+ - 合并处置损益按原持股比例计算应享有净资产与商誉,母公司损益按已处置部分计算
2162
+ - 处置前少数股东损益照常分配,处置后少数股东权益归零
2163
+ - A96 增加 80% 持股、处置 60%、保留 20% 用例:
2164
+ 子公司处置前利润 200、价款 720、剩余股权公允价值 240
2165
+ 合并净利润 200、归母 160、少数股东 40
2166
+ 资产 1160、剩余股权重计量 40
2167
+ - 外币子公司 OCI 结转、商誉减值仍显式拒绝
2168
+ - 验证 python scripts/sta_check.py,97 项全绿
2169
+ - fix[python]:补全投资收益在各期利润表的列报
2170
+ - zhunze_2019 / 2014 / 2017 / 2007 的利润表映射补 6111 投资收益
2171
+ - qiye_kuaiji_2001 补 5201 投资收益
2172
+ - 此前投资收益在利润表中整行缺失,非营业外收支的投资收益会直接漏出净利润
2173
+ - A97 验证:2026 年 6111、2006 年 5201 均进入利润表,
2174
+ 投资收益 100、净利润 100
2175
+ - 文档验收编号同步到 A0–A97;验证 python scripts/sta_check.py,98 项全绿
2176
+ - feat[python]:商誉减值接入合并报表
2177
+ - 所有权边增加 impairment / impairment_date / impairment_evidence
2178
+ - 工作底稿按累计减值同减商誉资产与归母权益,超额减值直接拒绝
2179
+ - 减值日期落在本期/本年时,损失计入合并净利润与归母净利润,并在利润表单列
2180
+ 「其中:商誉减值损失」
2181
+ - A98 验证:对价 120、可辨认净资产 100、商誉 20、减值 5
2182
+ 资产 115、归母权益 115、净利润 -5、减值损失单列 5
2183
+ - 完整商誉减值(nci_basis=fair_value)仍显式拒绝,避免 NCI 分摊错配
2184
+ - 文档验收编号同步到 A0–A98;验证 python scripts/sta_check.py,99 项全绿
2185
+ - feat[python]:新增所有者权益变动表
2186
+ - 新增 equity.py:实收资本、资本公积、其他综合收益、盈余公积、未分配利润、合计
2187
+ 六列;期初、净利润、OCI、投入/减少、提取盈余公积、对所有者的分配、其他、期末
2188
+ - 数字来自账簿权益余额与利润表;期末与权益合计逐分勾稽,未解释的变动单列「其他」
2189
+ - 损益未结转时拒绝出表,不做兜底
2190
+ - 导出增加 equity_statement.md,与内存报表同源;导出文件从 8 个变 9 个
2191
+ - A99 验证:期初 1000 + 净利润 200 − 分配 50 = 期末 1150;未结账被拒
2192
+ - 合并口径的归母/少数股东两列尚未接入
2193
+ - 文档验收编号同步到 A0–A99;验证 python scripts/sta_check.py,100 项全绿
2194
+ - feat[python]:新增合并所有者权益变动表
2195
+ - equity.consolidated_statement:归母按成分、少数股东单列
2196
+ 期初、本期净利润、其他、期末四段,期末与 allocate 的 parent/nci 逐分勾稽
2197
+ - 期初/期末权益取工作底稿,净利润取 allocate 的本期归母/少数股东损益
2198
+ - 扁平股权可逐成分列示;多层持股的逐成分分列尚未接入,显式拒绝
2199
+ - A100 验证 80% 持股:期初归母 1000 / 少数股东 200
2200
+ 净利润 160 / 40,期末 1160 / 240,所有者权益合计 1400
2201
+ - 文档验收编号同步到 A0–A100;验证 python scripts/sta_check.py,101 项全绿
2202
+ - feat[python]:新增现金流量表明细行
2203
+ - 新增 data/report/cashflow_lines.yaml:按对手科目把现金凭证归入标准行
2204
+ 经营(销售/购买/职工/税费/其他)、投资(购建/处置/投资/收益/其他)、
2205
+ 筹资(吸收投资/借款/偿还/分配/其他)
2206
+ - CashFlow 增加 lines,render 在三大类净额前列出明细
2207
+ - 明细行合计与经营/投资/筹资净额逐项勾稽
2208
+ - A101 验证:销售 1130、采购 -565、职工 -100、税费 -65、
2209
+ 购建 -200、借款 300、分配 -50,三类明细合计与净额一致
2210
+ - 当前只做单主体;合并口径的内部收付逐行抵消尚未接入,合并表仍只列三类净额
2211
+ - 文档验收编号同步到 A0–A101;验证 python scripts/sta_check.py,102 项全绿
2212
+ - feat[python]:合并现金流量表明细行逐笔抵消
2213
+ - 单体现金流明细随列报币种折算,合并口径的明细不再停留在原币
2214
+ - 合并明细先按成员汇总,再对每笔内部收付定位付款方/收款方的实际明细行
2215
+ 付款方补回流出、收款方扣掉流入,两侧明细同步抵消
2216
+ - 内部收付抵消后,明细合计仍与经营/投资/筹资三类净额逐项勾稽
2217
+ - A102 验证 CN-GROUP:内部收付不再出现在「收到/支付其他与经营活动有关的现金」,
2218
+ 明细合计 = 三类净额,三类明细分别落回各自净额
2219
+ - 文档验收编号同步到 A0–A102;验证 python scripts/sta_check.py,103 项全绿
2220
+ - feat[python]:境外经营处置结转累计折算差额
2221
+ - translation 新增 translation_reserve, 取处置日累计折算差额的权益口径
2222
+ - 合并利润表按有效持股把该差额从其他综合收益转入合并处置损益, 只转归母份额
2223
+ - 合并工作底稿的权益分项补上子公司折算差额, 分项之和回到归母合计
2224
+ - 合并权益变动表把 OCI-FX 归入其他综合收益列, 不再落进未分配利润
2225
+ - 新增 A103 守护: 全资与 80% 处置、处置前 OCI 列示与权益勾稽
2226
+ - 验证: python scripts/sta_check.py 通过(A0-A103 共 104 项)
2227
+ - feat[python]:新增关联方、或有事项与日后事项附注
2228
+ - 关联方关系从股权图推(母子/同受一方控制), 只列有账簿的实体, 虚拟节点不当母公司
2229
+ - 关联交易取合同主数据 counterparty_entity, 不解析凭证摘要; 未结算余额取内部往来科目
2230
+ - 或有事项契约: 概率三档决定确认或披露, 已确认金额勾稽预计负债余额
2231
+ - 日后事项契约: 事项日限制在(资产负债表日, 批准报出日], 调整事项须已在账上
2232
+ - 三节并入报表附注第八至十节, 与主表同源
2233
+ - 新增 A104-A106 守护, 验证: python scripts/sta_check.py 通过(A0-A106 共 107 项)
2234
+ - feat[python]:新增分部报告附注与只读接口
2235
+ - 以会计主体为经营分部、注册地为地区分部, 对外收入与分部间收入分列
2236
+ - 抵销列 = 分部合计 − 合并数, 收入抵销须等于内部销售不含税额, 资产负债抵销对称
2237
+ - 接口新增 consolidations/<id>/segment-note, 返回表格数据与正文
2238
+ - multi 模块说明改回现状: 内部往来与内部交易已分别在试算层与报表层抵销
2239
+ - 新增 A107 守护; DESIGN 记录跨主体税额轧差的口径差异与待办
2240
+ - 验证: python scripts/sta_check.py 通过(A0-A107 共 108 项)
2241
+ - feat[python]:完整商誉的减值分摊与负商誉
2242
+ - 完整商誉减值按持股比例在归母与少数股东之间分摊, 上限为完整商誉账面价值
2243
+ - 完整商誉下的负商誉按"对价 + NCI 公允价值 − 可辨认净资产"整体口径计量, 全部归归母
2244
+ - 工作底稿权益与损益同步调整, 少数股东权益随之减少, 报表仍平衡
2245
+ - 新增 A108 守护: 减值 10 时归母 -8、少数股东 -2; 负商誉 10 全归归母; 超额减值拒绝
2246
+ - 验证: python scripts/sta_check.py 通过(A0-A108 共 109 项)
2247
+ - chore[python]:压测脚本接入落库与回读
2248
+ - sta_bench 改为 argparse, 新增 --store 与 --path
2249
+ - 落库/回读/增量落库分别计时, 回读张数与写入不符即报错
2250
+ - DESIGN 落地进度补压测一行, 待办去掉已完成的性能压测项
2251
+ - 验证: python scripts/sta_bench.py 20000 --store 全项输出正常
2252
+ - docs[python]:修正过期说明并补齐能力清单
2253
+ - equity/statements/liquidation 的模块说明去掉"尚未接入"的旧表述, 指向现有实现
2254
+ - validate 里 A91 的注释改回它实际守护的规则: 购买法必须有实体母公司账套
2255
+ - README 能力清单补上境外经营处置结转、完整商誉减值、三节附注与分部报告
2256
+ - 验证: python scripts/sta_check.py 通过(A0-A108 共 109 项)
2257
+ - test[python]:附注渲染接线与折算进位容差
2258
+ - A104 断言 notes.render 真的输出关联方/或有事项/日后事项三节, 不只是函数存在
2259
+ - A49 净利润折算改为 1 分钱容差, 与资产合计口径一致(逐行折算后相加 vs 合计÷汇率)
2260
+ - 验证: python scripts/sta_check.py 通过(A0-A108 共 109 项)
2261
+ - feat[python]:合并口径导出四个报表与两节附注
2262
+ - export 新增 export_consolidation, 按合并口径落盘资产负债表/利润表/现金流量表/
2263
+ 权益变动表/现金流附注/分部附注; CLI 逐口径导出, 成员缺席打印原因后跳过
2264
+ - 修正 consolidated 未按 day 取余额的问题: 全本币合并一直用"当前"余额,
2265
+ 季末/期中合并报表的资产与权益对不上, 现按给定日期取试算
2266
+ - 新增 A109 守护: 文件清单、报表内容、2026Q3 期间导出、成员缺席拒绝
2267
+ - 验证: python scripts/sta_check.py 通过(A0-A109 共 110 项)
2268
+ - feat[python]:多层持股的权益变动表按成分分列
2269
+ - 归母权益成分 = 母公司自身 + 子公司取得日之后增量 × 有效持股, 逐层递归累加
2270
+ - 取得日的成分直接从子公司账簿取, 不新增"可辨认净资产成分"契约
2271
+ - 负商誉按取得日应享有份额与对价之差计入未分配利润
2272
+ - 投资与应享有取得日净资产不等时单列"合并价差", 不平掉也不藏进未分配利润
2273
+ - 外币主体参与的多层持股仍显式拒绝: 增量里混着折算差额, 会把 OCI 记进未分配利润
2274
+ - 新增 A110: 三层持股 0.8×0.7, 归母 1056/少数 544 与合并报表勾稽; 合并价差场景 -100
2275
+ - 验证: python scripts/sta_check.py 通过(A0-A110 共 111 项)
2276
+ - feat[python]:持有待售的减值转回与出售
2277
+ - 新增 holding: 按 sub 取 1481 原值与 1482 已计提减值, 不另存分类日快照
2278
+ - 新增 revalue: 公允价值回升转回减值, 上限为已计提额, 按凭证号幂等
2279
+ - 新增 sell: 冲平 1481/1482, 价款与净额差额进资产处置收益, 2007 前退回营业外收支
2280
+ - 已售出资产再出售直接拒绝, 同一天重放不重复入账
2281
+ - 新增 A111: 部分转回、转回上限、平价与亏损出售、幂等与拒绝
2282
+ - 验证: python scripts/sta_check.py 通过(A0-A111 共 112 项)
2283
+ - docs[python]:更正外币多层持股的拒绝理由
2284
+ - 原文说"会把 OCI 记进未分配利润"不准确: 增量按两端各自期末汇率折算,
2285
+ 取得日余额的折算差额既不在增量里也不在 OCI 里, 会整体落进合并价差
2286
+ - equity 注释与 DESIGN 同步改为该口径, 并写明接入前需先定的规则
2287
+ - 验证: python scripts/sta_check.py 通过(A0-A111 共 112 项)
2288
+ - feat[python]:含负债的处置组按辅助核算归集
2289
+ - 科目表补 2245 持有待售负债(财会〔2026〕11号 附录 122 项, 2017-05-28 起)
2290
+ - 三套资产负债表映射补「持有待售负债」行, 与 1481/1482 并列流动项目
2291
+ - 处置组归属用 aux=('处置组:<id>',) 标记, sub 留给资产卡片号, 停折旧不受影响
2292
+ - group_balances 按标记归集资产与负债, 现金/损益/权益入组直接拒绝
2293
+ - classify_group: 资产转 1481、负债转 2245, 按整体净资产孰低计提组级减值
2294
+ - sell_group: 价款 + 承接负债 + 已提减值 − 组内资产 = 处置损益
2295
+ - 新增 A112: 组外存货不受影响, 报表分列, 减值与出售, 拒绝规则
2296
+ - 验证: python scripts/sta_check.py 通过(A0-A112 共 113 项)
2297
+ - release version 0.1.5
2298
+
2299
+ ## [0.1.4] - 2026-10-19
2300
+ ### Changed
2301
+ - feat[python]:新增 labs/sta 全栈财务系统与 40 项契约自检
2302
+ - 契约层按日期解析制度/科目/税率/地方政策/票种/报表格式, 代码不写年份分支
2303
+ - 票据驱动: 导入管线、五类业务分录、四流勾对、稽查断言、哈希链操作日志
2304
+ - 账务: 期间锁、月末结转、年结、制度切换重分类、红冲、反结账重放
2305
+ - 核算: 附加税费、增值税申报表栏次、固定资产折旧与处置、印花税、所得税、外币折算
2306
+ - 报告: 资产负债表、利润表、现金流量表、附注、多年度比较、多主体合并与内部抵消
2307
+ - 持久化: SQLite 存票据/凭证/期间/外币头寸; 期初余额导入
2308
+ - 验收: python -m labs.sta.validate 的 A0-A39 全部通过
2309
+ - docs[multi]:README 目录布局补 labs 与 STA 项目说明
2310
+ - README 目录树加入 labs/ 与 labs/sta
2311
+ - 说明实验室收纳完整可运行项目, 与 panshi 契约层分离
2312
+ - feat[python]:新增 STA HTTP 接口层与 A40 接口自检
2313
+ - api.py: stdlib HTTP, 读接口覆盖资产负债表/利润表/试算平衡/增值税申报/现金流量表, 数字直接取自 reports/filing/cashflow, 不另设口径
2314
+ - 写接口 POST /api/entities/<id>/documents 走同一导入管线, 期间锁/查重/权限/主体一致性逐层拦截; 票据与凭证经 store.save_import 一次提交
2315
+ - 单页控制台只调接口, 不内嵌数据
2316
+ - documents.document_from 抽出供 YAML 与 JSON 共用; importer.remember 登记历史票据; 权限矩阵补 import 动作
2317
+ - 自检 A40: 接口报表与内存报表逐项一致, 401/404/409/422 各路径生效
2318
+ - 验证: python -m labs.sta.validate A0-A40 全绿
2319
+ - feat[python]:STA 增加递延所得税与 A41 自检
2320
+ - deferred.py: 资产负债表债务法, 暂时性差异 = 固定资产账面价值 - 计税基础, 按 25% 确认递延所得税资产
2321
+ - assets: 卡片增加 tax_years(税法最低年限) 与 tax_accumulated; 会计 5 年 / 税法 10 年形成可抵扣差异并逐年转回
2322
+ - 科目表补 1811 递延所得税资产、2901 递延所得税负债; 2006 年无此科目, 依科目表存在性判断而非年份分支
2323
+ - period: 年末结转前补提或冲回; 所得税累计预提剔除递延凭证
2324
+ - 附注增加第六节; A38 拆分当期与递延; A24 白名单补 DEFTAX-
2325
+ - 自检 A41: 2006 不适用, 2026 差异与科目余额、报表一致
2326
+ - 验证: python -m labs.sta.validate A0-A41 全绿
2327
+ - feat[python]:STA 增加 token 鉴权与账套级权限
2328
+ - auth.py: Bearer token, 用户表只存 sha256; 角色与可访问主体取自用户表, 不再信任请求头自称的身份
2329
+ - api.py: 读写接口统一校验主体范围, 主体列表按范围过滤; 未配置用户表时退回本机无鉴权模式并提示
2330
+ - 命令行建用户: python -m labs.sta.auth --user ... --role ... --entities ...
2331
+ - 用户表 labs/sta/data/auth/users.yaml 加入 .gitignore, 明文 token 不落库
2332
+ - 自检 A42: 无 token 或伪造 token 401, 跨主体 403, 审核角色越权 403, 列表按范围过滤, 用户表仅存哈希
2333
+ - 验证: python -m labs.sta.validate A0-A42 全绿
2334
+ - feat[python]:STA 持久化增加 WAL 与版本号乐观锁
2335
+ - store: 开启 WAL 与 busy_timeout, 新增 ledger_state 版本表; 写账套前校验版本, 过期抛 StoreConflict
2336
+ - ledger: 增加 version 字段, 由 Store 维护, 不参与 digest
2337
+ - api: 录票前预检版本, 落库冲突返回 409 并以库为准丢弃内存改动, 避免内存与库分叉
2338
+ - store 演示入口清理 -wal/-shm 残留
2339
+ - 自检 A43: 两连接各持旧版本, 后写者被拒且不落库, 版本号递增, WAL 生效
2340
+ - 验证: python -m labs.sta.validate A0-A43 全绿
2341
+ - feat[python]:STA 账簿增加记账本位币维, 支持多币种票据
2342
+ - fx: 汇率表改为多币种(USD/HKD), 以 CNY 为报价基准, 任意两币种按 CNY 套算; rate/convert 显式带币种
2343
+ - Entity 增加 currency(默认 CNY), 库表随之迁移; 建账时写入 Ledger.currency
2344
+ - importer: 原币与本位币不同才折算, 外币头寸按原币登记; 本位币业务不产生头寸
2345
+ - revalue/close_all: 按账套本位币重估; close_all 新增 until, 可把期间推进到指定年份
2346
+ - multi: 发现不同本位币的合并直接报错, 不静默相加(报表折算列入待办)
2347
+ - 自检 A44: USD 本位币实体收 CNY 10000 与 HKD 50000, 验证折算、头寸、期末重估与报表平衡
2348
+ - 验证: python -m labs.sta.validate A0-A44 全绿
2349
+ - feat[python]:STA 增加合并报表折算与 A45 自检
2350
+ - translation.py: 资产/负债按期末汇率、实收资本按历史汇率、损益按期间平均汇率折成列报币种
2351
+ - 折算差额列「外币报表折算差额」(其他综合收益), 只在合并工作底稿列示, 不回写账簿
2352
+ - multi.consolidated: 混币主体先折算再相加; 内部往来因汇率产生的差额转入折算储备, 同币种仍严格轧平
2353
+ - multi.consolidated_summary: 收入/成本/利润按平均汇率、存货按期末汇率, 输出 translation_reserve
2354
+ - 自检 A45: USD 子公司折 CNY, 资本用历史汇率 6.9、差额 10200, 合并试算归零, 汇总折算储备一致
2355
+ - 验证: python -m labs.sta.validate A0-A45 全绿
2356
+ - fix[python]:STA 控制台补 token 输入, 适配鉴权模式
2357
+ - 页面顶部增加 token 输入, 存 localStorage, 所有请求带 Authorization 头
2358
+ - 401 时提示输入 token 而不是静默失败; 初始化失败落到错误区
2359
+ - README 补充启用鉴权后的使用说明
2360
+ - 验证: python -m labs.sta.validate A0-A45 全绿; 页面返回并含 token 逻辑
2361
+ - docs[python]:更新 STA 定位为溯源式记账引擎
2362
+ - 标题与概述改为 Source-Traceable Accounting / 溯源式记账引擎, 无源不入账, 入账必可溯
2363
+ - 补充溯源链: Document.id -> Voucher.doc_id -> Line.account -> Report.Row
2364
+ - labs 索引与根 README 目录说明同步新定位
2365
+ - 修正 README 中验收清单范围的陈旧引用(A0-A12 -> A0-A45)
2366
+ - docs[python]:补充 STA 的自适应原则: 历史凭证与报表用当时制度
2367
+ - DESIGN 新增「双约束: 溯源 + 自适应」: 溯源管来源, 自适应管版本
2368
+ - 明确自适应是会计事实的还原要求, 不是兼容多版本的技术开关
2369
+ - 落法: 凭证日期决定制度/科目/税率/票种/报表格式; 无"当前版本"入口与最新版兜底; 废止封口不删除
2370
+ - README 同步一句原则说明
2371
+ - docs[python]:细化自适应的定义: 当时当地的财税法规与官方指导意见
2372
+ - 自适应从"按当时制度"扩为"当时当地": 会计制度、科目、报表格式、税种税率、地方优惠、票种、征管口径
2373
+ - 时间维度由凭证日期决定, 地域维度由主体属地决定, 两者都命中才取规则
2374
+ - 补两条硬约束: 无"按最新/按全国"兜底; 地方仅在 delegated 税目内调整
2375
+ - README 与根目录说明同步
2376
+ - docs[python]:把「自适应」统一为「时点适用」, 贴合会计与审计语汇
2377
+ - README 第二条原则改写: 适用业务发生时点与主体所属地的有效制度, 不以现行准则重述历史
2378
+ - 能力条目 制度自适应 -> 制度时点适用; 目录注释 按日期解析 -> 按时点解析
2379
+ - DESIGN 双约束改名, 正文与核心命题统一为"业务发生时点", 去掉"套用/自适应"的技术感
2380
+ - 代码 docstring 与接口页标题同步: asof/contracts/reports/rules/__init__/api
2381
+ - 验证: python -m labs.sta.validate A0-A45 全绿; 页面无"自适应"残留
2382
+ - fix[python]:STA 修复主体隔离缺口, 资产/合同/付款/票据归属不再跨账套
2383
+ - 固定资产卡片加 org, 折旧按主体计提; 附注只列本主体卡片
2384
+ - 合同与付款加 org, 印花税、四流一致、合同闸门均按主体取数
2385
+ - 票据 entity 改为必填, 导入时校验票据主体与账套一致
2386
+ - comparison 演示不再把两主体票据混进一本账, 也不再硬编码 310000
2387
+ - A20 增加反向断言: 北京合同的印花税不得计到上海主体
2388
+ - 验证: python -m labs.sta.validate A0-A45 全绿
2389
+ - feat[python]:STA 增加注册地/本币与合并列报币种
2390
+ - jurisdiction.py + data/jurisdictions.yaml: 本币按财税口径取注册地法定货币(CNY/HKD/GHS/USD), 记账本位币必须一致
2391
+ - Entity 增加 jurisdiction 与 functional_currency, 库表迁移补列
2392
+ - 合同/付款/票据必带币种; 新增 fx_rate 录入汇率, 折算时优先于汇率表; 印花税按合同币种折算
2393
+ - consolidation.py + data/consolidations.yaml: 列报币种与第二币种属于合并口径, 不挂在会计主体上; 加纳虚拟汇总配置 GHS + CNY
2394
+ - 合同与发票币种不一致由四流一致检出
2395
+ - 自检 A46/A47: 注册地与本币约束、录入汇率生效、双币合并各自归零
2396
+ - 验证: python -m labs.sta.validate A0-A47 全绿
2397
+ - feat[python]:STA 会计主体支持双币口径, 法定货币记账 + 管理货币报表
2398
+ - Entity 改为 jurisdiction(决定法定货币) + management_currency(内部报表), 去掉 functional_currency
2399
+ - 账簿本位币恒为注册地法定货币(财税合规); 管理货币只用于内部报表, 不写回账簿
2400
+ - 新增 management.py: 余额表与损益的只读折算, 折算差额单列
2401
+ - store/api 同步字段, 旧库迁移补 management_currency 列
2402
+ - A46 调整: 法定货币随注册地, 管理货币可另约但必须在汇率表/注册地表内
2403
+ - A48: 账簿余额不被改写, 管理口径余额表归零, 指定回法定货币可还原
2404
+ - 验证: python -m labs.sta.validate A0-A48 全绿
2405
+ - feat[python]:STA 管理币种三张报表, 纯展示层折算
2406
+ - reports: balance_sheet 支持只读余额视图与折算差额行; income_statement 支持展示汇率
2407
+ - management: 资产负债表/利润表/现金流量表按管理货币输出, 资产按期末、损益按平均、现金按各自时点
2408
+ - 折算只发生在渲染阶段, 不生成凭证、不改账簿
2409
+ - A49: 管理口径资产 = 法定口径 / 期末汇率, 报表平衡, 账簿凭证与摘要不变
2410
+ - 文档同步 A0-A49
2411
+ - 验证: python -m labs.sta.validate A0-A49 全绿
2412
+ - feat[python]:STA 报表统一出口, 三张表可任意切换币种
2413
+ - statements.py: 资产负债表/利润表/现金流量表接受 currency 参数, 缺省用账簿本位币
2414
+ - 折算口径: 资产按期末、资本按历史、损益按平均、现金按各自时点
2415
+ - consolidated_balance_sheet: 合并资产负债表同样按列报币种出, 含折算差额
2416
+ - A50: 同一本账按 CNY/USD/GHS 出表, 三张表与合并报表均平衡, 账簿不变
2417
+ - 文档同步 A0-A50
2418
+ - 验证: python -m labs.sta.validate A0-A50 全绿
2419
+ - feat[python]:STA 接口层统一三货币, 报表与合并接口接受 currency
2420
+ - /api/entities/<id>/{balance-sheet,income-statement,cashflow} 支持 currency, 走 statements 同一出口
2421
+ - 新增 /api/consolidations 与 /api/consolidations/<id>/balance-sheet?currency=, 按列报币种出合并表
2422
+ - 模块级 ContractError 映射为 400, 未知合并口径 404
2423
+ - A51: 接口 USD/GHS 报表与内存一致, 合并表两币种均平, 账簿不变
2424
+ - 文档同步 A0-A51
2425
+ - 验证: python -m labs.sta.validate A0-A51 全绿
2426
+ - feat[python]:STA 补齐合并利润表与合并现金流量表
2427
+ - statements.consolidated_income_statement: 各主体按平均汇率折算后逐行相加, 扣内部收入成本与未实现利润
2428
+ - statements.consolidated_cashflow: 各主体按列报币种折算后相加
2429
+ - API 新增 /api/consolidations/<id>/income-statement 与 /cashflow, 支持 currency
2430
+ - A52: 合并净利润与汇总勾稽, GHS 口径折算一致, 合并现金=各主体合计, 接口可用
2431
+ - 文档同步 A0-A52
2432
+ - 验证: python -m labs.sta.validate A0-A52 全绿
2433
+ - docs[multi]:登记 CAS 待补原文清单
2434
+ - 新增 docs/finance/cas/PENDING.md, 列出 2027-01-01 上市公司新列报规则及其应用指南
2435
+ - 明确现有 CAS 30 的 2006/2014 版本不能替代新规, 契约需标 verified: false
2436
+ - 补录要求: 命名、索引登记、契约状态同步
2437
+ - feat[python]:STA 增加 A53 科目时点完整性检查
2438
+ - 同一制度内同一编码的生效区间不得重叠, 科目区间不得越出所属制度
2439
+ - 未来生效的科目版本合法, 不要求落在当前日期之前
2440
+ - 为 CAS 全量科目与 2027 列报新规的版本轴提供机器化护栏
2441
+ - 文档同步 A0-A53
2442
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2443
+ - docs[multi]:登记应用指南附录缺失, 全量科目暂不可落
2444
+ - PENDING 增加《企业会计准则——应用指南》附录(会计科目和主要账务处理)
2445
+ - 现有语料只有准则正文与解释, 无科目表附录, 按项目规则不得凭印象补录
2446
+ - feat[python]:补齐企业会计制度资产类科目(批次 1)
2447
+ - 按 2006-01-01 生效的企业会计制度补资产类科目, 仅补缺失编码, 不覆盖既有记录
2448
+ - 新记录带 effective 区间与来源, 未逐字核对原文的标 verified: false
2449
+ - 科目总数增加, A0-A53 全绿
2450
+ - feat[python]:补齐企业会计制度负债/权益/成本/损益科目(批次 2-5)
2451
+ - 按 2006-01-01 生效的企业会计制度补 2xxx/3xxx/4xxx/5xxx 科目, 仅补缺失编码
2452
+ - 每条带 effective 区间与来源, 未逐字核对原文的标 verified: false
2453
+ - 2211 在 2006 与 2007 含义不同(预计负债/应付职工薪酬), 本批暂不收录, 待按名称维度处理
2454
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2455
+ - fix[python]:A1 越界判定改为编码加名称, 恢复 2006 年 2211 预计负债
2456
+ - 编码可跨制度重名(2006 的 2211 是预计负债, 2007 的是应付职工薪酬), 仅按编码判越界会误报
2457
+ - 探针改为 (编码, 名称) 命中才判越界; 恢复 2211 收录
2458
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2459
+ - feat[python]:补齐 2007 准则资产类科目(批次 7)
2460
+ - 按应用指南附录补 1xxx 一般企业常用科目, 仅补缺失编码
2461
+ - effective 自 2007-01-01 起无终止日, 未逐字核对原文的标 verified: false
2462
+ - 金融/保险等特殊行业科目未纳入本批
2463
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2464
+ - feat[python]:补齐 2007 准则负债类科目(批次 8)
2465
+ - 补 2xxx 一般企业常用科目, 仅补缺失编码
2466
+ - 2702 未确认融资费用为负债类备抵, 方向记借
2467
+ - 未逐字核对原文的标 verified: false
2468
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2469
+ - feat[python]:补齐 2007 准则权益/成本/损益/共同类科目(批次 9-12)
2470
+ - 补 4xxx/5xxx/6xxx/3xxx 一般企业常用科目, 仅补缺失编码
2471
+ - 新增资本公积、盈余公积、库存股、研发支出、其他业务收支、公允价值变动、投资收益、资产减值损失等
2472
+ - 未逐字核对原文的标 verified: false; 金融保险专用科目仍不在本批
2473
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2474
+ - feat[python]:补充新收入准则的合同资产与合同负债(批次 13)
2475
+ - 1124 合同资产、2204 合同负债, effective 自 2021-01-01(非上市企业执行日)
2476
+ - 仅收录可确认的编码, 未逐字核对原文的标 verified: false
2477
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2478
+ - feat[python]:2019 报表格式补齐其他收益/信用减值损失/资产处置收益
2479
+ - 按 2019 一般企业财务报表格式增加三个行项目
2480
+ - 科目映射暂空, 编码待应用指南附录确认后回填; 不做猜测
2481
+ - A22 增加三行存在性校验
2482
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2483
+ - feat[python]:2014 修订报表格式, 增加其他综合收益行
2484
+ - formats 拆出 fmt_2014(2014-07-01 ~ 2018-12-31), 对应 CAS 30 2014 修订
2485
+ - 新增 zhunze_2014.yaml, 在 2007 格式基础上增加"其他综合收益的税后净额"
2486
+ - 科目映射暂空, 待应用指南确认后回填
2487
+ - A22 增加 2014/2006 格式边界断言
2488
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2489
+ - feat[python]:2017 修订报表格式, 增加其他收益/信用减值/资产处置收益
2490
+ - formats 增加 fmt_2017(2018 全年), 对应财会〔2017〕30 号一般企业报表格式
2491
+ - 新增 zhunze_2017.yaml, 在 2014 格式上增加三行
2492
+ - 科目映射暂空, 待应用指南确认
2493
+ - 验证: python -m labs.sta.validate A0-A53 全绿
2494
+ - feat[python]:报表格式增加适用范围 scope, 按主体是否上市命中
2495
+ - Entity/Ledger 增加 listed; formats 支持 scope: listed|all
2496
+ - _format_of 按日期与适用范围筛选, 同区间优先命中 listed 专用版本
2497
+ - fmt_2017 标记 scope: listed, fmt_2014 覆盖到 2018-12-31 兜底
2498
+ - A54: 2018 年上市公司命中 2017 版, 非上市仍用 2014 版; 2019 统一
2499
+ - 验证: python -m labs.sta.validate A0-A54 全绿
2500
+ - fix[python]:P0 修复 listed 未入库与合并两表接口越权
2501
+ - store.entities 增加 listed 列并做迁移, 保存/重载保留上市属性
2502
+ - 合并利润表/现金流量表接口补 Auth.scope 校验, 与合并资产负债表一致
2503
+ - 空行项目映射仍待科目编码, 不属本次修复
2504
+ - 验证: python -m labs.sta.validate A0-A54 全绿
2505
+ - docs[multi]:收录应用指南附录会计科目原文(待结构化)
2506
+ - feat[python]:按应用指南附录补齐 2007 全部 156 个会计科目
2507
+ - 从财会〔2006〕18 号附录 PDF 解析出 156 个科目(资产/负债/共同/权益/成本/损益)
2508
+ - 与现有科目表比对后补入 59 个缺失编码, 含金融、保险等专用科目
2509
+ - 方向按科目性质推断: 备抵记贷、未确认融资费用记借、库存股记借、收入收益记贷
2510
+ - 全部标 verified: false, 待逐条对照原文复核
2511
+ - 验证: python -m labs.sta.validate A0-A54 全绿
2512
+ - docs[multi]:应用指南附录状态更新为已结构化
2513
+ - feat[python]:补入新租赁准则科目, 编码采用系统自定并注明来源
2514
+ - 指南只规定科目名称与账务处理, 不规定编号; 按项目规则不冒充官方编码
2515
+ - 新增使用权资产/累计折旧/减值准备、租赁负债、融资租赁资产、应收融资租赁款等
2516
+ - effective 自 2021-01-01(非上市企业执行日), source 注明编码为本系统自定
2517
+ - 验证: python -m labs.sta.validate A0-A54 全绿
2518
+ - fix[python]:修正 5402 工程结算方向为贷
2519
+ - 按应用指南“主要账务处理”核对 118 个科目的期末余额方向, 117 条一致
2520
+ - 5402 工程结算应为贷方余额, 原按成本类统一判为借, 现修正
2521
+ - 验证: python -m labs.sta.validate A0-A54 全绿
2522
+ - docs[multi]:归档应用指南附录 PDF 并补充修订来源
2523
+ - feat[python]:补 2014/2017 新增科目并回填报表映射
2524
+ - 其他综合收益 4003、其他收益 6117、资产处置收益 6115、信用减值损失 6702
2525
+ - 编码按项目规则由系统自定, source 注明指南未规定编号
2526
+ - 2014/2017/2019 报表中对应行项目的空映射回填为实际科目
2527
+ - 验证: python -m labs.sta.validate A0-A54 全绿
2528
+ - docs[multi]:收录会计科目修订征求意见稿及起草说明
2529
+ - feat[python]:新增准则巡检脚本与 cas 资料入口索引
2530
+ - docs[multi]:登记 CAS 30 2026 修订及分层施行时间
2531
+ - feat[python]:主体范围扩为三档, 报表格式按上市地命中
2532
+ - feat[python]:属地按 ISO 3166-2 建表并支持按日期解析
2533
+ - feat[python]:票据按发生日期取主体属地, 支持属地沿革
2534
+ - feat[python]:结转按月取主体属地, 附加税费随属地沿革切换
2535
+ - feat[python]:税率增加税务机关与国库字段, 分录增加属地留痕
2536
+ - docs[multi]:收录2019年度一般企业财务报表格式两份附件
2537
+ - feat[python]:主体增加新准则执行状态维度, 供2019两版格式命中
2538
+ - feat[python]:按2019年两份附件拆分 a1/a2 利润表格式
2539
+ - feat[python]:分录增加辅助核算维度, 研发费用与利息收支按辅助核算取数
2540
+ - feat[python]:新增利息支出与研发费用事件, 分录按辅助核算打标
2541
+ - test[python]:补2019年利息与研发费用票据
2542
+ - fix[python]:报表其中项标记 memo, 不参与合计避免重复计算
2543
+ - test[python]:增加A56辅助核算断言
2544
+ - feat[python]:损益科目增加类别维度并加A57覆盖率断言
2545
+ - fix[python]:补齐剩余损益科目类别, A57转绿
2546
+ - feat[python]:利润表按损益类别汇总, 加A58勾稽
2547
+ - feat[python]:新增分类口径利润表并加A59, 与旧格式勾稽
2548
+ - feat[python]:2027三档格式接入分类利润表, 修正格式优先级
2549
+ - test[python]:A60 补齐非上市2030分层断言
2550
+ - feat[python]:新增2027资产负债表项目映射与渲染
2551
+ - fix[python]:2027映射承接重分类规则, A61恢复合计断言
2552
+ - fix[python]:留抵税额列示其他流动资产, A61收紧零未映射断言
2553
+ - docs[python]:同步2027列报与A0-A61进度
2554
+ - chore[python]:新增STA自检门禁脚本
2555
+ - feat[python]:2019资产负债表接入项目映射, 加A62勾稽
2556
+ - feat[python]:2019附件2资产负债表项目名对齐
2557
+ - test[python]:增加A63合并现金流量表勾稽
2558
+ - chore[python]:新增凭证量级压测脚本
2559
+ - fix[python]:压测脚本补齐仓库根路径
2560
+ - feat[python]:合并现金流量表增加内部收付抵消与A64校验
2561
+ - 新增 internal_receipt / internal_payment 业务与规则表, 双边各记货币资金与内部往来, 不确认损益
2562
+ - 新增 data/flows/internal_settlements.yaml 台账, 逐笔绑定 payer_doc / payee_doc, 抵消必须落到双边凭证
2563
+ - statements.consolidated_cashflow 按两侧各自分类分别扣减, CashFlow 携带 offsets 抵消明细
2564
+ - A64 校验双边凭证溯源、分类合计与期末现金不受抵消影响; A49 折算比较放行 1 分钱进位差
2565
+ - 验证: python scripts/sta_check.py 65 项全绿
2566
+ - refactor[python]:删除 internal_balances 重复定义并校正设计文档现状
2567
+ - multi.py 同名函数重复两遍, 删除后者, 行为不变
2568
+ - DESIGN.md 验收清单补齐 A54–A64, 与 validate.py 的 65 项一致
2569
+ - 多主体条目去掉"未做内部往来抵消", 改述内部往来/内部交易/内部收付三类抵消
2570
+ - TODO 去掉已完成的"单法人、本币起做", 改为尚未接入的合并深度与框架维度
2571
+ - 验证: python scripts/sta_check.py 65 项全绿
2572
+ - refactor[python]:A64 补分类与完整性校验并清理死代码
2573
+ - A64 按台账年份逐年验证, 不再硬编码 2026
2574
+ - A64 核对凭证实际归类与台账两侧分类是否一致, 台账不能把经营收付写成投资
2575
+ - A64 反向检查: 带内部往来的现金凭证未登记台账即失败, 漏一笔就少抵消一笔
2576
+ - cashflow._classify 更名 classify, 供校验复用
2577
+ - 删除 multi.py 无引用的 _same_currency 与未使用的 Iterable
2578
+ - README/DESIGN 验收编号统一为 A0–A64
2579
+ - 验证: python scripts/sta_check.py 65 项全绿
2580
+ - refactor[python]:内部收付抵消改按原币单次折算
2581
+ - 同一张原始票据两侧原币金额必然相同, 抵消按台账原币折一次, 两侧抵消同一个数
2582
+ - 删除按各主体本位币分别折算再折列报币种的路径, 跨币种时不再折出两个金额
2583
+ - CashOffset 由 outflow/inflow 收敛为单一 amount; 两侧分类仍分别扣减
2584
+ - A64 改按原币核对: 凭证本位币金额折回台账原币再比, 并校验收付方向
2585
+ - 验证: python scripts/sta_check.py 65 项全绿
2586
+ - feat[python]:现金流量表补汇率变动影响行并新增A65
2587
+ - CashFlow 增加 fx_effect, 净增加额 = 三类净额 + 汇率影响
2588
+ - 折算口径: 流量按期间汇率、现金余额按报表日官方即期(经人民币套算), 差额单列
2589
+ - 合并按凭证原币汇总, 内部收付抵消单一原币金额, 出表时才折列报币种
2590
+ - A37/A63/A64 恒等式改为含汇率影响; 本位币报表与同币种合并断言其为零
2591
+ - A65 用年中变动的即期曲线验证: 期末按收盘价、期初按期初价、差额可勾稽
2592
+ - 接口返回 fx_effect / change / internal_offsets
2593
+ - 文档验收编号统一到 A0–A65, DESIGN 待办移除已完成的汇率影响行
2594
+ - 验证: python scripts/sta_check.py 66 项全绿
2595
+ - feat[python]:落地合并现金流量表折算契约并新增A66
2596
+ - 流量折算政策显式化: rate_policy 取 period_average(默认) / txn_date_spot, 随报表披露
2597
+ - txn_date_spot 逐张凭证按发生日即期折算, 大额离散项目不被期间均值抹平
2598
+ - FxRate 增 jurisdiction/mechanism/fixing_time, quote() 返回完整报价与缓存键
2599
+ - CashFlow 增 rate_policy 与 change, 渲染补汇率影响行与政策脚注
2600
+ - A66 校验: 未知政策被拒、余额不随政策变、汇率影响 = 期末−期初−流量、与 OCI 分通道
2601
+ - 接口接受并回显 rate_policy
2602
+ - DESIGN 新增 §13: 三档职责、计算契约、报价服务键、四条不变量、净投资边界
2603
+ - 文档验收编号统一到 A0–A66
2604
+ - 验证: python scripts/sta_check.py 67 项全绿
2605
+ - feat[python]:净投资标记落合同主数据并按IAS21.45分流折算差
2606
+ - 合同主数据增 type / net_investment / counterparty_entity / effective_from / evidence
2607
+ - 内部收付台账必填 contract_id 并校验合同引用; 内部合同对两边主体都可见
2608
+ - 内部往来分录按合同打 aux「净投资」标记, 台账不再自填性质
2609
+ - 合并折算差分流: 净投资进 OCI, 普通往来进损益(期末结转利润分配), 现金影响行只由现金桥接决定
2610
+ - 修正内部往来轧差补偿的方向错误(旧代码只在 offset=0 的样例下通过, 从未被触发)
2611
+ - 内部合同不是对外应税凭证, 印花税计提跳过
2612
+ - A67 用跨境内部借贷造数验证两支分流与现金行隔离
2613
+ - DESIGN §13.4/13.5 同步为合同层口径
2614
+ - 验证: python scripts/sta_check.py 68 项全绿
2615
+ - docs[python]:补充普通往来汇兑差额在合并利润表的列示缺口
2616
+ - DESIGN §13.5 记录: 该差额当前按已结转损益列在利润分配, 利润表未单列
2617
+ - 验证: 仅文档, 不影响 python scripts/sta_check.py 的 68 项结果
2618
+ - feat[python]:合并利润表单列内部往来汇兑差额并新增A68
2619
+ - 合并利润表本年累计增行「内部往来汇兑差额」, 取数与合并资产负债表同一口径
2620
+ - 只有普通往来的折算差入表, 净投资那一支仍进 OCI, 不在利润表出现
2621
+ - 净利润按费用口径扣减该行, 汇兑收益为负
2622
+ - A68 用同一组跨境造数跑 net_investment 两支: 一支有行并入净利润, 一支无行
2623
+ - DESIGN 验收清单与 §13.5 同步, 文档编号统一到 A0–A68
2624
+ - 验证: python scripts/sta_check.py 69 项全绿
2625
+ - feat[python]:报告期间参数化并让汇兑差额按期间增量列示
2626
+ - asof 增 Period 与 parse_period: 年 / 季 / 半年 / 月 / 单日 / 起..止(生命周期末段)
2627
+ - 利润表(单体与合并)接受 period: 本期按期间取数, 累计按会计年度起点取数
2628
+ - 合并利润表的内部交易、未实现利润、汇兑差额都按各自期间抵消, 不再写死本年累计
2629
+ - 汇兑差额按期间增量计算: 期末累计 − 期初前一日累计; 本期与累计各用各自区间
2630
+ - 本期净利润改由调整后的收入合计与成本费用合计勾稽
2631
+ - 接口 income-statement 与合并利润表接受 period 参数, 非法期间返回 400
2632
+ - A67-A69 共用一套跨境造数; A69 验证 Q3 本期/累计、9 月本期为零、自定义区间
2633
+ - 验证: python scripts/sta_check.py 70 项全绿
2634
+ - feat[python]:现金流量表接入报告期间并新增A70
2635
+ - cashflow.build 接受 period: 期初取期间起始日前一日余额, 期末取期间结束日
2636
+ - 折算口径按期初/期末即期, 期间平均改为任意区间的月末即期均值(period_average_rate)
2637
+ - 合并现金流量表: 内部收付只抵消落在本期间的部分, 期间外不重复扣减
2638
+ - 管理币种现金流量表同步支持 period
2639
+ - 接口 cashflow 与合并现金流接受 period 并回显
2640
+ - A70 校验: 期初期末边界、折算后勾稽、相邻期间首尾相接、Q3 不再抵消 Q2 收付
2641
+ - DESIGN 清单与 §13.5、README 同步, 编号 A0–A70
2642
+ - 验证: python scripts/sta_check.py 71 项全绿
2643
+ - chore[multi]:补齐 Rust 侧 labs 与 mpr 模块声明
2644
+ - lib.rs 增加 pub mod labs / pub mod mpr, 与 Python 侧同名包对齐
2645
+ - 两个 mod.rs 先留空, 模块内容属下一阶段
2646
+ - 验证: cargo check 通过
2647
+ - docs[multi]:提交规范语言枚举去掉 go 并补上 rust
2648
+ - language 取值改为 python / rust / multi, 对齐本仓 python 为 spec、rust 为生产实现的现状
2649
+ - 明确 go 代码只是寄存在 mpr/scoring, 日后迁出, 不参与本仓语言标注
2650
+ - 跨语言示例统一改为 python,rust
2651
+ - 验证: 文档变更, 不影响 python scripts/sta_check.py 的 71 项结果
2652
+ - chore[python]:pyproject 按优先级分组重排版
2653
+ - 分组顺序: 构建 → 项目元数据(名称/许可/作者/依赖) → 项目链接 → 可选依赖 → 工具
2654
+ - 作者段并入元数据组, [project.urls] 前移到可选依赖之前
2655
+ - 仅调整段落顺序与空行, 注释与键值一字未改
2656
+ - 验证: tomllib 解析前后完全一致, 注释行 diff 为空
2657
+ - chore[python]:requires-python 移出许可与作者段
2658
+ - 运行环境要求与运行时依赖归为一组, 不再紧贴 PEP 639 许可声明
2659
+ - 仅移动位置与空行, 注释与键值未改
2660
+ - 验证: tomllib 解析与上一版完全一致, 注释行 diff 为空
2661
+ - chore[python]:为 requires-python 补一行运行环境注释
2662
+ - 说明最低支持 Python 3.12, 低版本不保证可用
2663
+ - 仅新增一行注释, 键值未改
2664
+ - 验证: tomllib 解析通过
2665
+ - fix[python]:持久化补回分录辅助核算与属地,A35 覆盖
2666
+ - store 写凭证时只序列化 科目/金额/辅助, 丢掉 aux 与 jurisdiction, 读回后辅助核算全空
2667
+ - 补写 aux/jurisdiction, 读回时恢复; 旧库缺字段按空值兼容
2668
+ - ledger.digest 纳入 aux/jurisdiction, A35 的存盘往返比对不再漏项
2669
+ - 反向验证: 故意丢 aux 时 A35 报"凭证内容与存盘前不一致"
2670
+ - 验证: python scripts/sta_check.py 71 项全绿
2671
+ - feat[python]:期间覆盖分类与管理口径,合并成员缺席显式报错
2672
+ - reports.income_statement 增 rate_ytd: 本期与累计各用各自区间的平均汇率
2673
+ - profit_by_class / _classified_income 接受 period, 2027 分类表不再只认年度累计
2674
+ - statements.income_statement、income_statement_by_class、management.income_statement 同步支持 period
2675
+ - consolidation.members_missing + 接口: 合并范围成员不在账套时返回 409, 不再静默出空表
2676
+ - A71 验证分类三季度 = 累计差、两栏汇率分离、管理币种累计按累计区间
2677
+ - A72 验证成员缺席识别与虚拟合并显式报错
2678
+ - 文档验收编号统一到 A0–A72
2679
+ - 验证: python scripts/sta_check.py 73 项全绿
2680
+ - perf[python]:内部往来差额只折算往来科目,凭证按doc_id增量写入
2681
+ - 合并利润表算期间汇兑差额时不再整本账折算三次, 改为只取内部往来余额 × 期末即期
2682
+ - multi 增 internal_fx_split 与带 as_of 的净投资余额, consolidated 与报表共用同一口径
2683
+ - store._write_ledger 改为按 doc_id 增量同步: 内容未变不重写, 只处理新增/变更/删除
2684
+ - 逐票录入时每存一次从"全表删除重插"降为"读一次 doc_id + 写一张凭证"
2685
+ - 验证: python scripts/sta_check.py 73 项全绿
2686
+ - fix[python]:内部收付台账校验收付双方与合同对方一致
2687
+ - load_settlements 传入合同主数据时, 除存在性外还比对 counterparty_entity 与收付双方
2688
+ - A67 增加错配合同的反向用例: 对方主体对不上必须拒绝
2689
+ - 明确 contract_id 的职责: 溯源与对方校验; 净投资性质仍由余额侧单据所挂合同决定
2690
+ - 验证: python scripts/sta_check.py 73 项全绿
2691
+ - feat[python]:新增主体画像与准则适用路径规则(A73)
2692
+ - profile.py: 法律形式/行业/规模/增值税身份按生效区间版本化, 准则口径由规则推导
2693
+ - 划型按《中小企业划型标准规定》(工信部联企业〔2011〕300号), 大型为中型上限之上
2694
+ - 准则适用路径: 中途达标次年 1 月 1 日转 CAS, 已转不回退, 金融/公开交易/集团内直接 CAS
2695
+ - 收购主体按被收购时形态作为首段画像, 不补算从小做起的历次升级
2696
+ - 个体工商户不参与划型, 走个体工商户会计制度; 小规模纳税人原则上按季申报
2697
+ - data/entity_profiles.yaml 收录 SH-01/BJ-01 当前画像
2698
+ - A73 覆盖个体户/小微/升级次年生效/不回退/收购大型银行/公开交易/非法取值
2699
+ - DESIGN 新增 §14, 文档编号统一到 A0–A73
2700
+ - 验证: python scripts/sta_check.py 74 项全绿
2701
+ - feat[python]:增值税支持季度申报期与小规模优惠时点判定(A74)
2702
+ - filing 增 span/quarter: 任意申报区间按期初前一日留抵 + 区间合计计算
2703
+ - of() 改走 span, 单月与季度共用同一套聚合, 申报表销售额按区间取数
2704
+ - 新增 data/tax/vat_small.yaml: 月10万/季30万免征、3%减按1%, 2023-01-01 至 2027-12-31
2705
+ - small_scale_policy 按 as-of 解析, 优惠期外不豁免也不报错; 免征按季度销售额整体判定
2706
+ - A74 校验季度与三个月聚合一致、期初留抵衔接、应纳额恒等式、免征边界 30 万/30 万零 1 分
2707
+ - DESIGN §14 与验收清单同步, 编号 A0–A74
2708
+ - 验证: python scripts/sta_check.py 75 项全绿
2709
+ - feat[python]:增值税申报接口支持季度期间(A75)
2710
+ - vat-return 接受 period: 季度/半年/自定义区间走 filing.span, 不传时仍按 year+month
2711
+ - 响应回显期间标签(2026Q2 / 2026-03), 早于账套首票的区间返回 404
2712
+ - 申报表渲染标题按区间显示, 不再固定写成月份
2713
+ - A75 校验接口与 filing.quarter 同源、按月路径保持兼容、早期区间 404
2714
+ - DESIGN 清单与 README 同步, 编号 A0–A75
2715
+ - 验证: python scripts/sta_check.py 76 项全绿
2716
+ - feat[python]:新增主体生命周期状态机(A76)
2717
+ - lifecycle.py: active/migrated/deregistered/revoked/merged 按生效区间版本化
2718
+ - 迁移只换属地、账簿延续; 注销/吊销/被合并后不得记账
2719
+ - 终期取终止当年 1 月 1 日至终止日; merged 必须写承接主体, migrated 必须写新属地
2720
+ - 状态按 as-of 解析, 区间重叠或未封口直接拒绝
2721
+ - data/lifecycles.yaml 收录 SH-01/BJ-01 在营状态
2722
+ - A76 覆盖注销前后、终期边界、迁移延续与属地切换、合并终止、重叠与缺字段
2723
+ - DESIGN 新增 §15, 文档编号统一到 A0–A76
2724
+ - 验证: python scripts/sta_check.py 77 项全绿
2725
+ - feat[python]:分类词表按时点版本化(A77)
2726
+ - taxonomy.py + data/taxonomy.yaml: 法律形式/增值税身份/划型标准/会计制度各自带生效区间
2727
+ - 词表只回答某日存在哪些取值; 归属判断仍由 profile 负责
2728
+ - 画像加载时校验取值在区间内存在: 1990 年的小规模纳税人、1987 年前的个体工商户直接拒绝
2729
+ - 准则口径落到当日施行的制度: 2006 小型→小企业会计制度, 2013 起→小企业会计准则;
2730
+ 2006 中型→企业会计制度, 2007 起→企业会计准则
2731
+ - 个体工商户 1987-09-01 起才有法定形态, 词条注明 2011 年条例更替
2732
+ - A77 覆盖 1994/1987/1994-07/2003/2011-06 各边界与超时代码拒绝
2733
+ - DESIGN §14 增分类词表区间表, 编号 A0–A77
2734
+ - 验证: python scripts/sta_check.py 78 项全绿
2735
+ - feat[python]:记账闸门接入生命周期并按准则选择科目表(A78)
2736
+ - Importer 增 lifecycle: 注销/吊销/被合并之后的新票直接拒绝, 迁移期间照常入账
2737
+ - build_ledgers 与录票接口按主体传入生命周期, 不再绕过闸门
2738
+ - Book.coa 增 accounting_regime: 准则决定取哪套科目表, 与制度时间轴正交
2739
+ - 已收录: 企业会计准则(含 2006 企业会计制度); 小企业/个体户/金融未收录时显式报错, 不回退 CAS
2740
+ - A78 校验: 2006 可取企业会计制度、2007 起禁止、未收录准则报错、注销前后与迁移当日
2741
+ - DESIGN §14/§15 与 README 同步, 编号 A0–A78
2742
+ - 验证: python scripts/sta_check.py 79 项全绿
2743
+ - chore[python]:演示账套画像暂标 medium 对齐 CAS 科目表
2744
+ - SH-01 / BJ-01 的 scale 由 small 改为 medium, 与当前只收录 CAS 科目表的现实对齐
2745
+ - ProfileEra 增 note 字段, 两条画像写明"演示账套, 待小企业科目表到位后改回 small"
2746
+ - A73 改为断言演示账套走 CAS、规模为 medium 且必须带原因注解, 防止画像与账套假一致
2747
+ - DESIGN §14 记录临时口径与回退条件
2748
+ - 验证: python scripts/sta_check.py 79 项全绿
2749
+ - feat[python]:收录小企业会计准则科目表并接入准则选表
2750
+ - 从财政部附录 PDF 提取 66 个科目, 编号/名称照录, 标注类别/余额方向/损益分类
2751
+ - data/coa/accounting.yaml 登记准则到科目表; Book.coa(day, small_enterprise) 2013 起可取
2752
+ - 未收录准则(个体工商户/金融)仍显式报错; 2013 年前取小企业科目表报未施行
2753
+ - A78 校验 66 个科目、关键科目名称与生效边界
2754
+ - 演示账套仍按 medium/CAS: 业务规则与报表行项目未按 5xxx 科目映射, 直接切换会产出科目表里不存在的账
2755
+ - 画像注解与 DESIGN §14 同步为"科目表已收录, 待规则与报表映射"
2756
+ - 验证: python scripts/sta_check.py 79 项全绿
2757
+ - fix[python]:小企业 5403 按 2016-05-01 补更名区间(A78)
2758
+ - 5403 拆成两段: 2013-01-01~2016-04-30 营业税金及附加; 2016-05-01 起税金及附加
2759
+ - 依据财会〔2016〕22号: 科目名称调整, 房产税/土地使用税/车船税/印花税改列本科目
2760
+ - A78 增加更名前后的名称边界断言, 防止只写新名或只写旧名
2761
+ - DESIGN §2 明确原则: 规则本身必须带生效区间, 不论大小、不论是否只是更名
2762
+ - 验证: python scripts/sta_check.py 79 项全绿
2763
+ - docs[multi]:重构 docs 索引并按四个来源同步准则附件
2764
+ - docs 每级目录补 README 索引: docs/、finance/、cas/、cas/attachments/
2765
+ - CAS ↔ IFRS 转换调整分录移入 cas/,索引同步
2766
+ - CAS 文档索引从 finance/README 下沉到 cas/README,同步脚本改写该处标记位
2767
+ - casc_sync 增「工作通知」栏目: 关键词筛选、征求意见稿标效力、末页 404 容错
2768
+ - 小企业准则按工作通知来源收录,附件改用财政部官方 PDF(正文 + 科目表)
2769
+ - 附件改为下载归档到 cas/attachments/,多附件逐个登记,已归档不重复下载
2770
+ - casc_watch 关键词补小企业、个体工商户、金融企业、财务报表格式
2771
+ - 已归档 106 个附件(约 27MB),正文/索引/附件链接校验 0 缺失
2772
+ - 验证: casc_sync --dry-run 156 项未变,casc_watch 正常输出
2773
+ - docs[multi]:更新时间按文件时间记录,同步默认复用附件并限速
2774
+ - 更新时间优先取 HTTP Last-Modified,缺失时用本次抓取时刻,统一为 YYYY-MM-DD HH:MM:SS
2775
+ - html 页面的时间落在索引表「更新时间」列,附件落在条目的附件行
2776
+ - 同步默认复用已归档附件,只有新增或 --refresh 才重新下载
2777
+ - 条目间隔默认 0.6 秒;遇 403/429 立即停止本次抓取,避免被封 IP
2778
+ - 抓取失败不抹掉已有索引行,该行时间标「抓取失败」
2779
+ - 全量校验 156 条未变、105 个附件链接 0 缺失
2780
+ - docs[multi]:为 attachments 生成文件索引并对上准则条目
2781
+ - docs/finance/cas/attachments/README.md 由脚本按各条目附件段生成: 文件 → 所属条目 → 原文 → 更新时间
2782
+ - 未归档(源站 404)单列,附所属条目与失败原因
2783
+ - 索引正则兼容附件名内含方括号的情况(如“财会[2016]22号”)
2784
+ - 105 个已归档附件全部入索引,0 个链接缺失
2785
+ - 索引随 casc_sync 每次同步重建,不手写
2786
+ - feat[python]:接入小企业会计准则业务规则并守护科目映射(A79)
2787
+ - data/rules/small_enterprise 覆盖 21 类业务的 5xxx 科目映射,政策沿用基础规则
2788
+ - RuleBook 支持准则上下文:小企业账套取 5xxx 规则,其余仍走 CAS
2789
+ - Importer 按 ledger.accounting_regime(doc.issued) 选择规则;build_ledgers 挂主体画像
2790
+ - A79 校验:小企业票产出 5001、分录科目 ⊆ 小企业科目表、CAS 上下文不被污染、规则全覆盖
2791
+ - 演示账套仍为 medium/CAS:报表行项目映射尚未按 5xxx 接入
2792
+ - DESIGN/README 同步,编号 A0–A79
2793
+ - 验证:python scripts/sta_check.py 80 项全绿
2794
+ - feat[python]:打通小企业准则的科目取用、报表映射与全链路(A80)
2795
+ - book.coa 的调用点改按 ledger.accounting_regime(day) 取表:报表、结转、税金、资产、折算
2796
+ - 新增小企业资产负债表/利润表行项目映射(small_balance.yaml / small_income.yaml)
2797
+ - close_all 按年度设置准则上下文,小企业不确认递延所得税
2798
+ - A80 用独立主体跑通建账→入账→结转→出表:5xxx 科目、报表平衡、净利润 7500
2799
+ - 演示主体 SH-01/BJ-01 保持 medium/CAS:已执行 CAS 按财会〔2011〕17号不得转回小企业
2800
+ - 修正 opening.validate 的签名,期初校验按账套准则取科目表
2801
+ - DESIGN/README/画像注解同步,编号 A0–A80
2802
+ - 验证:python scripts/sta_check.py 81 项全绿
2803
+ - feat[python]:终止经营业务线按生效日标记并单列损益(A81)
2804
+ - Document 增 business 字段;data/discontinued.yaml 登记主体+业务线+生效日
2805
+ - posting 给该业务线的损益行打 aux「终止经营」,资产负债行不动
2806
+ - 分类利润表把带标记的损益归入「终止经营」,不重复计入经营
2807
+ - 利润表增加「其中:终止经营损益」备忘行,本期与累计各按区间汇总
2808
+ - A81 校验:生效日前不标、生效日后标、其他业务线不误标、分类与利润表金额
2809
+ - DESIGN 新增 §16,README/清单同步,编号 A0–A81
2810
+ - 验证:python scripts/sta_check.py 82 项全绿
2811
+ - feat[python]:2027 附注补管理层业绩指标与调节表(A82)
2812
+ - data/report/mpm.yaml: 指标定义、来源、准则口径基础与逐项调节(科目+方向)
2813
+ - notes.management_measures 按科目区间算调节项, 输出「基础→调节→指标值」可回算表
2814
+ - 附注新增「七、管理层业绩指标」; 指标不回写报表, 只是补充口径
2815
+ - A82 校验: 基础=利润总额、调节表可回算、定义/来源非空、附注确实披露
2816
+ - DESIGN 新增 §17, README/清单同步, 编号 A0–A82
2817
+ - 验证: python scripts/sta_check.py 83 项全绿
2818
+ - feat[python]:汇率报价补齐辖区/机制/定盘时点并强制法定折算(A83)
2819
+ - data/fx/rates.yaml 每条报价增加 jurisdiction / mechanism / fixing_time
2820
+ - FxBook.official_rate: only official 可用于法定折算, market_proxy 直接拒绝
2821
+ - translation.close_rate 改走 official_rate, 期间平均与期末折算一并受约束
2822
+ - GHS 定盘时点未核实, 字段留空并标注待核; 其余人民币报价记 09:15
2823
+ - A83 校验: 辖区/机制/出处齐备、rate 与 quote 一致、market_proxy 被拒
2824
+ - DESIGN §13.2 与 README 同步, 编号 A0–A83
2825
+ - 验证: python scripts/sta_check.py 84 项全绿
2826
+ - feat[python]:即期汇率接入 mopr 报价并生成年度快照(A84)
2827
+ - sta.fx.quote_from_mopr: USD/HKD 走人行 PBOC, GHS 走加纳银行 BOG 并取倒数
2828
+ - 返回 rate + publish_date(定盘日) + 发布场所 + 辖区, 价与日绑定
2829
+ - FxRate 增 publish_date 字段并支持 YAML 解析
2830
+ - scripts/fx_sync.py: 按年生成汇率快照, 默认只预览, --write 才覆写; 未来日期取最新可得价
2831
+ - A84 校验: 三币种汇率/辖区/场所/机制/定盘日, 周末查询自然前溯
2832
+ - 当前 rates.yaml 仍为示例快照; 换真实快照会改变 FX 断言基线, 需单独一轮
2833
+ - DESIGN §13.2 与 README 同步, 编号 A0–A84
2834
+ - 验证: python scripts/sta_check.py 85 项全绿
2835
+ - refactor[python]:明确 mopr 报价方向与直接/间接标价法口径(A84)
2836
+ - quote_from_mopr 注释写明 base 是报价币、汇率取自 base 国官方、mopr 已归一到 1 foreign = ? base
2837
+ - 返回增加 symbol 与 inverted, 记录原生报价方向(USDCNY 直接 / CNYGHS 取倒数)
2838
+ - GHS 仍以 base=GHS 单源取价后取倒数, 不跨源拼价
2839
+ - A84 增加报价符号与换算方向断言
2840
+ - DESIGN §13.2 补充直接标价法/间接标价法说明
2841
+ - 验证: python scripts/sta_check.py 85 项全绿
2842
+ - refactor[python]:汇率报价按记账主体本位币选源(A84)
2843
+ - quote_from_mopr 增加 base 参数: base 就是记账主体本位币, 返回 1 外币 = ? base
2844
+ - source 按 base 自动绑定: CNY→PBOC/GHS→BOG/USD→FED/HKD→HKMA/EUR→ECB
2845
+ - 保留 BOG 以 GHS 为本币的单源回退(CNY 直连 GHS 时取倒数), 不跨源拼价
2846
+ - symbol / inverted 记录原生报价方向; 辖区随 base 走
2847
+ - A84 增加 GHS 本位币看美元(USDGHS/BOG)的用例
2848
+ - DESIGN §13.2 同步本位币与 source 映射
2849
+ - 验证: python scripts/sta_check.py 85 项全绿
2850
+ - refactor[python]:A84 兼容 GHS 直连与修复前的单源回退
2851
+ - mopr 的 BOG/GHS 方向问题已确认是库 bug、正在修; 回退只作临时兼容
2852
+ - A84 改为校验语义不变量: GHS 价来自 BOG、辖区 GH、符号与换算方向一致、汇率合理
2853
+ - 直连(GHSCNY)与回退(CNYGHS 取倒数)两种路径都通过, 修复后无需改测试
2854
+ - fx.py 注释标明回退会随 mopr 修复自动失效
2855
+ - 验证: python scripts/sta_check.py 85 项全绿
2856
+ - fix[python]:适配 mopr 新版汇率接口
2857
+ - mopr 0.0.102 起 exchange_rate(base, quote) 口径为 1 base = ? quote,
2858
+ as_of/source 改为关键字参数;旧调用(1 外币 = ? 本币 + 位置时间戳)已失效
2859
+ - quote_from_mopr 改按「1 外币 = ? 本位币」调用 exchange_rate(currency, base),
2860
+ 不再手工取倒数;同币种直接返回恒等报价
2861
+ - 源按币对自动路由,未挂牌时依次退到外币、本位币所属官方源,只换源不拼价;
2862
+ DataGapError 原样抛出,不退到别的源或陈旧数据
2863
+ - 带出 formation(DIRECT/INVERSE/CROSS_LOCAL/CROSS_USD)与 value_date、
2864
+ 发布方;辖区跟发布方走(GHS 折 CNY 由 BOG 挂牌,辖区 GH)
2865
+ - FxRate 增加 formation 字段,fx_sync 生成快照时写入
2866
+ - A84 重写:校验币对方向、形成方式、换算方向、报价源、辖区、定盘日与同币种恒等
2867
+ - 验证:python scripts/sta_check.py,85 项全绿
2868
+ - fix[python]:按 mopr 签名显式传 base/quote
2869
+ - mopr 签名为 exchange_rate(base, quote) = 1 base = ? quote,base 是表达式中
2870
+ 等于 1 的一侧,quote 是折算结果
2871
+ - 本函数要「1 外币 = ? 本位币」,对应 mopr.base=外币、mopr.quote=本位币;
2872
+ 两套命名里的 base 不是同一个东西,改为关键字传参并注明映射
2873
+ - A84 增加本位币 USD 的方向用例:1 CNY = ? USD 由美联储挂牌,
2874
+ 与 CNY 本位币下 1 USD = ? CNY 由人行挂牌互为反向,参数写反即失败
2875
+ - 验证:python scripts/sta_check.py,85 项全绿
2876
+ - feat[python]:汇率源由注册地确定并支持交叉套算
2877
+ - jurisdictions.yaml 增加 fx_source(CN→pboc、HK→hkma、GH→bog、US→fed),
2878
+ 注册地成为汇率源的唯一事实源,不再让 mopr 按币对自动猜源
2879
+ - quote_from_mopr 增加 jurisdiction 参数;显式按该源取价,交叉盘由该源
2880
+ 本币锚套算(CROSS_LOCAL),本币锚缺格才降美元锚(CROSS_USD)
2881
+ - 该源无腿可套时才退到币种所属官方源,以 cross_jurisdiction 留痕;
2882
+ 同时返回 book_jurisdiction / source_jurisdiction / pivot / source_legs
2883
+ - 同一 EUR/USD:CN 主体经人行 CNY 锚得 1.134741(CROSS_LOCAL),
2884
+ US 主体经美联储直盘得 1.133600(DIRECT),差异可解释、可追溯
2885
+ - fx_sync 显式以 CN 主体生成快照;GHS 的辖区按发布方为 GH 而非本位币所在 CN
2886
+ - A84 重写:注册地定源、交叉盘锚点、跨辖区回退、未登记注册地直接拒绝
2887
+ - 验证:python scripts/sta_check.py,85 项全绿
2888
+ - docs[python]:修正人行 GHS 与定盘路径的表述
2889
+ - 人行经 CFETS 实际公布 CNY/GHS 的中间价、参考汇率与即期价,
2890
+ 此前「PBOC 无 GHS」的说法不成立;退到 BOG 是 mopr 的 PBOC 源未接该列,
2891
+ 补齐后会自动回到 PBOC
2892
+ - 记录三条公布路径:中间价 / 参考汇率 09:15、即期 11:30,
2893
+ 数值相同但口径与公布路径不同
2894
+ - 法定收盘价取中间价;fixing_time 不写死,mopr 的 publish_timestamp
2895
+ 目前是抓取时刻而非官方定盘时刻
2896
+ - 仅改注释与设计文档,行为不变;验证 python scripts/sta_check.py,85 项全绿
2897
+ - docs[python]:记录人民币参考汇率的公布路径与 GHS 样本
2898
+ - 人行经 CFETS 三条路径:中间价 09:15(主要挂牌货币)、参考汇率 11:00
2899
+ (含 GHS 等未进中间价表的货币)、即期 11:30(CFETS 口径,与中间价同值)
2900
+ - 法定收盘价取中间价;中间价未覆盖的币种取参考汇率
2901
+ - 记录样本:2026-09-30 CNY/GHS = 1.7312(参考汇率),折 1 GHS = 0.577634 CNY;
2902
+ 当日 BOG 为 0.573625,相差约 0.7%,用来说明退源必须带 cross_jurisdiction
2903
+ - fixing_time 仍不写死:mopr 的 publish_timestamp 是抓取时刻,不是官方定盘时刻
2904
+ - 仅改注释与设计文档,行为不变;验证 python scripts/sta_check.py,85 项全绿
2905
+ - release version 0.1.4
2906
+
2907
+ ## [0.1.3] - 2026-10-18
2908
+ ### Changed
2909
+ - docs[multi]:新增 docs/finance 并收录 CAS_IFRS 转换调整分录手册
2910
+ - 建立 docs/finance 目录, 按"跨品种财务口径"定位收纳财务资料
2911
+ - 收录 CAS_IFRS_转换调整分录手册.xlsx(CAS 与 IFRS 转换调整分录)
2912
+ - docs[multi]:docs/finance 建文档索引并将资料改为 ASCII 文件名
2913
+ - 新增 README.md: 定位为跨品种财务口径资料, 只收原始资料与口径说明
2914
+ - 索引登记 cas_ifrs_adjusting_entries.xlsx 的主题与来源
2915
+ - 文件名由中文改为 ASCII 小写下划线, 避免脚本与跨平台工具处理麻烦
2916
+ - 改名为 git mv, 保留文件历史关系
2917
+ - feat[python]:新增 casc 准则同步脚本
2918
+ - scripts/casc_sync.py 把抓取/转换/索引三件事收成单文件, 供不定期同步
2919
+ - 三个栏目(准则/解释/其他规定)配置化, 支持 --dry-run 与 --only
2920
+ - 内容未变不写盘, 末行统计新增/更新/未变/失败
2921
+ - README 索引段按 casc-index 标记重建, 标记外的手写内容不受影响
2922
+ - 附件 PDF/DOCX 转文本, 二进制只落 temp 不入库; .doc 仅登记链接
2923
+ - 站点导航与条目混排, 按导航块 URL 集合排除非条目(机构简介等)
2924
+ - docs[multi]:收录企业会计准则、解释与其他规定原文及索引
2925
+ - docs/finance/cas 共 104 份 markdown: 准则 59、解释 20、其他规定 25
2926
+ - 正文取自 casc.org.cn 条目页, 章与附录提升为二级标题
2927
+ - 解释与其他规定多为印发通知, 准则正文取自附件并转成文本
2928
+ - 无法转换的 .doc 与失效附件在文末标注, 仅登记链接
2929
+ - README 新增解释与其他规定两个索引章节, 三章索引交由 casc-index 标记托管
2930
+ - refactor[python,go]:把 base 与 q1x 的子目录并入 mpr
2931
+ 变更概述:
2932
+ - 仓库根的 base/scoring 迁至 mpr/scoring, 根目录不再有 base/
2933
+ - q1x/base、q1x/core 迁至 mpr/base、mpr/core, q1x 包随之删除
2934
+ - python 侧绝对导入由 q1x.* 改为 mpr.*
2935
+
2936
+ 涉及语言与文件范围:
2937
+ - python: mpr/base 16 个文件、mpr/core 14 个文件, 其中 10 个文件的导入前缀改写
2938
+ - go: mpr/scoring 3 个源文件, 包名仍为 scoring, 无内部导入
2939
+
2940
+ 语义一致性:
2941
+ - 只改目录位置与导入前缀, 未触碰任何逻辑; go 侧包名、实现与测试均未改动
2942
+
2943
+ 验证方式:
2944
+ - python -m compileall mpr 通过
2945
+ - import mpr.base、mpr.core.waves、mpr.base.exchange 正常
2946
+ - go build ./mpr/scoring 与 go test ./mpr/scoring 通过
2947
+ - chore[python]:重写 pyproject 的包清单与依赖, 清掉从 mopr 拷来的残留
2948
+ - 删除不存在的 foundations.* 包清单, packages 收敛为 mpr/mpr.base/mpr.core/panshi/panshi.data
2949
+ - 删除 package-dir 与 package-data 整段映射(包名与目录名一致, 无需映射)
2950
+ - 删除指向 mopr.tools.* 的三个入口点: mopr 是 PyPI 上的独立工具库, 入口由该包自己提供
2951
+ - 依赖按源码真实 import 重建, 补 mopr>=0.0.99(panshi.data 用其 io/config/base)
2952
+ - TA-Lib、akshare、matplotlib、tqdm 移入 optional extra full, pdfminer.six 移入 scripts
2953
+ - 验证: pip wheel 构建成功, METADATA 的 Requires-Dist 与 Provides-Extra 符合预期
2954
+ - release version 0.1.3
2955
+
2956
+ ## [0.1.2] - 2026-10-17
2957
+ ### Changed
2958
+ - refactor[python]:日历位掩码枚举 CalendarProperty 更名 CalendarType
2959
+ - CalendarType 语义是"日历的类型"(自然日/工作日/交易日/结算日等), 原 Property 易与叠加属性混淆
2960
+ - calendar.py 内类定义、类型注解、docstring 与 MarketCalendar 全量改名
2961
+ - README 日历契约章节与示例同步为新名
2962
+ - 验证: 冒烟验证 import/select/test/latest 按位筛选与越界返回均符合预期
2963
+ - feat[python]:新增 panshi 交易日历模块(规则推导 + CN 事实数据接入)
2964
+ - CalendarType 收为 WORK / EQUITY / FX 位加 WEEKEND 高位, "不在册"改用 None 表示
2965
+ - TradingCalendar 按 holidays 库清单与"名字 -> 掩码"表逐日推导, 补假按地区分
2966
+ - 新增 fact_trading_days: 读 ~/.mopr/meta/calendar 的 cn / sse 交易日序列, 历史段 EQUITY 以序列为准, 未来段仍按规则推, WORK / FX 不受影响
2967
+ - 汇市仍由规则表加 CFETS 官方休市日; 美股未接事实数据
2968
+ - 文档: holidays.md 总纲与各地区明细, holidays-chn.md 补股市口径对齐表
2969
+ - 验证: 2015 ~ 2025 年 EQUITY 与 cn 序列逐日全中(规则原本多标 2015-09-03 / 2020-01-31 / 2024-02-09 三天), 汇市逐日结果与接入前一致
2970
+ - chore[python]:补充 pyright 静态检查配置
2971
+ - pyproject.toml 新增 [tool.pyright] 一节, 固定 pythonVersion 与 typeCheckingMode
2972
+ - 编辑器与本地检查按同一口径做类型分析
2973
+ - release version 0.1.2
2974
+
2975
+ ## [0.1.1] - 2026-10-16
2976
+ ### Changed
2977
+ - feat[rust]:初始化 rust crate 于仓库根, 当前只收录 panshi
2978
+ - Cargo.toml 声明 foundations crate, [lib] path 指向仓库根的 lib.rs
2979
+ - lib.rs 只声明 pub mod panshi, 模块按同名目录展开到 panshi/mod.rs
2980
+ - .gitignore 补 Cargo.lock: 库按惯例不入库锁文件
2981
+ - 验证: cargo check 通过
2982
+ - refactor[python]:日历本体改为抽象基类 Calendar, 位掩码更名 CalendarProperty
2983
+ - 新增 Calendar(ABC): mask_of/select 为抽象方法, test/latest 由其派生
2984
+ - MarketCalendar 改为 Calendar 的预计算实现, 注册表现面向 Calendar 存取
2985
+ - 原模块级 get_latest_date 删除, 查询改由日历对象自身的 latest 承担
2986
+ - 验证: py_compile 通过, 冒烟覆盖按位筛选/越界 NONE/无结果 None/ABC 不可实例化
2987
+ - docs[multi]:同步 rust 布局与日历契约说明, 补写文件回读 SOP
2988
+ - README 补 Cargo.toml/lib.rs/panshi/mod.rs 布局与 cargo check 快速开始
2989
+ - README 的日历章节改写为 CalendarProperty 位掩码与 Calendar 抽象基类两层
2990
+ - AGENTS.md 增补覆写已存在文件要先删再写或回读全文的 SOP(源码被串改实例)
2991
+ - docs[multi]:修正写文件 SOP 中反复复用同一路径的处理方式
2992
+ - 实测同一路径(如 .git/commit-msg.tmp)即便先删再写仍会混入上一次内容
2993
+ - 改为要求每次换新文件名, 源码覆写才用先删再写
2994
+ - chore[rust]:锁定 rust 工具链版本为 1.98.1
2995
+ - rust-toolchain.toml 固定 channel 与 rustfmt/clippy 组件, profile 取 minimal
2996
+ - rustup 首次执行 cargo 命令时自动安装该版本, 保证开发/CI/生产构建一致
2997
+ - feat[python]:收录跨语言标量类型契约 mpr/types
2998
+ - types.py 声明 i8/u8/../f32/f64 与 SCALAR_SPECS, 作为其它语言等价实现的唯一权威
2999
+ - 显式构造按固定位宽截断, 平台相关类型落边界统一收敛为 u64/i64
3000
+ - types.md 记录命名对齐规则、浮点饱和语义、测试清单与后续 TODO
3001
+ - chore[python,rust]:统一源码版权头部为 MIT
3002
+ 变更概述:
3003
+ - 三个 python 文件的 SPDX 标识由 AGPL-3.0-only 改为 MIT, 与仓库根 LICENSE 对齐
3004
+ - 两个 rust 文件补上版权与 SPDX 头部
3005
+
3006
+ 涉及语言与文件范围:
3007
+ - python: .githooks/commit_msg_check.py, .githooks/text_check.py, mpr/types.py
3008
+ - rust: lib.rs, panshi/mod.rs
3009
+
3010
+ 语义一致性:
3011
+ - 仅改动文件头部注释, 不涉及任何代码逻辑, 各语言行为不变
3012
+
3013
+ 验证方式:
3014
+ - python -m py_compile 三个 python 文件通过
3015
+ - cargo check 通过
3016
+ - release version 0.1.1
3017
+
3018
+ ## [0.1.0] - 2026-10-16
3019
+ ### Changed
3020
+ - Initial commit
3021
+ - feat[multi]: 暂存部分代码
3022
+ - chore[multi]:新增 commit-msg 与 pre-commit 编码校验钩子
3023
+ - commit-msg 以 round-trip 反推识别 GBK/CP1252 等乱码链, 并拒绝 NUL/U+FFFD/私有区字符
3024
+ - commit-msg 追加禁止 Co-authored-by 与 Copilot/AI 署名的尾部约束
3025
+ - pre-commit 在暂存内容中拦截新混入的 BOM
3026
+ - 钩子经 core.hooksPath=.githooks 启用, Windows 下回退到 py -3 调用
3027
+ - refactor[python]:重写 panshi 日历契约为基准类型加叠加属性的双枚举结构
3028
+ - CalendarKind 收窄为自然日/工作日/交易日三级互斥基准, 取值有序可比较收窄程度
3029
+ - CalendarProperty 改用 IntFlag 位掩码叠加结算日/报告日/财务日, 与基准类型正交
3030
+ - MarketCalendar 按日期升序保存与日期对齐的属性掩码, 提供 mask_of/test/select
3031
+ - 注册表键改为 (交易所代码, CalendarKind), 查询入口 get_latest_date 支持属性过滤
3032
+ - 修正原文缺失 bisect 导入、模块级调用未定义函数导致文件无法 import 的问题
3033
+ - 验证: 冒烟验证 select/test 按位筛选、越界返回 None、三级基准可比较均符合预期
3034
+ - docs[multi]:新增 AGENTS.md 作业规范与 README.md 项目说明
3035
+ - AGENTS.md 约定编码前思考/简洁优先/精准修改/目标驱动执行四节作业准则
3036
+ - AGENTS.md 追加 git 提交规范: type[language]:中文摘要 主题模板与 Windows 下以 -F 传文件的约定
3037
+ - README.md 明确 python 为 spec、rust 为生产实现的双语言分工与四条一致性规则
3038
+ - README.md 声明当前仅收录 panshi(磐石), q1x/mpr/base 等为存量代码
3039
+ - README.md 记录 Rust crate 位置待定, 倾向 panshi-rs/ 与 packages 顶层并列
3040
+ - refactor[python]:合并日历的类型与属性为单一 Calendar 位掩码枚举
3041
+ - CalendarKind 与 CalendarProperty 合并为 Calendar(IntFlag), 一位代表一个角色
3042
+ - 位序维持收窄关系: 自然日 < 工作日 < 交易日, 其后依次为结算日/报告日/财务日
3043
+ - 注册表维度由 (交易所, 日历类型) 收敛为按交易所单份日历, 每个日期携带角色掩码
3044
+ - get_latest_date 改以 roles 位组合过滤, select/test 同步按包含语义筛选
3045
+ - README.md 的日历章节同步为单枚举写法
3046
+ - 验证: 冒烟覆盖按位筛选/test/越界返回 NONE/无结果返回 None/位序比较, 均符合预期
3047
+ - chore[python]:收录此前未跟踪的 mpr 包占位
3048
+ - mpr/__init__.py 为空占位文件, 一直未被版本管理, 补纳入仓库
3049
+ - 未在 pyproject.toml 的 packages 中登记, 暂不作为分发包
3050
+ - docs[multi]:补充提交前回读临时消息文件的 SOP 与踩坑记录
3051
+ - Windows 传递约定新增第 2 步: -F 之前先 head/wc -c 回读临时文件再提交
3052
+ - 新增"临时文件必须先回读, 为什么"小节, 记录两条报文交错污染同一提交对象的实例
3053
+ - 给出污染已入库的收场三步: 重写并回读 --amend -F 后 git log 复核(仅限未 push)
3054
+ - 提交前 Checklist 追加临时文件回读核对一项
3055
+ - release version 0.1.0
3056
+
3057
+
3058
+ [Unreleased]: https://codeberg.org/quant1x/foundations/compare/v0.1.26...HEAD
3059
+ [0.1.26]: https://codeberg.org/quant1x/foundations/compare/v0.1.25...v0.1.26
3060
+ [0.1.25]: https://codeberg.org/quant1x/foundations/compare/v0.1.24...v0.1.25
3061
+ [0.1.24]: https://codeberg.org/quant1x/foundations/compare/v0.1.23...v0.1.24
3062
+ [0.1.23]: https://codeberg.org/quant1x/foundations/compare/v0.1.22...v0.1.23
3063
+ [0.1.22]: https://codeberg.org/quant1x/foundations/compare/v0.1.21...v0.1.22
3064
+ [0.1.21]: https://codeberg.org/quant1x/foundations/compare/v0.1.20...v0.1.21
3065
+ [0.1.20]: https://codeberg.org/quant1x/foundations/compare/v0.1.19...v0.1.20
3066
+ [0.1.19]: https://codeberg.org/quant1x/foundations/compare/v0.1.18...v0.1.19
3067
+ [0.1.18]: https://codeberg.org/quant1x/foundations/compare/v0.1.17...v0.1.18
3068
+ [0.1.17]: https://codeberg.org/quant1x/foundations/compare/v0.1.16...v0.1.17
3069
+ [0.1.16]: https://codeberg.org/quant1x/foundations/compare/v0.1.15...v0.1.16
3070
+ [0.1.15]: https://codeberg.org/quant1x/foundations/compare/v0.1.14...v0.1.15
3071
+ [0.1.14]: https://codeberg.org/quant1x/foundations/compare/v0.1.13...v0.1.14
3072
+ [0.1.13]: https://codeberg.org/quant1x/foundations/compare/v0.1.12...v0.1.13
3073
+ [0.1.12]: https://codeberg.org/quant1x/foundations/compare/v0.1.11...v0.1.12
3074
+ [0.1.11]: https://codeberg.org/quant1x/foundations/compare/v0.1.10...v0.1.11
3075
+ [0.1.10]: https://codeberg.org/quant1x/foundations/compare/v0.1.9...v0.1.10
3076
+ [0.1.9]: https://codeberg.org/quant1x/foundations/compare/v0.1.8...v0.1.9
3077
+ [0.1.8]: https://codeberg.org/quant1x/foundations/compare/v0.1.7...v0.1.8
3078
+ [0.1.7]: https://codeberg.org/quant1x/foundations/compare/v0.1.6...v0.1.7
3079
+ [0.1.6]: https://codeberg.org/quant1x/foundations/compare/v0.1.5...v0.1.6
3080
+ [0.1.5]: https://codeberg.org/quant1x/foundations/compare/v0.1.4...v0.1.5
3081
+ [0.1.4]: https://codeberg.org/quant1x/foundations/compare/v0.1.3...v0.1.4
3082
+ [0.1.3]: https://codeberg.org/quant1x/foundations/compare/v0.1.2...v0.1.3
3083
+ [0.1.2]: https://codeberg.org/quant1x/foundations/compare/v0.1.1...v0.1.2
3084
+ [0.1.1]: https://codeberg.org/quant1x/foundations/compare/v0.1.0...v0.1.1
3085
+
3086
+ [0.1.0]: https://codeberg.org/quant1x/foundations/releases/tag/v0.1.0