sistema-de-chamados/prisma/schema.prisma
2025-11-10 01:57:45 -03:00

401 lines
10 KiB
Text

generator client {
provider = "prisma-client-js"
// Include both OpenSSL variants to support host build (OpenSSL 3.x)
// and container runtime (Debian bullseye, OpenSSL 1.1.x)
binaryTargets = ["native", "debian-openssl-1.1.x", "debian-openssl-3.0.x"]
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
enum UserRole {
ADMIN
MANAGER
AGENT
COLLABORATOR
}
enum TicketStatus {
PENDING
AWAITING_ATTENDANCE
PAUSED
RESOLVED
}
enum TicketPriority {
LOW
MEDIUM
HIGH
URGENT
}
enum TicketChannel {
EMAIL
WHATSAPP
CHAT
PHONE
API
MANUAL
}
enum CommentVisibility {
PUBLIC
INTERNAL
}
enum CompanyStateRegistrationType {
STANDARD
EXEMPT
SIMPLES
}
model Team {
id String @id @default(cuid())
tenantId String
name String
description String?
members TeamMember[]
queues Queue[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([tenantId, name])
}
model TeamMember {
teamId String
userId String
isLead Boolean @default(false)
assignedAt DateTime @default(now())
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@id([teamId, userId])
}
model Company {
id String @id @default(cuid())
tenantId String
name String
slug String
provisioningCode String @unique
isAvulso Boolean @default(false)
contractedHoursPerMonth Float?
cnpj String?
domain String?
phone String?
description String?
address String?
legalName String?
tradeName String?
stateRegistration String?
stateRegistrationType CompanyStateRegistrationType?
primaryCnae String?
timezone String?
businessHours Json?
supportEmail String?
billingEmail String?
contactPreferences Json?
clientDomains Json?
communicationChannels Json?
fiscalAddress Json?
hasBranches Boolean @default(false)
regulatedEnvironments Json?
privacyPolicyAccepted Boolean @default(false)
privacyPolicyReference String?
privacyPolicyMetadata Json?
contacts Json?
locations Json?
contracts Json?
sla Json?
tags Json?
customFields Json?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
users User[]
tickets Ticket[]
@@unique([tenantId, slug])
@@index([tenantId, name])
}
model User {
id String @id @default(cuid())
tenantId String
name String
email String @unique
role UserRole
jobTitle String?
managerId String?
timezone String @default("America/Sao_Paulo")
avatarUrl String?
companyId String?
teams TeamMember[]
requestedTickets Ticket[] @relation("TicketRequester")
assignedTickets Ticket[] @relation("TicketAssignee")
comments TicketComment[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
manager User? @relation("UserManager", fields: [managerId], references: [id])
reports User[] @relation("UserManager")
company Company? @relation(fields: [companyId], references: [id])
@@index([tenantId, role])
@@index([tenantId, companyId])
@@index([tenantId, managerId])
}
model Queue {
id String @id @default(cuid())
tenantId String
name String
slug String
teamId String?
tickets Ticket[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
team Team? @relation(fields: [teamId], references: [id])
@@unique([tenantId, slug])
}
model Ticket {
id String @id @default(cuid())
tenantId String
reference Int @default(0)
subject String
summary String?
status TicketStatus @default(PENDING)
priority TicketPriority @default(MEDIUM)
channel TicketChannel @default(EMAIL)
queueId String?
requesterId String
assigneeId String?
slaPolicyId String?
companyId String?
slaSnapshot Json?
slaResponseDueAt DateTime?
slaSolutionDueAt DateTime?
slaResponseStatus String?
slaSolutionStatus String?
slaPausedAt DateTime?
slaPausedBy String?
slaPausedMs Int?
dueAt DateTime?
firstResponseAt DateTime?
resolvedAt DateTime?
closedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
requester User @relation("TicketRequester", fields: [requesterId], references: [id])
assignee User? @relation("TicketAssignee", fields: [assigneeId], references: [id])
queue Queue? @relation(fields: [queueId], references: [id])
slaPolicy SlaPolicy? @relation(fields: [slaPolicyId], references: [id])
company Company? @relation(fields: [companyId], references: [id])
events TicketEvent[]
comments TicketComment[]
@@index([tenantId, status])
@@index([tenantId, queueId])
@@index([tenantId, assigneeId])
@@index([tenantId, companyId])
}
model ReportExportSchedule {
id String @id @default(cuid())
tenantId String
name String
reportKeys Json
range String @default("30d")
companyId String?
companyName String?
format String @default("xlsx")
frequency String
dayOfWeek Int?
dayOfMonth Int?
hour Int @default(8)
minute Int @default(0)
timezone String @default("America/Sao_Paulo")
recipients Json
status String @default("ACTIVE")
lastRunAt DateTime?
nextRunAt DateTime?
createdBy String
updatedBy String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
runs ReportExportRun[]
@@index([tenantId, status])
@@index([tenantId, nextRunAt])
}
model ReportExportRun {
id String @id @default(cuid())
tenantId String
scheduleId String
status String @default("PENDING")
startedAt DateTime @default(now())
completedAt DateTime?
error String?
artifacts Json?
schedule ReportExportSchedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade)
@@index([tenantId, status])
@@index([tenantId, scheduleId])
}
model TicketEvent {
id String @id @default(cuid())
ticketId String
type String
payload Json
createdAt DateTime @default(now())
ticket Ticket @relation(fields: [ticketId], references: [id], onDelete: Cascade)
@@index([ticketId, createdAt])
}
model TicketComment {
id String @id @default(cuid())
ticketId String
authorId String
visibility CommentVisibility @default(INTERNAL)
body String
attachments Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
ticket Ticket @relation(fields: [ticketId], references: [id], onDelete: Cascade)
author User @relation(fields: [authorId], references: [id])
@@index([ticketId, visibility])
}
model SlaPolicy {
id String @id @default(cuid())
tenantId String
name String
description String?
timeToFirstResponse Int?
timeToResolution Int?
calendar Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tickets Ticket[]
@@unique([tenantId, name])
}
model AuthUser {
id String @id @default(cuid())
name String?
email String @unique
emailVerified Boolean @default(false)
image String?
role String @default("agent")
tenantId String?
avatarUrl String?
machinePersona String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sessions AuthSession[]
accounts AuthAccount[]
}
model AuthSession {
id String @id @default(cuid())
userId String
token String @unique
expiresAt DateTime
ipAddress String?
userAgent String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user AuthUser @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([token])
}
model AuthAccount {
id String @id @default(cuid())
userId String
accountId String
providerId String
accessToken String?
refreshToken String?
accessTokenExpiresAt DateTime?
refreshTokenExpiresAt DateTime?
scope String?
idToken String?
password String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user AuthUser @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([providerId, accountId])
@@index([userId])
}
model AuthInvite {
id String @id @default(cuid())
email String
name String?
role String @default("agent")
tenantId String
token String @unique
status String @default("pending")
expiresAt DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
createdById String?
acceptedAt DateTime?
acceptedById String?
revokedAt DateTime?
revokedById String?
revokedReason String?
events AuthInviteEvent[]
@@index([tenantId, status])
@@index([tenantId, email])
}
model AuthInviteEvent {
id String @id @default(cuid())
inviteId String
type String
payload Json?
actorId String?
createdAt DateTime @default(now())
invite AuthInvite @relation(fields: [inviteId], references: [id], onDelete: Cascade)
@@index([inviteId, createdAt])
}
model AuthVerification {
id String @id @default(cuid())
identifier String
value String
expiresAt DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([identifier])
}