> 通用会计凭证归档技能,适用于任意中小企业的月度会计凭证归档、附件匹配、分录生成与报表输出。
首次使用本技能处理某公司账务时,必须先引导用户完成公司配置,保存到 references/company-config.md。配置项:
| 配置项 | 说明 | 示例 |
|--------|------|------|
| 公司全称 | 用于发票购方/销方判断 | XX科技有限公司 |
| 银行存款科目 | 银行账户对应的科目编码 | 如100201=工商银行人民币 |
| 主要供应商列表 | 名称+预付科目+应付科目 | 如供应商A 112301/220201 |
| 主要客户列表 | 名称+合同负债编码 | 如客户甲 220401 |
| 会计制度 | 小企业/企业会计准则 | 企业会计准则 |
| 税率 | 增值税税率 | 13% |
| 特殊政策 | 免退税/一般纳税人等 | 外贸免退税 |
| 发票购方名称 | 销方名称用于判断fp/ckfp | 与公司全称一致 |
配置模板详见 references/company-config-template.md。
列出所有文件,按类型分类:
| 类型 | 文件特征 | 处理方式 |
|------|----------|----------|
| 凭证PDF | 含分录表格(摘要/科目/借方/贷方) | 提取编号→重命名 |
| 总账PDF | 多笔凭证合并的连续账簿 | 按凭证编号切割 |
| 银行回单PDF | 含金额/收款人/付款人/用途 | 按金额匹配凭证→切割 |
| 发票PDF | 文件名含dzfp_或发票相关 | 提取金额+购销方→匹配 |
| 报关单PDF | 含RT编号或合同号 | 按编号匹配凭证 |
| 报销附件 | 文件名含"报销"或金额 | 按金额匹配 |
| 合同/其他 | 无明确特征 | 按金额或摘要匹配 |
| JPG/PNG | 图片附件 | view_image识别后归类 |
从总账PDF中按凭证编号切割,每笔凭证独立输出。切割逻辑详见 references/ledger-splitting.md。
从凭证PDF提取编号和日期,统一重命名为 YYMMNNN.pdf:
记-NNN-X/Y)
YYYY-MM-DD)
YYMMNNN.pdf → 输出到目标目录
从凭证中提取银行存款科目金额,与回单逐页金额匹配,切割为 YYMMNNNyhls.pdf。
详见 references/bank-statement-splitting.md。
匹配规则:
提取发票金额+购方/销方,判断发票类型后匹配凭证。
详见 references/attachment-matching.md。
关键逻辑:
提取报关单RT编号(文本或view_image),按RT编号匹配凭证 → YYMMNNNgd.pdf。
按金额匹配凭证贷方。多笔报销可合计匹配。
生成汇总表 {N}账本汇总表.xlsx:
| 列 | 内容 |
|----|------|
| 凭证编号 | YYMMNNN |
| 文件名 | 完整文件名 |
| 类型 | 凭证/回单/发票/报关单等 |
| 说明 | 业务摘要 |
同时输出文件清单(编号排序 + 总数统计)。
归档完成后,自动从已归档凭证PDF提取分录,与分录模板规则做一致性校验。
详见 references/cross-validation.md,脚本 scripts/cross-validation.py。
从已归档凭证PDF提取分录,排除结转凭证,汇总科目发生额,生成利润表+现金流量表+科目明细。
详见 references/financial-report-generation.md,脚本 scripts/financial-report-generation.py。
| 后缀 | 含义 | 备注 |
|------|------|------|
| (无) | 凭证 | YYMMNNN.pdf |
| yhls | 银行回单 | yhls2/yhls3 = 附加凭证 |
| fp | 收到发票 | 优先fp{金额};金额不可读时用内容缩写 |
| ckfp | 开具发票 | ckfp{金额} |
| fpch | 发票拆分 | 多张发票对应同一凭证时 |
| gd | 报关单 | gd1/gd2 |
| ht | 合同 | — |
> 宁可多提示待确认,不可错误匹配。
以下情况必须标黄提示"待人工确认":
使用 pdfplumber 表格解析,按列位置提取:摘要(col0) / 科目(col1) / 借方(col2) / 贷方(col3)。
import pdfplumber, re
def extract_entries(voucher_path):
"""从凭证PDF提取分录"""
entries = []
with pdfplumber.open(voucher_path) as pdf:
for page in pdf.pages:
for table in page.extract_tables():
# 找表头确定列位置
for row in table:
cells = [str(c).replace('\n','').strip() if c else '' for c in row]
if '摘要' in cells[0]:
# 按表头索引提取后续数据行
...
# 提取分录行(科目编码 + 借方/贷方金额)
return entries
科目编码提取:re.search(r'(\d{4,8})', account_full) 从科目全名中搜索。
基于业务场景的决策树,详见 references/journal-entry-templates.md。
决策逻辑:
| 文件 | 用途 | 加载时机 |
|------|------|----------|
| references/company-config-template.md | 公司配置模板 | 首次使用 |
| references/bank-statement-splitting.md | 回单切割步骤 | 第4步 |
| references/attachment-matching.md | 发票匹配规则 | 第5步 |
| references/cross-validation.md | 交叉验证说明 | 第9步 |
| references/financial-report-generation.md | 报表生成说明 | 第10步 |
| references/journal-entry-templates.md | 会计分录模板库 | 写分录时 |
| references/ledger-splitting.md | 总账切割方法 | 第2步 |
| scripts/cross-validation.py | 交叉验证脚本 | 第9步 |
| scripts/financial-report-generation.py | 财务报表生成脚本 | 第10步 |
共 1 个版本