272 lines
7.1 KiB
TypeScript
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);
|
||
});
|