ken_nogi/ClaudePleasanter/営業積算システム/generate-process-flowchart.js
2026-08-01 10:42:16 +09:00

77 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* generate-process-flowchart.js
* ------------------------------------------------------------
* configs/site-{SiteId}_{サイト名}/processes.json と
* siteSettingJsons/site-{SiteId}_latest.jsonStatus列ChoicesTextから
* Mermaid横向きフローチャートStatus遷移図を生成し、標準出力へ表示します。
*
* このスクリプトはファイル書き込み・API送信を一切行いません標準出力のみ
* 出力された```mermaid```ブロックは、仕様書「8. プロセス設定」節へ手動で組み込んでください。
*
* 使い方:
* node generate-process-flowchart.js site-335411
* (フォルダ名は "site-{SiteId}_{サイト名}" 形式だが、"site-{SiteId}" だけの
* 前方一致指定でも configs/ 配下から自動的に該当フォルダを探して解決する)
* ------------------------------------------------------------
*/
const fs = require("fs");
const path = require("path");
function readJson(p) {
return JSON.parse(fs.readFileSync(p, "utf-8"));
}
// フォルダ名は "site-{SiteId}_{サイト名}" 形式。"site-{SiteId}" のみの指定でも
// configs/ 配下から前方一致で該当フォルダを探して解決する。
// (build-desired-config.js の resolveSiteDir と同一ロジック)
function resolveSiteDir(baseDir, arg) {
const configsDir = path.join(baseDir, "configs");
const direct = path.isAbsolute(arg) ? arg : path.join(configsDir, path.basename(arg));
const baseName = path.basename(arg);
const candidates = fs.existsSync(configsDir)
? fs.readdirSync(configsDir).filter((name) => {
const full = path.join(configsDir, name);
return (
fs.statSync(full).isDirectory() && (name === baseName || name.startsWith(`${baseName}_`))
);
})
: [];
const suffixed = candidates.filter((name) => name !== baseName);
if (suffixed.length === 1) return path.join(configsDir, suffixed[0]);
if (suffixed.length > 1) {
console.error(`[エラー] "${baseName}" に一致するフォルダが複数見つかりました: ${suffixed.join(", ")}`);
console.error("フォルダ名をフルで指定してください。");
process.exit(1);
}
if (candidates.includes(baseName)) return path.join(configsDir, baseName);
if (fs.existsSync(direct) && fs.statSync(direct).isDirectory()) return direct;
console.error(`[エラー] フォルダが見つかりません: ${direct}`);
console.error("先に node extract-site-config.jsまたはnode get-site-config.jsを実行してください。");
process.exit(1);
}
// "値,ラベル,短縮ラベル,色" 形式改行区切りのChoicesTextを 値→ラベル のMapへ変換する
function parseChoicesText(choicesText) {
const map = new Map();
if (!choicesText) return map;
const lines = choicesText.split("\n").filter((line) => line.trim().length > 0);
for (const line of lines) {
const parts = line.split(",");
const value = (parts[0] || "").trim();
if (!value) continue;
const label = (parts[1] || value).trim();
map.set(value, label);
}
return map;
}
module.exports = {
resolveSiteDir,
parseChoicesText,
};