コンテンツにスキップ

アカウントの利用停止・再開を一本化する変更案

状態:2026-09-23、モック試用後に「これで進めてください」と承認済み。保護者の停止・再開、状態表示、CSVの制限を実装し、同日06:30:49 JSTに本番反映を完了。実装内容は 実装記録、確認結果は 配備記録 に記載。

要望と合意した方針

  • 保護者の利用停止・再開は「認証管理」にまとめる。
  • 通常の一時停止からの再開は、現在のパスワードを維持し、本人の再ログインを求める(ユーザー回答済み)。
  • 停止前のログイン状態・通知登録を復活させない。
  • 同様に一本化した方がよい操作を調査する。
  • AGENTS.md の手順に従い、モック確認を経て保護者の停止・再開を実装する。職員・メール変更などは候補整理のままとする。

配備基準は 15b13a9dd1eb6ae1b4d171186cb12c1dcc33326c。固定ソースは .local-dev/truenas-initial-ledger-20260922/source。対象の保護者ルーター、認証処理、CSV処理、保護者編集・認証管理・一覧テンプレートが現在の作業用ソースと同一であることをSHA256で確認した。職員編集テンプレートには差異があるため、候補調査では固定ソースも直接確認した。

こちらの解釈・今回のモック

アカウント編集から変更可能な「状態」欄を取り除き、利用状態の表示と「認証管理へ」の案内に置き換える。氏名・連絡先・照合用氏名・照合表記・電話・住所・勤務先・勤務先電話・勤務先住所・所属家族・家族プロフィールの保護者・全園児の明示的な閲覧許可は残す。

認証管理の上部に「利用停止・再開」を置く。既存のメール・ログインID変更、初回登録の案内、コード発行、メール配送、申請履歴、提出内容28項目、承認対象・確認理由・確認欄、パスワード再設定も状態に応じて確認できる。初回パスワード設定と既存利用者の再開は別の操作とする。

一覧・編集・認証管理は同じ利用状態を表示する。今回問題になった「台帳は有効・認証は停止中」の既存データは、一貫して「停止中」と表示し、管理者が認証管理から明示的に再開する。ページを開いただけで有効化しない。

現在の状態 操作 確定後 パスワード 園児との紐づけ
利用中 利用停止 停止中 維持・ログイン不可 保持
一時停止中 通常の利用再開 利用中・新たにログインが必要 維持 保持
再設定が必要な停止 再開案内を送信 再開手続き待ち・ログイン不可 本人の設定待ち 保持
再開手続き待ち 本人が設定を完了 利用中・新たにログインが必要 本人が再設定 保持
再開手続き待ち 手続きを取消 停止中 未変更・コード失効 保持
未登録/初回登録確認待ち 初回登録・初回設定 初回設定待ち等 初回設定が必要 承認した対象だけ
メールアドレス削除済み 通常の再開 この操作では再開させない 維持 保持

保存・修正・取消・失敗

  1. 操作理由を入力して「内容を確認」へ進む。この段階では状態もメールも変更しない。
  2. 確認画面で、対象・理由・セッションと通知への影響・閲覧許可の保持を表示する。
  3. 「修正に戻る」または確認画面を閉じると、入力理由を保持して元の画面へ戻る。
  4. 最後の確定ボタンで初めて一括保存する。通常の再開はメールを送信しない。
  5. 失敗時は元の状態を維持し、理由を残して再試行できるようにする。
  6. プロフィール編集のキャンセルは編集前の内容へ戻す。プロフィール更新では利用状態を変更しない。

試用モックは 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による既存アカウントの状態変更を拒否し、新しい回帰テストで防止を確認した。
  • 本番のコード・データ・アカウント状態は変更していない。先に保留していた本番向け利用再開コードのメールも送信していない。