# プリザンター社員マスタ更新ルール planMerge()ロジック整理。n8n版(`logic-merge-master-plan`)最新反映(2026-08-22)。CLI版(`src/commands/merge-master.js`)は未反映・乖離あり(内部列名のまま、状態判定ロジック無し)、要注意。 ## データ取得方式 - 正サイト(マスタ本体、SiteId=1)全件取得: `items/export`使用。表示名キー・表示値のままexistingItems保持。内部列名変換一切しない - 実ユーザー全件取得: `users/get`(コード値のまま)。理由: `users`にAPI経由export存在せず(ブラウザUI専用機能のみ、APIKey不可)。今後もget維持 - 選択肢マスタ(役職/職級/利用権限タイプ)取得: `items/get`のまま(Title/Status/ResultId基本列のみ、コード値/表示名区別問題起きない構造) ## 突合優先順位 **LINEWORKS社員→既存マスタ** 1. 社員ID一致 2. 無ければメールローカル部一致 **マッチ済み既存マスタ→プリザンター実ユーザー** 1. 既存マスタ内ユーザID最優先。メール変更・削除に影響されない安定突合 2. 無ければメールローカル部解決。候補1件→自動採用。複数→emailOverrides参照。無し→needsReview行き、プリザンター側不可触のまま **プリザンター専用ユーザー(LINEWORKS非在籍)→既存マスタ** - 対象: 既存マスタ内「社員IDが元々無い」行のみ限定(2026-08-22追加制約) - 社員IDがある行の使用中ユーザーIDは、この処理から完全除外(create/updateどちらにも入れない)。**理由: 社員ID有る行は退職処理側の担当。除外しないとcreate/update/retirements間で二重処理・重複が起きる(2026-08-22実データで2種類発覚・修正済み)** - ユーザID一本。メールフォールバックなし(同一ローカル部複数UserId紐づくケースでの奪い合い事故防止、2026-08-08実データ) ## 状態列判定(2026-08-22新規追加) | LINEWORKS | プリザンター組織(DeptId) | 状態 | |---|---|---| | 有 | 問わず | 在籍中 | | 無 | 7(「退職済み」組織) | 退職済み | | 無 | 7以外 | その他 | 「その他」該当は社員ID無し(プリザンター専用ユーザー)が前提。社員IDある行(退職処理対象)は基本的に「退職済み」想定だが、DeptId基準で機械的に計算(異常データでも安全側)。 ## create/update/retire判定 | ケース | 動作 | |---|---| | LINEWORKS社員・既存マスタ未登録 | create | | LINEWORKS社員・既存マスタ登録済み | update | | プリザンター専用(社員ID無し)・既存マスタ未登録 | create | | プリザンター専用(社員ID無し)・既存マスタ登録済み(ユーザID一致) | update | | 既存マスタ社員IDあり・今回LINEWORKS不在 | 退職処理(update。LINEWORKS有無=無、状態=DeptId判定、LINEWORKS在籍フラグ明示1) | ## 書き込み範囲 | 項目 | ルール | |---|---| | LINEWORKS由来項目群 | LINEWORKS由来のみ更新 | | プリザンター紐付け項目群 | 実ユーザー紐付け時のみミラーリング。紐付かなければ不可触 | | 名前 | 常にLINEWORKS姓名(半角スペース結合)で上書き。プリザンターName値は無視 | | 生年月日/入社日 | LINEWORKS側値消失時のみ明示クリア(`1899/12/31`送信)。既に未設定なら無変更 | | 役職/職級/利用権限タイプ | 外部選択肢マスタResultIdへ解決。無ければ新規作成(get-or-create) | ## フラグ - LINEWORKS有無: LINEWORKS社員なら常時「有」、プリザンター専用・退職処理対象なら「無」 - プリザンター有無: プリザンター実ユーザー紐付けば「有」、紐付かなければ「無」 - LINEWORKS在籍フラグ: LINEWORKS社員なら"1"、プリザンター専用は空欄維持、退職処理対象は"1"明示(ユーザー指示、2026-08-22) ## import時の重要な落とし穴(2026-08-22発覚・修正) creates/updates/retirementsを1つのCSVにまとめるとヘッダー(列)が全行共通になる。一部項目しか持たない行(退職処理等)に、他行だけが持つ列(氏名等)の値が空文字で明示送信され、既存値を上書き消去する事故が発生した(8/17の990/1071データ全消去、8/22の氏名再消失、いずれも実データ)。 **対策**: updates/retirementsは`backupFields`(既存の全項目)をベースに変更点だけ`{...backupFields, ...changedFields}`でマージしてからCSV化する。creates(新規)はbackupFields無いのでそのままでよい。 ## 実装 - n8n版本体: `logic-merge-master-plan`サブワークフロー(id: `asKvC5LSVg3q8tuU`) - n8n版検証用コピー: ブロックB(`org-sync: ②-B planmerge test`、id: `MRrc8DnuCupSoVjq`)。**本体とは別の独立コピー、本体修正時は必ずこちらも同時修正要**(2026-08-22、修正漏れで一度検証失敗) - CLI版: `apps/org-master-sync/src/commands/merge-master.js` `planMerge()`。**内部列名ベースのまま、状態列判定・社員ID重複除外ロジック等、今回の変更未反映。乖離状態**