import { PrismaClient } from '@prisma/client'; import bcrypt from 'bcryptjs'; const prisma = new PrismaClient(); async function main(): Promise { const passwordHash = await bcrypt.hash('Password@123', 12); const admin = await prisma.user.upsert({ where: { email: 'admin@okr.local' }, update: { passwordHash }, create: { name: 'System Admin', username: 'admin', email: 'admin@okr.local', passwordHash, role: 'ADMIN', }, }); const manager = await prisma.user.upsert({ where: { email: 'manager@okr.local' }, update: { passwordHash }, create: { name: 'Nguyen Van Manager', username: 'manager', email: 'manager@okr.local', passwordHash, role: 'MANAGER', }, }); const employee = await prisma.user.upsert({ where: { email: 'employee@okr.local' }, update: { passwordHash }, create: { name: 'Nguyen Van A', username: 'employee', email: 'employee@okr.local', passwordHash, role: 'EMPLOYEE', }, }); const employeeTwo = await prisma.user.upsert({ where: { email: 'employee2@okr.local' }, update: { passwordHash }, create: { name: 'Tran Thi B', username: 'employee2', email: 'employee2@okr.local', passwordHash, role: 'EMPLOYEE', }, }); const securityObjective = await prisma.objective.upsert({ where: { id: 1 }, update: { ownerId: employee.id, title: 'POC AI for SQL Injection prevention', description: 'Evaluate AI tools for automated SQL injection detection.', quarter: 'Q2/2026', status: 'IN_PROGRESS', }, create: { id: 1, ownerId: employee.id, title: 'POC AI for SQL Injection prevention', description: 'Evaluate AI tools for automated SQL injection detection.', quarter: 'Q2/2026', status: 'IN_PROGRESS', }, }); const adoptionObjective = await prisma.objective.upsert({ where: { id: 2 }, update: { ownerId: employeeTwo.id, title: 'AI for All enablement across department', description: 'Train and certify department members on practical AI workflows.', quarter: 'Q2/2026', status: 'NOT_STARTED', }, create: { id: 2, ownerId: employeeTwo.id, title: 'AI for All enablement across department', description: 'Train and certify department members on practical AI workflows.', quarter: 'Q2/2026', status: 'NOT_STARTED', }, }); const managerObjective = await prisma.objective.upsert({ where: { id: 3 }, update: { ownerId: manager.id, title: 'Improve OKR operating cadence', description: 'Create weekly progress rhythm and reduce stale OKRs.', quarter: 'Q2/2026', status: 'IN_PROGRESS', }, create: { id: 3, ownerId: manager.id, title: 'Improve OKR operating cadence', description: 'Create weekly progress rhythm and reduce stale OKRs.', quarter: 'Q2/2026', status: 'IN_PROGRESS', }, }); await prisma.keyResult.upsert({ where: { id: 1 }, update: { objectiveId: securityObjective.id, progress: 33 }, create: { id: 1, objectiveId: securityObjective.id, title: 'Complete 3 POC sessions with security team', progress: 33, startValue: 0, targetValue: 3, deadline: new Date('2026-06-30T00:00:00.000Z'), }, }); await prisma.keyResult.upsert({ where: { id: 2 }, update: { objectiveId: securityObjective.id, progress: 60 }, create: { id: 2, objectiveId: securityObjective.id, title: 'Reduce manual SQL injection review effort by 30%', progress: 60, startValue: 0, targetValue: 30, deadline: new Date('2026-06-30T00:00:00.000Z'), }, }); await prisma.keyResult.upsert({ where: { id: 3 }, update: { objectiveId: adoptionObjective.id, progress: 0 }, create: { id: 3, objectiveId: adoptionObjective.id, title: 'Certify 100 department members on AI for All', progress: 0, startValue: 0, targetValue: 100, deadline: new Date('2026-06-30T00:00:00.000Z'), }, }); await prisma.keyResult.upsert({ where: { id: 4 }, update: { objectiveId: managerObjective.id, progress: 75 }, create: { id: 4, objectiveId: managerObjective.id, title: 'Reach 90% weekly OKR update compliance', progress: 75, startValue: 40, targetValue: 90, deadline: new Date('2026-06-30T00:00:00.000Z'), }, }); await prisma.keyResult.upsert({ where: { id: 5 }, update: { objectiveId: managerObjective.id, progress: 45 }, create: { id: 5, objectiveId: managerObjective.id, title: 'Resolve stale OKR reports within two business days', progress: 45, startValue: 0, targetValue: 10, deadline: new Date('2026-06-30T00:00:00.000Z'), }, }); await prisma.progressUpdate.deleteMany({ where: { keyResultId: { in: [1, 2, 3, 4, 5] } } }); await prisma.progressUpdate.create({ data: { keyResultId: 2, progress: 60, comment: 'Two review workflows automated; third is in validation.', createdById: employee.id, }, }); void admin; console.log('Seed completed successfully.'); } main() .catch((error: unknown) => { console.error(error); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });