121 lines
3.7 KiB
TypeScript
121 lines
3.7 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
async function main() {
|
|
const filePath = path.join('C:', 'Users', 'parsa', '.gemini', 'antigravity-ide', 'brain', '951ff86f-dc4e-4670-9a62-78e1f9c8c223', 'scratch', 'products.json');
|
|
console.log(`Reading from: ${filePath}`);
|
|
const productsData = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
|
|
for (const item of productsData) {
|
|
const artNo = item.article_number || item.article_number_100g || 'UNKNOWN-' + Math.floor(Math.random()*1000);
|
|
const name = item.product_name_fa || 'محصول نامشخص';
|
|
const scientificTagline = item.product_name_en || null;
|
|
const description = item.description || '';
|
|
const shortDescription = item.analytical_constituents || null;
|
|
|
|
let priceStr = item.price || item.price_100g || item.price_90tab || '0';
|
|
priceStr = priceStr.replace(/,/g, '').replace(' T', '').replace('T', '').trim();
|
|
const priceValue = parseFloat(priceStr) || 0;
|
|
const priceDisplay = item.price || item.price_100g || item.price_90tab || 'نامشخص';
|
|
|
|
let packageSize = 100;
|
|
let unit = "g";
|
|
const vw = item.volume_weight || '';
|
|
if (vw.includes('ml')) unit = "ml";
|
|
else if (vw.includes('g')) unit = "g";
|
|
else if (vw.includes('tab')) unit = "tablet";
|
|
|
|
const sizeMatch = vw.match(/(\d+)/);
|
|
if (sizeMatch) {
|
|
packageSize = parseFloat(sizeMatch[1]);
|
|
}
|
|
|
|
const dosageLogic = item.feeding_recommendation || item.feeding_advice || '';
|
|
|
|
let suitableFor = "سگ";
|
|
const textToCheck = (name + " " + description).toLowerCase();
|
|
const hasCat = textToCheck.includes("گربه") || textToCheck.includes("katzen");
|
|
const hasDog = textToCheck.includes("سگ") || textToCheck.includes("hund") || textToCheck.includes("توله");
|
|
if (hasCat && hasDog) {
|
|
suitableFor = "هر دو";
|
|
} else if (hasCat) {
|
|
suitableFor = "گربه";
|
|
} else if (hasDog) {
|
|
suitableFor = "سگ";
|
|
} else {
|
|
suitableFor = "هر دو";
|
|
}
|
|
|
|
const category = "مکمل تخصصی";
|
|
const categorySlug = "specialized-supplements";
|
|
const imageUrl = "/products/product-placeholder.png";
|
|
|
|
const createdProduct = await prisma.product.upsert({
|
|
where: { artNo },
|
|
update: {
|
|
nameFa: name,
|
|
nameEn: name,
|
|
scientificTagline,
|
|
description,
|
|
shortDescription,
|
|
priceValue,
|
|
priceDisplay,
|
|
packageSize,
|
|
unit,
|
|
dosageLogic,
|
|
suitableFor
|
|
},
|
|
create: {
|
|
artNo,
|
|
nameFa: name,
|
|
nameEn: name,
|
|
slug: artNo,
|
|
scientificTagline,
|
|
description,
|
|
shortDescription,
|
|
categorySlug,
|
|
priceValue,
|
|
priceDisplay,
|
|
unit,
|
|
packageSize,
|
|
dosageLogic,
|
|
suitableFor,
|
|
imageUrl,
|
|
category: { connectOrCreate: { where: { slug: categorySlug }, create: { name: category, slug: categorySlug } } }
|
|
}
|
|
});
|
|
|
|
if (item.ingredients) {
|
|
const ingredientsArr = item.ingredients.split('،').map((i: string) => i.trim()).filter(Boolean);
|
|
for (const ing of ingredientsArr) {
|
|
await prisma.productIngredient.upsert({
|
|
where: {
|
|
productId_ingredient: {
|
|
productId: createdProduct.id,
|
|
ingredient: ing.substring(0, 150)
|
|
}
|
|
},
|
|
update: {},
|
|
create: {
|
|
productId: createdProduct.id,
|
|
ingredient: ing.substring(0, 150)
|
|
}
|
|
});
|
|
}
|
|
}
|
|
console.log(`Upserted ${name}`);
|
|
}
|
|
}
|
|
|
|
main()
|
|
.catch(e => {
|
|
console.error(e);
|
|
process.exit(1);
|
|
})
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
});
|