# 开票字段提取规则

## 什么时候读取

AI 需要从用户输入中推断税率、计算金额、校验字段格式，或判断发票类型时读取本文件。

---

## 税率推断规则

### 13% — 销售货物、有形动产租赁

| 关键词 | 典型商品 |
|--------|---------|
| 货物/商品/材料/配件/零件 | 各类实物商品 |
| 设备/机器/仪器/电子产品 | 机械设备、电器 |
| 食品/饮料/酒水/药品 | 食品医药 |
| 服装/家具/钢材/水泥/建材 | 服装建材 |
| 动产租赁/设备租赁 | 有形动产经营租赁 |

### 9% — 建筑服务、交通运输、不动产

| 关键词 | 典型服务 |
|--------|---------|
| 建筑/施工/装修/安装/工程 | 建筑安装 |
| 运输/物流/快递/搬运 | 交通运输 |
| 不动产/房屋/房租/土地 | 不动产 |
| 农产品/自来水/天然气 | 农产品等 |

### 6% — 现代服务、生活服务

| 关键词 | 典型服务 |
|--------|---------|
| 咨询/顾问/策划/技术/研发 | 咨询技术 |
| 软件/系统/SaaS/信息/数据 | 信息技术 |
| 设计/广告/营销/培训 | 文化创意 |
| 餐饮/住宿/旅游/物业 | 生活服务 |
| 会计/审计/法律/检测 | 鉴证服务 |
| 金融/保险/代理/中介 | 金融经纪 |

### 3% — 小规模纳税人

用户明确说"3%"或"小规模"时使用。

### 推断优先级

1. 用户明确指定的税率 → 最高优先
2. 商品名称关键词匹配 → 按上表
3. 多关键词冲突 → 取最相关（如"建筑材料"→13% 因为是货物销售）
4. 无法确定 → 展示常见选项让用户选

### 展示格式

```
根据商品名称"{goods_name}"，AI 推断：
- 适用税率：{X}%
其他常见税率：13%（货物）| 9%（建筑/交通）| 6%（服务）| 3%（小规模）
如税率不正确请告知，否则将按 {X}% 计算。
```

多个明细行时每行独立推断，一次性展示所有。

---

## 金额计算规则

### 已知含税金额

```
不含税金额 = round(含税金额 / (1 + 税率), 2)
税额 = 含税金额 - 不含税金额
```

### 已知不含税金额

```
税额 = round(不含税金额 × 税率, 2)
含税金额 = 不含税金额 + 税额
```

### 单价计算

```
不含税单价 = round(不含税金额 / 数量, 合理精度)
```

### 合计

```
totalAmount = sum(每行 amount)
taxAmount = sum(每行 taxAmount)
totalAmountWithTax = sum(每行 amountWithTax)
```

### 尾差处理

```
允许尾差 = |amountWithTax - amount - taxAmount| <= 0.06
```

超出范围提示用户核实。

---

## 校验规则

| 规则 | 说明 |
|------|------|
| 购方名称必填 | 所有发票类型 |
| 购方税号 | 专票必填；普票可选；无税号时强制普票 |
| 税号格式 | 15/18/20位，数字+大写字母。正则：`^[0-9A-Z]{15}$\|^[0-9A-Z]{18}$\|^[0-9A-Z]{20}$` |
| 明细至少一行 | details 不能为空 |
| 税率合法性 | 0 / 0.01 / 0.03 / 0.05 / 0.06 / 0.09 / 0.13 |
| 金额平衡 | amountWithTax = amount + taxAmount（允许尾差 ≤ 0.06） |
| 合计平衡 | 明细行 amount 之和 = totalAmount |

---

## 购方信息提取模式

| 用户表述 | 提取目标 |
|---------|---------|
| "给XX公司开票" / "购方XX" | purchaserName |
| "税号XXXX" / "纳税人识别号XXXX" | purchaserTaxNo |
| "地址：XX路XX号" | purchaserAddress |
| "电话XXX" | purchaserTel |
| "开户行XX银行" | purchaserBankName |
| "账号XXXX" | purchaserBankAccount |

### 从文档/图片提取

| 位置 | 提取目标 |
|------|---------|
| 合同甲方/乙方/购买方 | purchaserName |
| 统一社会信用代码 | purchaserTaxNo |
| 联系地址/通讯地址 | purchaserAddress |
| 联系电话 | purchaserTel |
| 开户银行 | purchaserBankName |
| 银行账号 | purchaserBankAccount |

---

## 商品明细提取

### 从 Excel 表头匹配

| 表头关键词 | 映射字段 |
|-----------|---------|
| 商品名称/品名/项目名称 | goods_name |
| 规格/规格型号 | specification |
| 单位/计量单位 | unit |
| 数量 | quantity |
| 单价/不含税单价 | unit_price |
| 金额/不含税金额/含税金额 | amount_raw |
| 税率 | tax_rate |

### externalDocumentNo 生成规则

用户未提供时自动生成：`AI-{YYYYMMDD}-{HHmmss}-{4位随机}`

用户提供合同号/订单号时优先使用。
