import { PrismaClient, Role, NivelRisco, StatusAvaliacao } from '@prisma/client'; import * as bcrypt from 'bcrypt'; const prisma = new PrismaClient(); async function main() { console.log('🌱 Seeding database...'); // Create users const adminPassword = await bcrypt.hash('DuoDemo2026', 10); const operadorPassword = await bcrypt.hash('DuoDemo2026', 10); const admin = await prisma.user.upsert({ where: { email: 'demo@duorigin.com' }, update: {}, create: { email: 'demo@duorigin.com', password: adminPassword, nome: 'Administrador Demo', role: Role.ADMIN, ativo: true, }, }); const operador = await prisma.user.upsert({ where: { email: 'operador@duorigin.com' }, update: {}, create: { email: 'operador@duorigin.com', password: operadorPassword, nome: 'Operador Demo', role: Role.OPERADOR, ativo: true, }, }); console.log('✅ Users created:', { admin: admin.email, operador: operador.email }); // Create empresas const empresas = await Promise.all([ prisma.empresa.upsert({ where: { cnpj: '12.345.678/0001-90' }, update: {}, create: { razaoSocial: 'Fazenda Bom Sucesso Ltda', nomeFantasia: 'Fazenda Bom Sucesso', cnpj: '12.345.678/0001-90', inscricaoEstadual: '123.456.789.012', atividadeAgricola: 'Soja, Milho', endereco: 'Rodovia BR-050, Km 45', cidade: 'Uberlândia', estado: 'MG', cep: '38400-000', telefone: '(34) 99999-0001', email: 'contato@bomsucesso.com.br', responsavel: 'João Silva', ativo: true, }, }), prisma.empresa.upsert({ where: { cnpj: '23.456.789/0001-01' }, update: {}, create: { razaoSocial: 'Agropecuária São José S.A.', nomeFantasia: 'São José Agro', cnpj: '23.456.789/0001-01', inscricaoEstadual: '234.567.890.123', atividadeAgricola: 'Café, Pecuária', endereco: 'Estrada Municipal SP-123, Km 10', cidade: 'Ribeirão Preto', estado: 'SP', cep: '14000-000', telefone: '(16) 99999-0002', email: 'contato@saojoseagro.com.br', responsavel: 'Maria Santos', ativo: true, }, }), prisma.empresa.upsert({ where: { cnpj: '34.567.890/0001-12' }, update: {}, create: { razaoSocial: 'Cooperativa Agrícola Vale Verde', nomeFantasia: 'Coop Vale Verde', cnpj: '34.567.890/0001-12', inscricaoEstadual: '345.678.901.234', atividadeAgricola: 'Soja, Algodão, Milho', endereco: 'Av. Principal, 1000', cidade: 'Rondonópolis', estado: 'MT', cep: '78700-000', telefone: '(66) 99999-0003', email: 'contato@valeverde.coop.br', responsavel: 'Carlos Oliveira', ativo: true, }, }), ]); console.log('✅ Empresas created:', empresas.length); // Create propriedades const propriedades = await Promise.all([ prisma.propriedade.create({ data: { nome: 'Fazenda Primavera', empresaId: empresas[0].id, codigoCar: 'MG-3170206-A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6', areaHa: 1500.5, latitude: -18.9186, longitude: -48.2772, bioma: 'Cerrado', endereco: 'Zona Rural, Lote 45', cidade: 'Uberlândia', estado: 'MG', nivelRisco: NivelRisco.BAIXO, flagDesmatamento: 'clean', ativo: true, }, }), prisma.propriedade.create({ data: { nome: 'Sítio Esperança', empresaId: empresas[0].id, codigoCar: 'MG-3170206-B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7', areaHa: 320.0, latitude: -18.8500, longitude: -48.3000, bioma: 'Cerrado', cidade: 'Uberlândia', estado: 'MG', nivelRisco: NivelRisco.BAIXO, ativo: true, }, }), prisma.propriedade.create({ data: { nome: 'Fazenda São José', empresaId: empresas[1].id, codigoCar: 'SP-3543402-C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8', areaHa: 850.75, latitude: -21.1767, longitude: -47.8108, bioma: 'Mata Atlântica', cidade: 'Ribeirão Preto', estado: 'SP', nivelRisco: NivelRisco.MEDIO, flagDesmatamento: 'under_review', ativo: true, }, }), prisma.propriedade.create({ data: { nome: 'Fazenda Pioneira', empresaId: empresas[2].id, codigoCar: 'MT-5107602-D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9', areaHa: 5200.0, latitude: -16.4673, longitude: -54.6372, bioma: 'Cerrado', cidade: 'Rondonópolis', estado: 'MT', nivelRisco: NivelRisco.BAIXO, ativo: true, }, }), prisma.propriedade.create({ data: { nome: 'Fazenda Horizonte', empresaId: empresas[2].id, codigoCar: 'MT-5107602-E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0', areaHa: 3800.25, latitude: -16.5000, longitude: -54.7000, bioma: 'Cerrado', cidade: 'Rondonópolis', estado: 'MT', nivelRisco: NivelRisco.ALTO, flagDesmatamento: 'flagged', ativo: true, }, }), ]); console.log('✅ Propriedades created:', propriedades.length); // Create avaliacoes const generateRef = () => { const timestamp = Date.now().toString(36).toUpperCase(); const random = Math.random().toString(36).substring(2, 6).toUpperCase(); return `DUO-${timestamp}-${random}`; }; const avaliacoes = await Promise.all([ prisma.avaliacao.create({ data: { propriedadeId: propriedades[0].id, userId: admin.id, referencia: generateRef(), status: StatusAvaliacao.APROVADA, nivelRisco: NivelRisco.BAIXO, dataAvaliacao: new Date('2024-01-15'), dataSubmissao: new Date('2024-01-20'), observacoes: 'Propriedade em conformidade com EUDR.', referenciaEu: 'EU-ABC123', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[0].id, userId: operador.id, referencia: generateRef(), status: StatusAvaliacao.EM_ANALISE, nivelRisco: NivelRisco.BAIXO, dataAvaliacao: new Date('2024-06-01'), observacoes: 'Aguardando documentação adicional.', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[1].id, userId: admin.id, referencia: generateRef(), status: StatusAvaliacao.RASCUNHO, nivelRisco: NivelRisco.BAIXO, dataAvaliacao: new Date(), }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[2].id, userId: operador.id, referencia: generateRef(), status: StatusAvaliacao.EM_ANALISE, nivelRisco: NivelRisco.MEDIO, dataAvaliacao: new Date('2024-05-10'), dataSubmissao: new Date('2024-05-15'), observacoes: 'Área com histórico de desmatamento em análise.', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[2].id, userId: admin.id, referencia: generateRef(), status: StatusAvaliacao.REPROVADA, nivelRisco: NivelRisco.ALTO, dataAvaliacao: new Date('2024-03-01'), dataSubmissao: new Date('2024-03-10'), observacoes: 'Documentação irregular. Necessário revisão.', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[3].id, userId: admin.id, referencia: generateRef(), status: StatusAvaliacao.APROVADA, nivelRisco: NivelRisco.BAIXO, dataAvaliacao: new Date('2024-02-20'), dataSubmissao: new Date('2024-02-25'), referenciaEu: 'EU-DEF456', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[3].id, userId: operador.id, referencia: generateRef(), status: StatusAvaliacao.RASCUNHO, nivelRisco: NivelRisco.BAIXO, dataAvaliacao: new Date(), }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[4].id, userId: admin.id, referencia: generateRef(), status: StatusAvaliacao.EM_ANALISE, nivelRisco: NivelRisco.ALTO, dataAvaliacao: new Date('2024-06-05'), dataSubmissao: new Date('2024-06-10'), observacoes: 'Área com risco alto de desmatamento identificado.', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[4].id, userId: operador.id, referencia: generateRef(), status: StatusAvaliacao.REPROVADA, nivelRisco: NivelRisco.CRITICO, dataAvaliacao: new Date('2024-04-01'), dataSubmissao: new Date('2024-04-05'), observacoes: 'Desmatamento ilegal detectado. Propriedade bloqueada.', }, }), prisma.avaliacao.create({ data: { propriedadeId: propriedades[1].id, userId: operador.id, referencia: generateRef(), status: StatusAvaliacao.APROVADA, nivelRisco: NivelRisco.BAIXO, dataAvaliacao: new Date('2024-01-05'), dataSubmissao: new Date('2024-01-10'), referenciaEu: 'EU-GHI789', }, }), ]); console.log('✅ Avaliacoes created:', avaliacoes.length); console.log('🎉 Seed completed successfully!'); console.log('\n📝 Login credentials:'); console.log(' Admin: demo@duorigin.com / DuoDemo2026'); console.log(' Operador: operador@duorigin.com / DuoDemo2026'); } main() .catch((e) => { console.error('❌ Seed error:', e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });