発行時点の確認対象を保存する。後からユーザーが増えても過去記録を変えない設計

BUILD 09 発行時点の確認対象を固定し、ユーザー追加後も過去記録を変えない仕組み

社内ポータルの確認フローを作ったとき、「確認対象のユーザー」をどの時点で決めるかが重要でした。発行後にユーザーが増減するたび、過去の確認記録まで変わってしまうと、当時誰へ依頼したのか分からなくなるからです。

そこで、現在のユーザー一覧を毎回参照するのではなく、発行時点の対象者を保存するスナップショット方式にしました。この記事では、現在値とスナップショットの違い、保存するタイミング、確認方法を整理します。

現在値を使うと過去の記録まで変わってしまう

最初に考えたのは、画面を開くたびに現在のユーザー一覧から対象者を計算する方法です。実装は分かりやすいものの、発行後の変更に弱い問題があります。

  • 発行後に追加されたユーザーが、過去の依頼にも含まれてしまう
  • 退職や権限変更で対象外になった人が、過去の記録から消えてしまう
  • 確認済み人数の分母が後から変わり、当時の進捗を再現できない

現在の組織状態を知る画面なら現在値が適しています。しかし、発行した文書の確認記録には、その時点の対象を残す必要があります。

発行時点の対象者をスナップショットとして保存する

スナップショットは、ある時点の状態を固定して保存した記録です。今回の仕組みでは、文書を発行するときに対象ユーザーのID一覧を作り、その文書に結び付けて保存します。

後からユーザーが増えても、保存済みの一覧は自動で書き換えません。確認画面では、その固定された対象者と確認済みユーザーを比べます。これにより、過去の発行時点を保ったまま進捗を表示できます。

保存するタイミングを「発行」にそろえる

対象者を固定するタイミングは、下書き作成時ではなく発行時にしました。下書き中は内容や対象範囲が変わる可能性があり、その段階で固定すると実際の依頼時点とずれるためです。

  1. 文書を下書きとして作る
  2. 内容と公開範囲を確認する
  3. 発行操作を行う
  4. その時点の対象ユーザーIDを保存する
  5. 保存した対象を基準に確認状況を集計する

業務上の区切りとデータを固定する処理を同じ操作にそろえることで、「いつの一覧か」を説明しやすくなりました。

保存するのは表示名ではなくユーザーID

対象者の保存には、表示名ではなくWordPressのユーザーIDを使います。表示名は後から変更されることがあり、同じ名前の人が存在する可能性もあるためです。

ID一覧を保存し、画面を表示するときに現在のプロフィール情報を取得します。誰を対象にしたかという関係は固定しつつ、表示名などのプロフィールは現在の情報を使える形です。

ユーザーが削除されて現在の情報を取得できない場合も想定し、IDが残っていること自体を過去記録として扱います。存在しないユーザーを無理に現在の一覧へ戻すのではなく、表示側で状態を区別します。

現在値を使う場所と固定値を使う場所を分ける

すべての画面をスナップショットにするわけではありません。用途に応じて、現在値と固定値を使い分けます。

用途使うデータ
新しい文書の対象候補現在のユーザー一覧
発行済み文書の確認対象発行時のスナップショット
現在の権限や所属現在値
発行時の対象人数保存済みID一覧

「最新情報が正しい」と一律に考えず、その画面が現在を示すのか、過去の事実を示すのかで選びます。

保存前に対象者一覧を確認できるようにする

スナップショットは発行後に自動変更しないため、保存前の確認が大切です。発行画面では、対象人数だけでなく対象者一覧も確認できるようにします。

  • 意図した役割・グループのユーザーが含まれている
  • 管理者など対象外にするユーザーが混ざっていない
  • 対象人数が想定と大きく違っていない

対象を間違えたまま固定しないよう、発行操作の直前に確認できる流れにしました。

ユーザー追加後も過去記録が変わらないか確認する

動作確認では、まず少人数を対象に文書を発行し、対象人数とID一覧を記録します。その後でテストユーザーを追加し、過去の文書を再表示します。

新しいユーザーが過去の対象へ追加されず、新しく発行する文書には含まれることを確認できれば、現在値とスナップショットを分けられています。確認済み人数の分母が変わらないことも成功状態です。

過去を再現するデータは発生時点で残す

今回分かったのは、あとから現在値を使って過去を再計算しても、当時の状態は再現できないということです。発行、申請、承認など時点に意味がある処理では、その瞬間の対象を保存する必要があります。

PROJECT 002で作った業務フロー全体は、WordPressで業務フローを組み立てるに記録しています。この記事では、その中でも発行対象を固定する判断だけを切り出しました。

現在を表示するデータと、過去の事実を残すデータを分ける。発行時点のスナップショットを持たせたことで、ユーザー構成が変わっても確認記録の意味を保てるようになりました。