crm-system/prisma/seed.ts

272 lines
7.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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