# SDD-002　DFD 與流程分解

| 項目 | 內容 |
|---|---|
| 文件編號 | SDD-002 |
| 版本 | 1.0 |
| 狀態 | 已核定 |
| 撰寫者 | SD |
| 審查者 | SA / BA |
| 對應需求 | AUT-1.1~1.3、ISS-2.3~2.13、ACQ-4.1~4.6、SYS-3 |

---

## 1. 說明

本文件以**資料流圖（Data Flow Diagram）**分解系統流程，層級如下：

| 層級 | 內容 | 用途 |
|---|---|---|
| L0 | 系統上下文（與外部實體之資料流） | 界定系統邊界 |
| L1 | 主要處理程序（7 個） | 界定服務群組 |
| L2 | 關鍵處理程序細分 | 對應用例與 Sequence |

**符號約定**：本文件以 Mermaid `flowchart` 表達 DFD。
圓角節點＝處理程序（Process）；方形節點＝外部實體（External Entity）；
資料庫柱狀節點以 `[( )]` 表達資料存放（Data Store）。

---

## 2. DFD Level 0　系統上下文

```mermaid
flowchart LR
  CUST(["持卡人"])
  MERC(["特店 / 收單機構"])
  ORG(["卡組織"])
  TICK(["票證公司"])
  CH(["數位通路"])
  CRED(["徵審系統"])
  CORE(["銀行核心"])
  GLS(["總帳系統"])
  HSM(["HSM"])
  NOTI(["通知通道"])

  P0["信用卡核心系統"]

  CH -->|"申請、查詢、繳款指令"| P0
  P0 -->|"帳務、點數、額度查詢結果"| CH
  CUST -->|"交易"| MERC
  MERC -->|"授權 / 請款"| P0
  P0 -->|"授權回應 / 撥款"| MERC
  ORG -->|"授權 / 清算檔"| P0
  P0 -->|"授權請求 / 清算結果"| ORG
  TICK -->|"加值 / 餘額"| P0
  P0 -->|"加值指令"| TICK
  P0 -->|"徵信查詢"| CRED
  CRED -->|"評分 / 核決"| P0
  P0 <-->|"CIF / 存款帳號"| CORE
  P0 -->|"會計分錄"| GLS
  P0 <-->|"金鑰 / PIN 驗證"| HSM
  P0 -->|"通知內容"| NOTI
```

---

## 3. DFD Level 1　主要處理程序

```mermaid
flowchart TD
  E1(["持卡人 / 特店 / 卡組織"])

  P1["P1 授權處理"]
  P2["P2 帳務處理"]
  P3["P3 額度處理"]
  P4["P4 卡片與客戶處理"]
  P5["P5 帳單與繳款處理"]
  P6["P6 權益與分期處理"]
  P7["P7 清算與爭議處理"]

  D1[("D1 授權資料")]
  D2[("D2 帳務資料")]
  D3[("D3 額度資料")]
  D4[("D4 卡片與客戶資料")]
  D5[("D5 帳單與繳款資料")]
  D6[("D6 點數與分期資料")]
  D7[("D7 清算與爭議資料")]

  E1 -->|"授權請求"| P1
  P1 -->|"授權回應"| E1
  P1 -->|"佔用請求"| P3
  P1 -->|"授權紀錄"| D1
  P1 -->|"授權核准事件"| P2

  E1 -->|"請款檔"| P2
  P2 -->|"入帳結果"| D2
  P2 -->|"釋放佔用"| P3
  P2 -->|"帳務事件"| P5
  P2 -->|"帳務事件"| P6
  P2 -->|"帳務事件"| P7

  P3 -->|"額度異動"| D3
  P3 -->|"額度快照"| P1

  P4 -->|"卡片 / 客戶主檔"| D4
  D4 -->|"卡片狀態"| P1
  D4 -->|"歸戶資訊"| P5

  P5 -->|"帳單資料"| D5
  P5 -->|"繳款結果"| E1
  P5 -->|"恢復額度"| P3
  P5 -->|"繳款入帳"| P2

  P6 -->|"點數 / 分期"| D6
  P6 -->|"佔用請求"| P3
  P6 -->|"攤還入帳"| P2

  P7 -->|"清算 / 爭議"| D7
  P7 -->|"沖正請求"| P2
```

### 3.1 處理程序與服務對照

