社内ポータルの確認フローを作ったとき、「確認対象のユーザー」をどの時点で決めるかが重要でした。発行後にユーザーが増減するたび、過去の確認記録まで変わってしまうと、当時誰へ依頼したのか分からなくなるからです。
そこで、現在のユーザー一覧を毎回参照するのではなく、発行時点の対象者を保存するスナップショット方式にしました。この記事では、現在値とスナップショットの違い、保存するタイミング、確認方法を整理します。
現在値を使うと過去の記録まで変わってしまう
最初に考えたのは、画面を開くたびに現在のユーザー一覧から対象者を計算する方法です。実装は分かりやすいものの、発行後の変更に弱い問題があります。
- 発行後に追加されたユーザーが、過去の依頼にも含まれてしまう
- 退職や権限変更で対象外になった人が、過去の記録から消えてしまう
- 確認済み人数の分母が後から変わり、当時の進捗を再現できない
現在の組織状態を知る画面なら現在値が適しています。しかし、発行した文書の確認記録には、その時点の対象を残す必要があります。
発行時点の対象者をスナップショットとして保存する
スナップショットは、ある時点の状態を固定して保存した記録です。今回の仕組みでは、文書を発行するときに対象ユーザーのID一覧を作り、その文書に結び付けて保存します。
後からユーザーが増えても、保存済みの一覧は自動で書き換えません。確認画面では、その固定された対象者と確認済みユーザーを比べます。これにより、過去の発行時点を保ったまま進捗を表示できます。
保存するタイミングを「発行」にそろえる
対象者を固定するタイミングは、下書き作成時ではなく発行時にしました。下書き中は内容や対象範囲が変わる可能性があり、その段階で固定すると実際の依頼時点とずれるためです。
- 文書を下書きとして作る
- 内容と公開範囲を確認する
- 発行操作を行う
- その時点の対象ユーザーIDを保存する
- 保存した対象を基準に確認状況を集計する
業務上の区切りとデータを固定する処理を同じ操作にそろえることで、「いつの一覧か」を説明しやすくなりました。
保存するのは表示名ではなくユーザーID
対象者の保存には、表示名ではなくWordPressのユーザーIDを使います。表示名は後から変更されることがあり、同じ名前の人が存在する可能性もあるためです。
ID一覧を保存し、画面を表示するときに現在のプロフィール情報を取得します。誰を対象にしたかという関係は固定しつつ、表示名などのプロフィールは現在の情報を使える形です。
ユーザーが削除されて現在の情報を取得できない場合も想定し、IDが残っていること自体を過去記録として扱います。存在しないユーザーを無理に現在の一覧へ戻すのではなく、表示側で状態を区別します。
現在値を使う場所と固定値を使う場所を分ける
すべての画面をスナップショットにするわけではありません。用途に応じて、現在値と固定値を使い分けます。
| 用途 | 使うデータ |
|---|---|
| 新しい文書の対象候補 | 現在のユーザー一覧 |
| 発行済み文書の確認対象 | 発行時のスナップショット |
| 現在の権限や所属 | 現在値 |
| 発行時の対象人数 | 保存済みID一覧 |
「最新情報が正しい」と一律に考えず、その画面が現在を示すのか、過去の事実を示すのかで選びます。
保存前に対象者一覧を確認できるようにする
スナップショットは発行後に自動変更しないため、保存前の確認が大切です。発行画面では、対象人数だけでなく対象者一覧も確認できるようにします。
- 意図した役割・グループのユーザーが含まれている
- 管理者など対象外にするユーザーが混ざっていない
- 対象人数が想定と大きく違っていない
対象を間違えたまま固定しないよう、発行操作の直前に確認できる流れにしました。
ユーザー追加後も過去記録が変わらないか確認する
動作確認では、まず少人数を対象に文書を発行し、対象人数とID一覧を記録します。その後でテストユーザーを追加し、過去の文書を再表示します。
新しいユーザーが過去の対象へ追加されず、新しく発行する文書には含まれることを確認できれば、現在値とスナップショットを分けられています。確認済み人数の分母が変わらないことも成功状態です。
過去を再現するデータは発生時点で残す
今回分かったのは、あとから現在値を使って過去を再計算しても、当時の状態は再現できないということです。発行、申請、承認など時点に意味がある処理では、その瞬間の対象を保存する必要があります。
PROJECT 002で作った業務フロー全体は、WordPressで業務フローを組み立てるに記録しています。この記事では、その中でも発行対象を固定する判断だけを切り出しました。
現在を表示するデータと、過去の事実を残すデータを分ける。発行時点のスナップショットを持たせたことで、ユーザー構成が変わっても確認記録の意味を保てるようになりました。