# 02_case_data_structure.md # 案件データ構造(JSONスキーマ) ## 1. 概要 本仕様書は、案件管理システムで使用する案件データのJSONスキーマを定義する。 - 保存先(SCSPS):`/backoffice/data/cases/corporate/[案件番号]/case.json` - 保存先(SPS) :`/backoffice/data/cases/private/[案件番号]/case.json` - 文字コード:UTF-8 - フォーマット:JSON --- ## 2. データ構造(全体) ```json { "case_id": "L01R0709001A", "company_type": "SCSPS", "branch_code": "01", "status": "調査中", "case_type": "ACC", "locked": false, "locked_by": "", "locked_at": "", "created_from": "cases", "created_at": "2025-09-22T10:00:00+09:00", "updated_at": "2025-12-10T15:30:00+09:00", "basic_info": { ... }, "hearing": { ... }, "analysis": { ... }, "nearby_confirmations": { ... }, "evidence": { ... }, "expenses": { ... }, "invoices": { ... }, "progress": { ... }, "readiness_checklist": { ... }, "contact_logs": { ... } } ``` --- ## 3. 案件レベルフィールド | フィールド | 型 | 必須 | 説明 | |-----------|-----|------|------| | case_id | string | ✅ | 案件番号 | | company_type | string | ✅ | SPS / SCSPS | | branch_code | string | ✅ | 受託拠点コード | | status | string | ✅ | 受託 / 調査中 / 報告書完了 / 請求書発行 / 入金待ち / 入金完了 | | case_type | string | ✅ | 案件種別コード(ACC/INJ/HAR/ASS/GEN/OTH) | | locked | boolean | ✅ | ロック状態(true: ロック済) | | locked_by | string | | ロックしたユーザーID | | locked_at | datetime | | ロック日時 | | created_from | string | ✅ | "sales" / "cases"(登録元) | | created_at | datetime | ✅ | 作成日時 | | updated_at | datetime | ✅ | 更新日時 | --- ## 4. 案件基本情報(basic_info) ```json { "basic_info": { "client_id": "CL001", "client_name": "株式会社 創建", "client_contact": "担当者名", "client_phone": "090-8385-3939", "client_case_no": "", "requester_name": "松本", "requester_phone": "090-8385-3939", "approach_type": "弁護士特約", "insurance_company": "", "accident_date": "2024-10-18", "accident_location": "京都市伏見区三栖町3丁目819番地", "case_type_name": "事故原因調査S", "sales_person_id": "00005", "sales_person_name": "山田 太郎", "primary_investigator_id": "00001", "primary_investigator_name": "真柴 直也", "secondary_investigator_id": "", "secondary_investigator_name": "", "manager_id": "00004", "manager_name": "佐藤 一郎", "department": "調査部", "investigation_targets": [ "依頼者聴取", "現場調査" ], "quote_date1": "2025-09-25", "mid_report_date": "", "quote_date2": "", "quote_date3": "", "quote_date_final": "", "report_delivery_date": "2025-12-10", "invoice_date": "", "payment_due_date": "", "payment_date": "" } } ``` ### 4.1 フィールド定義 | フィールド | 型 | 必須 | 説明 | |-----------|-----|------|------| | client_id | string | ✅ | 顧客マスタID | | client_name | string | ✅ | 依頼元名 | | client_contact | string | | 担当者名 | | client_phone | string | | 連絡先電話番号 | | client_case_no | string | | 依頼先事案番号 | | requester_name | string | | 依頼者名(実際の被害者/相談者) | | requester_phone | string | | 依頼者連絡先 | | approach_type | string | ✅ | 着手対応(マスタ参照) | | insurance_company | string | | 保険会社名 | | accident_date | date | ✅ | 事故日(YYYY-MM-DD) | | accident_location | string | ✅ | 発生場所 | | case_type_name | string | ✅ | 調査種目名 | | sales_person_id | string | | 営業担当ID | | sales_person_name | string | | 営業担当名 | | primary_investigator_id | string | ✅ | 主担当調査員ID | | primary_investigator_name | string | ✅ | 主担当調査員名 | | secondary_investigator_id | string | | 副担当調査員ID | | secondary_investigator_name | string | | 副担当調査員名 | | manager_id | string | | 管理者ID | | manager_name | string | | 管理者名 | | department | string | | 実施部署 | | investigation_targets | array | | 調査先リスト | | quote_date1 | date | | 初回見積書発行日 | | mid_report_date | date | | 中間報告書発行日 | | quote_date2 | date | | 第2回見積書発行日 | | quote_date3 | date | | 第3回見積書発行日 | | quote_date_final | date | | 最終見積書発行日 | | report_delivery_date | date | | 報告書出力日(納品日) | | invoice_date | date | | 請求書出力日 | | payment_due_date | date | | 入金予定日 | | payment_date | date | | 報酬支払日 | --- ## 5. 聴取内容(hearing) ```json { "hearing": { "format": "qanda", "persons": [ { "person_id": "p001", "name": "松本 悠", "interview_date": "2025-10-02", "interview_time": "17:30", "interview_method": "電話", "questions": [ { "question": "事故発生日の状況を教えてください。", "answer": "事故当日は非番で、大原野にある友人宅へ私用で向かう途中でした。" }, { "question": "走行速度と現場周辺の確認状況はどうでしたか。", "answer": "およそ時速30kmで走行していました。" } ] } ], "raw_memo": "松本さん 10/2 17:30 電話\n非番で友人宅へ(大原野)\n速度30km/hくらい..." } } ``` ### 5.1 フィールド定義 | フィールド | 型 | 必須 | 説明 | |-----------|-----|------|------| | format | string | ✅ | "qanda" または "12items" | | persons | array | ✅ | 聴取対象者リスト | | raw_memo | string | | 変換前の調査メモ | ### 5.2 persons オブジェクト | フィールド | 型 | 必須 | 説明 | |-----------|-----|------|------| | person_id | string | ✅ | 対象者ID(自動採番) | | name | string | ✅ | 氏名 | | interview_date | date | | 確認日 | | interview_time | string | | 確認時間 | | interview_method | string | | 確認方法(電話/面談/訪問) | | questions | array | | Q&A形式の場合の質問リスト | --- ## 6. 調査分析(analysis) ```json { "analysis": { "physical_evidence": { "own_vehicle_damage": "左側面後部に接触痕", "other_vehicle_damage": "右側面後部に5時方向から10時方向への入力痕", "skid_marks": "平井車左前輪横にスリップ痕あり", "analysis_result": "黒瀬車が平井車と接触後、平井車の左前角を支点に急旋回し、黒瀬車の左後方が中村車の右側面後部に接触した" }, "scientific_analysis": { "speed": 60, "reaction_distance": 12.5, "braking_distance": 31.5, "total_stopping_distance": 44.0, "actual_stopping_distance": 28.0, "avoidance_possible": false, "analysis_result": "物理的に停止可能な距離よりも短い距離で停止していることから、最大限の制動操作を行っていた" }, "contradiction_analysis": { "other_party_claim": "右側の第4車線への進路変更中に右後方から走行してきた黒瀬車に接触された", "objective_facts": "中村車の損傷は右側面後部に5時→10時方向の入力痕", "analysis_result": "追突ではなく側面からの接触である" }, "conclusion": "本件は、優先性の高い接続道路を直進していた松本車に対し、交差する生活道路を北進していた田中車が、安全確認を十分に行わないまま左折進入したことで接触した結果発生した事故であると思料します。" } } ``` --- ## 7. 近隣確認(nearby_confirmations) ```json { "nearby_confirmations": { "raw_inputs": [ { "resident": "住民A", "content": "役所から都市計画道路の説明を受けており、新築時には道路幅を確保して建築した。" } ], "summary": [ "役所からの都市計画道路に関する説明を受けており、新築時には道路幅を確保して建築している。", "拡幅計画が存在するため、役場の指導によりセットバックして建てた。" ] } } ``` --- ## 8. 証拠資料(evidence) ```json { "evidence": { "photos": [ { "id": "photo_001", "filename": "現場写真_001.jpg", "title": "松本車の京都府道124号へ右折進入時の視界", "description": "", "shooting_date": "2025-10-19", "photographer": "真柴 直也", "location": "京都市伏見区三栖町3丁目819番地", "order": 1 } ], "driving_recorder": [ { "id": "dr_001", "filename": "ドラレコ_001.jpg", "title": "松本車、京都府道124号三栖向納所線を西進", "description": "", "timestamp": "2024-10-18 16:45:17", "speed": 11.5, "order": 1 } ], "site_diagram": { "filename": "現場図.pdf", "uploaded_at": "2025-12-10T10:00:00+09:00", "version": "1" } } } ``` --- ## 9. 経費(expenses) ```json { "expenses": [ { "id": "exp_001", "date": "2025-10-19", "type": "高速料金", "amount": 800, "description": "京都→大阪", "receipt_path": "/data/receipts/SCSPS/2025/10/exp_001.jpg", "approved": true, "approved_by": "00004", "approved_at": "2025-10-20T09:00:00+09:00", "reimbursement_requested": true, "reimbursement_request_date": "2025-10-21", "reimbursement_invoice_no": "INV-20251021-001", "payment_status": "支払済", "payment_date": "2025-10-25", "payment_amount": 800, "paid_to_employee_id": "00002", "paid_to_employee_name": "調査員A", "accounting_transferred": true, "accounting_transferred_at": "2025-10-25T14:00:00+09:00", "journal_id": "1734567890123.456" } ], "expense_summary": { "total_approved": 800, "total_requested": 800, "total_paid": 800, "total_unpaid": 0 } } ``` ### 9.1 フィールド定義(追加分) | フィールド | 型 | 必須 | 説明 | |-----------|-----|------|------| | reimbursement_requested | boolean | | 精算請求済みか | | reimbursement_request_date | date | | 精算請求日 | | reimbursement_invoice_no | string | | 精算請求書番号 | | payment_status | string | ✅ | 未申請 / 申請中 / 承認済 / 精算請求中 / 支払済 | | payment_date | date | | 支払日 | | payment_amount | number | | 支払金額 | | paid_to_employee_id | string | | 支払先従事者ID | | paid_to_employee_name | string | | 支払先従事者名 | | accounting_transferred | boolean | | 会計転記済みか | | accounting_transferred_at | datetime | | 会計転記日時 | | journal_id | string | | 会計システム仕訳ID | --- ## 10. 請求(invoices) ```json { "invoices": [ { "id": "inv_001", "invoice_no": "L01R0709001A", "issue_date": "2025-12-10", "amount": 55000, "tax": 5500, "total": 60500, "adjustment": -20000, "final_total": 40500, "payment_due_date": "2026-01-15", "payment_date": "", "status": "未入金", "pdf_path": "/data/cases/corporate/L01R0709001A/invoices/L01R0709001A.pdf" } ], "total_billed": 40500, "total_paid": 0 } ``` --- ## 11. 調査経過(progress) ```json { "progress": [ { "id": "prog_001", "date": "2025-10-02", "contact": "松本 悠", "method": "電話", "content": "事故状況の聴取", "result": "松本車は時速30kmで走行中、交差点通過時に左後方から接触", "hours": 1.5 } ], "total_hours": 1.5 } ``` --- ## 12. 成果物チェックリスト(readiness_checklist) ```json { "readiness_checklist": { "basic_info_complete": true, "hearing_complete": true, "report_generatable": true, "photos_complete": true, "site_diagram_complete": true, "expenses_complete": true, "manager_confirmed": true, "manager_confirmed_by": "00004", "manager_confirmed_at": "2025-12-10T10:00:00+09:00", "all_complete": true, "ready_for_invoice": true } } ``` --- ## 13. 問い合わせ連絡履歴(contact_logs) ```json { "contact_logs": [ { "id": "contact_001", "sent_at": "2026-03-26T10:00:00+09:00", "sent_by": "00010", "sent_by_name": "電話対応担当A", "to_employee_id": "00001", "to_employee_name": "真柴 直也", "to_email": "mashiba@scsps.jp", "subject": "【SPS案件管理】問い合わせ連絡", "body": "案件: L01R0702001A(黒瀬 憲一)\n相手: 中川龍也\n電話: 075-748-7050\n内容: 報告書の納期について問い合わせがありました。", "status": "sent" } ] } ``` ### 13.1 フィールド定義 | フィールド | 型 | 必須 | 説明 | |-----------|-----|------|------| | id | string | ✅ | 連絡履歴ID(自動採番) | | sent_at | datetime | ✅ | 送信日時 | | sent_by | string | ✅ | 送信者ID(従事者マスタ参照) | | sent_by_name | string | ✅ | 送信者名 | | to_employee_id | string | ✅ | 送信先従事者ID | | to_employee_name | string | ✅ | 送信先従事者名 | | to_email | string | ✅ | 送信先メールアドレス | | subject | string | ✅ | 件名 | | body | string | ✅ | 本文 | | status | string | ✅ | "sent" / "failed" | --- ## 14. ファイル保存先 | 種別 | 保存先(SCSPS) | 保存先(SPS) | |------|----------------|--------------| | 案件JSON | `/backoffice/data/cases/corporate/[案件番号]/case.json` | `/backoffice/data/cases/private/[案件番号]/case.json` | | 案件ファイル(写真等) | `/backoffice/data/cases/corporate/[案件番号]/files/` | `/backoffice/data/cases/private/[案件番号]/files/` | | 現場図 | `/backoffice/data/cases/corporate/[案件番号]/site_diagram.pdf` | `/backoffice/data/cases/private/[案件番号]/site_diagram.pdf` | | 報告書 | `/backoffice/data/cases/corporate/[案件番号]/reports/` | `/backoffice/data/cases/private/[案件番号]/reports/` | | 請求書PDF | `/backoffice/data/cases/corporate/[案件番号]/invoices/` | `/backoffice/data/cases/private/[案件番号]/invoices/` | | 精算請求書 | `/backoffice/data/cases/corporate/[案件番号]/reimbursement/` | `/backoffice/data/cases/private/[案件番号]/reimbursement/` | --- ## 15. 日付表示 - 画面表示時の日付は `03_ui_design/01_design_guideline.md` の日付表記ルールに準拠する - JSON内の日付はISO形式(YYYY-MM-DD)で保存する --- ## 16. 関連仕様書 | # | 仕様書 | 内容 | |---|--------|------| | 1 | `01_case_management.md` | 案件管理全体設計 | | 3 | `03_case_type_master.md` | 案件種別マスタ設計 | | 4 | `04_case_input_screens.md` | 入力画面設計 | | 7 | `07_case_document_generate.md` | 報告書自動生成設計 | | 8 | `08_case_permission.md` | 権限設計 | | 9 | `09_case_accounting_link.md` | 会計連動設計 | | 11 | `11_case_mail.md` | メール送信機能仕様 | --- ## 17. 改訂履歴 | 日付 | 版 | 担当 | 内容 | 理由・影響範囲 | |------|----|------|------|--------------| | 2026-03-24 | 1.0 | 案件管理担当 | 初版作成 | | | 2026-03-24 | 1.1 | 案件管理担当 | 経費精算関連フィールド、成果物チェックリストを追加 | | | 2026-03-26 | 1.2 | 案件管理担当 | `contact_logs` 配列、`locked` 関連フィールド、`requester_name` 等を追加 | | | 2026-03-26 | 1.3 | 案件管理担当 | 日付表示を共通仕様参照に修正 | | | 2026-04-04 | 1.4 | 案件管理担当(初代) | 1節・14節のファイル保存先をcorporate/private分離構造に変更。10節のpdf_pathサンプルを修正 | 個人事業と法人の完全分離原則に基づきフォルダ構造を明確化。会計データのprivate/corporate分離と統一。save_case.php・load_case.phpの実装に先立ち確定 |