核心技能:自动接收、分类并命名会计凭证(发票、银行对账单),按客户/年度归档。
技能组织文件: 域名数据库编辑员是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
organisation-documents会计领域的入口引擎。接收 → 客户识别 → 归档 → 索引 → 生成报告。 实际工作由
scripts/main.py完成(该脚本调用scripts/extract.py)。本 skill 的作用仅限于:何时启动该脚本,以及如何与会计师对话。
每次调用时,唯一正确的归档操作是执行以下命令:
python3 scripts/main.py
然后读取 并将内容转达给会计师。
invoice_id 提取为 "N"、"des"、"um-rix",而非正确值 F1-2026-0001;total_ttc 提取为 0.00,而非真实金额)。此类错误将直接导致后续 rapprochement-bancaire 对账失败。/ 目录下(move / copy / write)。该操作应完全由脚本完成。invoice_id 时自行编造。 若 extract.py 未能提取,则脚本会写入 SANS-NUM;请勿尝试根据发票开具方名称或描述等信息“优化”生成编号。_report.json 文件。questions 字段非空时一并提出开户引导问题。向会计师准确报告错误详情(stderr)。切勿 手动补救归档——这正是导致文件名损坏的根源。若缺失 pdftotext 二进制(poppler-utils 未安装),请明确告知并中止流程。
为何该规则如此严格?我们已多次遇到模型擅自归档并生成虚假
invoice_id(如N、des、um-rix)的情况。每次都会触发rapprochement-bancaire报告误判的facture_manquante(缺失发票),迫使会计师耗费时间排查。而脚本绝不会出现此类错误。
面对所有新进文档时的默认响应流程:
不适用于:FEC(→ fec-parser)、催款函(→ relances)、银行对账(→ rapprochement-bancaire)。
python3 scripts/main.py[ ] # racine_clients 默认路径:~/.openclaw/workspace/clients
脚本执行以下步骤:
_index.json 忽略已归档文件)。scripts/extract.py 提取每个 PDF(调用 pdftotext -layout + 确定性规则)。所有金额、编号、名称均严格来自原文,绝不臆造。clients.json 条目(statut: auto-from-bank-statement),并将对账单归入 ///bank-statements/ 。clients.json 进行比对(先精确匹配,再模糊匹配 ≥ 0.82):invoices/out/;收件方 ≈ 客户 → 归入 invoices/in/。_a-identifier/,并在报告中添加一条识别问题(参见下方开户引导说明)。_a-identifier/ 并添加问题(罕见情况)。_incomplet/,并在报告中标记。_non-attribue/。clients/clients.json、clients/_index.json、clients/_report.json,并打印摘要。执行完毕后,请读取 clients/_report.json 并执行以下操作:
_report.json → questions 非空 → 将其中问题提交会计师(参见格式规范);_report.json → incomplete 非空 → 向会计师指出这些文档;_a-identifier/_incomplet)的发票或对账单,可认为后续 rapprochement-bancaire 处理已被触发(批次任务本身也会自动覆盖全部客户)。三个可信信号,按优先级排序(均由脚本处理):
contacts[].email,或域名 ∈ domains,或文档中的 SIREN ∈ 某客户的 siren 列表。clients.json)→ 仅当开具方与收件方中仅有一方匹配时启用。若无任何可信信号 → 绝不猜测。文档进入 _a-identifier/,由会计师一次性裁定。
一张发票始终包含两家企业(开具方、收件方)。当两者均未知,且无对账单覆盖其中任一方时,脚本不会自行选择,而是将文档放入 _a-identifier/ 并添加一条识别问题。
第一步(自动) — 问题出现在 _report.json → questions 中:
「文档:发票
TUYO-2024-087(含税金额 348.50 €)。开具方「TUYO SARL」,收件方「Corse Plomberie」。哪一方是您的客户?」
模型需将该问题转达会计师。此时不得修改 clients.json。
第二步(会计师回复后) — 当会计师确认「是 X」时:
clients.json 中新增或补充 X 的条目:{ "slug": "", "raisonSociale": "X", "statut": "confirmed",
"confiance": 1.0, "aValider": false,
"siren": [""], "contacts": [{"email": ""}],
"domains": [""], "sources": ["accountant-confirmation"] }
python3 scripts/main.py clients/_a-identifier :由于 X 已存在于 clients.json,关联文档将被正确归档(in/out 方向明确),并移出 _a-identifier/ 目录。此后,来自同一发件人(相同邮箱)的所有新文档将自动归属该客户。
将该文档从 _a-identifier/ 移至 _non-attribue/。无需进一步会计处理。
clients.json — 结构说明[
{
"slug": "corse-plomberie",
"raisonSociale": "Corse Plomberie",
"statut": "auto-from-bank-statement | confirmed",
"confiance": 0.9,
"aValider": false,
"siren": ["812345678"],
"contacts": [{ "email": "jeanmichel@gmail.com" }],
"domains": ["corseplomberie.fr"],
"sources": ["bank-statement"]
}
]
该文件仅由本 skill 构建与维护(通过 scripts/main.py 及开户引导期间的手动补充)。其他任何 skill 均不得写入此文件。会计师不得手动编辑:其职责仅为回答识别问题。
clients/ ├── clients.json ← 客户列表(源自对账单推导 + 人工确认) ├── _index.json ← sha256 → 已归档路径(去重依据) ├── _report.json ← 最近一次执行的报告 ├── _a-identifier/ ← 客户尚未确认的发票(正在开户引导中) ├── _incomplet/ ← 提取失败的文档(缺少日期 / 含税金额) ├── _non-attribue/ ← 无法识别为发票或对账单的文档 ├── _cabinet/ ← 事务所内部文档 └──/ └── / / ├── bank-statements/ │ └── _ .pdf └── invoices/ ├── in/ │ └── _ _ _ .pdf └── out/ └── _ _ _
文件命名规范(由脚本自动生成,严禁手动构造):
N°Facture:PDF 中提取的真实编号(如 F1-2026-0003),仅含字母、数字及短横线;缺失时为 SANS-NUM。Contrepartie:另一方名称中前 14 个有效字符(去除重音符号与空格)。MontantTTC:小数点分隔,无千位分隔符,无货币符号(如 3336.78)。AAAA-MM-JJ:文档签发日期。extract.py)RELEVÉ DE COMPTE/EXTRAIT DE COMPTE/ACCOUNT STATEMENT,或银行名称 + RELEVÉ,或含 Solde d'ouverture/Solde de clôture。
例外:若文档同时含 FACTURE/INVOICE 且含 SIRET/TVA → 视为发票。FACTURE/INVOICE/BON DE FACTURATION · 含 SIRET/TVA/SIREN 的区块 · 收件方区块(FACTURÉ À/DESTINATAIRE/BILL TO)· TOTAL HT/TOTAL TTC/NET À PAYER。_non-attribue/。pdftotext、regex、SHA-256、pipeline、extract.py、系统绝对路径。_a-identifier/、_incomplet/、_non-attribue/ 均保留原始单据。_incomplet/,不填臆造值。对于每张/每份已归档至真实客户目录(非 _a-identifier/ 或 _incomplet/)的发票或对账单,rapprochement-bancaire 状态引擎将自动接管。请发出如下指令:
{ "trigger": "rapprochement-bancaire", "client": "" }
(批次任务本身会扫描全部客户;此触发仅用于加速处理。)
关于催款函:切勿直接调用。最多输出:
{ "trigger_suggestion": "relances", "reason": "invoice status may require update" }
organisation-documents = 入口引擎 — 归档单据、识别客户(通过对账单或提问)、维护 clients.json rapprochement-bancaire = 状态引擎 — 执行对账、重建会计状态 relances = 延迟决策引擎
机械性工作交由脚本完成。本 skill 的核心职责是决定何时启动脚本,以及如何向会计师清晰传达结果。