T.ME/BIBIL_0DAY
CasperSecurity


Server : Apache/2
System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64
User : gositeme ( 1004)
PHP Version : 8.2.29
Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Directory :  /home/gositeme/domains/lavocat.quebec/public_html/prisma/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/lavocat.quebec/public_html/prisma/schema.prisma.backup
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model User {
  id                       String                     @id @default(cuid())
  email                    String                     @unique
  name                     String?
  password                 String
  role                     String                     @default("USER")
  createdAt                DateTime                   @default(now())
  updatedAt                DateTime                   @updatedAt
  resetPasswordToken       String?
  resetPasswordTokenExpiry DateTime?
  reminders                String?
  username                 String?                    @unique
  profilePicture           String?
  bio                      String?
  title                    String?
  specialization           String?
  barNumber                String?
  yearsOfExperience        Int?
  education                String?
  certifications           String?
  officeLocation           String?
  workPhone                String?
  linkedinUrl              String?
  websiteUrl               String?
  availability             String?
  timezone                 String?
  pronouns                 String?
  isProfilePublic          Boolean                    @default(false)
  lastActive               DateTime?
  hourlyRate               Float?
  proBono                  Boolean                    @default(false)
  boldnessRating           Float?
  transparencyRating       Float?
  winRate                  Float?
  totalCases               Int                        @default(0)
  wonCases                 Int                        @default(0)
  lostCases                Int                        @default(0)
  averageRating            Float?
  isVerified               Boolean                    @default(false)
  xpPoints                 Int                        @default(0)
  level                    Int                        @default(1)
  currentStreak            Int                        @default(0)
  totalBadges              Int                        @default(0)
  reviewsWritten           Int                        @default(0)
  forumPosts               Int                        @default(0)
  helpedOthers             Int                        @default(0)
  observationHours         Float                      @default(0)
  reformProposals          Int                        @default(0)
  wisdomScore              Float                      @default(0)
  civicEngagement          Float                      @default(0)
  accountBalance           Float                      @default(0.0)
  isPaymentVerified        Boolean                    @default(false)
  donationTotal            Float                      @default(0.0)
  subscriptionTier         String?
  subscriptionExpiry       DateTime?
  theme                    String                     @default("light")
  gender                   String?
  phone                    String?
  address                  String?
  emergencyContact         String?
  emergencyPhone           String?
  dateOfBirth              DateTime?
  occupation               String?
  language                 String                     @default("en")
  notifications            Boolean                    @default(true)
  lawFirmId                String?
  isActive                 Boolean                    @default(true)
  status                   String                     @default("ACTIVE")
  experience               Int?
  rating                   Float?
  profile                  UserProfile?
  businessProfiles         BusinessProfile?
  chatParticipants         ChatParticipant[]
  createdChatRooms         ChatRoom[]                 @relation("CreatedChatRooms")
  sentDirectMessages       DirectMessage[]            @relation("SentDirectMessages")
  receivedDirectMessages   DirectMessage[]            @relation("ReceivedDirectMessages")
  documents                Document[]                 @relation("UserDocuments")
  messages                 Message[]
  MessageReaction          MessageReaction[]
  adminChats               PrivateChat[]              @relation("AdminChats")
  privateChats             PrivateChat[]
  privateMessages          PrivateMessage[]
  createdRegistrations     Registration[]             @relation("CreatedRegistrations")
  registrations            Registration[]
  sessions                 Session[]
  themeProfiles            ThemeProfile[]
  analyticsEvents          AnalyticsTracking[]
  automationRules          AutomationRule[]
  menteeships              BrotherhoodMentorship[]    @relation("Menteeships")
  mentorships              BrotherhoodMentorship[]    @relation("Mentorships")
  lawyerEvents             CalendarEvent[]            @relation("LawyerEvents")
  clientEvents             CalendarEvent[]            @relation("ClientEvents")
  campaigns                Campaign[]
  assignedCases            CaseAssignment[]           @relation("AssignedCases")
  caseAssignments          CaseAssignment[]
  receivedOffers           CaseOffer[]                @relation("OfferReceiver")
  caseOffers               CaseOffer[]
  supportedCases           CaseSupport[]
  caseUpdates              CaseUpdate[]
  lawyerRelationships      ClientLawyerRelationship[] @relation("LawyerRelationships")
  clientRelationships      ClientLawyerRelationship[] @relation("ClientRelationships")
  clientPortal             ClientPortal?
  lawyerTestimonials       ClientTestimonial[]        @relation("LawyerTestimonials")
  clientTestimonials       ClientTestimonial[]        @relation("ClientTestimonials")
  clientConsultations      ConsultationBooking[]      @relation("ClientConsultations")
  lawyerConsultations      ConsultationBooking[]      @relation("LawyerConsultations")
  courseEnrollments        CourseEnrollment[]
  assignedDocuments        DocumentCollaboration[]    @relation("AssignedDocuments")
  createdDocuments         DocumentCollaboration[]    @relation("CreatedDocuments")
  donations                Donation[]
  emailTemplates           EmailTemplate[]
  lawyerEscrows            EscrowAccount[]            @relation("LawyerEscrows")
  clientEscrows            EscrowAccount[]            @relation("ClientEscrows")
  approvedReleases         EscrowRelease[]            @relation("ApprovedReleases")
  financialSummary         FinancialSummary?          @relation("FinancialSummary")
  impersonatedSessions     ImpersonationSession[]     @relation("ImpersonatedUser")
  originalImpersonations   ImpersonationSession[]     @relation("OriginalUser")
  givenRatings             LawyerRating[]             @relation("RatingUser")
  lawyerRatings            LawyerRating[]             @relation("RatedLawyer")
  lawyerStats              LawyerStats?
  casesCreated             LegalCase[]                @relation("CaseCreator")
  casesAsLead              LegalCase[]                @relation("LeadLawyer")
  lodgeMemberships         LodgeMembership[]          @relation("LodgeMemberships")
  menteeSessions           MentorSession[]            @relation("Mentee")
  mentoringSessions        MentorSession[]            @relation("Mentor")
  userNotifications        Notification[]
  approvedRefunds          PaymentRefund[]            @relation("ApprovedRefunds")
  requestedRefunds         PaymentRefund[]            @relation("RequestedRefunds")
  payments                 Payment[]
  segments                 Segment[]
  statusNotes              StatusNote[]
  createdTasks             Task[]                     @relation("CreatedTasks")
  assignedTasks            Task[]                     @relation("AssignedTasks")
  transactions             Transaction[]              @relation("UserTransactions")
  TypingStatus             TypingStatus[]
  achievements             UserAchievement[]
  badges                   UserBadge[]
  degrees                  UserDegree[]
  subscriptions            UserSubscription[]
  lawFirm                  LawFirm?                   @relation("FirmLawyers", fields: [lawFirmId], references: [id])
  createdDocumentVersions  DocumentVersion[]            @relation("CreatedDocumentVersions")
  documentComments         DocumentComment[]            @relation("DocumentComments")
  grantedDocumentPermissions DocumentPermission[]       @relation("PermissionGrantedBy")
  receivedDocumentPermissions DocumentPermission[]       @relation("PermissionUser")
  createdEvents            CalendarEvent[]             @relation("CreatedEvents")
  offerClients             CaseOffer[]                 @relation("OfferClient")
  lawyerRetainers          RetainerAgreement[]         @relation("LawyerRetainers")
  clientRetainers          RetainerAgreement[]         @relation("ClientRetainers")
  caseClients              LegalCase[]                 @relation("CaseClient")
  primaryLawyerCases       LegalCase[]                 @relation("PrimaryLawyer")
  assistantLawyerCases     LegalCase[]                 @relation("AssistantLawyer")
  secretaryCases           LegalCase[]                 @relation("Secretary")
  escrowAccount           EscrowAccount?
  ratings                 LawyerRating[]
  userLegalCases          User[]                      @relation("UserLegalCases")

  @@map("users")
}

