不要な家族情報の削除
2026-09-21、確認用モックを試用後の「実装してみよう」という指示に基づく実装。基点は本番配備版 66471bffb6eb3bba0b1783a498b84dad7fbaade6。本番への反映結果は家庭削除の更新記録を参照。配備による実在家庭の削除は行っていない。
操作
家族一覧の「削除」から確認画面を開く。家族名だけでなく家族番号(F-xxxxx)、住所・電話・保護者連絡先を確認する。園児台帳管理権限を持つ職員だけが操作できる。
関連記録がなければ確認チェックを入れて「この家族を削除」を押す。家族本体に保存された名前・住所・電話・保護者連絡先を削除し、検索条件を保持して一覧へ戻る。同名の別家族には影響しない。取消は削除を行わず一覧に戻る。この操作の個別の取り消し機能はない。
削除を止める条件
- 園児(在園だけでなく卒園・退園も対象)。
- 保護者アカウント(停止中も対象)。
- 請求設定、請求記録、引落出力、請求設定変更履歴。
- アンケート回答。
- 家族に結びつく写真。写真を画面から外した後も履歴保存用の写真が残っていれば保護する。
- 家族の保護者連絡先に残ったアカウントID・写真ID。移動後の古い紐づけや不整合があっても自動で破棄しない。
- 保護者の初回入力依頼・記録に保存された対象家族ID。
- 将来追加されるテーブルを含め、実際のDBで家族を外部キー参照する他の記録。
家族の住所・電話・保護者の名前や連絡先を直接入力しただけで、これらの関連付けがなければ削除できる。「保護者0人」は保護者アカウントがない意味で、連絡先が空という意味ではない。
実装上の保護
- GETは表示のみ。POSTは既存の署名付きCSRFトークン方式で検査する。
- 確認情報は家族ID・家族全項目のハッシュ・操作者・ログインセッション・CSRFトークンに結びつけて署名。有効期間は30分。期限切れや変更時は内容を再表示し、確認チェックをやり直す。削除後にSQLiteがIDを再利用した場合も、作成日時を含むハッシュで古い確認情報を拒否する。
- 最終実行はSQLiteの
BEGIN IMMEDIATEにより書き込みを排他し、最新の職員権限・関連記録・家族情報を再検査してから単一トランザクションで削除する。別の職員による関連付けを検査と削除の間に割り込ませない。 - ORMによる園児・保護者の所属解除や関連レコードの連鎖削除は行わない。DBエラーはロールバックし、再確認できる画面を返す。二重送信には既に削除された旨を返す。
- SQLite以外のDBは現在のCSV確定処理と同様に、削除実行を拒否する。
- 完了通知は操作者に結びつけた署名付きHttpOnly Cookieで一度だけ表示する。削除した家族名や連絡先を完了通知用のURLへ入れない。
- 監査イベントは
uvicorn.error.family_deletionのアプリログへ、UTC日時・操作者ID・家族ID・結果コードだけを出力する。家族名・住所・連絡先・確認トークンをログに保存しない。アプリログの保持方針に従う。 - DBテーブル・列の追加はない。既存バックアップのDBスキーマは変わらない。将来配備する際は既存の復元機能を保持し、実際に配備するcommitをバックアップ元commitの許可設定へ適切に追加する。
検証
- 削除機能:
test_family_deletion.py19件。実ファイルのSQLite/WAL・外部キー有効で実行。正常系、未確認、CSRF、署名改変・期限切れ、別家族・別職員・別セッション、権限取消、停止職員、退園・卒園、各関連記録、写真・JSONリンク、初回入力依頼、未知のCASCADE外部キー、情報変更、DB失敗時のロールバック、二重送信、ID再利用、同時書き込みを検証。 - 既存機能:家族編集、セキュリティ、写真、復元、職員管理の62件。合計81件成功。
- 実行コマンド:
python -m pytest -p no:cacheprovider test_family_deletion.py test_families.py test_security_controls.py test_profile_photos.py test_restore_runtime.py -q(初回17件の削除テストを含む60件)、続いて追加テストを含めpython -m pytest -p no:cacheprovider test_family_deletion.py test_staff_auth.py -q(38件)。重複を除く合計は81件。 - ブラウザーで架空家族の確認・取消・削除・同名家族の保持・検索条件保持・請求設定がある家族の拒否を検証。モックの表示項目・操作順と照合し、320px幅での確認画面も目視した。ブラウザーのエラーログなし。
- JavaScript/Python構文、
git diff --checkを確認。
実機データの削除を動作テストとして実行していない。確認用サーバーとDBは架空データ専用。