// 健康診断管理 SiteId 508971(社員別健康診断管理): Summaries(513156への集計設定)に、 // 既存のNum031/Num032と同じ条件(SiteId:513156, DestinationReferenceType:Results, // LinkColumn:ClassZ, Type:Total, SourceColumn=DestinationColumn)でNum033~038/Num061~071/081~091を // 追加するワンショットスクリプト。updatesite(Mode:full)を使う。 // --execute指定時のみ実際に送信、指定なければプレビューのみ出力。 "use strict"; const fs = require("fs"); const path = require("path"); const { findSiteDir, newModifyDir } = require("../../site-paths.js"); const PROJECT_NAME = "健康診断管理"; const ENV = "production"; const SITE_ID = 508971; const SITE_NAME = "社員別健康診断管理"; const DEST_SITE_ID = 513156; const REQUEST_LABEL = "add-summaries-num033-038-and-061-091"; const TARGET_COLUMNS = [ "Num033", "Num034", "Num035", "Num036", "Num037", "Num038", "Num061", "Num062", "Num063", "Num064", "Num065", "Num066", "Num067", "Num068", "Num069", "Num070", "Num071", "Num081", "Num082", "Num083", "Num084", "Num085", "Num086", "Num087", "Num088", "Num089", "Num090", "Num091", ]; const REPO_ROOT = path.join(__dirname, "..", "..", "..", ".."); const PROJECT_ROOT = path.join(REPO_ROOT, PROJECT_NAME); const CONFIGS_DIR = path.join(PROJECT_ROOT, "configs", ENV); function loadServerConfig() { const configPath = path.join(REPO_ROOT, `config_${ENV}.json`); const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); if (!config.BaseUrl || !config.ApiKey) { console.error(`[エラー] ${configPath} に BaseUrl / ApiKey を設定してください。`); process.exit(1); } return config; } function loadLatest() { const siteDir = findSiteDir(CONFIGS_DIR, SITE_ID); if (!siteDir) { console.error(`[エラー] configs/${ENV}/site-${SITE_ID}_* が見つかりません。先にget-site-config.jsを実行してください。`); process.exit(1); } const p = path.join(siteDir, "sitesettings", `site-${SITE_ID}_latest.json`); const raw = JSON.parse(fs.readFileSync(p, "utf-8")); return { current: raw.Response.Data, siteDir, rawText: fs.readFileSync(p, "utf-8") }; } function buildDesiredSiteSettings(current) { const settings = JSON.parse(JSON.stringify(current.SiteSettings)); const summaries = settings.Summaries || []; const existingIds = summaries.map((s) => s.Id); let nextId = existingIds.length > 0 ? Math.max(...existingIds) + 1 : 1; const added = []; for (const col of TARGET_COLUMNS) { if (summaries.some((s) => s.SourceColumn === col && s.SiteId === DEST_SITE_ID)) { console.error(`[エラー] Summaries内に${col}(SiteId${DEST_SITE_ID}向け)が既に存在します(重複防止のため中断)。`); process.exit(1); } const entry = { SiteId: DEST_SITE_ID, DestinationReferenceType: "Results", DestinationColumn: col, LinkColumn: "ClassZ", Type: "Total", SourceColumn: col, Id: nextId, }; summaries.push(entry); added.push(entry); nextId++; } settings.Summaries = summaries; // Links省略厳禁(全置換のため既存値をそのまま含める) settings.Links = current.SiteSettings.Links || []; return { settings, added }; } function buildUpdateBody(apiKey, current, desiredSettings) { return { ApiVersion: "1.1", ApiKey: apiKey, SiteId: SITE_ID, Title: current.Title, ReferenceType: current.ReferenceType, ParentId: current.ParentId, InheritPermission: current.InheritPermission, SiteSettings: desiredSettings, }; } const execute = process.argv.includes("--execute"); const server = loadServerConfig(); (async () => { const { current, siteDir, rawText } = loadLatest(); const { settings: desiredSettings, added } = buildDesiredSiteSettings(current); const body = buildUpdateBody(server.ApiKey, current, desiredSettings); const modifyDir = newModifyDir(siteDir, REQUEST_LABEL); const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); fs.writeFileSync(path.join(modifyDir, `before_site-${SITE_ID}_latest.json`), rawText, "utf-8"); const updatedPath = path.join(modifyDir, `site-${SITE_ID}_updated_${timestamp}.json`); fs.writeFileSync(updatedPath, JSON.stringify(body, null, 2), "utf-8"); console.log(`\n==== SiteId ${SITE_ID} (${SITE_NAME}) ====`); console.log(`追加するSummaries(SiteId${DEST_SITE_ID}向け):`); for (const s of added) console.log(` - Id${s.Id}: ${s.SourceColumn} → ${s.DestinationColumn} (Type:${s.Type}, LinkColumn:${s.LinkColumn})`); console.log(`\nSummaries件数: 変更前${(current.SiteSettings.Summaries || []).length} → 変更後${desiredSettings.Summaries.length}`); console.log(`プレビュー保存先: ${updatedPath}`); if (!execute) { console.log("\n(--execute 未指定のためプレビューのみ。送信していません)"); return; } const url = `${server.BaseUrl}api/items/${SITE_ID}/updatesite`; console.log(`送信先: ${url}`); const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); const json = await res.json(); console.log(`[結果] HTTP ${res.status}:`, JSON.stringify(json)); const resultPath = path.join(modifyDir, `site-${SITE_ID}_result_${timestamp}.json`); fs.writeFileSync(resultPath, JSON.stringify(json, null, 2), "utf-8"); })();