Files

283 lines
7.1 KiB
Plaintext

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")
}