model UserProfile {
  id           String   @id @default(cuid())
  userId       String   @unique
  availability String?
  workingHours String?
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Permission {
  id         String   @id @default(cuid())
  role       String
  resource   String
  action     String
  conditions String?
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt

  @@unique([role, resource, action])
  @@map("permissions")
}

model CaseAssignment {
  id             String       @id @default(cuid())
  registrationId String
  userId         String
  role           String
  assignedAt     DateTime     @default(now())
  assignedBy     String
  isActive       Boolean      @default(true)
  caseId         String?
  assignedByUser User         @relation("AssignedCases", fields: [assignedBy], references: [id])
  user           User         @relation(fields: [userId], references: [id])
  registration   Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
  legalCase      LegalCase?   @relation(fields: [caseId], references: [id])

  @@unique([registrationId, userId])
  @@map("case_assignments")
}

model Registration {
  id                     String           @id @default(cuid())
  firstName              String
  lastName               String
  email                  String
  phone                  String
  birthDate              DateTime
  gender                 String?
  relationship           String
  preferredLanguage      String
  preferredContactMethod String
  message                String?
  additionalNotes        String?
  lawyerName             String?
  lawyerEmail            String?
  lawyerPhone            String?
  lawFirm                String?
  status                 String           @default("PENDING")
  createdAt              DateTime         @default(now())
  updatedAt              DateTime         @updatedAt
  userId                 String?
  createdBy              String?
  reminders              String?          @default("[]")
  previousLegalActions   String?
  reasonForJoining       String?
  howDidYouHearAboutUs   String?
  representation         String?
  urgentNeeds            String?
  caseId                 String?
  address                Address?
  detaineeInfo           DetaineeInfo?
  documents              Document[]
  privateChat            PrivateChat?
  creator                User?            @relation("CreatedRegistrations", fields: [createdBy], references: [id])
  user                   User?            @relation(fields: [userId], references: [id])
  legalCase              LegalCase?       @relation(fields: [caseId], references: [id])
  caseAssignments        CaseAssignment[]
  statusNotes            StatusNote[]
}

model Address {
  id             String       @id @default(cuid())
  street         String
  city           String
  state          String
  postalCode     String
  country        String
  registrationId String       @unique
  registration   Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
}

model DetaineeInfo {
  id                  String       @id @default(cuid())
  name                String
  facility            String
  inmateId            String
  incarcerationDate   DateTime
  expectedReleaseDate DateTime?
  registrationId      String       @unique
  registration        Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
}

model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime

  @@unique([identifier, token])
}

model FileUpload {
  id             String   @id @default(uuid())
  originalName   String
  storedName     String
  mimeType       String
  size           Int
  path           String
  registrationId String?
  createdAt      DateTime @default(now())
  updatedAt      DateTime @updatedAt
}

model Document {
  id             String       @id @default(cuid())
  name           String
  title          String?
  type           String
  url            String
  filePath       String?
  fileSize       Int?
  uploadedBy     String?
  caseId         String?
  status         String?
  createdAt      DateTime     @default(now())
  updatedAt      DateTime     @updatedAt
  registrationId String
  userId         String
  user           User         @relation("UserDocuments", fields: [userId], references: [id])
  registration   Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
  versions       DocumentVersion[]
  comments       DocumentComment[]
  permissions    DocumentPermission[]
}

model DocumentVersion {
  id          String   @id @default(cuid())
  documentId  String
  version     Int
  content     String
  createdAt   DateTime @default(now())
  createdById String
  document    Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
  createdBy   User     @relation("CreatedDocumentVersions", fields: [createdById], references: [id])

  @@unique([documentId, version])
}

model DocumentComment {
  id          String   @id @default(cuid())
  documentId  String
  userId      String
  content     String
  createdAt   DateTime @default(now())
  document    Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
  user        User     @relation("DocumentComments", fields: [userId], references: [id])
}

model DocumentPermission {
  id          String   @id @default(cuid())
  documentId  String
  userId      String
  canEdit     Boolean  @default(false)
  canComment  Boolean  @default(false)
  canView     Boolean  @default(true)
  grantedById String
  createdAt   DateTime @default(now())
  document    Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
  user        User     @relation("PermissionUser", fields: [userId], references: [id])
  grantedBy   User     @relation("PermissionGrantedBy", fields: [grantedById], references: [id])

  @@unique([documentId, userId])
}

model ThemeProfile {
  id        String   @id @default(cuid())
  name      String
  colors    String
  createdAt DateTime @default(now())
  userId    String
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model ChatRoom {
  id             String            @id @default(cuid())
  name           String            @unique
  description    String?
  isPublic       Boolean           @default(true)
  type           String            @default("GROUP")
  createdById    String
  createdAt      DateTime          @default(now())
  updatedAt      DateTime          @updatedAt
  participants   ChatParticipant[]
  createdBy      User              @relation("CreatedChatRooms", fields: [createdById], references: [id])
  messages       Message[]
  typingStatuses TypingStatus[]
}

model ChatParticipant {
  id         String   @id @default(cuid())
  userId     String
  chatRoomId String
  role       String   @default("MEMBER")
  joinedAt   DateTime @default(now())
  chatRoom   ChatRoom @relation(fields: [chatRoomId], references: [id], onDelete: Cascade)
  user       User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([userId, chatRoomId])
}

model Message {
  id         String            @id @default(cuid())
  content    String
  type       String            @default("TEXT")
  fileUrl    String?
  fileName   String?
  fileSize   Int?
  mimeType   String?
  editedAt   DateTime?
  isEdited   Boolean           @default(false)
  replyToId  String?
  createdAt  DateTime          @default(now())
  updatedAt  DateTime          @updatedAt
  userId     String
  chatRoomId String
  replyTo    Message?          @relation("MessageReplies", fields: [replyToId], references: [id])
  replies    Message[]         @relation("MessageReplies")
  user       User              @relation(fields: [userId], references: [id], onDelete: Cascade)
  chatRoom   ChatRoom          @relation(fields: [chatRoomId], references: [id], onDelete: Cascade)
  reactions  MessageReaction[]
}

model PrivateChat {
  id             String           @id @default(cuid())
  registrationId String           @unique
  userId         String
  adminId        String?
  createdAt      DateTime         @default(now())
  updatedAt      DateTime         @updatedAt
  admin          User?            @relation("AdminChats", fields: [adminId], references: [id])
  user           User             @relation(fields: [userId], references: [id], onDelete: Cascade)
  registration   Registration     @relation(fields: [registrationId], references: [id], onDelete: Cascade)
  messages       PrivateMessage[]
}

model PrivateMessage {
  id            String      @id @default(cuid())
  content       String
  type          String      @default("TEXT")
  fileUrl       String?
  fileName      String?
  fileSize      Int?
  mimeType      String?
  createdAt     DateTime    @default(now())
  updatedAt     DateTime    @updatedAt
  senderId      String
  privateChatId String
  privateChat   PrivateChat @relation(fields: [privateChatId], references: [id], onDelete: Cascade)
  sender        User        @relation(fields: [senderId], references: [id], onDelete: Cascade)
}

model DirectMessage {
  id          String   @id @default(cuid())
  content     String
  type        String   @default("TEXT")
  fileUrl     String?
  fileName    String?
  fileSize    Int?
  mimeType    String?
  isRead      Boolean  @default(false)
  caseId      String?
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  senderId    String
  recipientId String
  sender      User     @relation("SentDirectMessages", fields: [senderId], references: [id], onDelete: Cascade)
  recipient   User     @relation("ReceivedDirectMessages", fields: [recipientId], references: [id], onDelete: Cascade)
}

model StatusNote {
  id             String       @id @default(cuid())
  content        String
  registrationId String
  adminId        String
  createdAt      DateTime     @default(now())
  updatedAt      DateTime     @updatedAt
  admin          User         @relation(fields: [adminId], references: [id])
  registration   Registration @relation(fields: [registrationId], references: [id])

  @@map("status_notes")
}

model TypingStatus {
  id         String   @id @default(cuid())
  userId     String
  chatRoomId String
  isTyping   Boolean  @default(false)
  updatedAt  DateTime @updatedAt
  chatRoom   ChatRoom @relation(fields: [chatRoomId], references: [id])
  user       User     @relation(fields: [userId], references: [id])

  @@unique([userId, chatRoomId])
  @@map("typing_statuses")
}

model MessageReaction {
  id        String   @id @default(cuid())
  messageId String
  userId    String
  emoji     String
  createdAt DateTime @default(now())
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  message   Message  @relation(fields: [messageId], references: [id], onDelete: Cascade)

  @@unique([messageId, userId, emoji])
}

model NewsletterSubscription {
  id               String          @id @default(cuid())
  email            String          @unique
  language         String          @default("en")
  source           String          @default("website")
  subscriptionDate DateTime        @default(now())
  isActive         Boolean         @default(true)
  confirmedAt      DateTime?
  unsubscribedAt   DateTime?
  tags             String?
  metadata         String?
  createdAt        DateTime        @default(now())
  updatedAt        DateTime        @updatedAt
  campaignEvents   CampaignEvent[]
  segmentMembers   SegmentMember[]

  @@map("newsletter_subscriptions")
}

model EmailTemplate {
  id          String     @id @default(cuid())
  name        String
  subject     String
  htmlContent String
  textContent String?
  thumbnail   String?
  category    String     @default("general")
  isActive    Boolean    @default(true)
  createdBy   String
  createdAt   DateTime   @default(now())
  updatedAt   DateTime   @updatedAt
  campaigns   Campaign[]
  creator     User       @relation(fields: [createdBy], references: [id])

  @@map("email_templates")
}

model Campaign {
  id                String            @id @default(cuid())
  name              String
  subject           String
  templateId        String?
  htmlContent       String?
  textContent       String?
  status            String            @default("draft")
  targetLanguage    String?
  targetTags        String?
  segmentId         String?
  scheduledAt       DateTime?
  sentAt            DateTime?
  createdBy         String
  createdAt         DateTime          @default(now())
  updatedAt         DateTime          @updatedAt
  isAbTest          Boolean           @default(false)
  abTestPercent     Int?
  abTestWinner      String?
  totalSent         Int               @default(0)
  totalOpened       Int               @default(0)
  totalClicked      Int               @default(0)
  totalBounced      Int               @default(0)
  totalUnsubscribed Int               @default(0)
  events            CampaignEvent[]
  abVariants        CampaignVariant[]
  creator           User              @relation(fields: [createdBy], references: [id])
  segment           Segment?          @relation(fields: [segmentId], references: [id])
  template          EmailTemplate?    @relation(fields: [templateId], references: [id])

  @@map("campaigns")
}

model CampaignVariant {
  id          String   @id @default(cuid())
  campaignId  String
  variant     String
  subject     String
  htmlContent String
  textContent String?
  sentCount   Int      @default(0)
  openCount   Int      @default(0)
  clickCount  Int      @default(0)
  campaign    Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade)

  @@map("campaign_variants")
}

model CampaignEvent {
  id             String                 @id @default(cuid())
  campaignId     String
  subscriptionId String
  eventType      String
  eventData      String?
  userAgent      String?
  ipAddress      String?
  createdAt      DateTime               @default(now())
  subscription   NewsletterSubscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
  campaign       Campaign               @relation(fields: [campaignId], references: [id], onDelete: Cascade)

  @@map("campaign_events")
}

model Segment {
  id          String          @id @default(cuid())
  name        String
  description String?
  conditions  String
  isActive    Boolean         @default(true)
  createdBy   String
  createdAt   DateTime        @default(now())
  updatedAt   DateTime        @updatedAt
  campaigns   Campaign[]
  members     SegmentMember[]
  creator     User            @relation(fields: [createdBy], references: [id])

  @@map("segments")
}

model SegmentMember {
  id             String                 @id @default(cuid())
  segmentId      String
  subscriptionId String
  addedAt        DateTime               @default(now())
  subscription   NewsletterSubscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
  segment        Segment                @relation(fields: [segmentId], references: [id], onDelete: Cascade)

  @@unique([segmentId, subscriptionId])
  @@map("segment_members")
}

model AutomationRule {
  id          String   @id @default(cuid())
  name        String
  description String?
  triggerType String
  conditions  String
  actions     String
  isActive    Boolean  @default(true)
  createdBy   String
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  creator     User     @relation(fields: [createdBy], references: [id])

  @@map("automation_rules")
}

model ImpersonationSession {
  id                 String    @id @default(cuid())
  originalUserId     String
  impersonatedUserId String
  createdAt          DateTime  @default(now())
  endedAt            DateTime?
  isActive           Boolean   @default(true)
  reason             String?
  ipAddress          String?
  userAgent          String?
  impersonatedUser   User      @relation("ImpersonatedUser", fields: [impersonatedUserId], references: [id], onDelete: Cascade)
  originalUser       User      @relation("OriginalUser", fields: [originalUserId], references: [id], onDelete: Cascade)

  @@unique([originalUserId, isActive])
  @@map("impersonation_sessions")
}

model LegalCase {
  id                      String                     @id @default(cuid())
  title                   String
  description             String
  caseNumber              String?                    @unique
  caseType                String
  status                  String                     @default("active")
  jurisdiction            String
  court                   String?
  priority                String                     @default("medium")
  budget                  Float?
  expectedDuration        Int?
  filingDate              DateTime?
  applicationDeadline     DateTime?
  isAcceptingApplications Boolean                    @default(true)
  isPublic                Boolean                    @default(false)
  category                String?
  legalArea               String?
  urgencyLevel            String                     @default("NORMAL")
  viewCount               Int                        @default(0)
  supporterCount          Int                        @default(0)
  estimatedValue          Float?
  actualValue             Float?
  startDate               DateTime?
  expectedEndDate         DateTime?
  actualEndDate           DateTime?
  riskLevel               String                     @default("MEDIUM")
  publicSummary           String?
  tags                    String?
  requiredDocuments       String?
  eligibilityCriteria     String?
  firmName                String?
  clientId                String?
  primaryLawyerId         String?
  assistantLawyerId       String?
  secretaryId             String?
  createdAt               DateTime                   @default(now())
  updatedAt               DateTime                   @updatedAt
  leadLawyerId            String
  createdBy               String
  registrations           Registration[]
  analyticsEvents         AnalyticsTracking[]
  calendarEvents          CalendarEvent[]
  caseAssignments         CaseAssignment[]
  offers                  CaseOffer[]
  supporters              CaseSupport[]
  caseUpdates             CaseUpdate[]
  clientRelationships     ClientLawyerRelationship[]
  clientPortals           ClientPortal[]
  testimonials            ClientTestimonial[]
  documentCollaborations  DocumentCollaboration[]
  escrowAccount           EscrowAccount?
  ratings                 LawyerRating[]
  documents               Document[]
  directMessages          DirectMessage[]
  userLegalCases          User[]                      @relation("UserLegalCases")
  creator                 User                       @relation("CaseCreator", fields: [createdBy], references: [id])
  leadLawyer              User                       @relation("LeadLawyer", fields: [leadLawyerId], references: [id])
  primaryLawyer           User?                      @relation("PrimaryLawyer", fields: [primaryLawyerId], references: [id])
  assistantLawyer         User?                      @relation("AssistantLawyer", fields: [assistantLawyerId], references: [id])
  secretary               User?                      @relation("Secretary", fields: [secretaryId], references: [id])
  client                  User?                      @relation("CaseClient", fields: [clientId], references: [id])
  payments                Payment[]
  tasks                   Task[]

  @@map("legal_cases")
}

model CaseUpdate {
  id          String    @id @default(cuid())
  caseId      String
  title       String
  description String
  updateType  String
  isPublic    Boolean   @default(false)
  createdAt   DateTime  @default(now())
  createdBy   String
  author      User      @relation(fields: [createdBy], references: [id])
  case        LegalCase @relation(fields: [caseId], references: [id], onDelete: Cascade)

  @@map("case_updates")
}

model LawFirm {
  id              String    @id @default(cuid())
  name            String    @unique
  shortName       String?
  address         String
  city            String
  province        String
  postalCode      String
  phone           String?
  email           String?
  website         String?
  barRegistration String?
  foundedYear     Int?
  specializations String?
  partnershipType String    @default("partner")
  contractStart   DateTime  @default(now())
  contractEnd     DateTime?
  isActive        Boolean   @default(true)
  createdAt       DateTime  @default(now())
  updatedAt       DateTime  @updatedAt
  lawyers         User[]    @relation("FirmLawyers")

  @@map("law_firms")
}

model LawyerRating {
  id                 String     @id @default(cuid())
  lawyerId           String
  userId             String
  caseId             String?
  boldnessScore      Int
  transparencyScore  Int
  communicationScore Int
  resultsScore       Int
  overallScore       Float
  review             String?
  isPublic           Boolean    @default(true)
  createdAt          DateTime   @default(now())
  updatedAt          DateTime   @updatedAt
  case               LegalCase? @relation(fields: [caseId], references: [id])
  rater              User       @relation("RatingUser", fields: [userId], references: [id])
  lawyer             User       @relation("RatedLawyer", fields: [lawyerId], references: [id])

  @@unique([lawyerId, userId, caseId])
  @@map("lawyer_ratings")
}

model CaseOffer {
  id                 String    @id @default(cuid())
  caseId             String
  lawyerId           String
  receiverId         String
  clientId           String?
  offerType          String
  message            String?
  proposedRate       Float?
  estimatedHours     Int?
  status             String    @default("PENDING")
  expiresAt          DateTime?
  collaborationType  String?
  feeSplit           String?
  createdAt          DateTime  @default(now())
  updatedAt          DateTime  @updatedAt
  receiver           User      @relation("OfferReceiver", fields: [receiverId], references: [id])
  lawyer             User      @relation(fields: [lawyerId], references: [id])
  client             User?     @relation("OfferClient", fields: [clientId], references: [id])
  case               LegalCase @relation(fields: [caseId], references: [id])

  @@map("case_offers")
}

