generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) name String email String @unique password String role UserRole @default(FREE) plan Plan @default(FREE) oabNumber String? oabState String? phone String? avatar String? credits Int @default(5) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt stripeCustomerId String? stripePriceId String? stripeSubscriptionId String? apiKeys ApiKey[] chats Chat[] contractAudits ContractAudit[] documents Document[] prazos Prazo[] subscriptions Subscription[] templates Template[] usageLogs UsageLog[] uploads Upload[] processAnalyses ProcessAnalysis[] processosMonitorados ProcessoMonitorado[] } model ApiKey { id String @id @default(cuid()) key String @unique name String userId String active Boolean @default(true) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Document { id String @id @default(cuid()) userId String type DocumentType title String prompt String content String wordCount Int @default(0) status DocumentStatus @default(GENERATING) area LegalArea tokens Int @default(0) cost Float @default(0) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Template { id String @id @default(cuid()) name String description String type DocumentType area LegalArea prompt String isPublic Boolean @default(false) userId String? createdAt DateTime @default(now()) user User? @relation(fields: [userId], references: [id]) } model Jurisprudencia { id String @id @default(cuid()) tribunal String numero String ementa String data String area String relator String orgaoJulgador String tags String } model Chat { id String @id @default(cuid()) userId String title String createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) messages ChatMessage[] } model ChatMessage { id String @id @default(cuid()) chatId String role MessageRole content String tokens Int @default(0) createdAt DateTime @default(now()) chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade) } model Subscription { id String @id @default(cuid()) userId String plan Plan status SubscriptionStatus @default(ACTIVE) startDate DateTime @default(now()) endDate DateTime? stripeId String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model UsageLog { id String @id @default(cuid()) userId String type UsageType tokens Int @default(0) cost Float @default(0) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Prazo { id String @id @default(cuid()) userId String title String description String? processNumber String? court String? deadline DateTime alertDays Int @default(3) status PrazoStatus @default(PENDENTE) priority PrazoPriority @default(MEDIA) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model ContractAudit { id String @id @default(cuid()) userId String title String content String analysis Json? status AuditStatus @default(PENDING) riskScore Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Upload { id String @id @default(cuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) filename String key String size Int mimeType String createdAt DateTime @default(now()) } enum UserRole { ADMIN ADVOGADO FREE } enum Plan { FREE PRO ENTERPRISE STARTER } enum DocumentType { PETICAO_INICIAL CONTESTACAO APELACAO RECURSO CONTRATO PARECER IMPUGNACAO HABEAS_CORPUS MANDADO_SEGURANCA OUTROS } enum LegalArea { CIVIL TRABALHISTA PENAL TRIBUTARIO FAMILIA EMPRESARIAL CONSUMIDOR ADMINISTRATIVO } enum DocumentStatus { GENERATING COMPLETED ERROR } enum MessageRole { USER ASSISTANT } enum SubscriptionStatus { ACTIVE CANCELLED EXPIRED } enum UsageType { DOCUMENT CHAT JURISPRUDENCIA } enum PrazoStatus { PENDENTE CONCLUIDO VENCIDO CANCELADO } enum PrazoPriority { ALTA MEDIA BAIXA } enum AuditStatus { PENDING ANALYZING DONE ERROR } model ProcessAnalysis { id String @id @default(cuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) title String filename String fileKey String fileSize Int extractedText String @db.Text analysis String @db.Text summary String? @db.Text status String @default("PENDING") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } // ===== MONITORAMENTO DE PUBLICAÇÕES ===== model ProcessoMonitorado { id String @id @default(cuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) numeroProcesso String // Ex: 0001234-56.2024.8.26.0100 tribunal String // Ex: TJSP, TRF3, STJ vara String? comarca String? parteAutora String? parteRe String? status ProcessoStatus @default(ATIVO) // Dados do processo (buscados da API DataJud) classe String? assunto String? dataAjuizamento DateTime? orgaoJulgador String? grau String? valorCausa Float? ultimaAtualizacao DateTime? dadosCompletos Json? // JSON com todos os dados brutos da API createdAt DateTime @default(now()) updatedAt DateTime @updatedAt publicacoes Publicacao[] andamentos Andamento[] } model Publicacao { id String @id @default(cuid()) processoId String processo ProcessoMonitorado @relation(fields: [processoId], references: [id], onDelete: Cascade) dataPublicacao DateTime diario String // Ex: DJe, DOU, DOESP conteudo String @db.Text tipo TipoPublicacao prazoCalculado DateTime? prazoTipo String? // Ex: "15 dias úteis", "5 dias" visualizado Boolean @default(false) createdAt DateTime @default(now()) } enum ProcessoStatus { ATIVO ARQUIVADO SUSPENSO } enum TipoPublicacao { INTIMACAO CITACAO SENTENCA DESPACHO ACORDAO OUTROS } model Andamento { id String @id @default(cuid()) processoId String processo ProcessoMonitorado @relation(fields: [processoId], references: [id], onDelete: Cascade) codigo Int nome String dataHora DateTime complemento String? createdAt DateTime @default(now()) @@unique([processoId, codigo, dataHora]) }