| 處理程序 | 服務 | 主要資料存放 |
|---|---|---|
| P1 授權處理 | `authorization-service` | D1 `auth.*` |
| P2 帳務處理 | `posting-service`、`pricing-service` | D2 `posting.*`、`pricing.*` |
| P3 額度處理 | `limit-service` | D3 `lim.*` |
| P4 卡片與客戶處理 | `card-service`、`party-service`、`product-service` | D4 `card.*`、`party.*`、`product.*` |
| P5 帳單與繳款處理 | `statement-service`、`payment-service` | D5 `statement.*`、`payment.*` |
| P6 權益與分期處理 | `rewards-service`、`installment-service` | D6 `rewards.*`、`installment.*` |
| P7 清算與爭議處理 | `clearing-service`、`dispute-service`、`merchant-service` | D7 `clearing.*`、`dispute.*`、`merchant.*` |

---

## 4. DFD Level 2　關鍵處理程序

### 4.1 P1.1　授權檢核（發卡授權）

```mermaid
flowchart TD
  IN(["授權請求"])
  C1["P1.1.1 電文解析與欄位校驗"]
  C2["P1.1.2 卡片狀態與管制碼檢核"]
  C3["P1.1.3 黑名單檢核"]
  C4["P1.1.4 可用額度檢核"]
  C5["P1.1.5 風險參數評分"]
  C6["P1.1.6 EMV 驗證"]
  C7["P1.1.7 專用額度與通路限額檢核"]
  DEC{"P1.1.8 決策彙總"}
  OUT(["授權回應"])

  D1[("D4 卡片與客戶")]
  D2[("D3 額度")]
  D3[("D1 授權")]
  PRM[("D4 參數與規則")]

  IN --> C1 --> C2
  C2 --> C3 --> C4 --> C5 --> C6 --> C7 --> DEC
  D1 --> C2
  D2 --> C4
  PRM --> C2
  PRM --> C4
  PRM --> C5
  PRM --> C7
  DEC -->|"核准"| OUT
  DEC -->|"拒絕"| OUT
  DEC -->|"核准"| D3
  C4 -->|"佔用請求"| D2
```

**檢核順序為參數驅動**：`product.rule_sets` 中 `rule_type='AUTH_CHECK'` 之 `priority` 決定執行順序；
`status='INACTIVE'` 之規則不執行。**不得以程式碼硬寫順序**（`BRD-001 BR-02-01`）。

### 4.2 P2.1　請款入帳

```mermaid
flowchart TD
  IN(["請款檔 / 即時請款"])
  C1["P2.1.1 檔案接收與格式檢核"]
  C2["P2.1.2 冪等鍵檢核"]
  DEC1{"P2.1.3 是否重複"}
  C3["P2.1.4 授權請款比對"]
  DEC2{"P2.1.5 比對結果"}
  C4["P2.1.6 產生入帳交易"]
  C5["P2.1.7 分欄位入帳"]
  C6["P2.1.8 釋放授權佔用"]
  C7["P2.1.9 更新餘額與帳齡"]
  C8["P2.1.10 產生帳務明細"]
  EXC["P2.1.11 異常處理"]
  OUT(["入帳結果與通知"])

  D1[("D2 帳務")]
  D2[("D1 授權")]
  D3[("D3 額度")]

  IN --> C1 --> C2 --> DEC1
  DEC1 -->|"是"| EXC
  DEC1 -->|"否"| C3
  D2 --> C3
  C3 --> DEC2
  DEC2 -->|"金額不符 / 授權失效"| EXC
  DEC2 -->|"相符"| C4
  C4 --> C5 --> C6 --> C7 --> C8 --> OUT
  C5 --> D1
  C7 --> D1
  C6 --> D3
  EXC --> OUT
  EXC --> D1
```

### 4.3 P5.1　繳款與即時恢復額度

```mermaid
flowchart TD
  IN(["繳款指令 / 自扣檔"])
  C1["P5.1.1 繳款受理"]
  C2["P5.1.2 銷帳檢核"]
  C3["P5.1.3 繳款分配"]
  C4["P5.1.4 帳務入帳"]
  C5["P5.1.5 即時恢復額度"]
  T1["P5.1.6 三日未銷帳計時器"]
  DEC{"P5.1.7 是否收到銷帳檔"}
  R1["P5.1.8 重新佔額"]
  OUT(["繳款結果與通知"])

  D1[("D5 繳款")]
  D2[("D2 帳務")]
  D3[("D3 額度")]

  IN --> C1 --> C2 --> C3 --> C4 --> C5 --> OUT
  C1 --> D1
  C3 --> D1
  C4 --> D2
  C5 --> D3
  C5 --> T1
  T1 --> DEC
  DEC -->|"是"| OUT
  DEC -->|"否，逾三日"| R1
  R1 --> D3
  R1 --> D1
```

> **時序要求**：`C5 即時恢復額度` 必須在繳款入帳後 **1 秒內**完成，
> **不得**等日終批次（`BRD-001 BR-05-01`、POC-11）。

