Files
Aislo/tools/est-test/inspect-accom.cjs

37 lines
1.6 KiB
JavaScript

const { unzip, table } = require("./import-estx.cjs");
function inspectAccom(bytes) {
const files = unzip(bytes),
data = files.get("accommaintable.dat");
if (!data) throw Error("기성 원본 표 AccomMainTable.Dat가 없습니다.");
const signature = Buffer.from("068abe8e592364cb403d71d2e3bc64d001", "hex");
if (data.length < 512 || !data.subarray(8, 25).equals(signature))
throw Error("기성 원본 표의 DBISAM 서명이 올바르지 않습니다.");
const warnings = new Set(),
rows = table(data, files.get("accommaintable.blb"), warnings),
fields = Array.from({ length: data.readUInt16LE(47) }, (_, index) => {
const at = 512 + index * 768;
return data.subarray(at + 3, at + 3 + data[at + 2]).toString("ascii");
});
if (!["Code", "TotalGN"].every((name) => fields.includes(name)))
throw Error("기성 원본 표의 코드 또는 누계 수량 필드가 없습니다.");
if (new Set(fields).size !== fields.length) throw Error("기성 원본 표에 중복 필드가 있습니다.");
const hasBlob = fields.some((_, index) => data[512 + index * 768 + 164] === 3);
if (hasBlob && !files.has("accommaintable.blb"))
warnings.add("기성 표의 BLOB 파일이 없어 별도 바이너리 값은 확인할 수 없습니다.");
return {
fields,
rows: rows.map((row) =>
Object.fromEntries(
fields.map((field) => [
field,
row[field] && typeof row[field] === "object" ? "[바이너리]" : row[field],
]),
),
),
warnings: [...warnings],
};
}
module.exports = { inspectAccom };