# 通知設計書 47-ルール削除失敗

## 概要

本ドキュメントは、ルールの削除に失敗した際にユーザーに表示されるエラー通知の設計を定義します。

### 本通知の処理概要

この通知は、ユーザーがルール管理画面でルールを削除しようとした際に、何らかのエラーにより削除処理が失敗した場合に表示されるエラー通知です。ネットワークエラー、サーバーエラー、その他の予期しないエラーにより削除が完了しなかった場合に発行されます。

**業務上の目的・背景**：ルールは取引の自動カテゴリ分類などを行う重要な機能です。ルール削除操作が失敗した場合、ユーザーに問題を明確に通知し、再試行を促す必要があります。

**通知の送信タイミング**：ルール管理画面（モバイル版）でルールを削除しようとし、try-catchブロックでエラーがキャッチされた場合に即座に発行されます。

**通知の受信者**：ルール削除操作を試みた現在のユーザー（ローカル通知）

**通知内容の概要**：「Failed to delete rule. Please try again.」（ルールの削除に失敗しました。再試行してください。）というエラーメッセージを表示します。

**期待されるアクション**：ユーザーは通知を確認し、ネットワーク接続を確認した上で再度ルール削除を試みます。問題が継続する場合はサポートに連絡します。

## 通知種別

アプリ内通知（トースト通知）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（Redux dispatch） |
| 優先度 | 高 |
| リトライ | 無し |

### 送信先決定ロジック

ルール削除操作を試みた現在のユーザーのみに対してローカル通知を表示します。

## 通知テンプレート

### アプリ内通知の場合

| 項目 | 内容 |
|-----|------|
| 通知タイプ | error |
| タイトル | なし |
| メッセージ | Failed to delete rule. Please try again. |
| タイムアウト | 6.5秒（デフォルト） |

### 本文テンプレート

```
Failed to delete rule. Please try again.
```

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージのため変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 例外発生 | rule-delete-all API呼び出し時 | catch ブロックでエラーキャッチ | モバイル版でのルール削除時の例外 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 削除が成功した場合 | エラーが発生しなかった場合は通知しない |
| someDeletionsFailedの場合 | スケジュールリンクによる失敗は別の通知（No.46）で処理 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ルール削除操作] --> B[try: rule-delete-all API呼び出し]
    B --> C{API処理}
    C -->|正常終了| D{someDeletionsFailed?}
    C -->|例外発生| E[catch: エラーキャッチ]
    D -->|true| F[スケジュールリンク通知 No.46]
    D -->|false| G[成功通知 No.48]
    E --> H[console.error出力]
    H --> I[addNotification dispatch]
    I --> J[エラー通知表示]
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| rules | 削除対象ルールの確認 | サーバー側で参照 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | エラーのためルールは削除されない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| ネットワークエラー | サーバーとの通信失敗 | 再試行を促す |
| サーバーエラー | サーバー内部エラー | 再試行を促す |
| 予期しないエラー | その他の例外 | 再試行を促す |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（ユーザーによる手動再試行を促す） |
| リトライ間隔 | - |
| リトライ対象エラー | なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし

## セキュリティ考慮事項

- エラーの詳細情報はconsole.errorにのみ出力し、ユーザーには汎用メッセージを表示
- ローカル通知のためネットワーク経由での情報漏洩リスクなし

## 備考

- モバイル版（MobileRulesPage.tsx）で実装
- エラーの詳細はconsole.errorでログ出力される
- ルール一覧は操作後に再読込される（成功・失敗にかかわらず）

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示します。

### 推奨読解順序

#### Step 1: データ構造を理解する

通知の型定義を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | notificationsSlice.ts | `packages/desktop-client/src/notifications/notificationsSlice.ts` | Notification型の定義（9-26行目） |

#### Step 2: エントリーポイントを理解する

通知を発行するコンポーネントを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MobileRulesPage.tsx | `packages/desktop-client/src/components/mobile/rules/MobileRulesPage.tsx` | handleRuleDelete関数（128-167行目） |

**主要処理フロー**:
1. **129行目**: try ブロック開始
2. **131行目**: `send('rule-delete-all', [rule.id])`でサーバーにルール削除リクエスト
3. **153-154行目**: catch ブロックでエラーをキャッチ
4. **154行目**: `console.error('Failed to delete rule:', error)`でログ出力
5. **155-163行目**: addNotificationでエラー通知をdispatch
6. **159行目**: メッセージ「Failed to delete rule. Please try again.」

### プログラム呼び出し階層図

```
MobileRulesPage.tsx
    │
    ├─ handleRuleDelete(rule)
    │      │
    │      └─ try {
    │             send('rule-delete-all', [rule.id])
    │         } catch (error) {
    │             │
    │             ├─ console.error('Failed to delete rule:', error)
    │             │
    │             └─ dispatch(addNotification({
    │                    type: 'error',
    │                    message: 'Failed to delete rule. Please try again.'
    │                }))
    │         }
    │
    └─ Notifications コンポーネント
           └─ エラー通知を画面に描画
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ルール削除操作 ───────▶ send('rule-delete-all') ───────▶ サーバーAPI
                              │                          │
                              ▼                          ▼
                         try-catch              エラー発生（ネットワーク等）
                              │
                              └─ catch (error)
                                     │
                                     ├─ console.error()
                                     │
                                     └─ addNotification dispatch
                                            │
                                            └─ type: 'error'
                                                   │
                                                   ▼
                                             Notifications.tsx
                                                   │
                                                   ▼
                                             エラートースト表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| MobileRulesPage.tsx | `packages/desktop-client/src/components/mobile/rules/MobileRulesPage.tsx` | ソース | モバイル版ルール管理画面 |
| notificationsSlice.ts | `packages/desktop-client/src/notifications/notificationsSlice.ts` | ソース | 通知の状態管理（Redux slice） |
| Notifications.tsx | `packages/desktop-client/src/components/Notifications.tsx` | ソース | 通知表示コンポーネント |
| app.ts | `packages/loot-core/src/server/rules/app.ts` | ソース | サーバー側ルールAPI |