### 4.4 P5.2　帳單批次產製

```mermaid
flowchart TD
  IN(["帳單週期到達"])
  C1["P5.2.1 週期判定與分流"]
  C2["P5.2.2 歸戶與統編合併"]
  C3["P5.2.3 計算本期應繳"]
  C4["P5.2.4 產生帳單資料"]
  C5["P5.2.5 套用帳彩"]
  C6["P5.2.6 產生各形式帳單"]
  C7["P5.2.7 帳單發送"]
  C8["P5.2.8 歸檔與稽核"]
  CKPT[("D5 Checkpoint")]
  OUT(["帳單檔與通知"])

  D1[("D2 帳務")]
  D2[("D4 客戶")]
  D3[("D5 帳單")]

  IN --> C1 --> C2 --> C3 --> C4 --> C5 --> C6 --> C7 --> C8 --> OUT
  D2 --> C2
  D1 --> C3
  D3 --> C4
  C4 --> CKPT
  C7 --> D3
  CKPT -->|"異常後自 Checkpoint 續跑"| C4
```

**效能要求（POC-16）**：1,000 萬筆交易資料之帳單批次須於 **1 小時內**完成；
批次期間 ONLINE 至少維持 **200 TPS**；第 135 萬筆異常後可自該筆續跑。

### 4.5 P2.2　沖正處理

```mermaid
flowchart TD
  IN(["沖正申請"])
  C1["P2.2.1 建立沖正案件"]
  C2["P2.2.2 鎖定原始交易"]
  DEC1{"P2.2.3 原始交易狀態"}
  B1["P2.2.4 直接反向沖銷"]
  B2["P2.2.5 產生調整交易"]
  B3["P2.2.6 提出清算調整"]
  C3["P2.2.7 產生反向分錄"]
  C4["P2.2.8 更新餘額與額度"]
  C5["P2.2.9 還原授權佔用"]
  C6["P2.2.10 留存沖正軌跡"]
  APR{"P2.2.11 是否需覆核"}
  OUT(["沖正結果"])

  D1[("D2 帳務")]
  D2[("D3 額度")]
  D3[("D7 清算")]

  IN --> C1 --> C2 --> DEC1
  DEC1 -->|"已入帳未出帳"| B1
  DEC1 -->|"已出帳"| B2
  DEC1 -->|"已清算"| B3
  B1 --> C3
  B2 --> C3
  B3 --> C3
  C3 --> APR
  APR -->|"是"| C6
  APR -->|"否"| C4
  C4 --> C5 --> C6 --> OUT
  C3 --> D1
  C4 --> D1
  C5 --> D2
  B3 --> D3
```

### 4.6 P3.1　額度調整

```mermaid
flowchart TD
  IN(["額度異動申請"])
  C1["P3.1.1 類型判定"]
  C2["P3.1.2 權限與客層檢核"]
  DEC1{"P3.1.3 是否超限"}
  C3["P3.1.4 覆核"]
  DEC2{"P3.1.5 覆核結果"}
  C4["P3.1.6 生效"]
  C5["P3.1.7 同步授權服務"]
  C6["P3.1.8 寫入稽核"]
  REJ["P3.1.9 拒絕並回覆"]
  OUT(["額度結果"])

  D1[("D3 額度")]
  D2[("D4 參數")]

  IN --> C1 --> C2 --> DEC1
  D2 --> C2
  DEC1 -->|"是"| C3
  DEC1 -->|"否"| C3
  C3 --> DEC2
  DEC2 -->|"核准"| C4
  DEC2 -->|"駁回"| REJ
  C4 --> C5 --> C6 --> OUT
  C4 --> D1
  C5 -->|"額度同步事件"| OUT
  REJ --> OUT
```

### 4.7 P7.1　清算比對

```mermaid
flowchart TD
  IN(["交易日終批次"])
  C1["P7.1.1 清分作業"]
  C2["P7.1.2 依卡組織分派"]
  C3["P7.1.3 依幣別分組與匯率轉換"]
  C4["P7.1.4 產生本行清算檔"]
  C5["P7.1.5 與卡組織清算檔比對"]
  DEC{"P7.1.6 差異筆數為零"}
  C6["P7.1.7 差異明細產出"]
  C7["P7.1.8 差異分類與處理"]
  C8["P7.1.9 調扣與撥款"]
  C9["P7.1.10 會計分錄"]
  OUT(["清算報表"])

  D1[("D2 帳務")]
  D2[("D7 清算")]

  IN --> C1 --> C2 --> C3 --> C4 --> C5 --> DEC
  D1 --> C1
  C4 --> D2
  DEC -->|"是"| C8
  DEC -->|"否"| C6 --> C7 --> C5
  C8 --> C9 --> OUT
  C9 --> D2
```

