发票与单据合规技能包(免费版)
完全本地运行:引擎已经打包在本技能里(
scripts/engine/)。 核对过程不需要联网、不需要 API Key、没有调用次数上限、不写任何文件。
什么时候用
谁会在什么时候用:采购 / 应付 / 财务会计 / 内控 / 代账,在别人把材料交上来、我要签字或付款之前。
来料从来不是一张单据:发票领用存台账、作废与红冲发票、农产品收购发票与进项抵扣、应付暂估与发票未到、 合同全文、多份合同条款、中标通知书与合同、投标报价明细、广告文案、出口退税单证、报销单、 采购三单(订单/入库单/发票)、外贸单证(发票/装箱单/提单)—— 一份材料往往要同时过好几把尺子, 逐把尺子手审既慢又容易漏,而且每来一批材料都要重来一遍。
这个包做的事只有一件:--input <材料目录>(每个子目录 = 一份材料 / 一个供应商),
一次跑完所有材料,每份材料一行结论。
这个免费版查什么
下面 14 项,每份材料都跑一遍(检查项名字与引擎 CHECKS_GIVEN 逐条一致):
- 发票领用存与开票数据
- 发票作废与红冲
- 农产品收购发票与进项抵扣
- 应付暂估与发票未到
- 合同一致性
- 多份合同条款差异
- 中标结果与合同一致性
- 投标报价明细
- 广告文案合规
- 广告文案违规体检
- 出口退税单证一致性
- 报销单合规
- 采购三单匹配
- 外贸单证单单一致
引擎里的 CHECKS_WITHHELD(本免费版不执行的项)会逐条打印出来,
它们是"未执行的检查项"的说明文本,不是实现。
另外,每个成员检查包自己没做的子检查(SUB_CHECKS_WITHHELD,本包合计 84 项)也在结果里
scope.sub_checks_not_run 如实列出 —— 两个档位都没实现它们,不会因为"买了完整档"就让买家以为这些项被跑了。
行号口径:14 个成员引擎报行号的字段并不统一(多数写 line,投标报价明细 写 row,
广告文案合规 写 index)。本包在批量壳层把它们统一换算成原文文件里的行号,
并且落位以原文内容为准(先按结论里的原文片段去找那一行),所以每条结论的
来源文件:行号 都能拿同一份材料复算。
怎么用
node scripts/run.mjs --sample # 单份材料样例(内置)
node scripts/run.mjs --sample-batch # 3 份材料的批量样例(有硬伤 / 更严重 / 没交材料)
node scripts/run.mjs --input 材料目录 # 批量:每个子目录 = 一份材料
node scripts/run.mjs --input 材料目录 --json # 机器可读
材料目录怎么放(每个子目录里放这份材料的一套单据,每项用 === 检查项 === 分段,Tab 分隔最稳):
材料目录/
豫州新材料有限公司/报送材料.txt
中岳机电设备有限公司/报送材料.txt
也可以把 14 张单据拆成 14 个文件放进同一个子目录 —— 引擎会自己认表头找对应的那一项。
templates/sample.json 是引擎自己的样例,可以直接 --input 它先跑通一遍。
退出码:0 已执行检查 / 1 缺少入参 / 3 材料不足 / 4 入参读不到或无法解析 / 9 未预期错误。 材料不足(一份材料都没有、材料为空或只有几行、认不出任何一张单据)时, 本工具不做任何认定、也不给任何结论,打印缺什么并以退出码 3 结束 —— 不会把"没查"说成"通过"。
结论怎么读
- 每份材料一行:
[结论] 材料名|问题 N 项(P0/P1/P2)|每一项:通过 / 有问题(n) / 未执行; - 有价值的是问题明细:每条都带
材料 + 检查项 + 来源文件:行号 + 类别 + 具体数字, 第三方可以拿同一份材料复算; - 本包的内置样例里,有 7 项的样例本身就是有问题的材料(合同主体不一致、条款缺条、
投标报价分项算术不平、绝对化用语、重复发票号、三单字段不一致、单单不一致),
所以
--sample会照实报出这些结论 —— 那是这些成员样例的真实结论,不是误报; 另外 7 项在各自样例上是 0 条发现。
需要完整档时(可选)
本免费版是完整可用的核心产出,本版本不包含下面这些项:
- 跨材料体检台账(全部材料 × 全部 14 项检查合并成一张总表)
- 按风险排序的「能不能签 / 能不能付」处置清单(带材料名与原文文件行号)
- 跨材料共性问题归类(同一类问题命中 2 份及以上材料时合并成一条共性项)
- 体检报告导出(Markdown 与 CSV 文本,直接交给签字/付款复核环节)
同名工具的完整档是另一个独立商品(条款与条件以它自己的商品页为准);两档的差别就是上面这些,没有别的。
边界(请务必知道)
- 不判断某份发票/合同/单据是否真实、是否伪造、是否具备法律效力;
- 不代替审计程序、函证与税务鉴证,也不出具鉴证意见或法律意见;
- 不核验发票真伪(不查全国增值税发票查验平台、不比对税局数据),也不判断某笔支出能否税前扣除;
- 不读取财务软件 / 票税系统 / 合同管理系统的导出文件 —— 需要你先导出成文本,一份材料一个目录;
- 不判断合同条款是否公平、是否对我方有利,也不评价报价是否合理(只核你给的内容是否自洽)。
常见错法
- 把 14 张单据全塞进一个
=== 检查项 ===段里:每个检查项认的是自己那一段。 全部堆在一段时,只有能认出表头的那一项会跑,其余会如实标成「未执行」并报一条「材料只覆盖了一部分」, 那不是"查过了没问题"。 - 一份材料一个目录:
--input指向的目录里,每个子目录 = 一份材料。 把所有供应商的单据放进同一个子目录,会被当成一份材料,跨材料的差异与汇总也就无从谈起。 - 以为「未执行」=「通过」:某份材料只交了 3 张单据,那 3 项之外的 11 项是没有核, 结论里写的是「未执行」,并且会单独报一条覆盖缺口。
- 表头行被删掉:只贴数据行不贴表头,该项直接变成「未执行」(引擎认不出列的角色)。
- 拿
--sample的输出当自己的结论:样例只是让你确认「跑得通、格式对」, 真正的结论必须来自你自己的材料。
