Initial commit: LexMind - Plataforma Jurídica Inteligente

This commit is contained in:
bigtux
2026-02-10 15:46:26 -03:00
commit 08bd4f039d
108 changed files with 75782 additions and 0 deletions

338
prisma/schema.prisma Normal file
View File

@@ -0,0 +1,338 @@
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])
}