## Firefly III 导出适配

- **DDS-Section**: 9. Firefly III / Data Importer 适配设计
- **DDS-Lines**: L1048-L1132

### Extract

#### 两段式规则映射策略

**第一阶段 — ProjectMoneyX 负责**：
1. 字段级映射：异构字段 → 统一模型
2. 业务分类映射：对手方/描述 → 分类/标签
3. 商户名归一化：别名 → 统一名称

**第二阶段 — Firefly III 负责**：
1. 最后一层字段适配
2. 临时补充规则
3. 导入格式兼容

#### 导出模式

##### 模式 A：API 推送模式（优先）

```
Export Engine → Data Importer (POST /api/v1/import) → Firefly III
                                ↓
              返回成功/失败明细 → 更新 import_results 表
```

##### 模式 B：中间文件导出模式

- 生成完全符合 Data Importer 规范的标准 CSV / JSON
- 用户手动下载后在 Data Importer 中执行导入
- 适合 API 不可用或权限受限场景

#### Firefly 交易类型映射

| 内部 Direction | Firefly Type | 说明 |
|----------------|--------------|------|
| `expense` | `withdrawal` | 支出 |
| `income` | `deposit` | 收入 |
| `transfer` | `transfer` | 内部转账 |
| `refund` | `deposit` | 退款（作为收入处理） |
| `fee` | `withdrawal` | 手续费（作为支出处理） |

#### ImportResult 数据结构

```go
type ImportResult struct {
    TaskID        string
    TransactionID string
    Status        string    // success / failed
    ErrorCode     string
    ErrorMessage  string
    FireflyTxnID  string    // Firefly III 返回的交易 ID
    RetryCount    int
    CreatedAt     time.Time
}
```

#### 导入后反馈

- 导入成功/失败数量统计
- 失败原因分类展示（字段缺失、格式错误、账户不存在等）
- 失败记录可单独重试（无需整批重做）
