![]() 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/ |
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
}