549 lines
28 KiB
TypeScript
549 lines
28 KiB
TypeScript
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 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 };
|
||
}
|
||
|
||
function getProductImageUrl(baseSlug: string): string {
|
||
const images: Record<string, string> = {
|
||
'canina-ballaststoff-mix':
|
||
'https://www.canina.de/media/4c/32/38/1715077271/Ballaststoff-Mix-140108-V1-Canino-100g_600x600.webp',
|
||
'canina-canhydrox-gag':
|
||
'https://www.canina.de/media/83/86/e1/123000_123005_Canhydrox_GAG_Canina-Pharma_1280x1280.png',
|
||
'canina-eierschalenpulver':
|
||
'https://www.canina.de/media/fb/d3/18/120208_Eierschalenpulver_Canina-Pharma_1280x1280.png',
|
||
'canina-flexan':
|
||
'https://www.canina.de/media/01/be/93/710003_Flexan_Canina-Pharma_1280x1280.png',
|
||
'canina-herz-vital':
|
||
'https://www.canina.de/media/b9/8b/4c/112036_Herz_Vital_Canina-Pharma_1280x1280.png',
|
||
'canina-immun-booster':
|
||
'https://www.canina.de/media/8c/fb/8e/311000_Canino_Immun_Booster_Paste_Abwehrkraefte_1280x1280.png',
|
||
'canina-immun-booster-paste':
|
||
'https://www.canina.de/media/8c/fb/8e/311000_Canino_Immun_Booster_Paste_Abwehrkraefte_1280x1280.png',
|
||
'canina-katzenmilch':
|
||
'https://www.canina.de/media/6b/48/81/731000_Canino_Lachsoel_Lachs_Oel_1280x1280.png',
|
||
'canina-lachsol':
|
||
'https://www.canina.de/media/6b/48/81/731000_Canino_Lachsoel_Lachs_Oel_1280x1280.png',
|
||
'canina-lachs-l':
|
||
'https://www.canina.de/media/6b/48/81/731000_Canino_Lachsoel_Lachs_Oel_1280x1280.png',
|
||
'canina-lachs-ol':
|
||
'https://www.canina.de/media/6b/48/81/731000_Canino_Lachsoel_Lachs_Oel_1280x1280.png',
|
||
'canina-marine-olmischung-premium':
|
||
'https://www.canina.de/media/ad/28/71/153008_Marine_Oelmischung_Premium_Canina-Pharma_1280x1280.png',
|
||
'canina-marine-lmischung-premium':
|
||
'https://www.canina.de/media/ad/28/71/153008_Marine_Oelmischung_Premium_Canina-Pharma_1280x1280.png',
|
||
'canina-moortranke':
|
||
'https://www.canina.de/media/9d/b2/87/112708_Moortraenke_Canina-Pharma_1280x1280.png',
|
||
'canina-moortrnke':
|
||
'https://www.canina.de/media/9d/b2/87/112708_Moortraenke_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-arthro-tabletten':
|
||
'https://www.canina.de/media/90/a6/50/723003_PETVITAL_Arthro_Tabletten_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-bio-aktivator':
|
||
'https://www.canina.de/media/c9/2e/0f/712007_PETVITAL_Bio_Aktivator_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-biotin-tabs':
|
||
'https://www.canina.de/media/e1/9b/6c/702008_PETVITAL_Biotin_Tabs_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-energy-gel':
|
||
'https://www.canina.de/media/7f/0f/06/712106_PETVITAL_Energy_Gel_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-mineral-tabs':
|
||
'https://www.canina.de/media/70/4e/f2/723102_PETVITAL_Mineral_Tabs_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-gag':
|
||
'https://www.canina.de/media/58/05/92/723201_723300_PETVITAL_GAG_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-vitamin-tabs':
|
||
'https://www.canina.de/media/2c/80/7e/712205_PETVITAL_Vitamin_Tabs_Canina-Pharma_1280x1280.png',
|
||
'canina-rinderblut-pulver':
|
||
'https://www.canina.de/media/14/d0/0d/792016_791514_Rinderblut_Pulver_Canina-Pharma_1280x1280.png',
|
||
'canina-rinderfett-pulver':
|
||
'https://www.canina.de/media/9a/31/59/131235_Rinderfett_Pulver_Canina-Pharma_1280x1280.png',
|
||
'canina-schwarz-kummel-samen':
|
||
'https://www.canina.de/media/a9/c8/aa/131105_Schwarzkuemmelsamen_Canina-Pharma_1280x1280.png',
|
||
'canina-schwarz-kmmel-samen':
|
||
'https://www.canina.de/media/a9/c8/aa/131105_Schwarzkuemmelsamen_Canina-Pharma_1280x1280.png',
|
||
'canina-seelgen-tabletten':
|
||
'https://www.canina.de/media/e4/c4/b2/130504_130511_130412_Seealgen_Bio-Seealgenmehl_Canina-Pharma_1280x1280.png',
|
||
'canina-bio-seelgenmehl':
|
||
'https://www.canina.de/media/e4/c4/b2/130504_130511_130412_Seealgen_Bio-Seealgenmehl_Canina-Pharma_1280x1280.png',
|
||
'canina-seealgen-tabletten':
|
||
'https://www.canina.de/media/e4/c4/b2/130504_130511_130412_Seealgen_Bio-Seealgenmehl_Canina-Pharma_1280x1280.png',
|
||
'canina-seealgen-bio-seealgenmehl':
|
||
'https://www.canina.de/media/e4/c4/b2/130504_130511_130412_Seealgen_Bio-Seealgenmehl_Canina-Pharma_1280x1280.png',
|
||
'canina-taurin-fur-katzen':
|
||
'https://www.canina.de/media/c6/aa/62/229505_Taurin_fuer_Katzen_Canina-Pharma_1280x1280.png',
|
||
'canina-taurin-fr-katzen':
|
||
'https://www.canina.de/media/c6/aa/62/229505_Taurin_fuer_Katzen_Canina-Pharma_1280x1280.png',
|
||
'canina-velox-gelenkenergie':
|
||
'https://www.canina.de/media/1a/0c/33/701902_Velox_Gelenkenergie_Canina-Pharma_1280x1280.png',
|
||
'canina-welpenbrei':
|
||
'https://www.canina.de/media/98/95/43/130603_Welpenbrei_Canina-Pharma_1280x1280.png',
|
||
'canina-welpenmilch':
|
||
'https://www.canina.de/media/2c/e0/75/130702_Welpenmilch_Canina-Pharma_1280x1280.png',
|
||
'canina-petvital-bio-insect-shocker':
|
||
'https://www.canina.de/media/76/a4/1c/741304_741311_PETVITAL_Bio_Insect_Shocker_Canina-Pharma_1280x1280.png',
|
||
'canina-mikrosilber-zahngel':
|
||
'https://www.canina.de/media/9d/5e/54/131454_Mikrosilber_Zahngel_Canina-Pharma_1280x1280.png',
|
||
'canina-novagard-green-augenpflege':
|
||
'https://www.canina.de/media/6b/48/81/731000_Canino_Lachsoel_Lachs_Oel_1280x1280.png',
|
||
'canina-novagard-green-pfotenpflege':
|
||
'https://www.canina.de/media/6b/48/81/731000_Canino_Lachsoel_Lachs_Oel_1280x1280.png',
|
||
};
|
||
return (
|
||
images[baseSlug] ||
|
||
'https://www.canina.de/media/83/86/e1/123000_123005_Canhydrox_GAG_Canina-Pharma_1280x1280.png'
|
||
);
|
||
}
|
||
|
||
async function findOrCreateCategory(
|
||
slug: string,
|
||
): Promise<{ id: string; slug: string }> {
|
||
const CATEGORY_NAMES: Record<string, string> = {
|
||
joints: 'مفاصل و استخوان',
|
||
immune: 'تقویت سیستم ایمنی و گوارش',
|
||
energy: 'ویتامینها و انرژیبخشها',
|
||
'special-care': 'مراقبتهای ویژه (پوست، دندان و چشم)',
|
||
general: 'تقویت عمومی',
|
||
nutrition: 'تغذیه تخصصی',
|
||
supplements: 'مکملهای غذایی و درمانی',
|
||
};
|
||
const name = CATEGORY_NAMES[slug] || slug;
|
||
return await prisma.category.upsert({
|
||
where: { slug },
|
||
update: { name },
|
||
create: { slug, name, description: name },
|
||
});
|
||
}
|
||
|
||
const PRODUCT_SYMPTOMS_MAP: Record<string, string[]> = {
|
||
'canina-ballaststoff-mix': [
|
||
'اسهال',
|
||
'یبوست',
|
||
'اسهال مزمن',
|
||
'تنظیم فلور روده',
|
||
],
|
||
'canina-canhydrox-gag': [
|
||
'درد مفاصل',
|
||
'سختی در بلند شدن',
|
||
'لنگیدن',
|
||
'رشد سریع تولهسگ',
|
||
'تقویت رباط و تاندون',
|
||
],
|
||
'canina-eierschalenpulver': [
|
||
'کمبود کلسیم',
|
||
'رژیم خام گوشتی',
|
||
'سلامت دندانها',
|
||
],
|
||
'canina-flexan': ['درد مفاصل', 'سختی در بلند شدن', 'لنگیدن', 'تخریب غضروف'],
|
||
'canina-herz-vital': ['نارسایی قلبی', 'بیحالی', 'کاهش انرژی'],
|
||
'canina-immun-booster-paste': [
|
||
'ضعف بعد از بیماری',
|
||
'اسهال',
|
||
'ضعف تولهسگ',
|
||
'کاهش ایمنی',
|
||
],
|
||
'canina-katzenmilch': ['تغذیه بچه گربه', 'بیمادری بچه گربه'],
|
||
'canina-lachs-ol': ['خشکی پوست', 'ریزش مو', 'خارش', 'التهاب پوست'],
|
||
'canina-marine-lmischung-premium': ['خشکی پوست', 'ریزش مو', 'التهاب'],
|
||
'canina-moortrnke': ['اسهال', 'اشتهای کم', 'مسمومیت گوارشی'],
|
||
'canina-petvital-arthro-tabletten': [
|
||
'درد مفاصل',
|
||
'سختی در بلند شدن',
|
||
'لنگیدن',
|
||
],
|
||
'canina-petvital-bio-aktivator': ['کاهش ایمنی', 'خستگی', 'دوران نقاهت'],
|
||
'canina-petvital-biotin-tabs': ['ریزش مو', 'خشکی پوست', 'شکنندگی ناخن'],
|
||
'canina-petvital-energy-gel': ['بیاشتهایی', 'کاهش وزن', 'کمبود انرژی'],
|
||
'canina-petvital-mineral-tabs': ['کمبود مواد معدنی', 'ضعف استخوان'],
|
||
'canina-petvital-gag': ['سختی در بلند شدن', 'لنگیدن'],
|
||
'canina-petvital-vitamin-tabs': ['کمبود ویتامین', 'کاهش انرژی'],
|
||
'canina-rinderblut-pulver': ['کمخونی', 'بیاشتهایی', 'دوران رشد'],
|
||
'canina-rinderfett-pulver': ['کمبود وزن', 'اشتهای کم'],
|
||
'canina-schwarz-kmmel-samen': ['انگل روده', 'ضعف ایمنی'],
|
||
'canina-seealgen-bio-seealgenmehl': ['کاهش پیگمنت مو', 'کمبود تیروئید'],
|
||
'canina-taurin-fr-katzen': ['مشکل بینایی گربه', 'نارسایی قلبی گربه'],
|
||
'canina-velox-gelenkenergie': ['درد مفاصل', 'لنگیدن'],
|
||
'canina-welpenbrei': ['تغذیه تولهسگ', 'از شیر گرفتن تولهسگ'],
|
||
'canina-welpenmilch': ['تغذیه تولهسگ', 'بیمادری تولهسگ'],
|
||
'canina-petvital-bio-insect-shocker': ['کک و کنه', 'انگلهای پوستی'],
|
||
'canina-mikrosilber-zahngel': ['جرم دندان', 'بوی بد دهان', 'التهاب لثه'],
|
||
'canina-novagard-green-augenpflege': [
|
||
'ترشحات چشم',
|
||
'التهاب چشم',
|
||
'کثیفی چشم',
|
||
],
|
||
'canina-novagard-green-pfotenpflege': ['ترک پنجه', 'خشکی پنجه', 'زخم پنجه'],
|
||
};
|
||
|
||
const PRODUCT_TAGLINES_MAP: Record<string, string> = {
|
||
'canina-ballaststoff-mix':
|
||
'مکمل فیبر پریبیوتیک جهت تنظیم گوارش و پایداری فلور روده',
|
||
'canina-canhydrox-gag':
|
||
'فرمولاسیون ویژه دامپزشکی برای پایداری بافتهای همبند، غضروف و استخوانها',
|
||
'canina-eierschalenpulver':
|
||
'کلسیم ارگانیک صد در صد طبیعی مناسب رژیمهای غذایی خام (BARF)',
|
||
'canina-flexan':
|
||
'پپتیدهای کلاژن زیستفعال برای بهینهسازی دامنه حرکتی و بازسازی مفصلی',
|
||
'canina-herz-vital': 'تقویت عملکرد فیزیولوژیک عضله قلب و افزایش نشاط حیوان',
|
||
'canina-immun-booster-paste':
|
||
'تامین فوری ایمونوگلوبولینهای آغوز و تثبیت فلور روده در زمان نقاهت',
|
||
'canina-katzenmilch':
|
||
'شیر خشک جایگزین بچه گربه حاوی تورین و فاقد لاکتوز مزاحم',
|
||
'canina-lachs-ol':
|
||
'اسیدهای چرب ضروری امگا ۳ برای درخشش پوشش مویی و سلامت پوست',
|
||
'canina-marine-lmischung-premium':
|
||
'ترکیب روغنهای ممتاز دریایی غنی از EPA و DHA جهت کاهش التهابات پوستی',
|
||
'canina-moortrnke':
|
||
'عصاره پیت طبیعی برای جذب بیولوژیکی سموم و بهبود ترشحات گوارشی',
|
||
'canina-petvital-arthro-tabletten':
|
||
'فرمول گیاهی-معدنی برای کاهش دردهای حاد مفصلی و تسهیل در بلند شدن',
|
||
'canina-petvital-bio-aktivator':
|
||
'آمینو اسیدها و آهن فعال جهت بازسازی قوای جسمی و بهبود اشتها',
|
||
'canina-petvital-biotin-tabs':
|
||
'دوز بالای بیوتین و ویتامین ب برای توقف سریع ریزش مو و بازسازی ناخن',
|
||
'canina-petvital-energy-gel':
|
||
'کنسانتره انرژی بالا همراه با الکترولیتها برای سگها و گربههای ضعیف',
|
||
'canina-petvital-mineral-tabs':
|
||
'مواد معدنی و عناصر کمیاب جهت تراکم استخوانی و دوران بارداری و رشد',
|
||
'canina-petvital-gag':
|
||
'ترکیب صدف لبسبز نیوزیلند و اسیدهای آمینه جهت تقویت رباطها و تاندونها',
|
||
'canina-petvital-vitamin-tabs':
|
||
'مولتیویتامین کامل روزانه برای تقویت سیستم دفاعی و افزایش شادابی پت',
|
||
'canina-rinderblut-pulver':
|
||
'پودر خون گاو غنی از آهن طبیعی و هموگلوبین برای بهبود اشتها و رفع کمخونی',
|
||
'canina-rinderfett-pulver':
|
||
'مکمل چربی طبیعی با طعمدهندگی بالا جهت جبران کمبود وزن و افزایش انرژی',
|
||
'canina-schwarz-kmmel-samen':
|
||
'دانههای سیاه دانه مصری برای پشتیبانی متابولیک و دفع طبیعی انگلها',
|
||
'canina-seealgen-bio-seealgenmehl':
|
||
'جلبک دریایی ارگانیک سرشار از ید طبیعی جهت درخشش و تیره کردن پیگمنتهای مو و بینی',
|
||
'canina-taurin-fr-katzen':
|
||
'اسید آمینه تورین خالص برای سلامت بینایی و پیشگیری از کاردیومیوپاتی گربهها',
|
||
'canina-velox-gelenkenergie':
|
||
'پودر صد در صد صدف لبسبز نیوزیلند برای مفاصل، غضروفها و رباطها',
|
||
'canina-welpenbrei':
|
||
'غذای کمکی بچه سگها برای انتقال آسان از شیر مادر به غذای جامد',
|
||
'canina-welpenmilch':
|
||
'شیر خشک تخصصی تولهسگ غنی شده با ویتامینها و املاح معدنی فاقد لاکتوز',
|
||
'canina-petvital-bio-insect-shocker':
|
||
'اسپری دافع انگلهای خارجی کک، کنه و شپش صد در صد طبیعی و بدون سموم شیمیایی',
|
||
'canina-mikrosilber-zahngel':
|
||
'ژل دندان با نقره میکروسیلور جهت مبارزه با بوی بد دهان، پلاک و عفونت لثه',
|
||
'canina-novagard-green-augenpflege':
|
||
'محلول ملایم شستشوی چشم سگ و گربه برای پاک کردن ترشحات و کاهش التهابات',
|
||
'canina-novagard-green-pfotenpflege':
|
||
'مومیایی محافظ پنجهها برای التیام خشکی، قرمزی و ترک خوردگی پنجهها در برف و سرما',
|
||
};
|
||
|
||
export async function main() {
|
||
console.log('Seeding products from seed-products-data.json...');
|
||
|
||
// 2. Read JSON data
|
||
const dataPath = path.join(
|
||
process.cwd() + '/prisma',
|
||
'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').replace(/^\ufeff/, ''),
|
||
);
|
||
let variantCount = 0;
|
||
|
||
for (const item of productsData) {
|
||
const baseName = item.name;
|
||
const cleanDesc = item.description;
|
||
const cleanShortDesc = item.short_description || '';
|
||
const cleanIngredients = item.ingredients || '';
|
||
const cleanDosage = item.usage_and_dosage || '';
|
||
const suitableFor = determineSuitableFor(baseName, cleanDesc);
|
||
// Split baseName into nameFa and nameEn
|
||
let baseNameFa = baseName;
|
||
let baseNameEn = baseName;
|
||
const matchName = baseName.match(/([^(]+)\(([^)]+)\)/);
|
||
if (matchName) {
|
||
baseNameEn = matchName[1].trim();
|
||
baseNameFa = matchName[2].trim();
|
||
}
|
||
|
||
const baseSlug = slugify(baseNameEn);
|
||
const categorySlug = item.category_slug || 'supplements';
|
||
const category = await findOrCreateCategory(categorySlug);
|
||
|
||
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 nameFa = `${baseNameFa}`;
|
||
const nameEn = `${baseNameEn} - ${sizeLabel}`;
|
||
const priceDisplay = `${sellPrice.toLocaleString()} تومان`;
|
||
|
||
const RX_PRODUCTS = [
|
||
'canina-canhydrox-gag',
|
||
'canina-petvital-gag',
|
||
'canina-herz-vital',
|
||
'canina-petvital-arthro-tabletten',
|
||
'canina-immun-booster',
|
||
'canina-petvital-bio-aktivator',
|
||
'canina-rinderblut-pulver',
|
||
'canina-velox-gelenkenergie',
|
||
];
|
||
const requiresRx = RX_PRODUCTS.includes(baseSlug);
|
||
|
||
try {
|
||
const product = await prisma.product.upsert({
|
||
where: { artNo },
|
||
update: {
|
||
barcode,
|
||
slug,
|
||
productGroup: baseSlug,
|
||
nameFa,
|
||
nameEn,
|
||
scientificTagline: PRODUCT_TAGLINES_MAP[baseSlug] || null,
|
||
description: cleanDesc,
|
||
shortDescription: cleanShortDesc,
|
||
ingredients: cleanIngredients,
|
||
categoryId: category.id,
|
||
categorySlug: category.slug,
|
||
priceValue: sellPrice,
|
||
wholesalePrice: Math.round(sellPrice * 0.7),
|
||
requiresRx,
|
||
buyPrice,
|
||
priceDisplay,
|
||
unit,
|
||
packageSize,
|
||
dosageLogic: cleanDosage,
|
||
suitableFor,
|
||
imageUrl: getProductImageUrl(baseSlug),
|
||
},
|
||
create: {
|
||
artNo,
|
||
barcode,
|
||
slug,
|
||
productGroup: baseSlug,
|
||
nameFa,
|
||
nameEn,
|
||
scientificTagline: PRODUCT_TAGLINES_MAP[baseSlug] || null,
|
||
description: cleanDesc,
|
||
shortDescription: cleanShortDesc,
|
||
ingredients: cleanIngredients,
|
||
categoryId: category.id,
|
||
categorySlug: category.slug,
|
||
priceValue: sellPrice,
|
||
wholesalePrice: Math.round(sellPrice * 0.7),
|
||
requiresRx,
|
||
buyPrice,
|
||
priceDisplay,
|
||
unit,
|
||
packageSize,
|
||
dosageLogic: cleanDosage,
|
||
suitableFor,
|
||
imageUrl: getProductImageUrl(baseSlug),
|
||
},
|
||
});
|
||
|
||
// Seed ingredients safely
|
||
await prisma.productIngredient.deleteMany({
|
||
where: { productId: product.id },
|
||
});
|
||
if (cleanIngredients) {
|
||
const parts = cleanIngredients
|
||
.split(/[،,]/)
|
||
.map((s: string) => s.trim())
|
||
.filter(Boolean);
|
||
const uniqueIngredients: string[] = Array.from(
|
||
new Set<string>(parts.map((ing: string) => ing.substring(0, 150))),
|
||
).slice(0, 20);
|
||
for (const item of uniqueIngredients) {
|
||
const truncated: string = String(item);
|
||
if (truncated.length > 0) {
|
||
try {
|
||
await prisma.productIngredient.create({
|
||
data: { productId: product.id, ingredient: truncated },
|
||
});
|
||
} catch {
|
||
// Ignore duplicate ingredient error
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Seed symptoms safely
|
||
await prisma.productSymptom.deleteMany({
|
||
where: { productId: product.id },
|
||
});
|
||
const symptomsList: string[] = Array.from(
|
||
new Set<string>(PRODUCT_SYMPTOMS_MAP[baseSlug] || []),
|
||
);
|
||
for (const item of symptomsList) {
|
||
const sym: string = String(item);
|
||
try {
|
||
await prisma.productSymptom.create({
|
||
data: { productId: product.id, symptom: sym },
|
||
});
|
||
} catch {
|
||
// Ignore duplicate symptom error
|
||
}
|
||
}
|
||
} catch (err: unknown) {
|
||
const msg = err instanceof Error ? err.message : String(err);
|
||
console.warn(`[Seed] Warning upserting product ${artNo}:`, msg);
|
||
}
|
||
|
||
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 = [
|
||
'<p><strong>تغذیه صحیح سگهای بالغ</strong> یکی از مهمترین عوامل در حفظ سلامت و افزایش طول عمر آنهاست. برند کنینا (Canina) با بیش از ۴۰ سال سابقه در تولید مکملهای دامپزشکی در آلمان، استاندارد طلایی تغذیه تکمیلی را تعریف کرده است.</p>',
|
||
'',
|
||
'<h2>اصول تغذیه سگ بالغ</h2>',
|
||
'<p>سگهای بالغ به رژیم غذایی متعادل حاوی پروتئین، چربی، کربوهیدرات، ویتامینها و مواد معدنی نیاز دارند. نسبت Ca:P (کلسیم به فسفر) باید در محدوده ۱.۲:۱ تا ۱.۵:۱ باشد. هرگونه عدم تعادل در این نسبت میتواند منجر به مشکلات کلیوی و استخوانی شود.</p>',
|
||
'',
|
||
'<h2>نقش مکملها در رژیم غذایی</h2>',
|
||
'<p>حتی با بهترین رژیم غذایی، ممکن است برخی مواد مغذی به اندازه کافی تأمین نشوند. محصولات کنینا مانند <strong>Petvital Vitamin-Tabs</strong> (کمپلکس کامل A تا K3) و <strong>Biotin-Tabs</strong> (۱ میلیون میکروگرم بیوتین) نیازهای تغذیهای را پوشش میدهند.</p>',
|
||
'',
|
||
'<h2>اسیدهای چرب ضروری</h2>',
|
||
'<p>روغن سالمون کنینا (Lachs-Öl) با ۱۴٪ امگا ۳ (EPA/DHA) به روش Cold Press استخراج میشود و تمام ویتامینهای حساس به حرارت را حفظ میکند. EPA پیشماده رزولوینهای ضدالتهابی و DHA ۳۰٪ وزن خشک مغز را تشکیل میدهد.</p>',
|
||
'',
|
||
'<h2>مراقبت از مفاصل</h2>',
|
||
'<p>با افزایش سن سگ، غضروف مفصلی تحلیل میرود. گلیکوزآمینوگلیکانهای صدف لب سبز (GAG) با جذب مولکولهای آب در ماتریکس غضروفی، خاصیت بافری مفاصل را بازیابی میکنند. <strong>CANHYDROX GAG</strong> و <strong>FLEXAN</strong> حاوی این ترکیبات حیاتی هستند.</p>',
|
||
'',
|
||
'<h2>هشدارهای مهم تغذیهای</h2>',
|
||
'<ul>',
|
||
'<li>مصرف همزمان ویتامین D3 با D2 مجاز نیست</li>',
|
||
'<li>روغن سیاه دانه در بارداری و شیردهی ممنوع است</li>',
|
||
'<li>روغنهای با غلظت بالا باید تدریجاً به رژیم اضافه شوند تا از پانکراتیت جلوگیری شود</li>',
|
||
'<li>تورین برای گربهها اسید آمینه ضروری است و بدن آنها قادر به سنتز آن نیست</li>',
|
||
'</ul>',
|
||
].join('\n');
|
||
|
||
const blog2Content = [
|
||
'<p><strong>کنینا (Canina)</strong> نماینده رسمی برند <strong>Canina pharma GmbH</strong> در ایران است. این شرکت آلمانی در سال ۱۹۸۴ توسط <strong>پتر و کریستین کرشنمایر</strong> در شهر برگیش گلادباخ تأسیس شد و به یکی از پیشگامان تولید مکملهای طبیعی دامپزشکی در اروپا تبدیل شده است.</p>',
|
||
'',
|
||
'<h2>فلسفه Canina: "مادر طبیعت بهترین نسخه را میداند"</h2>',
|
||
'<p>تمام محصولات کنینا بر پایه مواد اولیه طبیعی و با فرآیندهای پیشرفته تولید میشوند. این شرکت دارای گواهیهای معتبر <strong>IFS (International Featured Standard)</strong> و <strong>HACCP</strong> است و محصولات آن در بیش از ۴۰ کشور جهان توزیع میشود.</p>',
|
||
'',
|
||
'<h2>چرا مکملهای کنینا در ایران؟</h2>',
|
||
'<ul>',
|
||
'<li><strong>کیفیت آلمانی:</strong> تمام محصولات در کارخانه برگیش گلادباخ تحت نظارت دامپزشکان تولید میشوند</li>',
|
||
'<li><strong>بدون مواد مصنوعی:</strong> فاقد رنگ، طعم و نگهدارنده مصنوعی</li>',
|
||
'<li><strong>فرمولاسیون تخصصی:</strong> هر محصول برای نیاز خاصی مانند مفاصل، ایمنی، پوست و مو یا گوارش طراحی شده</li>',
|
||
'<li><strong>تأیید دامپزشکان:</strong> محصولات با مشورت دامپزشکان و متخصصان تغذیه حیوانات فرموله شدهاند</li>',
|
||
'</ul>',
|
||
'',
|
||
'<h2>محصولات پرفروش در ایران</h2>',
|
||
'<p><strong>مفاصل و استخوان:</strong> CANHYDROX GAG (استاندارد طلایی ارتوپدی)، FLEXAN (کلاژن خالص)، Petvital GAG و Velox Gelenkenergie (کنسانتره صدف لب سبز)</p>',
|
||
'<p><strong>سیستم ایمنی و گوارش:</strong> Immun-Booster (خمیر آغوز)، Moor-Tränke (عصاره پیت)، Ballaststoff Mix (فیبر گیاهی)</p>',
|
||
'<p><strong>پوست و مو:</strong> Lachs-Öl (روغن سالمون)، Biotin-Tabs، Seealgen (جلبک دریایی)</p>',
|
||
'<p><strong>قلب و انرژی:</strong> Herz Vital (ال-کارنیتین و زالزالک)، Energy-Gel (ویتامینهای گروه B)</p>',
|
||
'',
|
||
'<h2>تعهد به سلامت حیوانات</h2>',
|
||
'<p>کنینا به عنوان نماینده رسمی کنینا در ایران، متعهد به ارائه محصولات اصل با ضمانت اصالت و پروانه دامپزشکی است. تمام محصولات دارای بستهبندی اصلی آلمان و بارکد اختصاصی هستند.</p>',
|
||
].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) {
|
||
try {
|
||
await prisma.blog.upsert({
|
||
where: { slug: b.slug },
|
||
update: {
|
||
title: b.title,
|
||
content: b.content,
|
||
isPublished: b.isPublished,
|
||
},
|
||
create: b,
|
||
});
|
||
} catch (err: unknown) {
|
||
const msg = err instanceof Error ? err.message : String(err);
|
||
console.warn(`[Seed] Warning upserting blog ${b.slug}:`, msg);
|
||
}
|
||
}
|
||
console.log('Seeded blogs.');
|
||
}
|
||
|
||
main()
|
||
.catch((e) => {
|
||
console.error(e);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|