Files
MIS-Contro-Tower/scripts/export-reason-catalog-csv.mjs
2026-05-06 00:36:48 +00:00

77 lines
2.2 KiB
JavaScript

#!/usr/bin/env node
/**
* Export reasonCatalog JSON (downtime + scrap) to CSV for printed operator sheets.
* Usage: node scripts/export-reason-catalog-csv.mjs <path-to-catalog.json>
* cat reasonCatalog.json | node scripts/export-reason-catalog-csv.mjs
*
* CSV columns: kind, reasonCode, categoryLabel, reasonLabel, active
*/
import { readFileSync, existsSync } from "fs";
function escCsv(s) {
const t = String(s ?? "");
if (/[",\n\r]/.test(t)) return `"${t.replace(/"/g, '""')}"`;
return t;
}
function effectiveReasonCode(categoryId, detail) {
const c = String(detail.reasonCode ?? detail.code ?? "").trim();
if (c) return c.toUpperCase();
const cat = String(categoryId ?? "")
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "");
const det = String(detail.id ?? "")
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "");
return `${cat}__${det}`.toUpperCase();
}
function walk(kind, categories, rows) {
if (!Array.isArray(categories)) return;
for (const cat of categories) {
const cid = String(cat.id ?? "").trim();
const clab = String(cat.label ?? "").trim();
const details = Array.isArray(cat.details)
? cat.details
: Array.isArray(cat.children)
? cat.children
: [];
for (const d of details) {
const active = d.active === false ? "0" : "1";
const dlab = String(d.label ?? "").trim();
rows.push({
kind,
reasonCode: effectiveReasonCode(cid || clab, d),
categoryLabel: clab,
reasonLabel: dlab,
active,
});
}
}
}
let raw = "";
const arg = process.argv[2];
if (arg && existsSync(arg)) {
raw = readFileSync(arg, "utf8");
} else {
raw = readFileSync(0, "utf8");
}
const catalog = JSON.parse(raw || "{}");
const rows = [];
walk("downtime", catalog.downtime, rows);
walk("scrap", catalog.scrap, rows);
const header = ["kind", "reasonCode", "categoryLabel", "reasonLabel", "active"];
console.log(header.map(escCsv).join(","));
for (const r of rows) {
console.log([r.kind, r.reasonCode, r.categoryLabel, r.reasonLabel, r.active].map(escCsv).join(","));
}