### 4.8 P7.2　爭議處理

```mermaid
flowchart TD
  IN(["爭議申請"])
  C1["P7.2.1 案件建檔"]
  C2["P7.2.2 類型分流"]
  C3["P7.2.3 調單請求"]
  DEC1{"P7.2.4 證據完整"}
  C4["P7.2.5 補充資料"]
  DEC2{"P7.2.6 逾時未回覆"}
  C5["P7.2.7 裁決"]
  DEC3{"P7.2.8 責任歸屬"}
  C6["P7.2.9 卡組織仲裁"]
  C7["P7.2.10 帳務調整"]
  C8["P7.2.11 額度恢復"]
  C9["P7.2.12 結案通知"]
  OUT(["爭議結果"])

  D1[("D7 爭議")]
  D2[("D2 帳務")]

  IN --> C1 --> C2 --> C3 --> DEC1
  DEC1 -->|"否"| C4 --> DEC1
  DEC1 -->|"是"| DEC2
  DEC2 -->|"是"| C5
  DEC2 -->|"否"| C5
  C5 --> DEC3
  DEC3 -->|"需仲裁"| C6 --> C7
  DEC3 -->|"發卡行 / 收單行責任"| C7
  C7 --> C8 --> C9 --> OUT
  C1 --> D1
  C7 --> D2
  C9 --> D1
```

---

## 5. 流程分解對照表

| DFD 處理程序 | 用例 | Sequence | API | FR |
|---|---|---|---|---|
| P1.1 授權檢核 | `AuthorizeTransaction` | SDD-003 §3 | `POST /api/v1/authorizations` | AUT-1.1 |
| P1.1 授權檢核（收單分流） | `AuthorizeTransaction` | SDD-003 §4 | 同上 | AUT-1.2 |
| P1.1 授權檢核（路由） | `RouteTransaction` | SDD-003 §4 | 同上 | AUT-1.3 |
| P2.1 請款入帳 | `PostTransaction` | SDD-003 §5 | `POST /api/v1/postings` | ISS-2.3 |
| P2.2 沖正處理 | `ReverseTransaction` | SDD-003 §11 | `POST /api/v1/postings/{id}/reversals` | ISS-2.3 |
| P3.1 額度調整 | `AdjustLimit` | SDD-003 §6 | `POST /api/v1/limit-adjustments` | ISS-2.4 |
| P4.1 卡片生命週期 | `TransitionCardStatus` | SDD-005 §3 | `POST /api/v1/cards/{id}/lifecycle-transitions` | ISS-2.2 |
| P4.2 快發快綁 | `InstantIssuance` | SDD-003 §10 | `POST /api/v1/cards/{id}/instant-issuance` | ISS-2.2 |
| P5.1 繳款 | `ReceivePayment` | SDD-003 §7 | `POST /api/v1/payments` | ISS-2.6 |
| P5.1 三日未銷帳 | `ReoccupyIfUnmatched` | SDD-003 §8 | 系統排程 | ISS-2.6 |
| P5.2 帳單批次 | `RunStatementCycle` | SDD-003 §9 | `POST /api/v1/statement-cycles/{id}/runs` | ISS-2.8 |
| P6.1 分期建立 | `CreateInstallmentPlan` | SDD-003 §12 | `POST /api/v1/installments` | ISS-2.7 |
| P6.2 點數兌換 | `RedeemPoints` | SDD-003 §13 | `POST /api/v1/rewards/redemptions` | RWD-5.2 |
| P7.1 清算比對 | `RunClearing` | SDD-003 §14 | `POST /api/v1/clearing/runs` | ISS-2.13 |
| P7.2 爭議處理 | `OpenDispute` | SDD-003 §15 | `POST /api/v1/disputes` | — |
| P2.3 重複入帳防範 | `DetectDuplicatePosting` | SDD-003 §5 | 系統內部 | ISS-2.3 |
| P4.3 舊資料轉換 | `RunMigration` | — | `POST /api/v1/migration-jobs` | SYS-3 |

---

## 6. 資料流完整性檢核

| 檢核項 | 標準 |
|---|---|
| 每個處理程序有輸入與輸出 | 100% |
| 每個資料存放有寫入者與讀取者 | 100% |
| 無「黑洞」處理程序（有輸入無輸出） | 0 |
| 無「奇蹟」處理程序（有輸出無輸入） | 0 |
| 每個 L2 處理程序對應一個用例 | 100% |
| 每個用例對應一支 API 或排程 | 100% |
