import { PrismaClient, AdminRole, CustomerType, OrderStatus, SettlementType, CheckRegistrationMode, CheckStatus, CashPaymentStatus, ShipmentStatus, NotificationTone } from '@prisma/client'; import * as bcrypt from 'bcryptjs'; const prisma = new PrismaClient(); async function main() { console.log('Seeding fabric_trade database...'); await prisma.orderStatusHistory.deleteMany(); await prisma.cashPaymentReceipt.deleteMany(); await prisma.check.deleteMany(); await prisma.shipment.deleteMany(); await prisma.orderItem.deleteMany(); await prisma.order.deleteMany(); await prisma.cartItem.deleteMany(); await prisma.cart.deleteMany(); await prisma.otpChallenge.deleteMany(); await prisma.product.deleteMany(); await prisma.catalog.deleteMany(); await prisma.bankAccount.deleteMany(); await prisma.customer.deleteMany(); await prisma.company.deleteMany(); await prisma.adminUser.deleteMany(); await prisma.adminNotification.deleteMany(); await prisma.internalMessage.deleteMany(); await prisma.systemSettings.deleteMany(); const passwordHash = await bcrypt.hash('admin123', 10); await prisma.adminUser.createMany({ data: [ { id: 'usr-1', fullName: 'علی محمدی', phone: '09121112222', email: 'admin@fabrictrade.ir', passwordHash, role: AdminRole.admin, isActive: true, lastLoginAt: new Date('2024-10-25T08:00:00'), }, { id: 'usr-2', fullName: 'سارا احمدی', phone: '09133334444', email: 'sales@fabrictrade.ir', passwordHash, role: AdminRole.sales, isActive: true, lastLoginAt: new Date('2024-10-25T07:45:00'), }, { id: 'usr-3', fullName: 'رضا کریمی', phone: '09155556666', email: 'finance@fabrictrade.ir', passwordHash, role: AdminRole.finance, isActive: true, lastLoginAt: new Date('2024-10-24T17:10:00'), }, { id: 'usr-4', fullName: 'مریم حسینی', phone: '09177778888', email: 'warehouse@fabrictrade.ir', passwordHash, role: AdminRole.warehouse, isActive: true, lastLoginAt: new Date('2024-10-24T14:00:00'), }, { id: 'usr-5', fullName: 'امیر نوری', phone: '09199990000', email: 'amir.n@fabrictrade.ir', passwordHash, role: AdminRole.sales, isActive: false, lastLoginAt: new Date('2024-09-30T11:00:00'), }, ], }); await prisma.company.createMany({ data: [ { id: 'company-par', name: 'شرکت پَر', slug: 'par', description: 'تولیدکننده پارچه‌های باکیفیت', isActive: true, displayOrder: 1, maxMeteragePerInvoice: 5000, cashInvoiceValidityHours: 8, cashInvoiceValidUntilHour: 17, }, { id: 'company-fam-baft', name: 'فام‌بافت', slug: 'fam-baft', description: 'عرضه پارچه‌های تخصصی', isActive: true, displayOrder: 2, maxMeteragePerInvoice: 5000, cashInvoiceValidityHours: 8, cashInvoiceValidUntilHour: 17, }, ], }); await prisma.bankAccount.createMany({ data: [ { id: 'ba-par-1', companyId: 'company-par', bankName: 'بانک ملی', accountHolder: 'شرکت پَر', accountNumber: '0123456789', cardNumber: '6037-9912-3456-7890', iban: 'IR120170000000012345678901', isActive: true, displayOrder: 1, }, { id: 'ba-par-2', companyId: 'company-par', bankName: 'بانک صادرات', accountHolder: 'شرکت پَر', accountNumber: '9876543210', cardNumber: '6037-6912-3456-7891', iban: 'IR620190000000098765432101', isActive: true, displayOrder: 2, }, { id: 'ba-fam-1', companyId: 'company-fam-baft', bankName: 'بانک ملت', accountHolder: 'فام‌بافت', accountNumber: '1122334455', cardNumber: '6104-3378-9012-3456', iban: 'IR450120000000011223344556', isActive: true, displayOrder: 1, }, ], }); await prisma.catalog.createMany({ data: [ { id: 'cat-377', companyId: 'company-par', name: 'کالیته ۳۷۷', code: '377', displayOrder: 1, isActive: true }, { id: 'cat-378', companyId: 'company-par', name: 'کالیته ۳۷۸', code: '378', displayOrder: 2, isActive: true }, { id: 'cat-379', companyId: 'company-par', name: 'کالیته ۳۷۹', code: '379', displayOrder: 3, isActive: true }, { id: 'cat-380', companyId: 'company-par', name: 'کالیته ۳۸۰', code: '380', displayOrder: 4, isActive: true }, { id: 'cat-381', companyId: 'company-par', name: 'کالیته ۳۸۱', code: '381', displayOrder: 5, isActive: true }, { id: 'cat-fam-401', companyId: 'company-fam-baft', name: 'کالیته ۴۰۱', code: '401', displayOrder: 1, isActive: true }, { id: 'cat-fam-402', companyId: 'company-fam-baft', name: 'کالیته ۴۰۲', code: '402', displayOrder: 2, isActive: true }, ], }); await prisma.product.createMany({ data: [ { id: 'prod-377-blue', companyId: 'company-par', catalogId: 'cat-377', name: 'پارچه آبی', code: '377-BL', color: 'آبی', minMeterage: 30, orderMultiplier: 10, basePrice: 185000, stock: 10000, isActive: true }, { id: 'prod-377-black', companyId: 'company-par', catalogId: 'cat-377', name: 'پارچه مشکی', code: '377-BK', color: 'مشکی', minMeterage: 30, orderMultiplier: 10, basePrice: 192000, stock: 8000, isActive: true }, { id: 'prod-378-blue', companyId: 'company-par', catalogId: 'cat-378', name: 'آبی', code: '378-BL', color: 'آبی', minMeterage: 50, orderMultiplier: 10, basePrice: 200000, stock: 5000, isActive: true }, { id: 'prod-378-black', companyId: 'company-par', catalogId: 'cat-378', name: 'مشکی', code: '378-BK', color: 'مشکی', minMeterage: 50, orderMultiplier: 10, basePrice: 205000, stock: 5000, isActive: true }, { id: 'prod-378-blue-white', companyId: 'company-par', catalogId: 'cat-378', name: 'آبی پشت سفید', code: '378-BLW', color: 'آبی پشت سفید', minMeterage: 50, orderMultiplier: 10, basePrice: 210000, stock: 3000, isActive: true }, { id: 'prod-378-black-white', companyId: 'company-par', catalogId: 'cat-378', name: 'مشکی پشت سفید', code: '378-BKW', color: 'مشکی پشت سفید', minMeterage: 50, orderMultiplier: 10, basePrice: 215000, stock: 3000, isActive: true }, { id: 'prod-fam-401-1', companyId: 'company-fam-baft', catalogId: 'cat-fam-401', name: 'پارچه مخمل', code: '401-MV', color: 'سرمه‌ای', minMeterage: 40, orderMultiplier: 10, basePrice: 250000, stock: 6000, isActive: true }, { id: 'prod-fam-401-2', companyId: 'company-fam-baft', catalogId: 'cat-fam-401', name: 'پارچه کجراه', code: '401-KJ', color: 'کرم', minMeterage: 40, orderMultiplier: 10, basePrice: null, stock: 4000, isActive: true }, ], }); await prisma.customer.createMany({ data: [ { id: 'cust-1', firstName: 'پارچه‌سرای', lastName: 'نیکو', phone: '09121234567', nationalId: '0012345678', customerType: CustomerType.wholesale, companyId: 'company-par', isActive: true, createdAt: new Date('2024-03-12T10:00:00'), }, { id: 'cust-2', firstName: 'نساجی', lastName: 'آریا', phone: '09135551234', nationalId: '1030567890', customerType: CustomerType.wholesale, companyId: 'company-fam-baft', isActive: true, createdAt: new Date('2024-05-20T14:30:00'), }, { id: 'cust-3', firstName: 'فروشگاه', lastName: 'پارچه مهر', phone: '09128877665', nationalId: '0012345679', customerType: CustomerType.retail, companyId: 'company-par', isActive: true, createdAt: new Date('2024-07-08T09:15:00'), }, { id: 'cust-4', firstName: 'پوشاک', lastName: 'سپهر', phone: '09369876543', nationalId: '1050987654', customerType: CustomerType.wholesale, companyId: 'company-par', isActive: false, createdAt: new Date('2024-08-01T11:00:00'), }, { id: 'cust-5', firstName: 'بافت', lastName: 'آسان', phone: '09121110000', nationalId: '0065432109', customerType: CustomerType.wholesale, companyId: 'company-fam-baft', isActive: true, createdAt: new Date('2024-06-01T10:00:00'), }, ], }); const order1 = await prisma.order.create({ data: { id: 'ord-1', orderNumber: 'ORD-1403-1256', userId: 'cust-1', companyId: 'company-par', companyName: 'شرکت پَر', settlementType: SettlementType.check, checkMode: CheckRegistrationMode.full, status: OrderStatus.awaiting_review, totalMeterage: 4250, totalAmount: 2_450_000_000, createdAt: new Date('2024-10-25T10:30:00'), items: { create: [ { id: 'oi-1', productId: 'prod-377-blue', catalogCode: '377', productName: 'پارچه آبی', productCode: '377-BL', color: 'آبی', requestedMeterage: 2000, confirmedMeterage: 2000, }, { id: 'oi-2', productId: 'prod-377-black', catalogCode: '377', productName: 'پارچه مشکی', productCode: '377-BK', color: 'مشکی', requestedMeterage: 1500, confirmedMeterage: 1000, }, { id: 'oi-3', productId: 'prod-378-blue-white', catalogCode: '378', productName: 'آبی پشت سفید', productCode: '378-BLW', color: 'آبی پشت سفید', requestedMeterage: 750, confirmedMeterage: 750, }, ], }, checks: { create: [ { id: 'chk-1', row: 1, amount: 1_000_000_000, bankName: 'ملت', sayadId: '1234567890123456', dueDate: new Date('2024-10-21'), status: CheckStatus.pending_review, mode: CheckRegistrationMode.full, }, { id: 'chk-2', row: 2, amount: 800_000_000, bankName: 'ملی', sayadId: '2345678901234567', dueDate: new Date('2024-10-26'), status: CheckStatus.pending_review, mode: CheckRegistrationMode.full, }, { id: 'chk-3', row: 3, amount: 650_000_000, bankName: 'ملت', sayadId: '3456789012345678', dueDate: new Date('2024-10-31'), status: CheckStatus.pending_review, mode: CheckRegistrationMode.full, }, ], }, statusHistory: { create: [ { fromStatus: null, toStatus: OrderStatus.submitted, changedBy: 'customer', changedAt: new Date('2024-10-25T10:30:00') }, { fromStatus: OrderStatus.submitted, toStatus: OrderStatus.awaiting_review, changedBy: 'system', changedAt: new Date('2024-10-25T10:30:01') }, ], }, }, }); await prisma.order.create({ data: { id: 'ord-2', orderNumber: 'ORD-1403-1255', userId: 'cust-2', companyId: 'company-fam-baft', companyName: 'فام‌بافت', settlementType: SettlementType.check, checkMode: CheckRegistrationMode.brief, status: OrderStatus.awaiting_check_review, totalMeterage: 3200, totalAmount: 1_850_000_000, createdAt: new Date('2024-10-24T14:15:00'), items: { create: [ { productId: 'prod-fam-401-1', catalogCode: '401', productName: 'پارچه مخمل', productCode: '401-MV', color: 'سرمه‌ای', requestedMeterage: 3200, confirmedMeterage: 3200, unitPrice: 250000, lineTotal: 800_000_000, }, ], }, cashReceipt: { create: { id: 'cp-1', amount: 1_850_000_000, paidAmount: 1_850_000_000, transferDate: new Date('2024-10-25T08:30:00'), trackingNumber: '9876543210', expiresAt: new Date('2024-10-25T17:00:00'), status: CashPaymentStatus.pending_review, submittedAt: new Date('2024-10-25T08:30:00'), }, }, statusHistory: { create: [ { fromStatus: null, toStatus: OrderStatus.submitted, changedBy: 'customer' }, { fromStatus: OrderStatus.submitted, toStatus: OrderStatus.awaiting_check_review, changedBy: 'admin' }, ], }, }, }); await prisma.order.create({ data: { id: 'ord-3', orderNumber: 'ORD-1403-1254', userId: 'cust-1', companyId: 'company-par', companyName: 'شرکت پَر', settlementType: SettlementType.cash, status: OrderStatus.final_approved, totalMeterage: 1800, totalAmount: 980_000_000, finalAmount: 980_000_000, createdAt: new Date('2024-10-23T09:00:00'), cashReceipt: { create: { id: 'cp-2', amount: 980_000_000, paidAmount: 980_000_000, transferDate: new Date('2024-10-24T15:20:00'), trackingNumber: '1234567890', destinationAccountId: 'ba-par-1', expiresAt: new Date('2024-10-24T17:00:00'), status: CashPaymentStatus.approved, submittedAt: new Date('2024-10-24T15:20:00'), }, }, }, }); await prisma.order.create({ data: { id: 'ord-4', orderNumber: 'ORD-1403-1253', userId: 'cust-5', companyId: 'company-fam-baft', companyName: 'فام‌بافت', settlementType: SettlementType.check, status: OrderStatus.check_needs_fix, totalMeterage: 5100, totalAmount: 3_200_000_000, createdAt: new Date('2024-10-22T16:45:00'), }, }); await prisma.order.create({ data: { id: 'ord-5', orderNumber: 'ORD-1403-1252', userId: 'cust-1', companyId: 'company-par', companyName: 'شرکت پَر', settlementType: SettlementType.cash, status: OrderStatus.delivered, totalMeterage: 1200, totalAmount: 750_000_000, finalAmount: 750_000_000, createdAt: new Date('2024-10-21T11:20:00'), shipment: { create: { id: 'shp-delivered-5', carrier: 'باربری تهران', trackingNumber: 'BR-1403-88001', meterage: 1200, status: ShipmentStatus.delivered, shippedAt: new Date('2024-10-19T09:00:00'), deliveredAt: new Date('2024-10-21T11:00:00'), }, }, cashReceipt: { create: { id: 'cp-3', amount: 750_000_000, paidAmount: 750_000_000, transferDate: new Date('2024-10-18T11:00:00'), trackingNumber: '5555123456', destinationAccountId: 'ba-par-2', expiresAt: new Date('2024-10-18T17:00:00'), status: CashPaymentStatus.approved, submittedAt: new Date('2024-10-18T11:00:00'), }, }, }, }); await prisma.order.create({ data: { id: 'ord-6', orderNumber: 'ORD-1403-1251', userId: 'cust-1', companyId: 'company-par', companyName: 'شرکت پَر', settlementType: SettlementType.check, status: OrderStatus.shipped, totalMeterage: 2900, totalAmount: 1_600_000_000, createdAt: new Date('2024-10-20T08:30:00'), shipment: { create: { id: 'shp-1', carrier: 'باربری تهران-اصفهان', trackingNumber: 'BR-1403-88901', meterage: 2900, status: ShipmentStatus.shipped, shippedAt: new Date('2024-10-24T09:00:00'), }, }, }, }); await prisma.order.create({ data: { id: 'ord-7', orderNumber: 'ORD-1403-1250', userId: 'cust-5', companyId: 'company-fam-baft', companyName: 'فام‌بافت', settlementType: SettlementType.check, status: OrderStatus.awaiting_check_review, totalMeterage: 3800, totalAmount: 2_100_000_000, createdAt: new Date('2024-10-19T13:00:00'), shipment: { create: { id: 'shp-2', carrier: 'باربری سریع', trackingNumber: 'BR-1403-88902', meterage: 3800, status: ShipmentStatus.ready, }, }, }, }); await prisma.order.create({ data: { id: 'ord-8', orderNumber: 'ORD-1403-1208', userId: 'cust-3', companyId: 'company-par', companyName: 'شرکت پَر', settlementType: SettlementType.cash, status: OrderStatus.preparing, totalMeterage: 950, totalAmount: 450_000_000, createdAt: new Date('2024-10-18T10:00:00'), shipment: { create: { id: 'shp-3', carrier: 'پیک داخلی', trackingNumber: 'PK-1403-0045', meterage: 950, status: ShipmentStatus.preparing, }, }, cashReceipt: { create: { id: 'cp-4', amount: 450_000_000, paidAmount: null, transferDate: null, trackingNumber: null, expiresAt: new Date('2024-10-22T17:00:00'), status: CashPaymentStatus.expired, }, }, }, }); await prisma.order.create({ data: { id: 'ord-9', orderNumber: 'ORD-1403-1199', userId: 'cust-1', companyId: 'company-par', companyName: 'شرکت پَر', settlementType: SettlementType.check, status: OrderStatus.delivered, totalMeterage: 4100, totalAmount: 2_200_000_000, createdAt: new Date('2024-10-15T10:00:00'), shipment: { create: { id: 'shp-4', carrier: 'باربری تهران-مشهد', trackingNumber: 'BR-1403-88750', meterage: 4100, status: ShipmentStatus.delivered, shippedAt: new Date('2024-10-18T10:00:00'), deliveredAt: new Date('2024-10-20T16:30:00'), }, }, }, }); await prisma.systemSettings.create({ data: { id: 'default', maxMeteragePerInvoice: 5000, cashInvoiceValidityHours: 8, defaultSettlementCheck: true, defaultSettlementCash: true, smsOrderRegistered: true, smsPaymentReminder: true, smsCheckReview: true, smsShippingUpdate: true, supportPhone: '02191000000', supportEmail: 'support@fabrictrade.ir', }, }); await prisma.adminNotification.createMany({ data: [ { id: 'ntf-1', title: 'سفارش جدید ثبت شد', body: 'سفارش ORD-1403-1260 از مشتری پارچه‌سرای نیکو در انتظار بررسی است.', tone: NotificationTone.info, link: '/orders', isRead: false, sentAt: new Date('2024-10-25T10:05:00'), }, { id: 'ntf-2', title: 'چک در انتظار تأیید', body: '۳ فقره چک برای سفارش ORD-1403-1254 نیاز به بررسی دارد.', tone: NotificationTone.warning, link: '/orders/ord-1/checks', isRead: false, sentAt: new Date('2024-10-25T09:50:00'), }, { id: 'ntf-3', title: 'پیش‌فاکتور ارسال شد', body: 'پیش‌فاکتور سفارش ORD-1403-1252 برای مشتری ارسال گردید.', tone: NotificationTone.success, isRead: false, sentAt: new Date('2024-10-25T09:20:00'), }, ], }); await prisma.internalMessage.createMany({ data: [ { id: 'msg-1', senderName: 'سارا احمدی', subject: 'هماهنگی ارسال سفارش ORD-1403-1256', preview: 'لطفاً وضعیت باربری سفارش مشتری پارچه‌سرای نیکو را بررسی کنید.', sentAt: new Date('2024-10-25T09:15:00'), isRead: false, }, { id: 'msg-2', senderName: 'رضا کریمی', subject: 'درخواست اصلاح قیمت', preview: 'مشتری درخواست تخفیف ۵٪ روی متراژ بالای ۳۰۰۰ متر داده است.', sentAt: new Date('2024-10-25T08:40:00'), isRead: false, }, ], }); void order1; console.log('Seed completed successfully.'); console.log('Admin login: 09121112222 / admin123'); console.log('Customer OTP login: 09121234567 / code 1234'); } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });