Add tagged catalog import
This commit is contained in:
105
scripts/import-catalog.js
Normal file
105
scripts/import-catalog.js
Normal file
@@ -0,0 +1,105 @@
|
||||
import 'dotenv/config';
|
||||
|
||||
import { readFileSync } from 'node:fs';
|
||||
|
||||
import { prisma } from '../src/prisma-client.js';
|
||||
|
||||
const IMPORT_DESCRIPTION_PREFIX = 'Импорт каталога 2026-04-08: ';
|
||||
const dataset = JSON.parse(
|
||||
readFileSync(new URL('../data/catalog-import-2026-04-08.json', import.meta.url), 'utf8'),
|
||||
);
|
||||
|
||||
const warehouses = [
|
||||
{ code: 'MSK-01', name: 'Склад Москва' },
|
||||
{ code: 'SPB-01', name: 'Склад СПб' },
|
||||
];
|
||||
|
||||
function formatQuantity(value) {
|
||||
return Number(value ?? 0).toFixed(3);
|
||||
}
|
||||
|
||||
for (const warehouse of warehouses) {
|
||||
await prisma.warehouse.upsert({
|
||||
where: { code: warehouse.code },
|
||||
update: { name: warehouse.name },
|
||||
create: warehouse,
|
||||
});
|
||||
}
|
||||
|
||||
const warehouseIds = Object.fromEntries(
|
||||
await Promise.all(
|
||||
warehouses.map(async (warehouse) => {
|
||||
const persistedWarehouse = await prisma.warehouse.findUniqueOrThrow({
|
||||
where: { code: warehouse.code },
|
||||
select: { id: true },
|
||||
});
|
||||
|
||||
return [warehouse.code, persistedWarehouse.id];
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
await prisma.product.updateMany({
|
||||
data: {
|
||||
isActive: false,
|
||||
},
|
||||
});
|
||||
|
||||
let importedCount = 0;
|
||||
|
||||
for (const item of dataset) {
|
||||
const product = await prisma.product.upsert({
|
||||
where: { sku: item.sku },
|
||||
update: {
|
||||
name: item.name,
|
||||
productType: item.productType,
|
||||
widthMm: item.widthMm,
|
||||
lengthM: item.lengthM,
|
||||
thicknessMicron: item.thicknessMicron,
|
||||
sleeveBrand: item.sleeveBrand,
|
||||
quantityPerBox: item.quantityPerBox,
|
||||
tags: item.tags,
|
||||
description: `${IMPORT_DESCRIPTION_PREFIX}${item.rawName}`,
|
||||
isCustomizable: false,
|
||||
isActive: true,
|
||||
},
|
||||
create: {
|
||||
sku: item.sku,
|
||||
name: item.name,
|
||||
productType: item.productType,
|
||||
widthMm: item.widthMm,
|
||||
lengthM: item.lengthM,
|
||||
thicknessMicron: item.thicknessMicron,
|
||||
sleeveBrand: item.sleeveBrand,
|
||||
quantityPerBox: item.quantityPerBox,
|
||||
tags: item.tags,
|
||||
description: `${IMPORT_DESCRIPTION_PREFIX}${item.rawName}`,
|
||||
isCustomizable: false,
|
||||
isActive: true,
|
||||
},
|
||||
});
|
||||
|
||||
for (const warehouse of warehouses) {
|
||||
await prisma.productStock.upsert({
|
||||
where: {
|
||||
productId_warehouseId: {
|
||||
productId: product.id,
|
||||
warehouseId: warehouseIds[warehouse.code],
|
||||
},
|
||||
},
|
||||
update: {
|
||||
availableQty: formatQuantity(item.balances[warehouse.code]),
|
||||
},
|
||||
create: {
|
||||
productId: product.id,
|
||||
warehouseId: warehouseIds[warehouse.code],
|
||||
availableQty: formatQuantity(item.balances[warehouse.code]),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
importedCount += 1;
|
||||
}
|
||||
|
||||
console.log(`Imported ${importedCount} catalog products from 2026-04-08 stock reports.`);
|
||||
await prisma.$disconnect();
|
||||
Reference in New Issue
Block a user