feat: scaffold tickets experience
This commit is contained in:
commit
2230590e57
79 changed files with 16055 additions and 0 deletions
179
web/prisma/schema.prisma
Normal file
179
web/prisma/schema.prisma
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
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])
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue