import { PrismaClient, Role, RepairStatus } from '@prisma/client'; import * as bcrypt from 'bcrypt'; const prisma = new PrismaClient(); async function main() { console.log('Start seeding...'); // Clean existing data (optional, for dev) // await prisma.calculationItem.deleteMany(); // await prisma.calculation.deleteMany(); // await prisma.calculationTemplate.deleteMany(); // await prisma.repairOrderAssignee.deleteMany(); // await prisma.repairOrder.deleteMany(); // await prisma.unitIdentifier.deleteMany(); // await prisma.unit.deleteMany(); // await prisma.serviceObject.deleteMany(); // await prisma.trip.deleteMany(); // await prisma.contractor.deleteMany(); // await prisma.user.deleteMany(); // Users const adminPassword = await bcrypt.hash('admin123', 12); const admin = await prisma.user.upsert({ where: { email: 'admin@crm.local' }, update: {}, create: { email: 'admin@crm.local', password: adminPassword, firstName: 'Admin', lastName: 'User', role: Role.ADMIN, }, }); const directorPassword = await bcrypt.hash('director123', 12); const director = await prisma.user.upsert({ where: { email: 'director@crm.local' }, update: {}, create: { email: 'director@crm.local', password: directorPassword, firstName: 'Director', lastName: 'User', role: Role.DIRECTOR, }, }); const mechanicPassword = await bcrypt.hash('mechanic123', 12); const mechanic = await prisma.user.upsert({ where: { email: 'mechanic@crm.local' }, update: {}, create: { email: 'mechanic@crm.local', password: mechanicPassword, firstName: 'Mechanic', lastName: 'User', role: Role.MECHANIC, }, }); const workerPassword = await bcrypt.hash('worker123', 12); const worker = await prisma.user.upsert({ where: { email: 'worker@crm.local' }, update: {}, create: { email: 'worker@crm.local', password: workerPassword, firstName: 'Worker', lastName: 'User', role: Role.WORKER, }, }); console.log('Users created:', { admin: admin.email, director: director.email, mechanic: mechanic.email, worker: worker.email }); // Contractors const contractor1 = await prisma.contractor.create({ data: { name: 'ООО "Ромашка"', inn: '1234567890', address: 'г. Москва, ул. Цветочная, д. 1', phone: '+74951234567', }, }); const contractor2 = await prisma.contractor.create({ data: { name: 'ИП Петров', inn: '0987654321', address: 'г. Санкт-Петербург, пр. Невский, д. 42', phone: '+78127654321', }, }); console.log('Contractors created:', contractor1.name, contractor2.name); // Units + Identifiers const unit1 = await prisma.unit.create({ data: {} }); await prisma.unitIdentifier.createMany({ data: [ { unitId: unit1.id, type: 'SERIAL', value: 'SN123456789' }, { unitId: unit1.id, type: 'INTERNAL', value: 'INT001' }, ], }); const unit2 = await prisma.unit.create({ data: {} }); await prisma.unitIdentifier.createMany({ data: [ { unitId: unit2.id, type: 'SERIAL', value: 'SN987654321' }, { unitId: unit2.id, type: 'CUSTOMER', value: 'CUST-A42' }, ], }); console.log('Units created:', unit1.id, unit2.id); // RepairOrders const repair1 = await prisma.repairOrder.create({ data: { unitId: unit1.id, contractorId: contractor1.id, status: RepairStatus.RECEIVED, description: 'Не работает гидроцилиндр', }, }); await prisma.repairOrderAssignee.create({ data: { repairOrderId: repair1.id, userId: mechanic.id }, }); const repair2 = await prisma.repairOrder.create({ data: { unitId: unit2.id, contractorId: contractor2.id, status: RepairStatus.IN_WORK, description: 'Замена насоса', }, }); await prisma.repairOrderAssignee.createMany({ data: [ { repairOrderId: repair2.id, userId: mechanic.id }, { repairOrderId: repair2.id, userId: worker.id }, ], }); console.log('RepairOrders created:', repair1.id, repair2.id); // ServiceObjects + Trips const serviceObj1 = await prisma.serviceObject.create({ data: { contractorId: contractor1.id, name: 'Склад №1', address: 'г. Москва, ул. Складская, д. 5', }, }); const serviceObj2 = await prisma.serviceObject.create({ data: { contractorId: contractor2.id, name: 'Цех №3', address: 'г. Санкт-Петербург, ул. Промышленная, д. 10', }, }); const trip1 = await prisma.trip.create({ data: { contractorId: contractor1.id, serviceObjectId: serviceObj1.id, description: 'Диагностика оборудования', scheduledFor: new Date(Date.now() + 24 * 60 * 60 * 1000), // tomorrow }, }); const trip2 = await prisma.trip.create({ data: { contractorId: contractor2.id, serviceObjectId: serviceObj2.id, description: 'Монтаж гидроцилиндра', scheduledFor: new Date(Date.now() + 48 * 60 * 60 * 1000), // day after tomorrow }, }); console.log('Trips created:', trip1.id, trip2.id); // Calculation Templates const tmpl1 = await prisma.calculationTemplate.create({ data: { contractorId: contractor1.id, name: 'Ремонт гидроцилиндров (базовый)', }, }); const tmpl2 = await prisma.calculationTemplate.create({ data: { name: 'Общая диагностика', }, }); console.log('CalculationTemplates created:', tmpl1.id, tmpl2.id); // Calculations + Items const calc1 = await prisma.calculation.create({ data: { repairOrderId: repair1.id, templateId: tmpl1.id, }, }); await prisma.calculationItem.createMany({ data: [ { calculationId: calc1.id, type: 'WORK', name: 'Диагностика', quantity: 1, unit: 'шт', }, { calculationId: calc1.id, type: 'WORK', name: 'Ремонт поршня', quantity: 2, unit: 'шт', }, { calculationId: calc1.id, type: 'MATERIAL', name: 'Сальник', quantity: 4, unit: 'шт', }, ], }); const calc2 = await prisma.calculation.create({ data: { repairOrderId: repair2.id, templateId: tmpl2.id, }, }); await prisma.calculationItem.createMany({ data: [ { calculationId: calc2.id, type: 'WORK', name: 'Замена насоса', quantity: 1, unit: 'шт', }, { calculationId: calc2.id, type: 'MATERIAL', name: 'Насос НП-50', quantity: 1, unit: 'шт', }, ], }); console.log('Calculations created:', calc1.id, calc2.id); console.log('Seeding finished.'); } main() .then(async () => { await prisma.$disconnect(); }) .catch(async (e) => { console.error(e); await prisma.$disconnect(); process.exit(1); });