179 lines
4 KiB
Text
179 lines
4 KiB
Text
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum UserRole {
|
|
ADMIN
|
|
MANAGER
|
|
AGENT
|
|
COLLABORATOR
|
|
CUSTOMER
|
|
}
|
|
|
|
enum TicketStatus {
|
|
NEW
|
|
OPEN
|
|
PENDING
|
|
ON_HOLD
|
|
RESOLVED
|
|
CLOSED
|
|
}
|
|
|
|
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 User {
|
|
id String @id @default(cuid())
|
|
tenantId String
|
|
name String
|
|
email String @unique
|
|
role UserRole
|
|
timezone String @default("America/Sao_Paulo")
|
|
avatarUrl String?
|
|
teams TeamMember[]
|
|
requestedTickets Ticket[] @relation("TicketRequester")
|
|
assignedTickets Ticket[] @relation("TicketAssignee")
|
|
comments TicketComment[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([tenantId, role])
|
|
}
|
|
|
|
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(autoincrement())
|
|
subject String
|
|
summary String?
|
|
status TicketStatus @default(NEW)
|
|
priority TicketPriority @default(MEDIUM)
|
|
channel TicketChannel @default(EMAIL)
|
|
queueId String?
|
|
requesterId String
|
|
assigneeId String?
|
|
slaPolicyId 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])
|
|
events TicketEvent[]
|
|
comments TicketComment[]
|
|
|
|
@@index([tenantId, status])
|
|
@@index([tenantId, queueId])
|
|
@@index([tenantId, assigneeId])
|
|
}
|
|
|
|
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])
|
|
}
|