generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } enum TeamRole { OWNER MEMBER } enum MessageDirection { IN OUT } enum MessageChannel { TELEGRAM WHATSAPP INSTAGRAM PHONE EMAIL INTERNAL } enum ChatRole { USER ASSISTANT SYSTEM } model Team { id String @id @default(cuid()) name String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt members TeamMember[] contacts Contact[] calendarEvents CalendarEvent[] conversations ChatConversation[] chatMessages ChatMessage[] } model User { id String @id @default(cuid()) email String @unique name String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt memberships TeamMember[] conversations ChatConversation[] @relation("ConversationCreator") chatMessages ChatMessage[] @relation("ChatAuthor") } model TeamMember { id String @id @default(cuid()) teamId String userId String role TeamRole @default(MEMBER) createdAt DateTime @default(now()) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([teamId, userId]) @@index([userId]) } model Contact { id String @id @default(cuid()) teamId String name String company String? email String? phone String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) note ContactNote? messages ContactMessage[] events CalendarEvent[] @@index([teamId, updatedAt]) } model ContactNote { id String @id @default(cuid()) contactId String @unique content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt contact Contact @relation(fields: [contactId], references: [id], onDelete: Cascade) } model ContactMessage { id String @id @default(cuid()) contactId String direction MessageDirection channel MessageChannel content String occurredAt DateTime @default(now()) createdAt DateTime @default(now()) contact Contact @relation(fields: [contactId], references: [id], onDelete: Cascade) @@index([contactId, occurredAt]) } model CalendarEvent { id String @id @default(cuid()) teamId String contactId String? title String startsAt DateTime endsAt DateTime? note String? status String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) contact Contact? @relation(fields: [contactId], references: [id], onDelete: SetNull) @@index([startsAt]) @@index([contactId, startsAt]) @@index([teamId, startsAt]) } model ChatConversation { id String @id @default(cuid()) teamId String createdByUserId String title String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) createdByUser User @relation("ConversationCreator", fields: [createdByUserId], references: [id], onDelete: Cascade) messages ChatMessage[] @@index([teamId, updatedAt]) @@index([createdByUserId]) } model ChatMessage { id String @id @default(cuid()) teamId String conversationId String authorUserId String? role ChatRole text String planJson Json? createdAt DateTime @default(now()) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) conversation ChatConversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) authorUser User? @relation("ChatAuthor", fields: [authorUserId], references: [id], onDelete: SetNull) @@index([createdAt]) @@index([teamId, createdAt]) @@index([conversationId, createdAt]) }