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