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/.cursor-server/data/User/History/-6d5dc0ab/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/.cursor-server/data/User/History/-6d5dc0ab/4Fz6.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

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?
  barreauId                   String?                      @unique
  barreauVerifiedAt           DateTime?
  verificationStatus          VerificationStatus           @default("PENDING")
  specializations             String?
  regions                     String?
  acceptsLegalAid             Boolean                      @default(false)
  barreauStatus               String?
  barreauProfileJson          Json?
  position                    String?
  practiceAreas               String?
  verifiedBy                  String?
  verifiedAt                  DateTime?
  approvedBy                  String?
  approvedAt                  DateTime?
  verificationNotes           String?
  showFriends                 Boolean                      @default(true)
  showEmail                   Boolean                      @default(false)
  showPhone                   Boolean                      @default(false)
  showLocation                Boolean                      @default(false)
  allowMessages               Boolean                      @default(true)
  showOnlineStatus            Boolean                      @default(true)
  ownedBusinessProfiles       BusinessProfile[]            @relation("BusinessProfileOwner")
  chatParticipants            ChatParticipant[]
  createdChatRooms            ChatRoom[]                   @relation("CreatedChatRooms")
  documentComments            DocumentComment[]            @relation("DocumentComments")
  grantedDocumentPermissions  DocumentPermission[]         @relation("PermissionGrantedBy")
  receivedDocumentPermissions DocumentPermission[]         @relation("PermissionUser")
  createdDocumentVersions     DocumentVersion[]            @relation("CreatedDocumentVersions")
  friendOf                    Friendship[]                 @relation("FriendUser")
  friendships                 Friendship[]                 @relation("UserFriendships")
  messages                    Message[]
  MessageReaction             MessageReaction[]
  privateChats                PrivateChat[]
  adminChats                  PrivateChat[]                @relation("AdminChats")
  privateMessages             PrivateMessage[]
  registrations               Registration[]
  createdRegistrations        Registration[]               @relation("CreatedRegistrations")
  searchAnalytics             SearchAnalytics[]            @relation("UserSearchAnalytics")
  sessions                    Session[]
  themeProfiles               ThemeProfile[]
  profile                     UserProfile?
  analyticsEvents             AnalyticsTracking[]
  assistantProfile            AssistantProfile?
  automationRules             AutomationRule[]
  mentorships                 BrotherhoodMentorship[]      @relation("Mentorships")
  menteeships                 BrotherhoodMentorship[]      @relation("Menteeships")
  createdEvents               CalendarEvent[]              @relation("CreatedEvents")
  clientEvents                CalendarEvent[]              @relation("ClientEvents")
  lawyerEvents                CalendarEvent[]              @relation("LawyerEvents")
  campaigns                   Campaign[]
  caseAssignments             CaseAssignment[]
  assignedCases               CaseAssignment[]             @relation("AssignedCases")
  caseBids                    CaseBid[]                    @relation("CaseBids")
  caseChatMessages            CaseChatMessage[]            @relation("CaseChatMessages")
  comments                    CaseComment[]
  competitionParticipations   CaseCompetitionParticipant[] @relation("CompetitionParticipants")
  offerClients                CaseOffer[]                  @relation("OfferClient")
  caseOffers                  CaseOffer[]
  receivedOffers              CaseOffer[]                  @relation("OfferReceiver")
  supportedCases              CaseSupport[]
  caseUpdates                 CaseUpdate[]
  clerkProfile                ClerkProfile?
  clientRelationships         ClientLawyerRelationship[]   @relation("UserToClientRelationships")
  lawyerRelationships         ClientLawyerRelationship[]   @relation("UserToLawyerRelationships")
  clientPortal                ClientPortal?
  testimonialsAsClient        ClientTestimonial[]          @relation("UserToClientTestimonials")
  testimonialsAsLawyer        ClientTestimonial[]          @relation("UserToLawyerTestimonials")
  commentLikes                CommentLike[]
  commentReactions            CommentReaction[]
  commentReportReviews        CommentReport[]              @relation("CommentReportReviews")
  commentReports              CommentReport[]              @relation("CommentReports")
  lawyerConsultations         ConsultationBooking[]        @relation("LawyerConsultations")
  clientConsultations         ConsultationBooking[]        @relation("ClientConsultations")
  courseEnrollments           CourseEnrollment[]
  receivedDirectMessages      DirectMessage[]              @relation("ReceivedDirectMessages")
  sentDirectMessages          DirectMessage[]              @relation("SentDirectMessages")
  createdDocuments            DocumentCollaboration[]      @relation("CreatedDocuments")
  assignedDocuments           DocumentCollaboration[]      @relation("AssignedDocuments")
  documents                   Document[]                   @relation("UserDocuments")
  donations                   Donation[]
  emailTemplates              EmailTemplate[]
  endorsementsReceived        Endorsement[]                @relation("EndorsementsReceived")
  endorsementsGiven           Endorsement[]                @relation("EndorsementsGiven")
  escrowAccount               EscrowAccount?               @relation("UserEscrowAccount")
  clientEscrows               EscrowAccount[]              @relation("ClientEscrows")
  lawyerEscrows               EscrowAccount[]              @relation("LawyerEscrows")
  approvedReleases            EscrowRelease[]              @relation("ApprovedReleases")
  financialSummary            FinancialSummary?            @relation("FinancialSummary")
  forumPostsList              ForumPost[]                  @relation("ForumPostsList")
  originalImpersonations      ImpersonationSession[]       @relation("OriginalUser")
  impersonatedSessions        ImpersonationSession[]       @relation("ImpersonatedUser")
  lawyerRatings               LawyerRating[]               @relation("RatedLawyer")
  ratings                     LawyerRating[]               @relation("RatingUser")
  lawyerRequestsAsClient      LawyerRequest[]              @relation("LawyerRequestClient")
  lawyerRequestsAsLawyer      LawyerRequest[]              @relation("LawyerRequestLawyer")
  lawyerStats                 LawyerStats?
  secretaryCases              LegalCase[]                  @relation("SecretaryCases")
  assistantLawyerCases        LegalCase[]                  @relation("AssistantLawyerCases")
  primaryLawyerCases          LegalCase[]                  @relation("PrimaryLawyerCases")
  caseClients                 LegalCase[]                  @relation("CaseClient")
  casesCreated                LegalCase[]                  @relation("CaseCreator")
  casesAsLead                 LegalCase[]                  @relation("LeadLawyerCases")
  lodgeMemberships            LodgeMembership[]            @relation("LodgeMemberships")
  mentoringSessions           MentorSession[]              @relation("Mentor")
  menteeSessions              MentorSession[]              @relation("Mentee")
  userNotifications           Notification[]
  requestedRefunds            PaymentRefund[]              @relation("RequestedRefunds")
  approvedRefunds             PaymentRefund[]              @relation("ApprovedRefunds")
  payments                    Payment[]
  clientRetainers             RetainerAgreement[]          @relation("ClientRetainers")
  lawyerRetainers             RetainerAgreement[]          @relation("LawyerRetainers")
  reviewerReviews             Review[]                     @relation("ReviewerReviews")
  lawyerReviews               Review[]                     @relation("LawyerReviews")
  segments                    Segment[]
  statusNotes                 StatusNote[]
  assignedTasks               Task[]                       @relation("AssignedTasks")
  createdTasks                Task[]                       @relation("CreatedTasks")
  testimonialsReceived        Testimonial[]                @relation("TestimonialTarget")
  testimonialsGiven           Testimonial[]                @relation("TestimonialAuthor")
  transactions                Transaction[]                @relation("UserTransactions")
  TypingStatus                TypingStatus[]
  achievements                UserAchievement[]
  badges                      UserBadge[]
  degrees                     UserDegree[]
  followers                   UserFollow[]                 @relation("UserFollowing")
  following                   UserFollow[]                 @relation("UserFollowers")
  levelHistory                UserLevelHistory[]
  subscriptions               UserSubscription[]
  lawFirm                     LawFirm?                     @relation("FirmLawyers", fields: [lawFirmId], references: [id])
  businessProfiles            BusinessProfile[]            @relation("BusinessProfileMembers")
  users_A                     User[]                       @relation("UserLegalCases")
  users_B                     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?
  legalCase      LegalCase?   @relation(fields: [caseId], references: [id])
  registration   Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
  user           User         @relation(fields: [userId], references: [id])
  assignedByUser User         @relation("AssignedCases", fields: [assignedBy], 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?
  privateChat            PrivateChat?
  legalCase              LegalCase?       @relation(fields: [caseId], references: [id])
  user                   User?            @relation(fields: [userId], references: [id])
  creator                User?            @relation("CreatedRegistrations", fields: [createdBy], references: [id])
  caseAssignments        CaseAssignment[]
  documents              Document[]
  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
  public         Boolean              @default(false)
  description    String?
  comments       DocumentComment[]
  permissions    DocumentPermission[]
  versions       DocumentVersion[]
  legalCase      LegalCase?           @relation(fields: [caseId], references: [id])
  registration   Registration         @relation(fields: [registrationId], references: [id], onDelete: Cascade)
  user           User                 @relation("UserDocuments", fields: [userId], references: [id])

  @@map("documents")
}

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

  @@unique([documentId, version])
}

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

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())
  grantedBy   User     @relation("PermissionGrantedBy", fields: [grantedById], references: [id])
  user        User     @relation("PermissionUser", fields: [userId], references: [id])
  document    Document @relation(fields: [documentId], references: [id], onDelete: Cascade)

  @@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())
  user       User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  chatRoom   ChatRoom @relation(fields: [chatRoomId], 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
  chatRoom   ChatRoom          @relation(fields: [chatRoomId], references: [id], onDelete: Cascade)
  user       User              @relation(fields: [userId], references: [id], onDelete: Cascade)
  replyTo    Message?          @relation("MessageReplies", fields: [replyToId], references: [id])
  replies    Message[]         @relation("MessageReplies")
  reactions  MessageReaction[]
}

