なぜ二重になるのか
移行のせいではありません。CMS は追加しかしないので、全角スペースひとつ違えば別の事業所、
2 つのクリニックが登録した同じ人は 2 人になります。紹介先がどちらを指すか決まらず、
クリニックの選択肢にも両方出ます。
営業行の移行より先に流します
先に営業行を 1,913 行入れると、退役する記録を指した参照が同じ数だけ増えます。
順序は 統合 → 営業データ移行。
訪問看護ステーションなど、サービス名を含む事業所
本番マスタ 765 件が名称に「ステーション」を含みます。突合は名称を丸ごと見るので、
「○○訪問看護ステーション」と「○○居宅介護支援事業所」は別のまま——同じ建物・同じ法人でも
別サービスで、レセプトも担当者も別だからです(サービス名を除くと同名になる組が 201 組、
うち 128 組は同一所在地。重複ではありません)。今回の 56 まとまりのうち
ステーション名は 0 件、いずれも表記ゆれによる同一名。サービス種別をまたぐ統合は 3 件です。
回答のしかた
要判断 55 件は残す記録を番号で選ぶか「別の事業所です/別人です」。
自動 1 件もその場で止められます。回答は突合表と同じ保存先に入り、統合スクリプトが読みます
(同じまとまりに違う回答が並べば、どちらでも統合しません)。
既存の参照をどうするか
退役させる前に、担当者の勤務先・営業行の紹介先からの参照を残す記録へ付け替えます
(担当者 0 件・営業行 1 件)。付け替えと退役は同じ journal なので、
取り消せば参照も元に戻ります。要判断は統合しないため、その 132 件はいまのまま。
行を開くと、どの担当者・どの営業行がどの項目で指しているかが 1 件ずつ出ます。
統合が実際に書くもの
- 残す記録を決める — 項目が多いほう、次に参照が多いほう、最後は ID 順。再実行しても同じ。
- 空欄を埋める — 残す側が空の項目だけ。上書きなし(今回 1 項目)。
- 参照を移す — 担当者 0 件・営業行 1 件を残す記録へ。
- 削除ではなく退役 —
is_deleted と merged_into。CMS の論理削除と
同じ扱いで、参照を見落としても復旧できます。
- journal に記録 — 書き込みごとに前の値を残すので
rollback.py --journal が正確な取り消しに。
検証
エミュレータ(本番スナップショットから復元)で通し、取り消し後の
snapshot.py --diff は identical。
python3 scripts/snapshot.py --target <t> # 先にバックアップ
python3 transform/merge.py --apply --target <t> # 統合
python3 transform/rollback.py --journal <path> --apply # 取り消し