import { PrismaClient } from '@prisma/client'; import * as fs from 'fs'; import * as path from 'path'; const prisma = new PrismaClient(); function slugify(text: string): string { return text .toLowerCase() .replace(/\s+/g, '-') .replace(/[^a-z0-9\u0600-\u06FF\-]/g, '') .replace(/-+/g, '-') .replace(/^-|-$/g, ''); } function cleanBrand(text: string): string { return text .replace(/کانینا/g, 'کانینو') .replace(/کانینا/g, 'کانینو') .replace(/Canina/g, 'Canino') .replace(/canina/g, 'canino'); } function determineSuitableFor(name: string, description: string): string { const text = (name + ' ' + description).toLowerCase(); const hasCat = text.includes('گربه') || text.includes('katzen') || text.includes('cat'); const hasDog = text.includes('سگ') || text.includes('hund') || text.includes('توله') || text.includes('dog'); if (hasCat && hasDog) return 'هر دو'; if (hasCat) return 'گربه'; if (hasDog) return 'سگ'; return 'هر دو'; } function parseSize(size: string): { unit: string; packageSize: number } { const mlMatch = size.match(/([\d.]+)\s*ml/i); if (mlMatch) return { unit: 'ml', packageSize: parseFloat(mlMatch[1]) }; const gMatch = size.match(/([\d.]+)\s*g/i); if (gMatch) return { unit: 'g', packageSize: parseFloat(gMatch[1]) }; const tabMatch = size.match(/([\d.]+)\s*(tablet|tab)/i); if (tabMatch) return { unit: 'tablet', packageSize: parseFloat(tabMatch[1]) }; return { unit: 'g', packageSize: 100 }; } async function main() { console.log('Seeding products from seed-products-data.json...'); // 1. Create default category const category = await prisma.category.upsert({ where: { slug: 'supplements' }, update: {}, create: { name: 'مکملهای غذایی و درمانی', slug: 'supplements', description: 'انواع مکملهای اورجینال کانینو آلمان', metaTitle: 'خرید مکمل کانینو', metaDescription: 'بهترین مکملهای کانینو' } }); // 2. Read JSON data const dataPath = path.join(__dirname, 'seed-products-data.json'); if (!fs.existsSync(dataPath)) { console.error('seed-products-data.json not found at', dataPath); process.exit(1); } const productsData = JSON.parse(fs.readFileSync(dataPath, 'utf-8')); let variantCount = 0; for (const item of productsData) { const baseName = cleanBrand(item.name); const cleanDesc = cleanBrand(item.description); const cleanIngredients = item.ingredients ? cleanBrand(item.ingredients) : ''; const cleanDosage = item.usage_and_dosage ? cleanBrand(item.usage_and_dosage) : ''; const suitableFor = determineSuitableFor(baseName, cleanDesc); const baseSlug = slugify(baseName); for (const variant of item.variants) { const artNo = variant.art_no; const barcode = variant.barcode; const sellPrice = variant.sell_price || 0; const buyPrice = variant.buy_price || 0; const sizeLabel = variant.size; const { unit, packageSize } = parseSize(sizeLabel); // Build variant-specific slug const sizeSlug = slugify(sizeLabel); const slug = `${baseSlug}-${sizeSlug}`; // Build display name with size const displayName = `${baseName} - ${sizeLabel}`; const priceDisplay = `${sellPrice.toLocaleString()} T`; const product = await prisma.product.upsert({ where: { artNo }, update: { barcode, slug, productGroup: baseSlug, name: displayName, description: cleanDesc, ingredients: cleanIngredients, categoryId: category.id, categorySlug: category.slug, priceValue: sellPrice, buyPrice, priceDisplay, unit, packageSize, dosageLogic: cleanDosage, suitableFor, imageUrl: `/products/${baseSlug}.png`, }, create: { artNo, barcode, slug, productGroup: baseSlug, name: displayName, description: cleanDesc, ingredients: cleanIngredients, categoryId: category.id, categorySlug: category.slug, priceValue: sellPrice, buyPrice, priceDisplay, unit, packageSize, dosageLogic: cleanDosage, suitableFor, imageUrl: `/products/${baseSlug}.png`, } }); // Seed ingredients (split by '،' or '، ') await prisma.productIngredient.deleteMany({ where: { productId: product.id } }); if (cleanIngredients) { const parts = cleanIngredients.split(/[،,]/).map(s => s.trim()).filter(Boolean); // Only take the first meaningful items (up to ~20) const meaningful = parts.slice(0, 20); for (const ing of meaningful) { const truncated = ing.substring(0, 150); if (truncated.length > 0) { await prisma.productIngredient.create({ data: { productId: product.id, ingredient: truncated } }); } } } variantCount++; } } console.log(`Seeded ${variantCount} product variants.`); // Create admin user for blogs const adminId = '12345678-1234-1234-1234-123456789012'; await prisma.user.upsert({ where: { id: adminId }, update: { role: 'ADMIN' }, create: { id: adminId, mobile: '09120000000', email: 'admin@canino-iran.com', firstName: 'Admin', lastName: 'User', role: 'ADMIN' } }); // 3. Seed some Blogs const blog1Content = [ '
تغذیه صحیح سگهای بالغ یکی از مهمترین عوامل در حفظ سلامت و افزایش طول عمر آنهاست. برند کانینو (Canino) با بیش از ۴۰ سال سابقه در تولید مکملهای دامپزشکی در آلمان، استاندارد طلایی تغذیه تکمیلی را تعریف کرده است.
', '', 'سگهای بالغ به رژیم غذایی متعادل حاوی پروتئین، چربی، کربوهیدرات، ویتامینها و مواد معدنی نیاز دارند. نسبت Ca:P (کلسیم به فسفر) باید در محدوده ۱.۲:۱ تا ۱.۵:۱ باشد. هرگونه عدم تعادل در این نسبت میتواند منجر به مشکلات کلیوی و استخوانی شود.
', '', 'حتی با بهترین رژیم غذایی، ممکن است برخی مواد مغذی به اندازه کافی تأمین نشوند. محصولات کانینو مانند Petvital Vitamin-Tabs (کمپلکس کامل A تا K3) و Biotin-Tabs (۱ میلیون میکروگرم بیوتین) نیازهای تغذیهای را پوشش میدهند.
', '', 'روغن سالمون کانینو (Lachs-Öl) با ۱۴٪ امگا ۳ (EPA/DHA) به روش Cold Press استخراج میشود و تمام ویتامینهای حساس به حرارت را حفظ میکند. EPA پیشماده رزولوینهای ضدالتهابی و DHA ۳۰٪ وزن خشک مغز را تشکیل میدهد.
', '', 'با افزایش سن سگ، غضروف مفصلی تحلیل میرود. گلیکوزآمینوگلیکانهای صدف لب سبز (GAG) با جذب مولکولهای آب در ماتریکس غضروفی، خاصیت بافری مفاصل را بازیابی میکنند. CANHYDROX GAG و FLEXAN حاوی این ترکیبات حیاتی هستند.
', '', 'کانینو (Canino) نماینده رسمی برند Canina pharma GmbH در ایران است. این شرکت آلمانی در سال ۱۹۸۴ توسط پتر و کریستین کرشنمایر در شهر برگیش گلادباخ تأسیس شد و به یکی از پیشگامان تولید مکملهای طبیعی دامپزشکی در اروپا تبدیل شده است.
', '', 'تمام محصولات کانینا بر پایه مواد اولیه طبیعی و با فرآیندهای پیشرفته تولید میشوند. این شرکت دارای گواهیهای معتبر IFS (International Featured Standard) و HACCP است و محصولات آن در بیش از ۴۰ کشور جهان توزیع میشود.
', '', 'مفاصل و استخوان: CANHYDROX GAG (استاندارد طلایی ارتوپدی)، FLEXAN (کلاژن خالص)، Petvital GAG و Velox Gelenkenergie (کنسانتره صدف لب سبز)
', 'سیستم ایمنی و گوارش: Immun-Booster (خمیر آغوز)، Moor-Tränke (عصاره پیت)، Ballaststoff Mix (فیبر گیاهی)
', 'پوست و مو: Lachs-Öl (روغن سالمون)، Biotin-Tabs، Seealgen (جلبک دریایی)
', 'قلب و انرژی: Herz Vital (ال-کارنیتین و زالزالک)، Energy-Gel (ویتامینهای گروه B)
', '', 'کانینو به عنوان نماینده رسمی کانینا در ایران، متعهد به ارائه محصولات اصل با ضمانت اصالت و پروانه دامپزشکی است. تمام محصولات دارای بستهبندی اصلی آلمان و بارکد اختصاصی هستند.
' ].join('\n'); const blogs = [ { title: 'راهنمای جامع تغذیه سگهای بالغ', slug: 'adult-dog-nutrition-guide', content: blog1Content, authorId: adminId, isPublished: true, }, { title: 'چرا مکملهای کانینو؟', slug: 'why-canino-supplements', content: blog2Content, authorId: adminId, isPublished: true, } ]; for (const b of blogs) { await prisma.blog.upsert({ where: { slug: b.slug }, update: {}, create: b }); } console.log('Seeded blogs.'); } main() .catch(e => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });