Files
AbelBirdNest-Stock/scripts/seed-grades-from-xls.mjs

83 lines
2.3 KiB
JavaScript

import path from "node:path";
import fs from "node:fs";
import { fileURLToPath } from "node:url";
import XLSX from "xlsx";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const defaultSourcePath = path.join(__dirname, "data", "Grade.xls");
const sourcePath = process.argv[2] ?? process.env.GRADE_XLS_PATH ?? defaultSourcePath;
function formatCode(prefix, sequence) {
return `${prefix}${String(sequence).padStart(5, "0")}`;
}
async function main() {
if (!fs.existsSync(sourcePath)) {
throw new Error(
[
`File grade tidak ditemukan: ${sourcePath}`,
"Simpan file Grade.xls di scripts/data/Grade.xls",
"atau jalankan: node scripts/seed-grades-from-xls.mjs /path/ke/Grade.xls",
"atau set env: GRADE_XLS_PATH=/path/ke/Grade.xls"
].join("\n")
);
}
const workbook = XLSX.readFile(sourcePath);
const sheetName = workbook.SheetNames[0];
const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { defval: "" });
let mangkokSequence = 1;
let nonMangkokSequence = 1;
for (const row of rows) {
const legacyCode = String(row.Code || "").trim();
const name = String(row.Name || "").trim();
const description = String(row.Description || "").trim();
const isMangkok = String(row.Mangkok || "").trim().toLowerCase() === "yes";
if (!name) continue;
const prefix = isMangkok ? "MGK" : "GRD";
const code = isMangkok
? formatCode(prefix, mangkokSequence++)
: formatCode(prefix, nonMangkokSequence++);
await prisma.grade.upsert({
where: { legacyCode: legacyCode || "__missing__" },
update: {
code,
isMangkok,
name,
description: description || null,
status: "ACTIVE"
},
create: {
code,
legacyCode: legacyCode || null,
isMangkok,
name,
description: description || null,
status: "ACTIVE"
}
});
}
const count = await prisma.grade.count();
console.log(`Seeded grades: ${count} from ${path.basename(sourcePath)}`);
}
main()
.catch((error) => {
console.error(error);
process.exitCode = 1;
})
.finally(async () => {
await prisma.$disconnect();
});