Files
crm-system/prisma/seed.ts
T

272 lines
7.1 KiB
TypeScript

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);
});