# 个人账派生与财务总览口径

更新时间：2026-06-12  
实现位置：`backend/src/services/ledger-service.js`  
设计依据：`docs/一期业务事实模型与基础表结构草案.md` 第 10 章、《用户新想法记录》03/04 条

## 1. 核心原则

**个人账不是底层事实表。** 数据库里没有"个人账流水表"；个人账是每次查询时从基础事实（报销、资金流水、核销关联）实时派生的计算结果。基础事实改了，个人账自动跟着变，不存在两套账对不上的问题。

个人账余额的业务含义：**公司（各主体合计）当前应付给这个人的钱**。

## 2. 派生公式

```text
个人账余额 = [+] 报销待打款 + [+] 个人注资 + [+] 个人代付 − [−] 公司还个人
```

| 分量 | 方向 | 取数口径 |
|---|---|---|
| 报销待打款 | + | `reimbursement_order` 中 payee 为个人、状态 `APPROVED` 的未付金额（`total_amount − 已核销打款`）。打款核销到 `PAID` 后该单自动归零退出个人账。同时给出无票/有票明细拆分：无票部分即原"个人公共账"口径。 |
| 个人注资 | + | `fund_transaction` 中 `direction=IN`、来源 `src_personal_injection`、付款人为个人主体的流水（如个人打 50 万到公司）。 |
| 个人代付 | + | 两类：① 个人作为付款人核销公司应付（`payable_settlement` 关联流水的 payer 是个人）；② 直接登记为 `src_personal_advance` 来源、未挂应付的个人流出。 |
| 公司还个人 | − | `fund_transaction` 中 `direction=OUT`、来源 `src_company_repay_person`、收款人为个人的流水，**报销打款除外**——报销打款已通过"报销待打款"分量自动抵减，再扣会重复计算。 |

补充规则：

- 个人主体的判定：`subject.subject_type_id = 'stype_person'`；
- `REVERSED`（已冲销）状态的流水不参与任何分量；
- 每个分量都按公司主体拆分，可以看到"哪个公司欠这个人多少"；
- 每条派生明细都带来源单据号（报销单号/流水号/应付编号），可以追溯回原始事实。

## 3. 典型场景对账

| 场景 | 入账动作 | 个人账变化 |
|---|---|---|
| 无票报销审批通过 | 报销单 `APPROVED` | +（计入"报销待打款"，无票拆分项） |
| 报销打款 | `POST /api/reimbursements/:id/payments` → `PAID` | 该单未付归零，个人账自动减少 |
| 个人注资 50 万 | `finance_record_fund_transaction`，IN + `src_personal_injection` | +500,000 |
| 公司归还注资 | `finance_record_fund_transaction`，OUT + `src_company_repay_person` | −归还金额 |
| 个人垫付供应商货款 | 应付建档 + `finance_settle_obligation`（payer 传个人） | +垫付金额 |
| 公司把垫付还给个人 | OUT + `src_company_repay_person` | −还款金额 |

## 4. 接口与看板

- API：`GET /api/dashboards/personal-ledger`（可带 `person_subject_id`）；
- MCP 工具：`finance_personal_ledger`；
- 看板：财务看板中心「个人帐」页，按人展示余额、四个分量、按公司拆分和来源明细。

## 5. 财务总览口径

`GET /api/dashboards/finance-overview`（看板「财务总览」页 / MCP `finance_overview`）：

| 指标 | 取数 |
|---|---|
| 资金账户余额 | `cash_account_balance_view`：期初 + IN 流入 − OUT 流出（按账户、按主体、总计） |
| 月度收支 | `fund_transaction` 按月汇总 IN/OUT（默认近 6 个月，REVERSED 除外） |
| 应收未收 | `receivable_summary.outstanding_amount` 合计（VOID 除外） |
| 应付未付 | `payable_summary.outstanding_amount` 合计（VOID 除外） |
| 报销待打款 | `APPROVED` 状态报销单未付金额合计 |
| 合同回款进度 | `commercial_order_summary`：合同总额 / 关联应收 / 已收 |
| 按主体汇总 | 每个公司主体的现金余额、应收未收、应付未付、报销待打款 |

## 6. 已知边界（后续迭代）

1. 报销部分付款时，无票/有票拆分按明细全额展示，未按付款比例摊薄——一期可接受，月度结算时人工复核；
2. 个人账暂不按项目维度拆分（按人/按公司两级），需要时可在 ledger-service 上加 project 维度；
3. 月结锁定/快照尚未实现，个人账随时反映最新事实；
4. `TRANSFER`（内部转账）和 `REFUND`（退款）方向的流水暂不进入个人账派生。