model Badge {
  id           String      @id @default(cuid())
  name         String      @unique
  description  String
  icon         String
  category     String
  requirements String
  xpReward     Int         @default(0)
  rarity       String      @default("COMMON")
  isActive     Boolean     @default(true)
  createdAt    DateTime    @default(now())
  userBadges   UserBadge[]

  @@map("badges")
}

model UserBadge {
  id        String   @id @default(cuid())
  userId    String
  badgeId   String
  earnedAt  DateTime @default(now())
  isVisible Boolean  @default(true)
  badge     Badge    @relation(fields: [badgeId], references: [id])
  user      User     @relation(fields: [userId], references: [id])

  @@unique([userId, badgeId])
  @@map("user_badges")
}

model Achievement {
  id               String            @id @default(cuid())
  name             String            @unique
  description      String
  type             String
  target           Int
  xpReward         Int               @default(0)
  badgeReward      String?
  isRepeatable     Boolean           @default(false)
  isActive         Boolean           @default(true)
  createdAt        DateTime          @default(now())
  userAchievements UserAchievement[]

  @@map("achievements")
}

model UserAchievement {
  id              String      @id @default(cuid())
  userId          String
  achievementId   String
  currentProgress Int         @default(0)
  isCompleted     Boolean     @default(false)
  completedAt     DateTime?
  lastUpdated     DateTime    @default(now())
  achievement     Achievement @relation(fields: [achievementId], references: [id])
  user            User        @relation(fields: [userId], references: [id])

  @@unique([userId, achievementId])
  @@map("user_achievements")
}

model BusinessProfile {
  id                 String    @id @default(cuid())
  userId             String    @unique
  businessName       String
  businessType       String
  industry           String?
  description        String?
  logo               String?
  website            String?
  phone              String?
  email              String?
  address            String?
  registrationNumber String?
  taxId              String?
  employeeCount      String?
  annualRevenue      String?
  isPublic           Boolean   @default(false)
  isVerified         Boolean   @default(false)
  createdAt          DateTime  @default(now())
  updatedAt          DateTime  @updatedAt
  verificationStatus String    @default("PENDING")
  verificationNote   String?
  verifiedAt         DateTime?
  user               User      @relation(fields: [userId], references: [id])
}

model Donation {
  id            String   @id @default(cuid())
  userId        String?
  amount        Float
  currency      String   @default("CAD")
  type          String
  targetId      String?
  message       String?
  isAnonymous   Boolean  @default(false)
  paymentMethod String
  paymentId     String?
  status        String   @default("PENDING")
  createdAt     DateTime @default(now())
  user          User?    @relation(fields: [userId], references: [id])

  @@map("donations")
}

model Payment {
  id                    String          @id @default(cuid())
  userId                String
  amount                Float
  currency              String          @default("CAD")
  type                  String
  description           String?
  paymentMethod         String
  stripePaymentIntentId String?         @unique
  stripeChargeId        String?         @unique
  stripeFeeAmount       Float?
  status                String          @default("PENDING")
  failureReason         String?
  caseId                String?
  escrowId              String?
  societyDiscount       Float           @default(0.0)
  xpEarned              Int             @default(0)
  platformFeeAmount     Float           @default(0.0)
  lawyerPayoutAmount    Float           @default(0.0)
  refundAmount          Float           @default(0.0)
  metadata              String?
  paymentDate           DateTime?
  createdAt             DateTime        @default(now())
  updatedAt             DateTime        @updatedAt
  refunds               PaymentRefund[]
  escrow                EscrowAccount?  @relation(fields: [escrowId], references: [id])
  case                  LegalCase?      @relation(fields: [caseId], references: [id])
  user                  User            @relation(fields: [userId], references: [id])
  transactions          Transaction[]

  @@map("payments")
}

model EscrowAccount {
  id                 String          @id @default(cuid())
  caseId             String          @unique
  clientId           String
  lawyerId           String
  totalAmount        Float
  availableAmount    Float
  heldAmount         Float           @default(0.0)
  releasedAmount     Float           @default(0.0)
  milestoneReleases  String?
  autoReleaseDate    DateTime?
  status             String          @default("ACTIVE")
  disputeReason      String?
  societyFeeDiscount Float           @default(0.0)
  createdAt          DateTime        @default(now())
  updatedAt          DateTime        @updatedAt
  lawyer             User            @relation("LawyerEscrows", fields: [lawyerId], references: [id])
  client             User            @relation("ClientEscrows", fields: [clientId], references: [id])
  case               LegalCase       @relation(fields: [caseId], references: [id])
  releases           EscrowRelease[]
  payments           Payment[]

  @@map("escrow_accounts")
}

model EscrowRelease {
  id                   String        @id @default(cuid())
  escrowId             String
  amount               Float
  releaseType          String
  reason               String
  approvedBy           String?
  milestoneDescription String?
  milestoneNumber      Int?
  status               String        @default("PENDING")
  releasedAt           DateTime?
  createdAt            DateTime      @default(now())
  approver             User?         @relation("ApprovedReleases", fields: [approvedBy], references: [id])
  escrow               EscrowAccount @relation(fields: [escrowId], references: [id])

  @@map("escrow_releases")
}

model Transaction {
  id              String   @id @default(cuid())
  paymentId       String?
  userId          String
  type            String
  amount          Float
  currency        String   @default("CAD")
  direction       String
  balanceBefore   Float    @default(0.0)
  balanceAfter    Float    @default(0.0)
  referenceId     String?
  referenceType   String?
  description     String
  metadata        String?
  transactionDate DateTime @default(now())
  createdAt       DateTime @default(now())
  user            User     @relation("UserTransactions", fields: [userId], references: [id])
  payment         Payment? @relation(fields: [paymentId], references: [id])

  @@map("transactions")
}

model PaymentRefund {
  id             String    @id @default(cuid())
  paymentId      String
  amount         Float
  reason         String
  stripeRefundId String?   @unique
  status         String    @default("PENDING")
  processedAt    DateTime?
  requestedBy    String
  approvedBy     String?
  metadata       String?
  createdAt      DateTime  @default(now())
  approver       User?     @relation("ApprovedRefunds", fields: [approvedBy], references: [id])
  requester      User      @relation("RequestedRefunds", fields: [requestedBy], references: [id])
  payment        Payment   @relation(fields: [paymentId], references: [id])

  @@map("payment_refunds")
}

model SocietyPricingTier {
  id                  String   @id @default(cuid())
  name                String   @unique
  track               String
  minDegreeNumber     Int
  minXP               Int      @default(0)
  minLevel            Int      @default(1)
  platformFeeDiscount Float    @default(0.0)
  prioritySupport     Boolean  @default(false)
  advancedFeatures    String?
  customBranding      Boolean  @default(false)
  baseCommissionRate  Float    @default(0.10)
  discountedRate      Float?
  description         String?
  benefits            String?
  isActive            Boolean  @default(true)
  createdAt           DateTime @default(now())

  @@map("society_pricing_tiers")
}

model FinancialSummary {
  id                    String   @id @default(cuid())
  userId                String   @unique
  totalEarnings         Float    @default(0.0)
  thisMonthEarnings     Float    @default(0.0)
  pendingPayouts        Float    @default(0.0)
  totalCaseFees         Float    @default(0.0)
  totalSpent            Float    @default(0.0)
  thisMonthSpent        Float    @default(0.0)
  escrowBalance         Float    @default(0.0)
  totalCommissionPaid   Float    @default(0.0)
  societyDiscountsSaved Float    @default(0.0)
  currentTier           String?
  nextTierProgress      Float    @default(0.0)
  paymentCount          Int      @default(0)
  refundCount           Int      @default(0)
  disputeCount          Int      @default(0)
  lastCalculated        DateTime @default(now())
  createdAt             DateTime @default(now())
  updatedAt             DateTime @updatedAt
  user                  User     @relation("FinancialSummary", fields: [userId], references: [id])

  @@map("financial_summaries")
}

model CourseEnrollment {
  id             String    @id @default(cuid())
  userId         String
  courseId       String
  enrollmentDate DateTime  @default(now())
  completionDate DateTime?
  status         String    @default("IN_PROGRESS")
  progress       Float     @default(0.0)
  certificateUrl String?
  course         Course    @relation(fields: [courseId], references: [id])
  user           User      @relation(fields: [userId], references: [id])

  @@unique([userId, courseId])
  @@map("course_enrollments")
}

model MentorSession {
  id          String   @id @default(cuid())
  mentorId    String
  menteeId    String
  sessionDate DateTime @default(now())
  duration    Int
  notes       String?
  status      String   @default("SCHEDULED")
  mentee      User     @relation("Mentee", fields: [menteeId], references: [id])
  mentor      User     @relation("Mentor", fields: [mentorId], references: [id])

  @@unique([mentorId, menteeId, sessionDate])
  @@map("mentor_sessions")
}

model Course {
  id            String             @id @default(cuid())
  title         String
  description   String
  category      String
  level         Int                @default(1)
  instructor    String?
  instructorId  String?
  duration      Int
  xpReward      Int                @default(0)
  badgeReward   String?
  prerequisites String?
  syllabus      String
  materials     String?
  isPublic      Boolean            @default(true)
  isActive      Boolean            @default(true)
  price         Float              @default(0.0)
  createdAt     DateTime           @default(now())
  updatedAt     DateTime           @updatedAt
  enrollments   CourseEnrollment[]

  @@map("courses")
}

model LawResource {
  id              String    @id @default(cuid())
  title           String
  type            String
  category        String
  description     String?
  author          String?
  publisher       String?
  publicationDate DateTime?
  isbn            String?
  url             String?
  coverImage      String?
  preview         String?
  fullContent     String?
  tags            String?
  difficultyLevel String    @default("BEGINNER")
  isPublic        Boolean   @default(true)
  isActive        Boolean   @default(true)
  viewCount       Int       @default(0)
  downloadCount   Int       @default(0)
  createdAt       DateTime  @default(now())
  updatedAt       DateTime  @updatedAt

  @@map("law_resources")
}

model SocietyDegree {
  id                 String                  @id @default(cuid())
  degreeNumber       Int
  name               String
  title              String?
  description        String
  requirements       String
  xpRequired         Int
  casesRequired      Int                     @default(0)
  winRateRequired    Float?
  clientsRequired    Int                     @default(0)
  proBonoRequired    Int                     @default(0)
  badgesRequired     String?
  coursesRequired    String?
  mentorshipRequired Int                     @default(0)
  track              String                  @default("LAWYER")
  trackSpecificReqs  String?
  ceremonialText     String?
  symbol             String?
  color              String?
  privileges         String?
  previousDegreeId   String?
  timeRequirement    Int?
  lodgeLevel         String                  @default("BLUE")
  isSecret           Boolean                 @default(false)
  maxMembers         Int?
  isActive           Boolean                 @default(true)
  createdAt          DateTime                @default(now())
  mentorships        BrotherhoodMentorship[] @relation("MentorshipDegrees")
  ceremonies         DegreeCeremony[]
  previousDegree     SocietyDegree?          @relation("DegreeProgression", fields: [previousDegreeId], references: [id])
  nextDegrees        SocietyDegree[]         @relation("DegreeProgression")
  userDegrees        UserDegree[]

  @@unique([degreeNumber, track])
  @@map("society_degrees")
}

model UserDegree {
  id                 String          @id @default(cuid())
  userId             String
  degreeId           String
  achievedAt         DateTime        @default(now())
  ceremonyCompleted  Boolean         @default(false)
  ceremonyDate       DateTime?
  presentedBy        String?
  witnessedBy        String?
  notes              String?
  progressPercentage Float           @default(0.0)
  isCurrentTarget    Boolean         @default(false)
  ceremony           DegreeCeremony?
  degree             SocietyDegree   @relation(fields: [degreeId], references: [id])
  user               User            @relation(fields: [userId], references: [id])

  @@unique([userId, degreeId])
  @@map("user_degrees")
}

model DegreeCeremony {
  id           String        @id @default(cuid())
  degreeId     String
  userDegreeId String        @unique
  ceremonyDate DateTime      @default(now())
  conductedBy  String
  witnesses    String?
  location     String?
  notes        String?
  isPublic     Boolean       @default(false)
  userDegree   UserDegree    @relation(fields: [userDegreeId], references: [id])
  degree       SocietyDegree @relation(fields: [degreeId], references: [id])

  @@map("degree_ceremonies")
}

model BrotherhoodMentorship {
  id                String              @id @default(cuid())
  mentorId          String
  menteeId          String
  degreeId          String?
  status            String              @default("ACTIVE")
  startDate         DateTime            @default(now())
  endDate           DateTime?
  sessionsCompleted Int                 @default(0)
  goalSessions      Int                 @default(5)
  progressNotes     String?
  wasSuccessful     Boolean?
  mentorRating      Int?
  menteeRating      Int?
  degree            SocietyDegree?      @relation("MentorshipDegrees", fields: [degreeId], references: [id])
  mentee            User                @relation("Menteeships", fields: [menteeId], references: [id])
  mentor            User                @relation("Mentorships", fields: [mentorId], references: [id])
  sessions          MentorshipSession[]

  @@unique([mentorId, menteeId, degreeId])
  @@map("brotherhood_mentorships")
}

