エッジケース仕様
自動保存中のネットワークタイムアウト復帰
動作仕様:
- 保存失敗時、UI に「保存失敗」インジケーターを表示
- Exponential Backoff + Jitter で最大3回自動リトライ(1秒 → 2秒 → 4秒)
- リトライ中は「再保存中...」インジケーターを表示
- 3回リトライ後も失敗した場合、入力データを IndexedDB にローカル保存し「オフラインモード」に移行
- ネットワーク復帰時(
navigator.onLineイベント)に自動同期を実行 - 同期時にサーバー側のバージョンと競合した場合、ユーザーに選択を促すダイアログを表示
マルウェアスキャンタイムアウト時の UX
→ 関連: SR-006 マルウェア対策、PE-001 パフォーマンス
| フェーズ | タイムアウト | 動作 |
|---|---|---|
| アップロード中 | 30秒 | プログレスバー表示。タイムアウト時は「アップロードに時間がかかっています。しばらくお待ちください」 |
| スキャン中 | 10秒/件 | 「ウイルススキャン中...」ステータス表示 |
| スキャンタイムアウト | 10秒超過 | ファイルを「スキャン保留中」状態で保持。ユーザーには「スキャン結果の確認に時間がかかっています。完了次第通知します」と表示 |
| スキャン完了(安全) | - | 「スキャン完了」に更新。申告フローを続行可能 |
| スキャン完了(検出) | - | ファイルを拒否し「ウイルスが検出されたため、このファイルはアップロードできません」と表示。TSHK-BIZ-006 を返却 |
税計算サービス障害中の確認画面の振る舞い
税計算サービスが障害中の場合、確認画面は以下のように振る舞う:
- 計算結果セクション: 「税額計算が一時的に利用できません」と表示し、前回の計算結果がある場合は「前回の計算結果({日時}時点)」として参考表示
- 入力データ確認: 入力データの確認・編集は引き続き可能
- 最終確認ボタン: 無効化し、「税額計算が完了するまで最終確認はできません」と説明表示
- 自動リカバリ: バックグラウンドで定期的に(30秒間隔)計算サービスの復旧を確認し、復旧後は自動で再計算を実行
一括操作での部分失敗ハンドリング
一括操作(一括承認、一括帳票生成、データインポート等)において一部が失敗した場合の仕様:
レスポンスフォーマット:
json
{
"type": "https://tashika.example/errors/business/partial-failure",
"title": "Partial Operation Failure",
"status": 422,
"detail": "100件中3件の処理に失敗しました。",
"instance": "/api/v1/2025/declarations/bulk-approve",
"traceId": "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9",
"errorCode": "TSHK-BIZ-005",
"summary": {
"total": 100,
"succeeded": 97,
"failed": 3
},
"failures": [
{
"resourceId": "decl-001",
"errorCode": "TSHK-BIZ-001",
"detail": "申告が既に確定済みです"
},
{
"resourceId": "decl-042",
"errorCode": "TSHK-BIZ-002",
"detail": "承認の前提条件未達です"
},
{
"resourceId": "decl-099",
"errorCode": "TSHK-SYS-002",
"detail": "処理中にタイムアウトが発生しました"
}
]
}UI 動作:
- 一括操作の実行結果をサマリとして表示(「97件成功 / 3件失敗」)
- 失敗した項目の一覧をテーブルで表示し、個別に原因と対処方法を案内
- 「失敗した項目のみ再実行」ボタンを提供
- 成功した項目は確定済みとし、ロールバックしない(部分コミット方式)
セッション期限切れ中の自動保存
→ 関連: SR-005 セッション管理
自動保存のリクエストが 401(トークン期限切れ)で失敗した場合のフロー:
ポイント:
- リフレッシュトークンが有効な間(7日以内)は自動的にアクセストークンを更新してリトライ
- リフレッシュトークンも失効している場合は IndexedDB にデータを退避
- 再ログイン後、IndexedDB のデータをサーバーと同期(バージョン競合チェック付き)
同時編集の競合(楽観的ロック)
→ 関連: AV-002 データ整合性
従業員と管理者が同一の申告データを同時に編集した場合の競合解決:
競合検出方式:
ETag/If-Matchヘッダーによるバージョンベースの楽観的排他制御- サーバー側は Declaration エンティティの
Versionカラム(行バージョン)で競合を検出 - 競合時は 409 Conflict + TSHK-BIZ-004 を返却
競合解決 UI:
- 競合発生時、最新のサーバー側データと自分の変更内容の差分をハイライト表示
- ユーザーに「最新データを取得して自分の変更を再適用」するか「自分の変更を破棄」するかを選択させる