Files

329 lines
9.7 KiB
TypeScript

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