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
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)
  totalEndorsements           Int                          @default(0)
  profileViews                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[]            @relation("BusinessProfileMembers")
  ownedBusinessProfiles       BusinessProfile[]            @relation("BusinessProfileOwner")
  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("UserToLawyerRelationships")
  clientRelationships         ClientLawyerRelationship[]   @relation("UserToClientRelationships")
  clientPortal                ClientPortal?
  testimonialsAsLawyer        ClientTestimonial[]          @relation("UserToLawyerTestimonials")
  testimonialsAsClient        ClientTestimonial[]          @relation("UserToClientTestimonials")
  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")
  ratings                     LawyerRating[]               @relation("RatingUser")
  lawyerRatings               LawyerRating[]               @relation("RatedLawyer")
  lawyerStats                 LawyerStats?
  casesCreated                LegalCase[]                  @relation("CaseCreator")
  casesAsLead                 LegalCase[]                  @relation("LeadLawyerCases")
  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("PrimaryLawyerCases")
  assistantLawyerCases        LegalCase[]                  @relation("AssistantLawyerCases")
  secretaryCases              LegalCase[]                  @relation("SecretaryCases")
  escrowAccount               EscrowAccount?               @relation("UserEscrowAccount")
  userLegalCases              User[]                       @relation("UserLegalCases")
  userLegalCasesOf            User[]                       @relation("UserLegalCases")
  competitionParticipations   CaseCompetitionParticipant[] @relation("CompetitionParticipants")
  caseBids                    CaseBid[]                    @relation("CaseBids")
  assistantProfile            AssistantProfile?
  clerkProfile                ClerkProfile?
  comments                    CaseComment[]
  commentLikes                CommentLike[]
  commentReactions            CommentReaction[]
  commentReports              CommentReport[]              @relation("CommentReports")
  commentReportReviews        CommentReport[]              @relation("CommentReportReviews")
  lawyerRequestsAsLawyer      LawyerRequest[]              @relation("LawyerRequestLawyer")
  lawyerRequestsAsClient      LawyerRequest[]              @relation("LawyerRequestClient")
  caseChatMessages            CaseChatMessage[]            @relation("CaseChatMessages")

  // Barreau verification fields
  barreauId                    String?  @unique
  barreauVerifiedAt            DateTime?
  verificationStatus            VerificationStatus @default(PENDING)
  specializations               String?
  regions                       String?
  acceptsLegalAid               Boolean  @default(false)
  barreauStatus                 String?  // ACTIVE, SUSPENDED, INACTIVE
  barreauProfileJson            Json?

  position                    String?
  practiceAreas               String?

  verifiedBy      String?
  verifiedAt      DateTime?
  approvedBy      String?
  approvedAt      DateTime?
  verificationNotes String?

  friendships         Friendship[] @relation("UserFriendships")
  friendOf            Friendship[] @relation("FriendUser")
  showFriends              Boolean                      @default(true)
  showEmail                Boolean                      @default(false)
  showPhone                 Boolean                      @default(false)
  searchAnalytics      SearchAnalytics[] @relation("UserSearchAnalytics")
  showLocation              Boolean                      @default(false)
  allowMessages             Boolean                      @default(true)
  showOnlineStatus          Boolean                      @default(true)

  // Endorsements relations
  endorsementsGiven     Endorsement[] @relation("EndorsementsGiven")
  endorsementsReceived  Endorsement[] @relation("EndorsementsReceived")

  // Level history
  levelHistory          UserLevelHistory[]

  // Reviews
  lawyerReviews         Review[] @relation("LawyerReviews")
  reviewerReviews       Review[] @relation("ReviewerReviews")

  // Forum posts
  forumPostsList         ForumPost[] @relation("ForumPostsList")

  // Testimonials
  testimonialsGiven     Testimonial[] @relation("TestimonialAuthor")
  testimonialsReceived  Testimonial[] @relation("TestimonialTarget")

  // User follows
  followers             UserFollow[] @relation("UserFollowing")
  following             UserFollow[] @relation("UserFollowers")

  @@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[]
  legalCase      LegalCase?           @relation(fields: [caseId], references: [id])
  public         Boolean              @default(false)
  description    String?

  @@map("documents")
}

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)
  legalCase   LegalCase? @relation(fields: [caseId], references: [id])

  @@map("direct_messages")
}

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?
  expiresAt          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
  competitionType           String? // AUCTION, TENDER, NEGOTIATION
  competitionDeadline       DateTime?
  minimumBid                Float?
  currentHighestBid         Float?
  totalBidders              Int                          @default(0)
  averageBidAmount          Float?
  logoUrl                   String? // <-- Case logo image URL
  registrations             Registration[]
  analyticsEvents           AnalyticsTracking[]
  calendarEvents            CalendarEvent[]
  caseAssignments           CaseAssignment[]
  offers                    CaseOffer[]
  supporters                CaseSupport[]
  competitionParticipants   CaseCompetitionParticipant[]
  bids                      CaseBid[]
  directMessages            DirectMessage[]
  lawyerRatings             LawyerRating[]
  payments                  Payment[]
  escrowAccounts            EscrowAccount[]
  clientLawyerRelationships ClientLawyerRelationship[]   @relation("CaseLawyerRequests")
  tasks                     Task[]
  documentCollaborations    DocumentCollaboration[]
  clientPortals             ClientPortal[]
  milestones                RelationshipMilestone[]      @relation("CaseLawyerRequests")
  leadLawyer                User                         @relation("LeadLawyerCases", fields: [leadLawyerId], references: [id])
  creator                   User                         @relation("CaseCreator", fields: [createdBy], references: [id])
  client                    User?                        @relation("CaseClient", fields: [clientId], references: [id])
  primaryLawyer             User?                        @relation("PrimaryLawyerCases", fields: [primaryLawyerId], references: [id])
  assistantLawyer           User?                        @relation("AssistantLawyerCases", fields: [assistantLawyerId], references: [id])
  secretary                 User?                        @relation("SecretaryCases", fields: [secretaryId], references: [id])
  caseUpdates               CaseUpdate[]
  documents                 Document[]
  testimonials              ClientTestimonial[]          @relation("CaseLawyerRequests")
  comments                  CaseComment[]
  lawyerRequests            LawyerRequest[]              @relation("CaseLawyerRequests")
  caseChatMessages          CaseChatMessage[]            @relation("CaseChatMessages")

  @@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())
  ownerId            String
  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?
  owner              User      @relation("BusinessProfileOwner", fields: [ownerId], references: [id])
  members            User[]    @relation("BusinessProfileMembers")
}

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[]
  userId             String?         @unique
  user               User?           @relation("UserEscrowAccount", fields: [userId], references: [id])

  @@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("CaseLawyerRequests", fields: [caseId], references: [id])
  lawyer              User                    @relation("UserToLawyerRelationships", fields: [lawyerId], references: [id])
  client              User                    @relation("UserToClientRelationships", fields: [clientId], references: [id])
  milestones          RelationshipMilestone[] @relation("RelationshipMilestoneToClientLawyerRelationship")
  testimonials        ClientTestimonial[]     @relation("RelationshipToClientTestimonial")

  @@map("client_lawyer_relationships")
}

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

  @@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("CaseLawyerRequests", fields: [caseId], references: [id])
  relationship    ClientLawyerRelationship @relation("RelationshipToClientTestimonial", fields: [relationshipId], references: [id])
  lawyer          User                     @relation("UserToLawyerTestimonials", fields: [lawyerId], references: [id])
  client          User                     @relation("UserToClientTestimonials", 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)
  paymentMethodId      String?
  amount               Float?
  currency             String?
  billingCycle         String?
  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")
}

model SystemSettings {
  id                       String   @id @default(cuid())
  siteName                 String   @default("Liberté Meme en Cellule")
  siteDescription          String?
  maintenanceMode          Boolean  @default(false)
  maintenanceMessage       String?
  allowRegistrations       Boolean  @default(true)
  requireEmailVerification Boolean  @default(false)
  maxFileUploadSize        Int      @default(10485760) // 10MB in bytes
  allowedFileTypes         String? // JSON array of allowed extensions
  defaultLanguage          String   @default("en")
  supportedLanguages       String? // JSON array of supported languages
  timezone                 String   @default("UTC")
  dateFormat               String   @default("YYYY-MM-DD")
  timeFormat               String   @default("HH:mm")
  currency                 String   @default("USD")
  currencySymbol           String   @default("$")
  emailSettings            String? // JSON object for email configuration
  smtpHost                 String?
  smtpPort                 Int?
  smtpUser                 String?
  smtpPassword             String?
  smtpSecure               Boolean  @default(true)
  fromEmail                String?
  fromName                 String?
  logoUrl                  String?
  faviconUrl               String?
  primaryColor             String   @default("#3B82F6")
  secondaryColor           String   @default("#1F2937")
  analyticsEnabled         Boolean  @default(false)
  analyticsCode            String?
  socialMediaLinks         String? // JSON object for social media URLs
  contactEmail             String?
  contactPhone             String?
  address                  String?
  termsOfService           String?
  privacyPolicy            String?
  cookiePolicy             String?
  version                  String   @default("1.0.0")
  lastUpdated              DateTime @default(now())
  updatedBy                String?
  createdAt                DateTime @default(now())
  updatedAt                DateTime @updatedAt

  @@map("system_settings")
}

