アカウントの利用停止・再開を一本化する変更案
状態:2026-09-23、モック試用後に「これで進めてください」と承認済み。保護者の停止・再開、状態表示、CSVの制限を実装し、同日06:30:49 JSTに本番反映を完了。実装内容は 実装記録、確認結果は 配備記録 に記載。
要望と合意した方針
- 保護者の利用停止・再開は「認証管理」にまとめる。
- 通常の一時停止からの再開は、現在のパスワードを維持し、本人の再ログインを求める(ユーザー回答済み)。
- 停止前のログイン状態・通知登録を復活させない。
- 同様に一本化した方がよい操作を調査する。
AGENTS.mdの手順に従い、モック確認を経て保護者の停止・再開を実装する。職員・メール変更などは候補整理のままとする。
配備基準は 15b13a9dd1eb6ae1b4d171186cb12c1dcc33326c。固定ソースは .local-dev/truenas-initial-ledger-20260922/source。対象の保護者ルーター、認証処理、CSV処理、保護者編集・認証管理・一覧テンプレートが現在の作業用ソースと同一であることをSHA256で確認した。職員編集テンプレートには差異があるため、候補調査では固定ソースも直接確認した。
こちらの解釈・今回のモック
アカウント編集から変更可能な「状態」欄を取り除き、利用状態の表示と「認証管理へ」の案内に置き換える。氏名・連絡先・照合用氏名・照合表記・電話・住所・勤務先・勤務先電話・勤務先住所・所属家族・家族プロフィールの保護者・全園児の明示的な閲覧許可は残す。
認証管理の上部に「利用停止・再開」を置く。既存のメール・ログインID変更、初回登録の案内、コード発行、メール配送、申請履歴、提出内容28項目、承認対象・確認理由・確認欄、パスワード再設定も状態に応じて確認できる。初回パスワード設定と既存利用者の再開は別の操作とする。
一覧・編集・認証管理は同じ利用状態を表示する。今回問題になった「台帳は有効・認証は停止中」の既存データは、一貫して「停止中」と表示し、管理者が認証管理から明示的に再開する。ページを開いただけで有効化しない。
| 現在の状態 | 操作 | 確定後 | パスワード | 園児との紐づけ |
|---|---|---|---|---|
| 利用中 | 利用停止 | 停止中 | 維持・ログイン不可 | 保持 |
| 一時停止中 | 通常の利用再開 | 利用中・新たにログインが必要 | 維持 | 保持 |
| 再設定が必要な停止 | 再開案内を送信 | 再開手続き待ち・ログイン不可 | 本人の設定待ち | 保持 |
| 再開手続き待ち | 本人が設定を完了 | 利用中・新たにログインが必要 | 本人が再設定 | 保持 |
| 再開手続き待ち | 手続きを取消 | 停止中 | 未変更・コード失効 | 保持 |
| 未登録/初回登録確認待ち | 初回登録・初回設定 | 初回設定待ち等 | 初回設定が必要 | 承認した対象だけ |
| メールアドレス削除済み | 通常の再開 | この操作では再開させない | 維持 | 保持 |
保存・修正・取消・失敗
- 操作理由を入力して「内容を確認」へ進む。この段階では状態もメールも変更しない。
- 確認画面で、対象・理由・セッションと通知への影響・閲覧許可の保持を表示する。
- 「修正に戻る」または確認画面を閉じると、入力理由を保持して元の画面へ戻る。
- 最後の確定ボタンで初めて一括保存する。通常の再開はメールを送信しない。
- 失敗時は元の状態を維持し、理由を残して再試行できるようにする。
- プロフィール編集のキャンセルは編集前の内容へ戻す。プロフィール更新では利用状態を変更しない。
試用モックは tools/account-lifecycle-review/index.html。通信を connect-src 'none'、フォーム送信を form-action 'none' で禁止し、データはJavaScriptのメモリ内のみ。本番URL・API・DB・メール送信には接続しない。再読み込みで初期化する。
モック確認時の論点と採用範囲
- 権限:承認されたモックどおり、停止・再開は管理者のみ。台帳担当は情報編集を行えるが利用状態は変えられない。
- 一括操作:通常の台帳CSVから既存利用者の状態変更を拒否し、認証管理へ案内する。空欄・同じ状態での情報更新は継続できる。一括停止・再開専用画面は今回作らない。
- 特殊な停止:侵害疑い、アドレス削除、未登録、退園・退職に伴う扱いを、通常の一時停止とどう区別するか。モックでは再設定必須の停止とメール削除済みの場面を用意し、通常再開では通さない。
- 再開案内の失敗・期限切れ:メール送信だけで「利用中」にしない。期限切れ・再送・取消の状態判定を決める。モックのメール配送は表示と状態遷移の再現まで。
- 他の一本化候補:職員、メール変更、初回招待などは候補整理のみ。停止・再開のモック合意だけで、それらのUI改修まで確定したものとは扱わない。
実装で揃える必要がある処理
画面だけでなく、台帳状態と資格情報・セッション・通知購読・再設定コード・未完了の招待を扱う処理を共通化する。停止時は一つのトランザクションで失効・監査を行い、通常再開ではパスワードを保存したままログイン許可を戻す。失効済みのコード・セッション・プッシュ購読や過去の送信待ち案内を復活させない。
認証管理以外のプロフィール保存で状態が変わらないようにする。既存の status=active の既定値を残して、送信されなかった状態が勝手に有効へ戻る形にしない。別経路・古い画面・手作りPOSTでも管理者権限と状態遷移を検証する。確認後の同時更新、連打・二重送信を検査し、古い確認内容をそのまま適用しない。
未登録者には通常再開で本人確認やパスワード設定を飛ばさせない。家族所属や園児への閲覧許可は操作対象外とし、リンクの件数・属性を保持する。
docs/parent-local-authentication-spec.md 10.5の従来の再有効化方針は、今回の通常再開に関するユーザー判断に合わせて改訂した。管理者の明示操作・理由・監査を必須とし、データの自動整合や起動処理で再開しない。
一本化候補の一次調査
調査範囲はアカウント・家族台帳・設定・CSV周辺。全業務の網羅調査ではない。
| 優先度 | 候補 | 配備版の根拠 | 整理案 |
|---|---|---|---|
| 今回 | 保護者の利用停止・再開・状態表示 | routers/parent_accounts.py:369,382、parent_auth.py:1598、templates/parent_auth/admin.html:6、templates/parent_accounts/list.html:107。台帳と認証が別々に状態判定 |
認証管理へ集約し、共通の利用状態を表示。園児詳細の状態表示も揃える |
| 同時に必要 | 保護者CSVからの状態変更 | data_transfer_service.py:927 が状態だけを代入。画面の停止処理を呼ばない。下記の架空データ検証で差を再現 |
台帳CSVからの直接変更を制限するか、共通の認証処理を通す。台帳担当に再開権限を与えない |
| 次の候補 | 職員の有効・停止・再開 | routers/staff_auth.py:674,1068、配備版 templates/staff_auth/users.html:91、templates/staff_auth/authentication.html:31。一覧削除・編集の有効・認証管理の有効化に分散 |
認証管理へ集約し、「一覧から削除」が利用停止であることを名称でも明示。自己停止・最後の管理者の保護は保持 |
| 次の候補 | メール/ログインID変更 | routers/parent_accounts.py:348、routers/parent_portal.py:850、family_support.py:519 は連絡先メール。parent_auth.py:1403 以降はログインIDも変更 |
連絡先メールとログインIDを明確に区別し、本人確認が必要な変更窓口をまとめる。二つを自動で同一値へ上書きしない |
| 次の候補 | 初回招待・再招待・初回設定・再開 | templates/parent_auth/admin.html:75,102、templates/parent_accounts/list.html:13、templates/children/detail.html:164 |
入口は園児・保護者の状況に合わせて残し、選択対象を共通の認証管理へ引き継ぐ。利用中の人への初回招待と再開を混同させない |
| 整理済み | 職員権限 | templates/staff_auth/user_form.html:30、routers/staff_auth.py:917、docs/staff-permissions-and-billing-accounts-spec.md |
既存の権限設定へ集約済み。今回やり直す必要はない |
| 分けて維持 | 家族・園児のプロフィール/閲覧許可/アーカイブ | family_support.py:319 と同期関数群、家庭アーカイブの配備記録 |
家族の所属・一覧整理とログインや閲覧権限は別。複数の編集入口でも同じ共有データ・共通処理を使うものは残す |
検証と限界
- モックの状態遷移6テスト成功。通常再開のパスワード維持、98リンク保持、旧セッション・通知失効の維持、従来の不整合状態、再設定待ち、取消、未登録・メール削除済みの拒否、権限・古い確認・保存失敗を検証した。
- ブラウザーで、未入力の送信拒否、確認から修正へ戻る操作、通常再開、一覧・編集の状態一致、100人中98人の選択保持、編集キャンセル、保存失敗時の停止状態保持と再試行、再設定を伴う再開の待機・完了を操作確認した。既定の画面幅で配置も確認済み。
- 配備版のコードを読み込んだインメモリDBでCSVの停止・再有効化を再現。CSV停止後も資格情報の停止日時は未設定、セッションは未失効、通知購読はactiveのまま。停止中にセッション照合のリクエストを挟まずCSVで再有効化すると、以前のセッションを再利用できた。停止中のアクセスが許可されるという結果ではない。通常の認証処理はinactiveを拒否する。
- 調査時の再現スクリプト:
tools/account-lifecycle-review/audit-source.py。配備版の固定ソースで旧動作を再現するもの。今回の実装ではCSVによる既存アカウントの状態変更を拒否し、新しい回帰テストで防止を確認した。 - 本番のコード・データ・アカウント状態は変更していない。先に保留していた本番向け利用再開コードのメールも送信していない。