# DuOrigin v2 - Prisma Database Layer Este diretório contém o schema Prisma e scripts de seed para o DuOrigin v2. ## 📁 Estrutura ``` prisma/ ├── schema.prisma # Schema do banco de dados ├── seed.ts # Script de seed com dados demo └── README.md # Esta documentação ``` ## 🗄️ Modelos de Dados | Modelo | Descrição | Tabela | |--------|-----------|--------| | `User` | Usuários do sistema (autenticação) | `users` | | `Company` | Empresas/operadores EUDR | `companies` | | `Producer` | Produtores rurais | `producers` | | `Area` | Propriedades/glebas com geolocalização | `areas` | | `Product` | Commodities EUDR (soja, café, etc.) | `products` | | `Lot` | Lotes de produto para rastreabilidade | `lots` | | `DdsStatement` | Declarações de Due Diligence | `dds_statements` | | `AuditLog` | Trilha de auditoria | `audit_logs` | ## 🔗 Relacionamentos ``` Company └── Producer (1:N) ├── Area (1:N) │ └── Lot (1:N) └── Lot (1:N) Product └── Lot (1:N) Company └── DdsStatement (1:N) └── lot_ids (JSON array) User └── AuditLog (1:N) ``` ## 🚀 Setup ### 1. Configurar Variável de Ambiente Crie ou edite `.env` na raiz do projeto: ```env # Via túnel SSH (recomendado para dev local) DATABASE_URL="postgresql://duorigin:DuOrigin2026!@localhost:5433/duorigin" # Conexão direta (se PostgreSQL aceitar conexões externas) # DATABASE_URL="postgresql://duorigin:DuOrigin2026!@198.199.84.130:5432/duorigin" ``` ### 1.1 Criar Túnel SSH (se necessário) Se o PostgreSQL não aceita conexões externas, crie um túnel SSH: ```bash # Criar túnel (porta local 5433 -> servidor 5432) ssh -i ~/.ssh/digitalocean_jarvis -L 5433:localhost:5432 -fN root@198.199.84.130 # Verificar se túnel está ativo ss -tlnp | grep 5433 # Matar túnel quando terminar pkill -f "ssh.*5433.*5432" ``` ### 2. Gerar Prisma Client ```bash npx prisma generate ``` ### 3. Aplicar Schema (se banco novo) ```bash # Criar migration inicial npx prisma migrate dev --name init # Ou sincronizar sem migration (dev) npx prisma db push ``` ### 4. Popular com Dados Demo ```bash npx prisma db seed ``` ## 📊 Dados de Demonstração O seed cria os seguintes dados: ### Usuários | Email | Senha | Role | |-------|-------|------| | demo@duorigin.com | DuoDemo2026 | admin | | operador@duorigin.com | DuoDemo2026 | operator | ### Empresas (3) - AgroCerrado Exportações Ltda (GO) - Fazendas Unidas do Brasil S.A. (MT) - Cooperativa Agrícola Planalto Central (MG) ### Produtores (5) Produtores rurais vinculados às empresas, com CAR válido. ### Áreas (5) Propriedades rurais no Cerrado com coordenadas reais: - 3 áreas com risco baixo (sem desmatamento) - 1 área com risco médio (alerta) - 1 área com risco alto (desmatamento confirmado) ### Lotes (10) Lotes de soja e café em diferentes status: - 4 aprovados - 2 em revisão - 2 rejeitados - 2 pendentes ### Declarações DDS (5) Due Diligence Statements em vários status: - 2 aprovadas (com EU reference) - 1 submetida (aguardando) - 1 rejeitada - 1 rascunho ## 🛠️ Comandos Úteis ```bash # Abrir Prisma Studio (GUI) npx prisma studio # Resetar banco e re-seed npx prisma migrate reset # Verificar schema npx prisma validate # Formatar schema npx prisma format # Gerar diagrama ERD npx prisma-erd-generator ``` ## 📦 Uso no Código ```typescript import { prisma } from '@/lib/prisma'; // Buscar todos os lotes com risco alto const highRiskLots = await prisma.lot.findMany({ where: { risk_score: { gte: 70 } }, include: { area: true, producer: true, product: true, }, }); // Buscar empresa com produtores e áreas const company = await prisma.company.findUnique({ where: { id: 1 }, include: { producers: { include: { areas: true }, }, }, }); ``` ## 🔒 Segurança - Nunca commitar `.env` com credenciais reais - Em produção, usar SSL: `?sslmode=require` - Sempre usar prepared statements (Prisma faz isso automaticamente) ## 📝 Notas - O campo `lot_ids` em `DdsStatement` é um JSON array de IDs - O campo `geojson` em `Area` armazena polígonos GeoJSON - Timestamps são `DateTime?` para compatibilidade com banco existente - Passwords são hasheados com bcrypt (salt rounds: 10)