model CaseCompetitionParticipant {
  id       String    @id @default(cuid())
  lawyerId String
  caseId   String
  joinedAt DateTime  @default(now())
  status   String    @default("ACTIVE") // ACTIVE, WITHDRAWN, DISQUALIFIED
  notes    String?
  lawyer   User      @relation("CompetitionParticipants", fields: [lawyerId], references: [id])
  case     LegalCase @relation(fields: [caseId], references: [id])

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

model CaseBid {
  id        String    @id @default(cuid())
  caseId    String
  lawyerId  String
  bidAmount Float
  message   String
  status    String    @default("ACTIVE") // ACTIVE, ACCEPTED, REJECTED, WITHDRAWN
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  case      LegalCase @relation(fields: [caseId], references: [id])
  lawyer    User      @relation("CaseBids", fields: [lawyerId], references: [id])

  @@map("case_bids")
}

model AssistantProfile {
  id              String   @id @default(cuid())
  userId          String   @unique
  firstName       String   @default("")
  lastName        String   @default("")
  email           String   @default("")
  phone           String   @default("")
  address         String   @default("")
  city            String   @default("")
  state           String   @default("")
  zipCode         String   @default("")
  country         String   @default("")
  dateOfBirth     String   @default("")
  gender          String   @default("")
  bio             String   @default("")
  experience      String   @default("")
  education       String   @default("")
  certifications  String   @default("")
  languages       String   @default("")
  specializations String   @default("")
  softwareSkills  String   @default("")
  availability    String   @default("")
  hourlyRate      Float    @default(0)
  isPublic        Boolean  @default(false)
  linkedinUrl     String   @default("")
  websiteUrl      String   @default("")
  profilePicture  String?
  createdAt       DateTime @default(now())
  updatedAt       DateTime @updatedAt
  user            User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@map("assistant_profiles")
}

model ClerkProfile {
  id               String   @id @default(cuid())
  userId           String   @unique
  firstName        String   @default("")
  lastName         String   @default("")
  email            String   @default("")
  phone            String   @default("")
  address          String   @default("")
  city             String   @default("")
  state            String   @default("")
  zipCode          String   @default("")
  country          String   @default("")
  dateOfBirth      String   @default("")
  gender           String   @default("")
  bio              String   @default("")
  experience       String   @default("")
  education        String   @default("")
  certifications   String   @default("")
  languages        String   @default("")
  specializations  String   @default("")
  courtSystems     String   @default("")
  filingProcedures String   @default("")
  availability     String   @default("")
  hourlyRate       Float    @default(0)
  isPublic         Boolean  @default(false)
  linkedinUrl      String   @default("")
  websiteUrl       String   @default("")
  profilePicture   String?
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt
  user             User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@map("clerk_profiles")
}

model CaseComment {
  id        String    @id @default(cuid())
  caseId    String
  userId    String
  parentId  String?   // For threaded replies
  content   String
  likes     Int       @default(0)
  isEdited  Boolean   @default(false)
  isDeleted Boolean   @default(false)
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  
  // Relations
  case      LegalCase @relation(fields: [caseId], references: [id])
  user      User      @relation(fields: [userId], references: [id])
  parent    CaseComment? @relation("CommentReplies", fields: [parentId], references: [id])
  replies   CaseComment[] @relation("CommentReplies")
  
  // Reactions tracking
  likedBy   CommentLike[]
  reactions CommentReaction[]
  reports   CommentReport[]
  
  // Attachments
  attachments CommentAttachment[]
  
  @@map("case_comments")
}

model CommentAttachment {
  id        String      @id @default(cuid())
  commentId String
  name      String
  url       String
  type      String
  size      Int
  createdAt DateTime    @default(now())
  
  comment   CaseComment @relation(fields: [commentId], references: [id], onDelete: Cascade)
  
  @@map("comment_attachments")
}

model CommentLike {
  id        String      @id @default(cuid())
  commentId String
  userId    String
  createdAt DateTime    @default(now())
  
  comment   CaseComment @relation(fields: [commentId], references: [id], onDelete: Cascade)
  user      User        @relation(fields: [userId], references: [id], onDelete: Cascade)
  
  @@unique([commentId, userId])
  @@map("comment_likes")
}

model CommentReaction {
  id        String      @id @default(cuid())
  commentId String
  userId    String
  reactionType String   // like, love, laugh, wow, sad, angry
  createdAt DateTime    @default(now())
  
  comment   CaseComment @relation(fields: [commentId], references: [id], onDelete: Cascade)
  user      User        @relation(fields: [userId], references: [id], onDelete: Cascade)
  
  @@unique([commentId, userId, reactionType])
  @@map("comment_reactions")
}

model CommentReport {
  id          String   @id @default(cuid())
  commentId   String
  reportedBy  String
  reason      String
  description String?
  status      String   @default("PENDING") // PENDING, REVIEWED, RESOLVED, DISMISSED
  reviewedBy  String?
  reviewedAt  DateTime?
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  
  comment     CaseComment @relation(fields: [commentId], references: [id], onDelete: Cascade)
  reporter    User        @relation("CommentReports", fields: [reportedBy], references: [id], onDelete: Cascade)
  reviewer    User?       @relation("CommentReportReviews", fields: [reviewedBy], references: [id])
  
  @@unique([commentId, reportedBy])
  @@map("comment_reports")
}

model LawyerRequest {
  id             String   @id @default(cuid())
  caseId         String
  lawyerId       String
  clientId       String
  message        String?
  proposedRate   Float?
  estimatedHours Int?
  reasoning      String?
  status         String   @default("PENDING")
  createdAt      DateTime @default(now())
  updatedAt      DateTime @updatedAt

  case   LegalCase @relation("CaseLawyerRequests", fields: [caseId], references: [id])
  lawyer User      @relation("LawyerRequestLawyer", fields: [lawyerId], references: [id])
  client User      @relation("LawyerRequestClient", fields: [clientId], references: [id])

  @@map("lawyer_requests")
}

model CaseChatMessage {
  id          String   @id @default(cuid())
  caseId      String
  content     String
  senderId    String
  senderName  String
  senderAvatar String?
  senderRole  String
  isPublic    Boolean  @default(true)
  reactions   Json?    // Store reactions as JSON
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  case        LegalCase @relation("CaseChatMessages", fields: [caseId], references: [id], onDelete: Cascade)
  sender      User     @relation("CaseChatMessages", fields: [senderId], references: [id], onDelete: Cascade)

  @@map("case_chat_messages")
}

enum VerificationStatus {
  PENDING
  VERIFIED
  VERIFIED_BARREAU
  REJECTED
  SUSPENDED
}

model Friendship {
  id           String   @id @default(cuid())
  userId       String
  friendId     String
  status       String   // 'pending', 'accepted', 'declined'
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt

  user         User     @relation("UserFriendships", fields: [userId], references: [id])
  friend       User     @relation("FriendUser", fields: [friendId], references: [id])

  @@unique([userId, friendId])
}

model SearchAnalytics {
  id           String   @id @default(cuid())
  userId       String
  query        String
  filters      Json?
  resultCount  Int      @default(0)
  clickedResult String?
  searchTime   Int      @default(0) // in milliseconds
  userAgent    String?
  ipAddress    String?
  timestamp    DateTime @default(now())
  
  user         User     @relation("UserSearchAnalytics", fields: [userId], references: [id])
}

model Endorsement {
  id             String   @id @default(cuid())
  endorserId     String
  endorsedUserId String
  category       String?
  message        String?
  createdAt      DateTime @default(now())

  endorser       User     @relation("EndorsementsGiven", fields: [endorserId], references: [id])
  endorsedUser   User     @relation("EndorsementsReceived", fields: [endorsedUserId], references: [id])

  @@unique([endorserId, endorsedUserId])
  @@map("endorsements")
}

model UserLevelHistory {
  id        String   @id @default(cuid())
  userId    String
  oldLevel  Int
  newLevel  Int
  earnedAt  DateTime @default(now())
  reason    String?
  user      User     @relation(fields: [userId], references: [id])

  @@map("user_level_history")
}

model Review {
  id           String   @id @default(cuid())
  lawyerId     String
  reviewerId   String
  rating       Int
  comment      String?
  caseType     String?
  outcome      String?
  helpfulCount Int      @default(0)
  isVerified   Boolean  @default(false)
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt
  lawyer       User     @relation("LawyerReviews", fields: [lawyerId], references: [id])
  reviewer     User     @relation("ReviewerReviews", fields: [reviewerId], references: [id])

  @@unique([lawyerId, reviewerId])
  @@map("reviews")
}

model ForumPost {
  id        String   @id @default(cuid())
  authorId  String
  title     String
  content   String
  category  String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  author    User     @relation("ForumPostsList", fields: [authorId], references: [id])

  @@map("forum_posts")
}

model Testimonial {
  id           String   @id @default(cuid())
  authorId     String
  targetUserId String
  content      String
  rating       Int?
  category     String?
  caseType     String?
  outcome      String?
  helpfulCount Int      @default(0)
  isVerified   Boolean  @default(false)
  isPublic     Boolean  @default(true)
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt
  author       User     @relation("TestimonialAuthor", fields: [authorId], references: [id])
  targetUser   User     @relation("TestimonialTarget", fields: [targetUserId], references: [id])

  @@map("testimonials")
}

model UserFollow {
  id          String   @id @default(cuid())
  followerId  String
  followingId String
  createdAt   DateTime @default(now())
  follower    User     @relation("UserFollowers", fields: [followerId], references: [id])
  following   User     @relation("UserFollowing", fields: [followingId], references: [id])

  @@unique([followerId, followingId])
  @@map("user_follows")
}



CasperSecurity Mini