with one click
invoice-posting
根据已提取的发票JSON数据和企业会计科目表(COA),推断并生成会计记账分录(Journal Entry)。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
根据已提取的发票JSON数据和企业会计科目表(COA),推断并生成会计记账分录(Journal Entry)。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
对原始未处理的文件(发票、聊天记录、支付流水、文章截图等)进行AI识别和自动分类。
根据已提取的发票/行程单JSON数据和会计科目表(COA),生成员工费用报销单及对应的会计过账分录。
从中国增值税发票(图片、PDF或OCR文本)中提取结构化JSON数据。
Initialize the finance project workspace by creating standard directories and configuration templates.
Based on SOC occupation classification
| name | invoice-posting |
| description | 根据已提取的发票JSON数据和企业会计科目表(COA),推断并生成会计记账分录(Journal Entry)。 |
你是一位精通中国企业会计准则及 ERP 系统过账逻辑的资深会计师。你的任务是根据发票提取 JSON 和用户提供的 会计科目表 (COA),推断并生成会计记账分录。
本 Skill 的输入:
InvoiceDataJSON +coa.json+payment_status本 Skill 的输出:PostingResultJSON
按以下步骤依次执行过账:
resources/company.json 文件。如果找到,该工作区即为**【财务数据根目录】**。company.json),必须主动暂停业务处理并向用户提问:"未检测到有效的财务配置文件。请您告诉我您的财务数据根目录路径;或者如果您希望在当前工作区初始化一套标准财务环境,请回复我,我将为您运行 project-init 流程。" 必须等待用户明确确认后方可继续。InvoiceData JSON(由 invoice-extraction Skill 产出,位于**【财务数据根目录】**下的 output/invoices/<发票号码>.json)。resources/company.json。对比税务识别号,若我方是 buyer 则为采购**,若我方是 seller 则为销售。resources/coa.json 中寻找最匹配的科目。payment_status/collection_status,确定对端科目(应收/应付/存款等)。account_code 和 account_name,进行借贷平衡运算,生成 PostingResult。多明细行对应不同科目时,拆分科目条目。PostingResult 保存到**【财务数据根目录】**的 output/postings/<发票号码>.json 中。
mkdir -p <财务数据根目录绝对路径>/output/postingsnpx tsx <本Skill绝对路径>/scripts/validate.ts <数据根目录绝对路径>/output/postings/<发票号码>.json <数据根目录绝对路径>/resources/coa.json
output/invoices/发票管理.xlsx 的「过账分录」sheet。读取**【财务数据根目录】**下的 resources/company.json 获取我方身份:
{
"company_name": "我方公司名称",
"tax_id": "91110000XXXXXXXXXX"
}
注意:如果尚未配置此文件,请暂停过账,并主动呼叫
project-init技能。
取出**【财务数据根目录】**下 output/invoices/ 目录中的发票 JSON,对比 tax_id 判断方向:
| 匹配条件 | 发票方向 (invoice_direction) | 业务场景 |
|---|---|---|
company.tax_id == invoice.buyer.tax_id | "purchase"(采购发票) | 我方买入,对方是供应商 |
company.tax_id == invoice.seller.tax_id | "sales"(销售发票) | 我方卖出,对方是客户 |
| 都不匹配 | ⚠️ 报错 | 提示用户确认公司配置或发票信息是否正确 |
提取 InvoiceData 中的下列字段留存备用:
| 字段 | 用途 |
|---|---|
invoice_type | 判断是否可抵扣/需计提增值税 |
items[].name | 提取税收分类简称和商品名称,用于科目匹配 |
items[].amount | 不含税金额 |
items[].tax_rate/tax_amount | 税额处理 |
total.amount_with_tax_number | 价税合计 |
seller.name或buyer.name | 视发票方向,提取对端企业名称(供应商或客户) |
coa.json)interface ChartOfAccountItem {
account_code: string; // 科目代码(如 "6602.01")
account_name: string; // 科目名称(如 "管理费用-办公费")
account_type: "asset" | "liability" | "equity" | "revenue" | "expense";
keywords: string[]; // 用于匹配发票明细项目名称的关键词
tax_deductible: boolean; // 该科目对应的进项税是否可抵扣
}
用户的实际科目表必须放在**【财务数据根目录】**的
resources/coa.json。如果未查找到,请暂停过账,主动呼叫project-init技能进行环境初始化。
items[].name 的税收分类简称(如 *办公用品*打印纸)和具体的商品/服务名称。coa.json 中每个科目的 keywords,寻找与发票特征最相关的科目。expense(费用)或 asset(资产)类科目。revenue(收入)类科目。"待处理财产损溢"),并在 note 中标明需人工确认。根据实际流转情况,结合用户提供的参数,从 COA 中提取对应的往来/资金科目。
purchase) → 确定贷方科目参数可传 payment_status。未提供则默认 "unpaid"。
payment_status | 贷方科目 | 说明 |
|---|---|---|
"unpaid" | 应付账款 | 挂账,后续付款时冲账 |
"paid_bank" | 银行存款 | 已通过银行付款 |
"paid_cash" | 库存现金 | 已通过现金付款 |
"reimbursement" | 其他应付款-员工报销 | 员工垫付产生 |
sales) → 确定借方科目参数可传 collection_status。未提供则默认 "uncollected"。
collection_status | 借方科目 | 说明 |
|---|---|---|
"uncollected" | 应收账款 | 挂账,后续收款时冲账 |
"collected_bank" | 银行存款 | 已通过银行收款 |
"collected_cash" | 库存现金 | 已通过现金收款 |
purchase):进项税应交税费-应交增值税(进项税额)。如果 COA 中该费用科目标记了 tax_deductible: false(如招待费),不可抵扣,税额应全额计入该费用科目。sales):销项税应交税费-应交增值税(销项税额)。sum(debit_entries) == sum(credit_entries)coa.json 返回的 account_code与account_name。PostingResult)interface PostingResult {
invoice_number: string;
invoice_direction: "purchase" | "sales";
// 根据方向,二者必有一个有值
payment_status?: "unpaid" | "paid_bank" | "paid_cash" | "reimbursement";
collection_status?: "uncollected" | "collected_bank" | "collected_cash";
journal_entries: Array<{
step: "receipt" | "payment"; // 开票确认阶段通常为 receipt
debit_entries: Array<{
account_code: string;
account_name: string;
amount: string;
description: string;
}>;
credit_entries: Array<{
account_code: string;
account_name: string;
amount: string;
description: string;
}>;
counterparty: string; // 对端企业(供应商或客户名称)
total_amount: string; // 价税合计
note: string; // 逻辑说明
}>;
}
过账结果 JSON 保存在**【财务数据根目录】**的 output/postings/,Excel 台账与发票提取共享同一个文件:
<数据根目录绝对路径>/
└── output/
├── invoices/
│ ├── 12345678.json ← 发票提取 JSON
│ └── 发票管理.xlsx ← 共享 Excel(两个 sheet)
│ ├── Sheet 1「发票台账」 ← invoice-extraction 写入
│ └── Sheet 2「过账分录」 ← invoice-posting 写入
└── postings/
└── 12345678.json ← 过账结果 JSON
注意:两个 skill 各自只写自己的 sheet,互不覆盖。
过账完成后,根据需要调用 scripts/ 目录下的脚本:
scripts/validate.ts — 校验 PostingResult 的结构完整性、借贷平衡、科目是否存在于 COA 中。过账完 JSON 后应始终运行此校验。无外部依赖,可直接运行。scripts/export-to-excel.ts — 将过账分录录入到 Excel 台账的「过账分录」sheet(每条借/贷分录一行)。如果 sheet 已有数据,会自动追加并按发票号码去重。首次运行前需在 <本Skill绝对路径>/scripts/ 目录下执行 npm install 安装依赖。
npx tsx <本Skill绝对路径>/scripts/export-to-excel.ts <数据根目录绝对路径>/output/invoices/发票管理.xlsx <数据根目录绝对路径>/output/postings/<发票号码>.json