305 lines
7.4 KiB
Text
305 lines
7.4 KiB
Text
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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
|
|
isAvulso Boolean @default(false)
|
|
cnpj String?
|
|
domain String?
|
|
phone String?
|
|
description String?
|
|
address 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
|
|
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
|
|
|
|
company Company? @relation(fields: [companyId], references: [id])
|
|
|
|
@@index([tenantId, role])
|
|
@@index([tenantId, companyId])
|
|
}
|
|
|
|
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?
|
|
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 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?
|
|
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])
|
|
}
|