- Enhanced `nss-fasteners-pb-import.json` to compute `selling_price` as `cost_price * (1 + 80%)` and included `markup` in the records. - Updated `nss-fasteners-pb-transform.ts` to allow configurable CSV and output file names via environment variables, improving flexibility for different product runs. - Added support for uploading photos in the repair detail page, including validation for file types and sizes, and implemented a dialog for creating customer quotes linked to repairs. - Introduced a new `customer_quote` field in the `Repair` type to link generated quotes back to their respective repairs. These changes streamline the pricing process and enhance the user experience in managing repairs and quotes.
109 lines
3.3 KiB
TypeScript
109 lines
3.3 KiB
TypeScript
import "./_env";
|
|
import { getAdminPocketBase } from "../src/lib/server/pocketbase-admin";
|
|
import { readFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
|
|
const NSS_LOCATION =
|
|
"NSS Fasteners price list - hex nut DIN934 (Grade 8 + A2)";
|
|
const IMPORT_JSON = join(import.meta.dirname, "nss-fasteners-pb-import.json");
|
|
|
|
async function main() {
|
|
const importDoc = JSON.parse(readFileSync(IMPORT_JSON, "utf8")) as {
|
|
records: Array<{ sku: string; name: string; description: string; notes: string }>;
|
|
};
|
|
const originalBySku = new Map(
|
|
importDoc.records.map((r) => [r.sku, r] as const),
|
|
);
|
|
|
|
const pb = await getAdminPocketBase();
|
|
const current = await pb.collection("stock_items").getFullList<{
|
|
id: string;
|
|
sku: string;
|
|
name: string;
|
|
description: string;
|
|
notes: string;
|
|
updated: string;
|
|
}>({
|
|
filter: `location = "${NSS_LOCATION}"`,
|
|
fields: "id,sku,name,description,notes,updated",
|
|
batch: 200,
|
|
sort: "sku",
|
|
});
|
|
|
|
console.log(`Comparing ${current.length} NSS-imported rows: original (from JSON) vs current (in PB)\n`);
|
|
|
|
let nameChanged = 0;
|
|
let descChanged = 0;
|
|
let notesChanged = 0;
|
|
let unchanged = 0;
|
|
|
|
const diffs: Array<{
|
|
sku: string;
|
|
origName: string;
|
|
currName: string;
|
|
origDesc: string;
|
|
currDesc: string;
|
|
origNotes: string;
|
|
currNotes: string;
|
|
updated: string;
|
|
}> = [];
|
|
|
|
for (const r of current) {
|
|
const orig = originalBySku.get(r.sku);
|
|
if (!orig) continue;
|
|
|
|
const nameDiff = r.name !== orig.name;
|
|
const descDiff = r.description !== orig.description;
|
|
const notesDiff = r.notes !== orig.notes;
|
|
|
|
if (nameDiff) nameChanged++;
|
|
if (descDiff) descChanged++;
|
|
if (notesDiff) notesChanged++;
|
|
if (!nameDiff && !descDiff && !notesDiff) unchanged++;
|
|
|
|
if (nameDiff || descDiff || notesDiff) {
|
|
diffs.push({
|
|
sku: r.sku,
|
|
origName: orig.name,
|
|
currName: r.name,
|
|
origDesc: orig.description,
|
|
currDesc: r.description,
|
|
origNotes: orig.notes,
|
|
currNotes: r.notes,
|
|
updated: r.updated,
|
|
});
|
|
}
|
|
}
|
|
|
|
console.log(`Field change tally across ${current.length} rows:`);
|
|
console.log(` name changed: ${nameChanged}, unchanged: ${current.length - nameChanged}`);
|
|
console.log(` description changed: ${descChanged}, unchanged: ${current.length - descChanged}`);
|
|
console.log(` notes changed: ${notesChanged}, unchanged: ${current.length - notesChanged}`);
|
|
console.log(` fully unchanged rows: ${unchanged}\n`);
|
|
|
|
console.log(`Sample of rows with differences (first 5):\n`);
|
|
for (const d of diffs.slice(0, 5)) {
|
|
console.log(`SKU: ${d.sku} (updated: ${d.updated})`);
|
|
console.log(` name:`);
|
|
console.log(` before: "${d.origName}"`);
|
|
console.log(` after: "${d.currName}"`);
|
|
console.log(` description:`);
|
|
console.log(` before: "${d.origDesc}"`);
|
|
console.log(` after: "${d.currDesc}"`);
|
|
const notesChanged = d.origNotes !== d.currNotes;
|
|
if (notesChanged) {
|
|
console.log(` notes:`);
|
|
console.log(` before: "${d.origNotes}"`);
|
|
console.log(` after: "${d.currNotes}"`);
|
|
}
|
|
console.log("");
|
|
}
|
|
if (diffs.length > 5) {
|
|
console.log(`... and ${diffs.length - 5} more rows with differences`);
|
|
}
|
|
}
|
|
|
|
main().catch((e) => {
|
|
console.error(e);
|
|
process.exit(1);
|
|
});
|