GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。 NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは 別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
67 lines
2.6 KiB
JavaScript
67 lines
2.6 KiB
JavaScript
"use strict";
|
||
/*
|
||
* プリザンター実ユーザー側で既に「退職済み」マーキングされている人(Name先頭が"(退職) "、
|
||
* またはBodyが"退職済み")に対応するマスタレコード(Class011=プリザンターUserId一致)の
|
||
* Check001(退職済み、基本情報タブに新規追加)をtrueに一括更新する。
|
||
* 既定はドライラン(対象一覧の表示のみ)。実際に送信するには --execute を付ける。
|
||
*
|
||
* 実行: node scripts/mark-retired-check001.js [--execute]
|
||
*/
|
||
const { getSiteItems, getAllUsers, updateSiteItem } = require("../src/lib/pleasanterClient");
|
||
|
||
const BASE_URL = process.env.PLEASANTER_BASE_URL;
|
||
const API_KEY = process.env.PLEASANTER_API_KEY;
|
||
const SITE_ID = process.env.PLEASANTER_MASTER_SITE_ID;
|
||
|
||
if (!BASE_URL || !API_KEY || !SITE_ID) {
|
||
console.error("PLEASANTER_BASE_URL / PLEASANTER_API_KEY / PLEASANTER_MASTER_SITE_ID が未設定");
|
||
process.exit(1);
|
||
}
|
||
|
||
function isRetiredPleasanterUser(pUser) {
|
||
return pUser.Name.startsWith("(退職) ") || pUser.Body === "退職済み";
|
||
}
|
||
|
||
async function main() {
|
||
const execute = process.argv.includes("--execute");
|
||
const config = { baseUrl: BASE_URL, apiKey: API_KEY, siteId: SITE_ID };
|
||
|
||
const [masterItems, pleasanterUsers] = await Promise.all([
|
||
getSiteItems(config),
|
||
getAllUsers(config),
|
||
]);
|
||
|
||
const retiredUserIds = new Set(
|
||
pleasanterUsers.filter(isRetiredPleasanterUser).map((u) => String(u.UserId))
|
||
);
|
||
console.log(`プリザンター側「退職済み」判定件数: ${retiredUserIds.size}`);
|
||
|
||
const targets = masterItems.filter(
|
||
(i) => i.Class011 && retiredUserIds.has(i.Class011) && i.Check001 !== true
|
||
);
|
||
const alreadyTrue = masterItems.filter(
|
||
(i) => i.Class011 && retiredUserIds.has(i.Class011) && i.Check001 === true
|
||
).length;
|
||
|
||
console.log(`マスタ内で更新対象(Check001をtrueにする): ${targets.length}件`);
|
||
console.log(`マスタ内で既にCheck001=trueだったもの: ${alreadyTrue}件`);
|
||
console.log("更新対象サンプル:", JSON.stringify(targets.slice(0, 5).map((i) => ({ ResultId: i.ResultId, Class011: i.Class011, Class013: i.Class013 }))));
|
||
|
||
if (!execute) {
|
||
console.log("\n[ドライラン] --execute を付けずに実行したため送信していません。");
|
||
return;
|
||
}
|
||
|
||
let updated = 0;
|
||
for (const item of targets) {
|
||
await updateSiteItem({ baseUrl: BASE_URL, apiKey: API_KEY, itemId: item.ResultId, fields: { Check001: true } });
|
||
updated++;
|
||
}
|
||
console.log(`\n[OK] ${updated}件のCheck001をtrueに更新しました。`);
|
||
}
|
||
|
||
main().catch((e) => {
|
||
console.error(e);
|
||
process.exit(1);
|
||
});
|