DriftLedger/plan.md
2026-07-13 13:34:27 +08:00

63 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Beancount 移动端:复式记账与账单自动记账方案
## 摘要
面向已有 Beancount 账本的个人用户,开发 iOS/Android 应用。账本文件是唯一权威来源:应用读取现有 `.bean` 文件,并将手机确认的新交易追加到独立的 `mobile.bean`。自动记账采用“导入账单 → 规则生成复式分录草稿 → 用户确认入账”,不申请短信权限、不自动提交未确认交易。
首版不做实时 Git/WebDAV 双向同步、OCR、AI 直接记账、投资 lot 完整计算或团队协作。
## 核心实现
- 使用 React Native + TypeScript + Expo CNG自定义开发构建支持 iOS 与 Android本地以加密 SQLite 保存账本索引、导入记录、规则和草稿缓存,原始 `.bean` 文件仍为唯一权威数据。
- 首次打开时导入账本包(主文件及其 `include` 引用的文件);应用解析账户、交易、商品、价格和余额断言,建立只读查询索引。
- 要求用户在主账本中一次性加入 `include "mobile.bean"`。应用只创建、编辑或删除 `mobile.bean` 内的分录,绝不改写桌面维护的源文件。
- 导出时输出完整账本包及更新后的 `mobile.bean`;用户可通过 Files/iCloud/Android 文件选择器交回其原有同步方式。首版不做后台文件监听或并发合并。
- 使用 Tree-sitter 提供 Beancount 语法树解析;复式规则由独立账务层执行:
- 交易必须至少有两条 posting
- 同币种显式金额 posting 必须平衡;
- 账户必须已 `open`
- 金额采用 Decimal/字符串定点表示,禁止浮点计算;
- 不支持或无法安全解释的高级指令、插件与复杂库存交易保留原文并标记为“只读兼容”,不允许移动端修改。
- 应用公开的领域接口固定为:
- `parseLedger(files) -> LedgerIndex | ParseDiagnostics`
- `validateTransaction(draft, ledger) -> ValidationResult`
- `importStatement(file, adapter) -> ImportedEvent[]`
- `classify(event, rules, ledger) -> TransactionDraft`
- `commitMobileTransaction(draft) -> mobile.bean diff`
- `exportLedgerBundle() -> zip`
## 自动记账流程
- 首版支持可版本化的账单适配器:支付宝 CSV、微信支付 CSV、银行卡 CSVExcel 仅在格式等同 CSV 时支持。PDF 账单不纳入首版。
- 每个适配器统一输出 `ImportedEvent`:交易时间、金额、币种、收付款方向、渠道账户、交易对手、备注、外部流水号和原始字段。
- 导入后按“渠道 + 外部流水号”去重;缺少流水号时,以日期时间、金额、方向、对手方和备注生成指纹,并提示可能重复项。
- 规则按优先级匹配:渠道账户、收付款方向、对手方关键词、备注关键词、金额区间、币种。规则输出目标账户、对方账户或分类、标签、摘要和置信度。
- 未匹配规则时,生成含 `Expenses:Uncategorized``Income:Uncategorized` 的草稿;用户必须选择或确认分类后才能写入。
- 转账识别仅在金额、币种一致且时间差在 3 天内的两条相反流水之间执行;生成 `Assets:* ↔ Assets:*` 分录,并要求用户确认。
- 确认交易写入 `mobile.bean`,并保留导入事件与生成交易的关联;用户可从一笔已确认交易反查源账单及命中规则。
- 用户在确认页手工修正账户、金额、日期、摘要或分录后,可选择“保存为规则”;规则只对之后导入的账单生效,不回写历史交易。
## 页面与交互
- `账本`:导入账本、解析状态、`mobile.bean` 写入状态、导出账本包。
- `记账`:支出、收入、转账、手工复式分录;默认提供借贷平衡提示。
- `导入`:选择账单文件、选择适配器、字段预览、重复项处理、草稿确认队列和导入结果。
- `规则`:按优先级管理自动分类规则,展示最近命中次数与示例。
- `账户与报表`:账户树、账户明细、未分类交易、月度收支和净资产;仅基于已解析且有效的分录计算。
- `诊断`:展示 Beancount 文件语法/账务错误、未识别指令与无法写回的原因;错误不阻断阅读,但阻断受影响账本的写入。
## 测试与验收
- 账务单测覆盖:平衡/不平衡分录、Decimal 精度、多币种隔离、关闭账户、未知账户、转账、编辑和删除 `mobile.bean` 内交易。
- 解析兼容测试使用公开 Beancount 示例及中文账户名;要求未支持内容不丢失、导出后仍保留原始文本。
- 每个账单适配器使用脱敏固定样本,覆盖收入、支出、退款、手续费、转账、重复流水和字段缺失。
- 端到端测试覆盖:导入账本 → 导入支付宝账单 → 命中规则 → 修改草稿 → 确认 → 导出 → 桌面端 Beancount 校验通过。
- 上架前在 iOS/Android 真机验证离线记账、数据库加密、文件导入导出、应用锁和崩溃恢复;不申请 SMS、全盘存储或后台读取权限。
## 默认假设
- 默认主币种为 CNY但账本可含其他货币首版只对同币种交易做自动平衡校验不自动推导汇率、成本或库存。
- `mobile.bean` 是仅由移动端维护的追加文件;桌面端交易在首版只读。
- 用户负责将导出的账本包同步回 Git、WebDAV、iCloud 或其他已有方案;实时多端同步属于下一阶段。