generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum Papel { CLIENTE ADMIN } enum TipoPessoa { PF PJ } enum TipoPergunta { TEXTAREA RADIO CHECKBOX ANEXO } enum StatusBriefing { RASCUNHO ENVIADO EM_ANALISE CONCLUIDO } enum CanalNotificacao { EMAIL WHATSAPP } enum StatusNotificacao { PENDENTE ENVIADO ERRO } enum StatusSolicitacaoExclusao { PENDENTE PROCESSADA CANCELADA } model User { id String @id @default(cuid()) email String @unique senhaHash String papel Papel @default(CLIENTE) criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt cliente Cliente? passwordResetTokens PasswordResetToken[] auditorias AuditoriaAcesso[] notasInternas NotaInterna[] @@map("users") } model Cliente { id String @id @default(cuid()) userId String @unique nomeCompleto String cpfCifrado String cpfHash String @unique whatsapp String tipo TipoPessoa @default(PF) razaoSocial String? cnpj String? cep String? logradouro String? numero String? complemento String? bairro String? cidade String? uf String? lgpdAceiteEm DateTime criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt user User @relation(fields: [userId], references: [id]) briefings Briefing[] auditorias AuditoriaAcesso[] solicitacoesExclusao SolicitacaoExclusao[] @@index([tipo]) @@map("clientes") } model Secao { id String @id @default(cuid()) ordem Int titulo String descricao String? ativo Boolean @default(true) criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt perguntas Pergunta[] @@unique([ordem]) @@map("secoes") } model Pergunta { id String @id @default(cuid()) secaoId String ordem Int rotulo String dica String? tipo TipoPergunta opcoes Json obrigatoria Boolean @default(false) permiteComplemento Boolean @default(false) ativo Boolean @default(true) criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt secao Secao @relation(fields: [secaoId], references: [id]) ajuda Ajuda? respostas Resposta[] anexos Anexo[] @@unique([secaoId, ordem]) @@index([tipo]) @@map("perguntas") } model Ajuda { id String @id @default(cuid()) perguntaId String @unique oQueResponder String porQuePerguntamos String miniExemplo String criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt pergunta Pergunta @relation(fields: [perguntaId], references: [id]) @@map("ajudas") } model Briefing { id String @id @default(cuid()) clienteId String titulo String status StatusBriefing @default(RASCUNHO) confirmadoEm DateTime? enviadoEm DateTime? criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt cliente Cliente @relation(fields: [clienteId], references: [id]) respostas Resposta[] anexos Anexo[] notasInternas NotaInterna[] notificacoes EnvioNotificacao[] @@index([clienteId]) @@index([status]) @@map("briefings") } model Resposta { id String @id @default(cuid()) briefingId String perguntaId String texto String? complemento String? selecionadas Json? criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt briefing Briefing @relation(fields: [briefingId], references: [id], onDelete: Cascade) pergunta Pergunta @relation(fields: [perguntaId], references: [id]) @@unique([briefingId, perguntaId]) @@index([perguntaId]) @@map("respostas") } model Anexo { id String @id @default(cuid()) briefingId String perguntaId String nomeOriginal String caminho String mime String tamanho Int criadoEm DateTime @default(now()) briefing Briefing @relation(fields: [briefingId], references: [id], onDelete: Cascade) pergunta Pergunta @relation(fields: [perguntaId], references: [id]) @@index([briefingId]) @@index([perguntaId]) @@map("anexos") } model PasswordResetToken { id String @id @default(cuid()) userId String tokenHash String @unique expiraEm DateTime usadoEm DateTime? criadoEm DateTime @default(now()) user User @relation(fields: [userId], references: [id]) @@index([userId]) @@index([expiraEm]) @@map("password_reset_tokens") } model Configuracao { id String @id @default(cuid()) chave String @unique valor Json criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt @@map("configuracoes") } model AuditoriaAcesso { id String @id @default(cuid()) adminId String clienteId String acao String criadoEm DateTime @default(now()) admin User @relation(fields: [adminId], references: [id]) cliente Cliente @relation(fields: [clienteId], references: [id]) @@index([adminId]) @@index([clienteId]) @@map("auditorias_acesso") } model NotaInterna { id String @id @default(cuid()) briefingId String adminId String texto String criadoEm DateTime @default(now()) briefing Briefing @relation(fields: [briefingId], references: [id], onDelete: Cascade) admin User @relation(fields: [adminId], references: [id]) @@index([briefingId]) @@index([adminId]) @@map("notas_internas") } model EnvioNotificacao { id String @id @default(cuid()) briefingId String canal CanalNotificacao destino String assunto String? status StatusNotificacao @default(PENDENTE) erro String? tentativas Int @default(0) criadoEm DateTime @default(now()) atualizadoEm DateTime @updatedAt enviadoEm DateTime? briefing Briefing @relation(fields: [briefingId], references: [id], onDelete: Cascade) @@index([briefingId]) @@index([status]) @@map("envios_notificacao") } model SolicitacaoExclusao { id String @id @default(cuid()) clienteId String motivo String? status StatusSolicitacaoExclusao @default(PENDENTE) criadoEm DateTime @default(now()) processadoEm DateTime? cliente Cliente @relation(fields: [clienteId], references: [id]) @@index([clienteId]) @@index([status]) @@map("solicitacoes_exclusao") }