# 费用申请审批财务规则概念文档

## 功能一句话

在财务规则中心新增《公司费用申请审批规则》，统一维护业务招待、办公用品和通用大额费用的事前申请与审批阈值，并让报销风险规则引用该规则执行。

## 背景与问题

现有系统已经有“业务招待无申请”“办公采购无申请”“大额费用无申请”等风险规则，但制度依据主要以风险规则 JSON 的口径字段存在，财务规则中心缺少一张可被制度管理员查看、编辑和追溯的规则表。

用户明确要求：

- 业务招待费超过 500 元需要申请。
- 大额办公用品需要申请。
- 金额超过 2000 元的费用都需要走审批。
- 这些要求最好形成财务规则，而不是散落在代码或前端提示中。

## 目标与非目标

目标：

- 新增一张财务规则资产《公司费用申请审批规则》。
- 规则资产以 Excel 形式进入 `finance-rules` 规则库，并在规则中心按“财务规则”展示。
- 风险规则引用统一的 `finance_rule_code`，不再使用零散口径 code。
- 报销阶段按结构化金额规则判断，而不是只靠关键词命中。
- 关联有效申请单后不触发“缺少申请”风险。

非目标：

- 本轮不新增数据库字段。
- 本轮不新增非本体业务字段。
- 本轮不改造完整审批流节点，只补充申请前置与风险执行依据。

## 用户与场景

- 报销人：上传或录入业务招待、办公用品、大额费用报销时，系统自动识别是否缺少事前申请。
- 直属领导和财务审核人：审核单据时能看到风险来自财务规则。
- 财务制度管理员：能在规则中心看到并维护《公司费用申请审批规则》。

## 功能能力

### 财务规则表

规则表包含以下行：

- 业务招待费：单次费用金额大于 500 元时，必须先提交费用申请单。
- 办公用品费：单次或批量采购金额大于 2000 元时，必须先提交办公采购或费用申请单。
- 通用大额费用：任意费用金额大于 2000 元时，必须进入审批流程。

### 风险规则执行

- `meal` 与 `entertainment` 都视为业务招待费。
- `office` 视为办公用品费。
- `all` 视为通用大额费用。
- 报销阶段没有关联有效申请单时，超过阈值命中高风险。
- 已有关联申请单时，不命中缺少申请风险。

## 方案设计

### 后端

- 在 `agent_asset_spreadsheet.py` 中新增费用申请审批规则 code 与文件名常量。
- 在财务规则同步中新增该资产的 metadata、Excel 工作簿生成和版本快照。
- 在初始化和补齐逻辑中创建该财务规则资产，确保老库和新库都能看到。
- 将三条风险规则改为 `composite_rule_v1`，使用金额阈值和申请单存在性执行。
- 在 `risk_rule_template_executor.py` 中补齐 `application.*` 字段解析，桥接现有 `application_link` / `application_handoff` / `application_detail` 风险上下文。

### 前端

本轮不新增前端页面。规则中心已有财务规则和 JSON 风险规则展示能力，后端资产同步后前端可直接展示。

### 数据与本体

本轮只使用现有本体字段：

- `expense_type`
- `amount`
- `reason`
- `application_claim_id`
- `application_claim_no`
- `application_detail`

不新增非本体字段。

## 算法与公式

业务招待费规则：

$$
hit = expenseType \in \{meal, entertainment\} \land amount > 500 \land \neg hasApplication
$$

办公用品规则：

$$
hit = expenseType = office \land amount > 2000 \land \neg hasApplication
$$

通用大额规则：

$$
hit = amount > 2000 \land \neg hasApplication
$$

其中：

- `amount` 来自 `claim.amount`。
- `hasApplication` 来自 `application.id`、`application.claim_no` 或等价申请单上下文。

## 测试方案

- 单元测试：验证 `application.*` 字段能从已有申请关联上下文解析。
- 规则执行测试：超过 500 元业务招待费且无申请命中风险。
- 规则执行测试：超过 2000 元办公用品费且无申请命中风险。
- 规则执行测试：超过 2000 元通用费用且无申请命中风险。
- 规则执行测试：已关联申请单的超额费用不命中缺少申请风险。
- 资产测试：规则中心种子数据包含《公司费用申请审批规则》，且 `config_json.tag` 为“财务规则”。

## 指标与验收

- 财务规则中心能看到新增规则资产。
- 新增资产 `finance_rule_code` 统一为 `expense.preapproval.policy`。
- 三条风险规则均引用该财务规则 code。
- 容器内后端定向测试通过。
- 不新增非本体业务字段。

## 风险与开放问题

- “大额办公用品”的金额阈值按用户同句“大额/超过 2000 都需要审批”落为 2000 元。
- 当前申请单上下文主要存在 `risk_flags_json` 的申请关联 flag 中，本轮先补执行器解析，不新增外键字段。
- 后续如果要支持不同部门或不同职级阈值，可以在同一张财务规则表中扩展分档行。