model PrivateChat {
  id             String           @id @default(cuid())
  registrationId String           @unique
  userId         String
  adminId        String?
  createdAt      DateTime         @default(now())
  updatedAt      DateTime         @updatedAt
  registration   Registration     @relation(fields: [registrationId], references: [id], onDelete: Cascade)
  user           User             @relation(fields: [userId], references: [id], onDelete: Cascade)
  admin          User?            @relation("AdminChats", fields: [adminId], references: [id])
  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
  sender        User        @relation(fields: [senderId], references: [id], onDelete: Cascade)
  privateChat   PrivateChat @relation(fields: [privateChatId], 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
  legalCase   LegalCase? @relation(fields: [caseId], references: [id])
  recipient   User       @relation("ReceivedDirectMessages", fields: [recipientId], references: [id], onDelete: Cascade)
  sender      User       @relation("SentDirectMessages", fields: [senderId], references: [id], onDelete: Cascade)

  @@map("direct_messages")
}

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

  @@map("status_notes")
}

model TypingStatus {
  id         String   @id @default(cuid())
  userId     String
  chatRoomId String
  isTyping   Boolean  @default(false)
  updatedAt  DateTime @updatedAt
  user       User     @relation(fields: [userId], references: [id])
  chatRoom   ChatRoom @relation(fields: [chatRoomId], 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())
  message   Message  @relation(fields: [messageId], references: [id], onDelete: Cascade)
  user      User     @relation(fields: [userId], 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[]
  template          EmailTemplate?    @relation(fields: [templateId], references: [id])
  segment           Segment?          @relation(fields: [segmentId], references: [id])
  creator           User              @relation(fields: [createdBy], 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())
  campaign       Campaign               @relation(fields: [campaignId], references: [id], onDelete: Cascade)
  subscription   NewsletterSubscription @relation(fields: [subscriptionId], 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())
  segment        Segment                @relation(fields: [segmentId], references: [id], onDelete: Cascade)
  subscription   NewsletterSubscription @relation(fields: [subscriptionId], 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?
  expiresAt          DateTime?
  originalUser       User      @relation("OriginalUser", fields: [originalUserId], references: [id], onDelete: Cascade)
  impersonatedUser   User      @relation("ImpersonatedUser", fields: [impersonatedUserId], 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?
  competitionDeadline       DateTime?
  minimumBid                Float?
  currentHighestBid         Float?
  totalBidders              Int                          @default(0)
  averageBidAmount          Float?
  logoUrl                   String?
  registrations             Registration[]
  analyticsEvents           AnalyticsTracking[]
  calendarEvents            CalendarEvent[]
  caseAssignments           CaseAssignment[]
  bids                      CaseBid[]
  caseChatMessages          CaseChatMessage[]            @relation("CaseChatMessages")
  comments                  CaseComment[]
  competitionParticipants   CaseCompetitionParticipant[]
  offers                    CaseOffer[]
  supporters                CaseSupport[]
  caseUpdates               CaseUpdate[]
  clientLawyerRelationships ClientLawyerRelationship[]   @relation("CaseLawyerRequests")
  clientPortals             ClientPortal[]
  testimonials              ClientTestimonial[]          @relation("CaseLawyerRequests")
  directMessages            DirectMessage[]
  documentCollaborations    DocumentCollaboration[]
  documents                 Document[]
  escrowAccounts            EscrowAccount?
  lawyerRatings             LawyerRating[]
  lawyerRequests            LawyerRequest[]              @relation("CaseLawyerRequests")
  secretary                 User?                        @relation("SecretaryCases", fields: [secretaryId], references: [id])
  assistantLawyer           User?                        @relation("AssistantLawyerCases", fields: [assistantLawyerId], references: [id])
  primaryLawyer             User?                        @relation("PrimaryLawyerCases", fields: [primaryLawyerId], references: [id])
  client                    User?                        @relation("CaseClient", fields: [clientId], references: [id])
  creator                   User                         @relation("CaseCreator", fields: [createdBy], references: [id])
  leadLawyer                User                         @relation("LeadLawyerCases", fields: [leadLawyerId], references: [id])
  payments                  Payment[]
  milestones                RelationshipMilestone[]      @relation("CaseLawyerRequests")
  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
  case        LegalCase @relation(fields: [caseId], references: [id], onDelete: Cascade)
  author      User      @relation(fields: [createdBy], references: [id])

  @@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
  lawyer             User       @relation("RatedLawyer", fields: [lawyerId], references: [id])
  rater              User       @relation("RatingUser", fields: [userId], references: [id])
  case               LegalCase? @relation(fields: [caseId], 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
  case              LegalCase @relation(fields: [caseId], references: [id])
  client            User?     @relation("OfferClient", fields: [clientId], references: [id])
  lawyer            User      @relation(fields: [lawyerId], references: [id])
  receiver          User      @relation("OfferReceiver", fields: [receiverId], 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)
  user      User     @relation(fields: [userId], references: [id])
  badge     Badge    @relation(fields: [badgeId], 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())
  user            User        @relation(fields: [userId], references: [id])
  achievement     Achievement @relation(fields: [achievementId], 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[]
  user                  User            @relation(fields: [userId], references: [id])
  case                  LegalCase?      @relation(fields: [caseId], references: [id])
  escrow                EscrowAccount?  @relation(fields: [escrowId], 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
  userId             String?         @unique
  user               User?           @relation("UserEscrowAccount", fields: [userId], references: [id])
  case               LegalCase       @relation(fields: [caseId], references: [id])
  client             User            @relation("ClientEscrows", fields: [clientId], references: [id])
  lawyer             User            @relation("LawyerEscrows", fields: [lawyerId], 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())
  escrow               EscrowAccount @relation(fields: [escrowId], references: [id])
  approver             User?         @relation("ApprovedReleases", fields: [approvedBy], 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())
  payment         Payment? @relation(fields: [paymentId], references: [id])
  user            User     @relation("UserTransactions", fields: [userId], 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())
  payment        Payment   @relation(fields: [paymentId], references: [id])
  requester      User      @relation("RequestedRefunds", fields: [requestedBy], references: [id])
  approver       User?     @relation("ApprovedRefunds", fields: [approvedBy], 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?
  user           User      @relation(fields: [userId], references: [id])
  course         Course    @relation(fields: [courseId], 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")
  mentor      User     @relation("Mentor", fields: [mentorId], references: [id])
  mentee      User     @relation("Mentee", fields: [menteeId], 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?
  user               User            @relation(fields: [userId], references: [id])
  degree             SocietyDegree   @relation(fields: [degreeId], 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)
  degree       SocietyDegree @relation(fields: [degreeId], references: [id])
  userDegree   UserDegree    @relation(fields: [userDegreeId], 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?
  mentor            User                @relation("Mentorships", fields: [mentorId], references: [id])
  mentee            User                @relation("Menteeships", fields: [menteeId], references: [id])
  degree            SocietyDegree?      @relation("MentorshipDegrees", fields: [degreeId], 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)
  user          User     @relation("LodgeMemberships", fields: [userId], references: [id])
  lodge         Lodge    @relation(fields: [lodgeId], references: [id])

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

model CaseSupport {
  id        String    @id @default(cuid())
  userId    String
  caseId    String
  createdAt DateTime  @default(now())
  user      User      @relation(fields: [userId], references: [id])
  case      LegalCase @relation(fields: [caseId], 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
  client              User                    @relation("UserToClientRelationships", fields: [clientId], references: [id])
  lawyer              User                    @relation("UserToLawyerRelationships", fields: [lawyerId], references: [id])
  case                LegalCase?              @relation("CaseLawyerRequests", fields: [caseId], references: [id])
  testimonials        ClientTestimonial[]     @relation("RelationshipToClientTestimonial")
  milestones          RelationshipMilestone[] @relation("RelationshipMilestoneToClientLawyerRelationship")

  @@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)
  legalCase      LegalCase?               @relation("CaseLawyerRequests", fields: [caseId], references: [id])
  relationship   ClientLawyerRelationship @relation("RelationshipMilestoneToClientLawyerRelationship", fields: [relationshipId], 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
  client          User                     @relation("UserToClientTestimonials", fields: [clientId], references: [id])
  lawyer          User                     @relation("UserToLawyerTestimonials", fields: [lawyerId], references: [id])
  relationship    ClientLawyerRelationship @relation("RelationshipToClientTestimonial", fields: [relationshipId], references: [id])
  case            LegalCase?               @relation("CaseLawyerRequests", fields: [caseId], 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
  user                 User             @relation(fields: [userId], references: [id])
  plan                 SubscriptionPlan @relation(fields: [planId], 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
  lawyer           User      @relation("LawyerConsultations", fields: [lawyerId], references: [id])
  client           User      @relation("ClientConsultations", fields: [clientId], 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
  assignedToUser User       @relation("AssignedTasks", fields: [assignedTo], references: [id])
  assignedByUser User       @relation("CreatedTasks", fields: [assignedBy], references: [id])
  case           LegalCase? @relation(fields: [caseId], 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
  createdByUser     User?      @relation("CreatedEvents", fields: [createdBy], references: [id])
  case              LegalCase? @relation(fields: [caseId], references: [id])
  client            User?      @relation("ClientEvents", fields: [clientId], references: [id])
  lawyer            User       @relation("LawyerEvents", fields: [lawyerId], 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
  createdByUser  User       @relation("CreatedDocuments", fields: [createdBy], references: [id])
  assignedToUser User?      @relation("AssignedDocuments", fields: [assignedTo], references: [id])
  case           LegalCase? @relation(fields: [caseId], 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
  client        User       @relation(fields: [clientId], references: [id])
  case          LegalCase? @relation(fields: [caseId], 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?
  user      User?      @relation(fields: [userId], references: [id])
  case      LegalCase? @relation(fields: [caseId], 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
  client      User     @relation("ClientRetainers", fields: [clientId], references: [id])
  lawyer      User     @relation("LawyerRetainers", fields: [lawyerId], 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)
  allowedFileTypes         String?
  defaultLanguage          String   @default("en")
  supportedLanguages       String?
  timezone                 String   @default("UTC")
  dateFormat               String   @default("YYYY-MM-DD")
  timeFormat               String   @default("HH:mm")
  currency                 String   @default("USD")
  currencySymbol           String   @default("$")
  emailSettings            String?
  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?
  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")
  notes    String?
  case     LegalCase @relation(fields: [caseId], references: [id])
  lawyer   User      @relation("CompetitionParticipants", fields: [lawyerId], 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")
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  lawyer    User      @relation("CaseBids", fields: [lawyerId], references: [id])
  case      LegalCase @relation(fields: [caseId], 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?
  content     String
  likes       Int                 @default(0)
  isEdited    Boolean             @default(false)
  isDeleted   Boolean             @default(false)
  createdAt   DateTime            @default(now())
  updatedAt   DateTime            @updatedAt
  parent      CaseComment?        @relation("CommentReplies", fields: [parentId], references: [id])
  replies     CaseComment[]       @relation("CommentReplies")
  user        User                @relation(fields: [userId], references: [id])
  case        LegalCase           @relation(fields: [caseId], references: [id])
  attachments CommentAttachment[]
  likedBy     CommentLike[]
  reactions   CommentReaction[]
  reports     CommentReport[]

  @@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())
  user      User        @relation(fields: [userId], references: [id], onDelete: Cascade)
  comment   CaseComment @relation(fields: [commentId], references: [id], onDelete: Cascade)

  @@unique([commentId, userId])
  @@map("comment_likes")
}

model CommentReaction {
  id           String      @id @default(cuid())
  commentId    String
  userId       String
  reactionType String
  createdAt    DateTime    @default(now())
  user         User        @relation(fields: [userId], references: [id], onDelete: Cascade)
  comment      CaseComment @relation(fields: [commentId], 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")
  reviewedBy  String?
  reviewedAt  DateTime?
  createdAt   DateTime    @default(now())
  updatedAt   DateTime    @updatedAt
  reviewer    User?       @relation("CommentReportReviews", fields: [reviewedBy], references: [id])
  reporter    User        @relation("CommentReports", fields: [reportedBy], references: [id], onDelete: Cascade)
  comment     CaseComment @relation(fields: [commentId], references: [id], onDelete: Cascade)

  @@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
  client         User      @relation("LawyerRequestClient", fields: [clientId], references: [id])
  lawyer         User      @relation("LawyerRequestLawyer", fields: [lawyerId], references: [id])
  case           LegalCase @relation("CaseLawyerRequests", fields: [caseId], 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?
  createdAt    DateTime  @default(now())
  updatedAt    DateTime  @updatedAt
  sender       User      @relation("CaseChatMessages", fields: [senderId], references: [id], onDelete: Cascade)
  case         LegalCase @relation("CaseChatMessages", fields: [caseId], references: [id], onDelete: Cascade)

  @@map("case_chat_messages")
}

model Friendship {
  id        String   @id @default(cuid())
  userId    String
  friendId  String
  status    String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  friend    User     @relation("FriendUser", fields: [friendId], references: [id])
  user      User     @relation("UserFriendships", fields: [userId], 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)
  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())
  endorsedUser   User     @relation("EndorsementsReceived", fields: [endorsedUserId], references: [id])
  endorser       User     @relation("EndorsementsGiven", fields: [endorserId], 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
  reviewer     User     @relation("ReviewerReviews", fields: [reviewerId], references: [id])
  lawyer       User     @relation("LawyerReviews", fields: [lawyerId], 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
  targetUser   User     @relation("TestimonialTarget", fields: [targetUserId], references: [id])
  author       User     @relation("TestimonialAuthor", fields: [authorId], references: [id])

  @@map("testimonials")
}

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

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

enum VerificationStatus {
  PENDING
  VERIFIED
  VERIFIED_BARREAU
  REJECTED
  SUSPENDED
}

CasperSecurity Mini