# ER図

## 概要

本ドキュメントは、Actual Budgetのデータベースエンティティ間の関係を示すER図です。

## 主要エンティティのER図

```mermaid
erDiagram
    accounts ||--o{ transactions : "has"
    accounts ||--o{ pending_transactions : "has"
    accounts }o--|| banks : "belongs to"

    transactions }o--o| categories : "categorized by"
    transactions }o--o| payees : "paid to"
    transactions }o--o| schedules : "linked to"
    transactions ||--o{ transactions : "parent-child (split)"
    transactions ||--o| transactions : "transfer"

    categories }o--|| category_groups : "belongs to"

    payees }o--o| accounts : "transfer account"

    schedules ||--|| rules : "based on"
    schedules ||--|| schedules_next_date : "has next date"
    schedules ||--|| schedules_json_paths : "has json paths"

    accounts {
        TEXT id PK
        TEXT account_id
        TEXT name
        INTEGER balance_current
        INTEGER balance_available
        INTEGER balance_limit
        TEXT mask
        TEXT official_name
        TEXT type
        TEXT bank FK
        INTEGER offbudget
        INTEGER closed
        REAL sort_order
        TEXT account_sync_source
        TEXT last_sync
        TEXT last_reconciled
        INTEGER tombstone
    }

    banks {
        TEXT id PK
        TEXT bank_id
        TEXT name
        INTEGER tombstone
    }

    transactions {
        TEXT id PK
        INTEGER isParent
        INTEGER isChild
        TEXT parent_id FK
        TEXT acct FK
        TEXT category FK
        INTEGER amount
        TEXT description
        TEXT notes
        INTEGER date
        TEXT financial_id
        TEXT transferred_id FK
        REAL sort_order
        INTEGER cleared
        INTEGER reconciled
        TEXT schedule FK
        INTEGER tombstone
    }

    categories {
        TEXT id PK
        TEXT name
        INTEGER is_income
        TEXT cat_group FK
        REAL sort_order
        TEXT goal_def
        BOOLEAN hidden
        INTEGER tombstone
    }

    category_groups {
        TEXT id PK
        TEXT name
        INTEGER is_income
        REAL sort_order
        BOOLEAN hidden
        INTEGER tombstone
    }

    payees {
        TEXT id PK
        TEXT name
        TEXT category FK
        TEXT transfer_acct FK
        INTEGER favorite
        BOOLEAN learn_categories
        INTEGER tombstone
    }

    schedules {
        TEXT id PK
        TEXT name
        TEXT rule FK
        INTEGER active
        INTEGER completed
        INTEGER posts_transaction
        INTEGER tombstone
    }

    rules {
        TEXT id PK
        TEXT stage
        TEXT conditions
        TEXT conditions_op
        TEXT actions
        INTEGER tombstone
    }

    schedules_next_date {
        TEXT id PK
        TEXT schedule_id FK
        INTEGER local_next_date
        INTEGER base_next_date
        INTEGER tombstone
    }

    schedules_json_paths {
        TEXT schedule_id PK
        TEXT payee
        TEXT account
        TEXT amount
        TEXT date
    }
```

## 予算管理のER図

```mermaid
erDiagram
    zero_budget_months ||--o{ zero_budgets : "contains"
    zero_budgets }o--|| categories : "for category"
    reflect_budgets }o--|| categories : "for category"

    zero_budget_months {
        TEXT id PK
        INTEGER buffered
    }

    zero_budgets {
        TEXT id PK
        INTEGER month
        TEXT category FK
        INTEGER amount
        INTEGER carryover
        INTEGER goal
        INTEGER long_goal
    }

    reflect_budgets {
        TEXT id PK
        INTEGER month
        TEXT category FK
        INTEGER amount
        INTEGER carryover
        INTEGER goal
        INTEGER long_goal
    }

    categories {
        TEXT id PK
        TEXT name
        INTEGER is_income
        TEXT cat_group FK
        TEXT goal_def
        JSON template_settings
    }
```

## レポート・ダッシュボードのER図

```mermaid
erDiagram
    dashboard_pages ||--o{ dashboard : "contains"
    dashboard }o--o| custom_reports : "references"

    dashboard_pages {
        TEXT id PK
        TEXT name
        INTEGER tombstone
    }

    dashboard {
        TEXT id PK
        TEXT dashboard_page_id FK
        TEXT type
        INTEGER width
        INTEGER height
        INTEGER x
        INTEGER y
        TEXT meta
        INTEGER tombstone
    }

    custom_reports {
        TEXT id PK
        TEXT name
        TEXT start_date
        TEXT end_date
        INTEGER date_static
        TEXT date_range
        TEXT mode
        TEXT group_by
        TEXT balance_type
        TEXT sort_by
        TEXT graph_type
        TEXT conditions
        TEXT interval
        INTEGER tombstone
    }

    transaction_filters {
        TEXT id PK
        TEXT name
        TEXT conditions
        TEXT conditions_op
        INTEGER tombstone
    }
```

## マッピング・同期のER図

```mermaid
erDiagram
    categories ||--o| category_mapping : "mapped"
    payees ||--o| payee_mapping : "mapped"

    category_mapping {
        TEXT id PK
        TEXT transferId
    }

    payee_mapping {
        TEXT id PK
        TEXT targetId
    }

    notes {
        TEXT id PK
        TEXT note
    }

    tags {
        TEXT id PK
        TEXT tag
        TEXT color
        TEXT description
        INTEGER tombstone
    }

    preferences {
        TEXT id PK
        TEXT value
    }

    messages_crdt {
        INTEGER id PK
        TEXT timestamp
        TEXT dataset
        TEXT row
        TEXT column
        BLOB value
    }

    messages_clock {
        INTEGER id PK
        TEXT clock
    }
```

## 主要な関係性の説明

### 1. 口座と取引
- 1つの口座（accounts）は複数の取引（transactions）を持つ
- 取引は必ず1つの口座に紐づく

### 2. 取引とカテゴリ
- 取引は0または1つのカテゴリに分類される
- カテゴリは必ず1つのカテゴリグループに属する

### 3. 取引と支払先
- 取引は0または1つの支払先（payees）に紐づく
- 支払先は振替用の場合、振替先口座への参照を持つ

### 4. スプリット取引
- 親取引（isParent=1）は複数の子取引（isChild=1）を持つことができる
- 子取引は親取引のIDをparent_idで参照

### 5. 振替取引
- 振替取引は2つの取引（元と先）で構成される
- transferred_idで相互参照

### 6. スケジュールとルール
- スケジュール（定期取引）はルールに基づいて動作する
- ルールには条件とアクションがJSON形式で保存される

### 7. 予算
- ゼロベース予算（zero_budgets）と反映予算（reflect_budgets）の2種類
- それぞれ月とカテゴリの組み合わせで予算額を管理

### 8. ダッシュボード
- 複数のダッシュボードページが存在可能
- 各ページは複数のウィジェットを持つ
- カスタムレポートウィジェットはcustom_reportsを参照