model MentorshipSession {
  id             String                @id @default(cuid())
  mentorshipId   String
  sessionDate    DateTime              @default(now())
  duration       Int?
  topic          String
  objectives     String?
  outcomes       String?
  nextSteps      String?
  menteeProgress Int?
  mentorship     BrotherhoodMentorship @relation(fields: [mentorshipId], references: [id])

  @@map("mentorship_sessions")
}

model Lodge {
  id              String            @id @default(cuid())
  name            String            @unique
  description     String
  lodgeLevel      String
  track           String            @default("LAWYER")
  minimumDegree   Int
  maximumMembers  Int?
  currentMembers  Int               @default(0)
  isSecret        Boolean           @default(false)
  foundedDate     DateTime          @default(now())
  meetingSchedule String?
  meetingLocation String?
  memberships     LodgeMembership[]

  @@map("lodges")
}

model LodgeMembership {
  id            String   @id @default(cuid())
  userId        String
  lodgeId       String
  joinedDate    DateTime @default(now())
  role          String   @default("MEMBER")
  isActive      Boolean  @default(true)
  contributions Int      @default(0)
  lodge         Lodge    @relation(fields: [lodgeId], references: [id])
  user          User     @relation("LodgeMemberships", fields: [userId], references: [id])

  @@unique([userId, lodgeId])
  @@map("lodge_memberships")
}

model CaseSupport {
  id        String    @id @default(cuid())
  userId    String
  caseId    String
  createdAt DateTime  @default(now())
  case      LegalCase @relation(fields: [caseId], references: [id])
  user      User      @relation(fields: [userId], references: [id])

  @@unique([userId, caseId])
  @@map("case_supports")
}

model ClientLawyerRelationship {
  id                  String                  @id @default(cuid())
  clientId            String
  lawyerId            String
  caseId              String?
  relationshipType    String
  startDate           DateTime                @default(now())
  endDate             DateTime?
  isActive            Boolean                 @default(true)
  totalHoursWorked    Float?
  totalFeePaid        Float?
  feeStructure        String?
  caseStatus          String?
  outcomeDescription  String?
  settlementAmount    Float?
  clientSatisfaction  Int?
  wouldRecommend      Boolean?
  impactLevel         String?
  clientReview        String?
  lawyerNotes         String?
  publicTestimonial   String?
  isTestimonialPublic Boolean                 @default(false)
  createdAt           DateTime                @default(now())
  updatedAt           DateTime                @updatedAt
  case                LegalCase?              @relation(fields: [caseId], references: [id])
  lawyer              User                    @relation("LawyerRelationships", fields: [lawyerId], references: [id])
  client              User                    @relation("ClientRelationships", fields: [clientId], references: [id])
  testimonials        ClientTestimonial[]
  milestones          RelationshipMilestone[]

  @@map("client_lawyer_relationships")
}

model RelationshipMilestone {
  id             String                   @id @default(cuid())
  relationshipId String
  milestoneType  String
  title          String
  description    String?
  date           DateTime                 @default(now())
  amount         Float?
  isPublic       Boolean                  @default(false)
  relationship   ClientLawyerRelationship @relation(fields: [relationshipId], references: [id], onDelete: Cascade)

  @@map("relationship_milestones")
}

model LawyerStats {
  id                   String   @id @default(cuid())
  lawyerId             String   @unique
  totalClients         Int      @default(0)
  activeClients        Int      @default(0)
  casesWon             Int      @default(0)
  casesLost            Int      @default(0)
  casesSettled         Int      @default(0)
  casesDismissed       Int      @default(0)
  winRate              Float    @default(0.0)
  totalRevenue         Float    @default(0.0)
  averageHourlyRate    Float?
  totalProBonoHours    Float    @default(0.0)
  totalProBonoValue    Float    @default(0.0)
  averageSatisfaction  Float    @default(0.0)
  recommendationRate   Float    @default(0.0)
  totalTestimonials    Int      @default(0)
  lifeChangingCases    Int      @default(0)
  totalSettlementValue Float    @default(0.0)
  lastCalculated       DateTime @default(now())
  lawyer               User     @relation(fields: [lawyerId], references: [id])

  @@map("lawyer_stats")
}

model ClientTestimonial {
  id              String                    @id @default(cuid())
  clientId        String
  lawyerId        String
  relationshipId  String?
  caseId          String?
  title           String
  content         String
  beforeSituation String?
  afterSituation  String?
  category        String
  impactLevel     String
  isPublic        Boolean                   @default(false)
  isFeatured      Boolean                   @default(false)
  helpfulVotes    Int                       @default(0)
  views           Int                       @default(0)
  createdAt       DateTime                  @default(now())
  updatedAt       DateTime                  @updatedAt
  case            LegalCase?                @relation(fields: [caseId], references: [id])
  relationship    ClientLawyerRelationship? @relation(fields: [relationshipId], references: [id])
  lawyer          User                      @relation("LawyerTestimonials", fields: [lawyerId], references: [id])
  client          User                      @relation("ClientTestimonials", fields: [clientId], references: [id])

  @@map("client_testimonials")
}

model SubscriptionPlan {
  id                String             @id @default(cuid())
  name              String             @unique
  description       String
  price             Float
  currency          String             @default("CAD")
  billingCycle      String             @default("MONTHLY")
  features          String
  maxCases          Int                @default(10)
  maxUsers          Int                @default(10)
  maxTeamMembers    Int                @default(5)
  advancedAnalytics Boolean            @default(false)
  prioritySupport   Boolean            @default(false)
  customBranding    Boolean            @default(false)
  apiAccess         Boolean            @default(false)
  societyDiscount   Float              @default(0.0)
  xpMultiplier      Float              @default(1.0)
  isActive          Boolean            @default(true)
  sortOrder         Int                @default(0)
  createdAt         DateTime           @default(now())
  updatedAt         DateTime           @updatedAt
  subscriptions     UserSubscription[]

  @@map("subscription_plans")
}

model UserSubscription {
  id                   String           @id @default(cuid())
  userId               String
  planId               String
  status               String           @default("ACTIVE")
  currentPeriodStart   DateTime
  currentPeriodEnd     DateTime
  cancelAtPeriodEnd    Boolean          @default(false)
  stripeSubscriptionId String?          @unique
  stripeCustomerId     String?
  lastPaymentDate      DateTime?
  nextPaymentDate      DateTime?
  amountPaid           Float            @default(0.0)
  metadata             String?
  createdAt            DateTime         @default(now())
  updatedAt            DateTime         @updatedAt
  plan                 SubscriptionPlan @relation(fields: [planId], references: [id])
  user                 User             @relation(fields: [userId], references: [id])

  @@unique([userId, planId])
  @@map("user_subscriptions")
}

