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]) }