model ConsultationBooking {
  id               String    @id @default(cuid())
  lawyerId         String
  clientId         String
  preferredDate    DateTime
  preferredTime    String
  duration         Int       @default(60)
  consultationType String    @default("GENERAL")
  status           String    @default("PENDING")
  message          String?
  hourlyRate       Float?
  totalAmount      Float?
  meetingLink      String?
  meetingPlatform  String?
  notes            String?
  lawyerNotes      String?
  clientNotes      String?
  followUpDate     DateTime?
  followUpNotes    String?
  createdAt        DateTime  @default(now())
  updatedAt        DateTime  @updatedAt
  client           User      @relation("ClientConsultations", fields: [clientId], references: [id])
  lawyer           User      @relation("LawyerConsultations", fields: [lawyerId], references: [id])

  @@map("consultation_bookings")
}

model Task {
  id             String     @id @default(cuid())
  title          String
  description    String?
  caseId         String?
  assignedTo     String
  assignedBy     String
  priority       String     @default("MEDIUM")
  status         String     @default("PENDING")
  dueDate        DateTime?
  completedAt    DateTime?
  estimatedHours Float?
  actualHours    Float?
  tags           String?
  attachments    String?
  notes          String?
  createdAt      DateTime   @default(now())
  updatedAt      DateTime   @updatedAt
  case           LegalCase? @relation(fields: [caseId], references: [id])
  assignedByUser User       @relation("CreatedTasks", fields: [assignedBy], references: [id])
  assignedToUser User       @relation("AssignedTasks", fields: [assignedTo], references: [id])

  @@map("tasks")
}

model CalendarEvent {
  id                String     @id @default(cuid())
  title             String
  description       String?
  eventType         String
  date              DateTime
  startTime         String?
  endTime           String?
  duration          Int?
  priority          String     @default("MEDIUM")
  caseId            String?
  clientId          String?
  lawyerId          String
  location          String?
  isVirtual         Boolean    @default(false)
  meetingLink       String?
  courtJurisdiction String?
  documentsRequired String?
  notes             String?
  reminders         String?
  billingRate       Float?
  estimatedHours    Float?
  status            String     @default("SCHEDULED")
  linkedEvents      String?
  aiSuggestions     String?
  participants      String?
  createdBy         String?
  type              String?
  createdAt         DateTime   @default(now())
  updatedAt         DateTime   @updatedAt
  lawyer            User       @relation("LawyerEvents", fields: [lawyerId], references: [id])
  client            User?      @relation("ClientEvents", fields: [clientId], references: [id])
  case              LegalCase? @relation(fields: [caseId], references: [id])
  createdByUser     User?      @relation("CreatedEvents", fields: [createdBy], references: [id])

  @@map("calendar_events")
}

model DocumentCollaboration {
  id             String     @id @default(cuid())
  documentId     String
  caseId         String?
  title          String
  description    String?
  filePath       String
  fileType       String
  fileSize       Int
  version        Int        @default(1)
  status         String     @default("DRAFT")
  createdBy      String
  assignedTo     String?
  dueDate        DateTime?
  completedAt    DateTime?
  comments       String?
  changes        String?
  permissions    String?
  tags           String?
  createdAt      DateTime   @default(now())
  updatedAt      DateTime   @updatedAt
  case           LegalCase? @relation(fields: [caseId], references: [id])
  assignedToUser User?      @relation("AssignedDocuments", fields: [assignedTo], references: [id])
  createdByUser  User       @relation("CreatedDocuments", fields: [createdBy], references: [id])

  @@map("document_collaborations")
}

model ClientPortal {
  id            String     @id @default(cuid())
  clientId      String     @unique
  caseId        String?
  accessToken   String     @unique
  isActive      Boolean    @default(true)
  lastAccess    DateTime?
  preferences   String?
  notifications Boolean    @default(true)
  language      String     @default("en")
  theme         String     @default("light")
  createdAt     DateTime   @default(now())
  updatedAt     DateTime   @updatedAt
  case          LegalCase? @relation(fields: [caseId], references: [id])
  client        User       @relation(fields: [clientId], references: [id])

  @@map("client_portals")
}

model AnalyticsTracking {
  id        String     @id @default(cuid())
  userId    String?
  caseId    String?
  eventType String
  eventData String?
  sessionId String?
  userAgent String?
  ipAddress String?
  timestamp DateTime   @default(now())
  metadata  String?
  case      LegalCase? @relation(fields: [caseId], references: [id])
  user      User?      @relation(fields: [userId], references: [id])

  @@map("analytics_tracking")
}

model Notification {
  id           String    @id @default(cuid())
  userId       String
  type         String
  title        String
  message      String
  data         String?
  isRead       Boolean   @default(false)
  isArchived   Boolean   @default(false)
  priority     String    @default("NORMAL")
  scheduledFor DateTime?
  sentAt       DateTime?
  readAt       DateTime?
  createdAt    DateTime  @default(now())
  updatedAt    DateTime  @updatedAt
  user         User      @relation(fields: [userId], references: [id])

  @@map("notifications")
}

model AutomationTask {
  id           String          @id @default(cuid())
  name         String
  description  String?
  type         String
  schedule     String
  enabled      Boolean         @default(true)
  status       String          @default("active")
  lastRun      DateTime?
  nextRun      DateTime?
  successCount Int             @default(0)
  errorCount   Int             @default(0)
  lastError    String?
  config       String?
  createdAt    DateTime        @default(now())
  updatedAt    DateTime        @updatedAt
  logs         AutomationLog[]

  @@map("automation_tasks")
}

model AutomationLog {
  id            String         @id @default(cuid())
  taskId        String
  status        String
  output        String?
  error         String?
  executionTime DateTime       @default(now())
  duration      Int?
  task          AutomationTask @relation(fields: [taskId], references: [id], onDelete: Cascade)

  @@map("automation_logs")
}

model RetainerAgreement {
  id          String    @id @default(cuid())
  lawyerId    String
  clientId    String
  monthlyRate Float
  services    String
  startDate   DateTime
  message     String?
  status      String    @default("PENDING")
  isActive    Boolean   @default(false)
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
  lawyer      User      @relation("LawyerRetainers", fields: [lawyerId], references: [id])
  client      User      @relation("ClientRetainers", fields: [clientId], references: [id])

  @@map("retainer_agreements")
}

CasperSecurity Mini