![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.quebec/public_html/prisma/ |
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
model User {
id String @id @default(cuid())
email String @unique
name String?
password String
role String @default("USER")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
resetPasswordToken String?
resetPasswordTokenExpiry DateTime?
reminders String?
username String? @unique
profilePicture String?
bio String?
title String?
specialization String?
barNumber String?
yearsOfExperience Int?
education String?
certifications String?
officeLocation String?
workPhone String?
linkedinUrl String?
websiteUrl String?
availability String?
timezone String?
pronouns String?
isProfilePublic Boolean @default(false)
lastActive DateTime?
hourlyRate Float?
proBono Boolean @default(false)
boldnessRating Float?
transparencyRating Float?
winRate Float?
totalCases Int @default(0)
wonCases Int @default(0)
lostCases Int @default(0)
averageRating Float?
isVerified Boolean @default(false)
xpPoints Int @default(0)
level Int @default(1)
currentStreak Int @default(0)
totalBadges Int @default(0)
reviewsWritten Int @default(0)
forumPosts Int @default(0)
helpedOthers Int @default(0)
observationHours Float @default(0)
reformProposals Int @default(0)
wisdomScore Float @default(0)
civicEngagement Float @default(0)
accountBalance Float @default(0.0)
isPaymentVerified Boolean @default(false)
donationTotal Float @default(0.0)
subscriptionTier String?
subscriptionExpiry DateTime?
theme String @default("light")
gender String?
phone String?
address String?
emergencyContact String?
emergencyPhone String?
dateOfBirth DateTime?
occupation String?
language String @default("en")
notifications Boolean @default(true)
lawFirmId String?
isActive Boolean @default(true)
status String @default("ACTIVE")
experience Int?
rating Float?
profile UserProfile?
businessProfiles BusinessProfile?
chatParticipants ChatParticipant[]
createdChatRooms ChatRoom[] @relation("CreatedChatRooms")
sentDirectMessages DirectMessage[] @relation("SentDirectMessages")
receivedDirectMessages DirectMessage[] @relation("ReceivedDirectMessages")
documents Document[] @relation("UserDocuments")
messages Message[]
MessageReaction MessageReaction[]
adminChats PrivateChat[] @relation("AdminChats")
privateChats PrivateChat[]
privateMessages PrivateMessage[]
createdRegistrations Registration[] @relation("CreatedRegistrations")
registrations Registration[]
sessions Session[]
themeProfiles ThemeProfile[]
analyticsEvents AnalyticsTracking[]
automationRules AutomationRule[]
menteeships BrotherhoodMentorship[] @relation("Menteeships")
mentorships BrotherhoodMentorship[] @relation("Mentorships")
lawyerEvents CalendarEvent[] @relation("LawyerEvents")
clientEvents CalendarEvent[] @relation("ClientEvents")
campaigns Campaign[]
assignedCases CaseAssignment[] @relation("AssignedCases")
caseAssignments CaseAssignment[]
receivedOffers CaseOffer[] @relation("OfferReceiver")
caseOffers CaseOffer[]
supportedCases CaseSupport[]
caseUpdates CaseUpdate[]
lawyerRelationships ClientLawyerRelationship[] @relation("LawyerRelationships")
clientRelationships ClientLawyerRelationship[] @relation("ClientRelationships")
clientPortal ClientPortal?
lawyerTestimonials ClientTestimonial[] @relation("LawyerTestimonials")
clientTestimonials ClientTestimonial[] @relation("ClientTestimonials")
clientConsultations ConsultationBooking[] @relation("ClientConsultations")
lawyerConsultations ConsultationBooking[] @relation("LawyerConsultations")
courseEnrollments CourseEnrollment[]
assignedDocuments DocumentCollaboration[] @relation("AssignedDocuments")
createdDocuments DocumentCollaboration[] @relation("CreatedDocuments")
donations Donation[]
emailTemplates EmailTemplate[]
lawyerEscrows EscrowAccount[] @relation("LawyerEscrows")
clientEscrows EscrowAccount[] @relation("ClientEscrows")
approvedReleases EscrowRelease[] @relation("ApprovedReleases")
financialSummary FinancialSummary? @relation("FinancialSummary")
impersonatedSessions ImpersonationSession[] @relation("ImpersonatedUser")
originalImpersonations ImpersonationSession[] @relation("OriginalUser")
givenRatings LawyerRating[] @relation("RatingUser")
lawyerRatings LawyerRating[] @relation("RatedLawyer")
lawyerStats LawyerStats?
casesCreated LegalCase[] @relation("CaseCreator")
casesAsLead LegalCase[] @relation("LeadLawyer")
lodgeMemberships LodgeMembership[] @relation("LodgeMemberships")
menteeSessions MentorSession[] @relation("Mentee")
mentoringSessions MentorSession[] @relation("Mentor")
userNotifications Notification[]
approvedRefunds PaymentRefund[] @relation("ApprovedRefunds")
requestedRefunds PaymentRefund[] @relation("RequestedRefunds")
payments Payment[]
segments Segment[]
statusNotes StatusNote[]
createdTasks Task[] @relation("CreatedTasks")
assignedTasks Task[] @relation("AssignedTasks")
transactions Transaction[] @relation("UserTransactions")
TypingStatus TypingStatus[]
achievements UserAchievement[]
badges UserBadge[]
degrees UserDegree[]
subscriptions UserSubscription[]
lawFirm LawFirm? @relation("FirmLawyers", fields: [lawFirmId], references: [id])
createdDocumentVersions DocumentVersion[] @relation("CreatedDocumentVersions")
documentComments DocumentComment[] @relation("DocumentComments")
grantedDocumentPermissions DocumentPermission[] @relation("PermissionGrantedBy")
receivedDocumentPermissions DocumentPermission[] @relation("PermissionUser")
createdEvents CalendarEvent[] @relation("CreatedEvents")
offerClients CaseOffer[] @relation("OfferClient")
lawyerRetainers RetainerAgreement[] @relation("LawyerRetainers")
clientRetainers RetainerAgreement[] @relation("ClientRetainers")
caseClients LegalCase[] @relation("CaseClient")
primaryLawyerCases LegalCase[] @relation("PrimaryLawyer")
assistantLawyerCases LegalCase[] @relation("AssistantLawyer")
secretaryCases LegalCase[] @relation("Secretary")
escrowAccount EscrowAccount?
ratings LawyerRating[]
userLegalCases User[] @relation("UserLegalCases")
@@map("users")
}
model UserProfile {
id String @id @default(cuid())
userId String @unique
availability String?
workingHours String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model Permission {
id String @id @default(cuid())
role String
resource String
action String
conditions String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([role, resource, action])
@@map("permissions")
}
model CaseAssignment {
id String @id @default(cuid())
registrationId String
userId String
role String
assignedAt DateTime @default(now())
assignedBy String
isActive Boolean @default(true)
caseId String?
assignedByUser User @relation("AssignedCases", fields: [assignedBy], references: [id])
user User @relation(fields: [userId], references: [id])
registration Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
legalCase LegalCase? @relation(fields: [caseId], references: [id])
@@unique([registrationId, userId])
@@map("case_assignments")
}
model Registration {
id String @id @default(cuid())
firstName String
lastName String
email String
phone String
birthDate DateTime
gender String?
relationship String
preferredLanguage String
preferredContactMethod String
message String?
additionalNotes String?
lawyerName String?
lawyerEmail String?
lawyerPhone String?
lawFirm String?
status String @default("PENDING")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userId String?
createdBy String?
reminders String? @default("[]")
previousLegalActions String?
reasonForJoining String?
howDidYouHearAboutUs String?
representation String?
urgentNeeds String?
caseId String?
address Address?
detaineeInfo DetaineeInfo?
documents Document[]
privateChat PrivateChat?
creator User? @relation("CreatedRegistrations", fields: [createdBy], references: [id])
user User? @relation(fields: [userId], references: [id])
legalCase LegalCase? @relation(fields: [caseId], references: [id])
caseAssignments CaseAssignment[]
statusNotes StatusNote[]
}
model Address {
id String @id @default(cuid())
street String
city String
state String
postalCode String
country String
registrationId String @unique
registration Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
}
model DetaineeInfo {
id String @id @default(cuid())
name String
facility String
inmateId String
incarcerationDate DateTime
expectedReleaseDate DateTime?
registrationId String @unique
registration Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
}
model FileUpload {
id String @id @default(uuid())
originalName String
storedName String
mimeType String
size Int
path String
registrationId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Document {
id String @id @default(cuid())
name String
title String?
type String
url String
filePath String?
fileSize Int?
uploadedBy String?
caseId String?
status String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
registrationId String
userId String
user User @relation("UserDocuments", fields: [userId], references: [id])
registration Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
versions DocumentVersion[]
comments DocumentComment[]
permissions DocumentPermission[]
}
model DocumentVersion {
id String @id @default(cuid())
documentId String
version Int
content String
createdAt DateTime @default(now())
createdById String
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
createdBy User @relation("CreatedDocumentVersions", fields: [createdById], references: [id])
@@unique([documentId, version])
}
model DocumentComment {
id String @id @default(cuid())
documentId String
userId String
content String
createdAt DateTime @default(now())
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
user User @relation("DocumentComments", fields: [userId], references: [id])
}
model DocumentPermission {
id String @id @default(cuid())
documentId String
userId String
canEdit Boolean @default(false)
canComment Boolean @default(false)
canView Boolean @default(true)
grantedById String
createdAt DateTime @default(now())
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
user User @relation("PermissionUser", fields: [userId], references: [id])
grantedBy User @relation("PermissionGrantedBy", fields: [grantedById], references: [id])
@@unique([documentId, userId])
}
model ThemeProfile {
id String @id @default(cuid())
name String
colors String
createdAt DateTime @default(now())
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model ChatRoom {
id String @id @default(cuid())
name String @unique
description String?
isPublic Boolean @default(true)
type String @default("GROUP")
createdById String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
participants ChatParticipant[]
createdBy User @relation("CreatedChatRooms", fields: [createdById], references: [id])
messages Message[]
typingStatuses TypingStatus[]
}
model ChatParticipant {
id String @id @default(cuid())
userId String
chatRoomId String
role String @default("MEMBER")
joinedAt DateTime @default(now())
chatRoom ChatRoom @relation(fields: [chatRoomId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([userId, chatRoomId])
}
model Message {
id String @id @default(cuid())
content String
type String @default("TEXT")
fileUrl String?
fileName String?
fileSize Int?
mimeType String?
editedAt DateTime?
isEdited Boolean @default(false)
replyToId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userId String
chatRoomId String
replyTo Message? @relation("MessageReplies", fields: [replyToId], references: [id])
replies Message[] @relation("MessageReplies")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
chatRoom ChatRoom @relation(fields: [chatRoomId], references: [id], onDelete: Cascade)
reactions MessageReaction[]
}
model PrivateChat {
id String @id @default(cuid())
registrationId String @unique
userId String
adminId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
admin User? @relation("AdminChats", fields: [adminId], references: [id])
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
registration Registration @relation(fields: [registrationId], references: [id], onDelete: Cascade)
messages PrivateMessage[]
}
model PrivateMessage {
id String @id @default(cuid())
content String
type String @default("TEXT")
fileUrl String?
fileName String?
fileSize Int?
mimeType String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
senderId String
privateChatId String
privateChat PrivateChat @relation(fields: [privateChatId], references: [id], onDelete: Cascade)
sender User @relation(fields: [senderId], references: [id], onDelete: Cascade)
}
model DirectMessage {
id String @id @default(cuid())
content String
type String @default("TEXT")
fileUrl String?
fileName String?
fileSize Int?
mimeType String?
isRead Boolean @default(false)
caseId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
senderId String
recipientId String
sender User @relation("SentDirectMessages", fields: [senderId], references: [id], onDelete: Cascade)
recipient User @relation("ReceivedDirectMessages", fields: [recipientId], references: [id], onDelete: Cascade)
}
model StatusNote {
id String @id @default(cuid())
content String
registrationId String
adminId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
admin User @relation(fields: [adminId], references: [id])
registration Registration @relation(fields: [registrationId], references: [id])
@@map("status_notes")
}
model TypingStatus {
id String @id @default(cuid())
userId String
chatRoomId String
isTyping Boolean @default(false)
updatedAt DateTime @updatedAt
chatRoom ChatRoom @relation(fields: [chatRoomId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, chatRoomId])
@@map("typing_statuses")
}
model MessageReaction {
id String @id @default(cuid())
messageId String
userId String
emoji String
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
@@unique([messageId, userId, emoji])
}
model NewsletterSubscription {
id String @id @default(cuid())
email String @unique
language String @default("en")
source String @default("website")
subscriptionDate DateTime @default(now())
isActive Boolean @default(true)
confirmedAt DateTime?
unsubscribedAt DateTime?
tags String?
metadata String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
campaignEvents CampaignEvent[]
segmentMembers SegmentMember[]
@@map("newsletter_subscriptions")
}
model EmailTemplate {
id String @id @default(cuid())
name String
subject String
htmlContent String
textContent String?
thumbnail String?
category String @default("general")
isActive Boolean @default(true)
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
campaigns Campaign[]
creator User @relation(fields: [createdBy], references: [id])
@@map("email_templates")
}
model Campaign {
id String @id @default(cuid())
name String
subject String
templateId String?
htmlContent String?
textContent String?
status String @default("draft")
targetLanguage String?
targetTags String?
segmentId String?
scheduledAt DateTime?
sentAt DateTime?
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
isAbTest Boolean @default(false)
abTestPercent Int?
abTestWinner String?
totalSent Int @default(0)
totalOpened Int @default(0)
totalClicked Int @default(0)
totalBounced Int @default(0)
totalUnsubscribed Int @default(0)
events CampaignEvent[]
abVariants CampaignVariant[]
creator User @relation(fields: [createdBy], references: [id])
segment Segment? @relation(fields: [segmentId], references: [id])
template EmailTemplate? @relation(fields: [templateId], references: [id])
@@map("campaigns")
}
model CampaignVariant {
id String @id @default(cuid())
campaignId String
variant String
subject String
htmlContent String
textContent String?
sentCount Int @default(0)
openCount Int @default(0)
clickCount Int @default(0)
campaign Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade)
@@map("campaign_variants")
}
model CampaignEvent {
id String @id @default(cuid())
campaignId String
subscriptionId String
eventType String
eventData String?
userAgent String?
ipAddress String?
createdAt DateTime @default(now())
subscription NewsletterSubscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
campaign Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade)
@@map("campaign_events")
}
model Segment {
id String @id @default(cuid())
name String
description String?
conditions String
isActive Boolean @default(true)
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
campaigns Campaign[]
members SegmentMember[]
creator User @relation(fields: [createdBy], references: [id])
@@map("segments")
}
model SegmentMember {
id String @id @default(cuid())
segmentId String
subscriptionId String
addedAt DateTime @default(now())
subscription NewsletterSubscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
segment Segment @relation(fields: [segmentId], references: [id], onDelete: Cascade)
@@unique([segmentId, subscriptionId])
@@map("segment_members")
}
model AutomationRule {
id String @id @default(cuid())
name String
description String?
triggerType String
conditions String
actions String
isActive Boolean @default(true)
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creator User @relation(fields: [createdBy], references: [id])
@@map("automation_rules")
}
model ImpersonationSession {
id String @id @default(cuid())
originalUserId String
impersonatedUserId String
createdAt DateTime @default(now())
endedAt DateTime?
isActive Boolean @default(true)
reason String?
ipAddress String?
userAgent String?
impersonatedUser User @relation("ImpersonatedUser", fields: [impersonatedUserId], references: [id], onDelete: Cascade)
originalUser User @relation("OriginalUser", fields: [originalUserId], references: [id], onDelete: Cascade)
@@unique([originalUserId, isActive])
@@map("impersonation_sessions")
}
model LegalCase {
id String @id @default(cuid())
title String
description String
caseNumber String? @unique
caseType String
status String @default("active")
jurisdiction String
court String?
priority String @default("medium")
budget Float?
expectedDuration Int?
filingDate DateTime?
applicationDeadline DateTime?
isAcceptingApplications Boolean @default(true)
isPublic Boolean @default(false)
category String?
legalArea String?
urgencyLevel String @default("NORMAL")
viewCount Int @default(0)
supporterCount Int @default(0)
estimatedValue Float?
actualValue Float?
startDate DateTime?
expectedEndDate DateTime?
actualEndDate DateTime?
riskLevel String @default("MEDIUM")
publicSummary String?
tags String?
requiredDocuments String?
eligibilityCriteria String?
firmName String?
clientId String?
primaryLawyerId String?
assistantLawyerId String?
secretaryId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
leadLawyerId String
createdBy String
registrations Registration[]
analyticsEvents AnalyticsTracking[]
calendarEvents CalendarEvent[]
caseAssignments CaseAssignment[]
offers CaseOffer[]
supporters CaseSupport[]
caseUpdates CaseUpdate[]
clientRelationships ClientLawyerRelationship[]
clientPortals ClientPortal[]
testimonials ClientTestimonial[]
documentCollaborations DocumentCollaboration[]
escrowAccount EscrowAccount?
ratings LawyerRating[]
documents Document[]
directMessages DirectMessage[]
userLegalCases User[] @relation("UserLegalCases")
creator User @relation("CaseCreator", fields: [createdBy], references: [id])
leadLawyer User @relation("LeadLawyer", fields: [leadLawyerId], references: [id])
primaryLawyer User? @relation("PrimaryLawyer", fields: [primaryLawyerId], references: [id])
assistantLawyer User? @relation("AssistantLawyer", fields: [assistantLawyerId], references: [id])
secretary User? @relation("Secretary", fields: [secretaryId], references: [id])
client User? @relation("CaseClient", fields: [clientId], references: [id])
payments Payment[]
tasks Task[]
@@map("legal_cases")
}
model CaseUpdate {
id String @id @default(cuid())
caseId String
title String
description String
updateType String
isPublic Boolean @default(false)
createdAt DateTime @default(now())
createdBy String
author User @relation(fields: [createdBy], references: [id])
case LegalCase @relation(fields: [caseId], references: [id], onDelete: Cascade)
@@map("case_updates")
}
model LawFirm {
id String @id @default(cuid())
name String @unique
shortName String?
address String
city String
province String
postalCode String
phone String?
email String?
website String?
barRegistration String?
foundedYear Int?
specializations String?
partnershipType String @default("partner")
contractStart DateTime @default(now())
contractEnd DateTime?
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lawyers User[] @relation("FirmLawyers")
@@map("law_firms")
}
model LawyerRating {
id String @id @default(cuid())
lawyerId String
userId String
caseId String?
boldnessScore Int
transparencyScore Int
communicationScore Int
resultsScore Int
overallScore Float
review String?
isPublic Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
case LegalCase? @relation(fields: [caseId], references: [id])
rater User @relation("RatingUser", fields: [userId], references: [id])
lawyer User @relation("RatedLawyer", fields: [lawyerId], references: [id])
@@unique([lawyerId, userId, caseId])
@@map("lawyer_ratings")
}
model CaseOffer {
id String @id @default(cuid())
caseId String
lawyerId String
receiverId String
clientId String?
offerType String
message String?
proposedRate Float?
estimatedHours Int?
status String @default("PENDING")
expiresAt DateTime?
collaborationType String?
feeSplit String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
receiver User @relation("OfferReceiver", fields: [receiverId], references: [id])
lawyer User @relation(fields: [lawyerId], references: [id])
client User? @relation("OfferClient", fields: [clientId], references: [id])
case LegalCase @relation(fields: [caseId], references: [id])
@@map("case_offers")
}
model Badge {
id String @id @default(cuid())
name String @unique
description String
icon String
category String
requirements String
xpReward Int @default(0)
rarity String @default("COMMON")
isActive Boolean @default(true)
createdAt DateTime @default(now())
userBadges UserBadge[]
@@map("badges")
}
model UserBadge {
id String @id @default(cuid())
userId String
badgeId String
earnedAt DateTime @default(now())
isVisible Boolean @default(true)
badge Badge @relation(fields: [badgeId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, badgeId])
@@map("user_badges")
}
model Achievement {
id String @id @default(cuid())
name String @unique
description String
type String
target Int
xpReward Int @default(0)
badgeReward String?
isRepeatable Boolean @default(false)
isActive Boolean @default(true)
createdAt DateTime @default(now())
userAchievements UserAchievement[]
@@map("achievements")
}
model UserAchievement {
id String @id @default(cuid())
userId String
achievementId String
currentProgress Int @default(0)
isCompleted Boolean @default(false)
completedAt DateTime?
lastUpdated DateTime @default(now())
achievement Achievement @relation(fields: [achievementId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, achievementId])
@@map("user_achievements")
}
model BusinessProfile {
id String @id @default(cuid())
userId String @unique
businessName String
businessType String
industry String?
description String?
logo String?
website String?
phone String?
email String?
address String?
registrationNumber String?
taxId String?
employeeCount String?
annualRevenue String?
isPublic Boolean @default(false)
isVerified Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
verificationStatus String @default("PENDING")
verificationNote String?
verifiedAt DateTime?
user User @relation(fields: [userId], references: [id])
}
model Donation {
id String @id @default(cuid())
userId String?
amount Float
currency String @default("CAD")
type String
targetId String?
message String?
isAnonymous Boolean @default(false)
paymentMethod String
paymentId String?
status String @default("PENDING")
createdAt DateTime @default(now())
user User? @relation(fields: [userId], references: [id])
@@map("donations")
}
model Payment {
id String @id @default(cuid())
userId String
amount Float
currency String @default("CAD")
type String
description String?
paymentMethod String
stripePaymentIntentId String? @unique
stripeChargeId String? @unique
stripeFeeAmount Float?
status String @default("PENDING")
failureReason String?
caseId String?
escrowId String?
societyDiscount Float @default(0.0)
xpEarned Int @default(0)
platformFeeAmount Float @default(0.0)
lawyerPayoutAmount Float @default(0.0)
refundAmount Float @default(0.0)
metadata String?
paymentDate DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
refunds PaymentRefund[]
escrow EscrowAccount? @relation(fields: [escrowId], references: [id])
case LegalCase? @relation(fields: [caseId], references: [id])
user User @relation(fields: [userId], references: [id])
transactions Transaction[]
@@map("payments")
}
model EscrowAccount {
id String @id @default(cuid())
caseId String @unique
clientId String
lawyerId String
totalAmount Float
availableAmount Float
heldAmount Float @default(0.0)
releasedAmount Float @default(0.0)
milestoneReleases String?
autoReleaseDate DateTime?
status String @default("ACTIVE")
disputeReason String?
societyFeeDiscount Float @default(0.0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lawyer User @relation("LawyerEscrows", fields: [lawyerId], references: [id])
client User @relation("ClientEscrows", fields: [clientId], references: [id])
case LegalCase @relation(fields: [caseId], references: [id])
releases EscrowRelease[]
payments Payment[]
@@map("escrow_accounts")
}
model EscrowRelease {
id String @id @default(cuid())
escrowId String
amount Float
releaseType String
reason String
approvedBy String?
milestoneDescription String?
milestoneNumber Int?
status String @default("PENDING")
releasedAt DateTime?
createdAt DateTime @default(now())
approver User? @relation("ApprovedReleases", fields: [approvedBy], references: [id])
escrow EscrowAccount @relation(fields: [escrowId], references: [id])
@@map("escrow_releases")
}
model Transaction {
id String @id @default(cuid())
paymentId String?
userId String
type String
amount Float
currency String @default("CAD")
direction String
balanceBefore Float @default(0.0)
balanceAfter Float @default(0.0)
referenceId String?
referenceType String?
description String
metadata String?
transactionDate DateTime @default(now())
createdAt DateTime @default(now())
user User @relation("UserTransactions", fields: [userId], references: [id])
payment Payment? @relation(fields: [paymentId], references: [id])
@@map("transactions")
}
model PaymentRefund {
id String @id @default(cuid())
paymentId String
amount Float
reason String
stripeRefundId String? @unique
status String @default("PENDING")
processedAt DateTime?
requestedBy String
approvedBy String?
metadata String?
createdAt DateTime @default(now())
approver User? @relation("ApprovedRefunds", fields: [approvedBy], references: [id])
requester User @relation("RequestedRefunds", fields: [requestedBy], references: [id])
payment Payment @relation(fields: [paymentId], references: [id])
@@map("payment_refunds")
}
model SocietyPricingTier {
id String @id @default(cuid())
name String @unique
track String
minDegreeNumber Int
minXP Int @default(0)
minLevel Int @default(1)
platformFeeDiscount Float @default(0.0)
prioritySupport Boolean @default(false)
advancedFeatures String?
customBranding Boolean @default(false)
baseCommissionRate Float @default(0.10)
discountedRate Float?
description String?
benefits String?
isActive Boolean @default(true)
createdAt DateTime @default(now())
@@map("society_pricing_tiers")
}
model FinancialSummary {
id String @id @default(cuid())
userId String @unique
totalEarnings Float @default(0.0)
thisMonthEarnings Float @default(0.0)
pendingPayouts Float @default(0.0)
totalCaseFees Float @default(0.0)
totalSpent Float @default(0.0)
thisMonthSpent Float @default(0.0)
escrowBalance Float @default(0.0)
totalCommissionPaid Float @default(0.0)
societyDiscountsSaved Float @default(0.0)
currentTier String?
nextTierProgress Float @default(0.0)
paymentCount Int @default(0)
refundCount Int @default(0)
disputeCount Int @default(0)
lastCalculated DateTime @default(now())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation("FinancialSummary", fields: [userId], references: [id])
@@map("financial_summaries")
}
model CourseEnrollment {
id String @id @default(cuid())
userId String
courseId String
enrollmentDate DateTime @default(now())
completionDate DateTime?
status String @default("IN_PROGRESS")
progress Float @default(0.0)
certificateUrl String?
course Course @relation(fields: [courseId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, courseId])
@@map("course_enrollments")
}
model MentorSession {
id String @id @default(cuid())
mentorId String
menteeId String
sessionDate DateTime @default(now())
duration Int
notes String?
status String @default("SCHEDULED")
mentee User @relation("Mentee", fields: [menteeId], references: [id])
mentor User @relation("Mentor", fields: [mentorId], references: [id])
@@unique([mentorId, menteeId, sessionDate])
@@map("mentor_sessions")
}
model Course {
id String @id @default(cuid())
title String
description String
category String
level Int @default(1)
instructor String?
instructorId String?
duration Int
xpReward Int @default(0)
badgeReward String?
prerequisites String?
syllabus String
materials String?
isPublic Boolean @default(true)
isActive Boolean @default(true)
price Float @default(0.0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
enrollments CourseEnrollment[]
@@map("courses")
}
model LawResource {
id String @id @default(cuid())
title String
type String
category String
description String?
author String?
publisher String?
publicationDate DateTime?
isbn String?
url String?
coverImage String?
preview String?
fullContent String?
tags String?
difficultyLevel String @default("BEGINNER")
isPublic Boolean @default(true)
isActive Boolean @default(true)
viewCount Int @default(0)
downloadCount Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("law_resources")
}
model SocietyDegree {
id String @id @default(cuid())
degreeNumber Int
name String
title String?
description String
requirements String
xpRequired Int
casesRequired Int @default(0)
winRateRequired Float?
clientsRequired Int @default(0)
proBonoRequired Int @default(0)
badgesRequired String?
coursesRequired String?
mentorshipRequired Int @default(0)
track String @default("LAWYER")
trackSpecificReqs String?
ceremonialText String?
symbol String?
color String?
privileges String?
previousDegreeId String?
timeRequirement Int?
lodgeLevel String @default("BLUE")
isSecret Boolean @default(false)
maxMembers Int?
isActive Boolean @default(true)
createdAt DateTime @default(now())
mentorships BrotherhoodMentorship[] @relation("MentorshipDegrees")
ceremonies DegreeCeremony[]
previousDegree SocietyDegree? @relation("DegreeProgression", fields: [previousDegreeId], references: [id])
nextDegrees SocietyDegree[] @relation("DegreeProgression")
userDegrees UserDegree[]
@@unique([degreeNumber, track])
@@map("society_degrees")
}
model UserDegree {
id String @id @default(cuid())
userId String
degreeId String
achievedAt DateTime @default(now())
ceremonyCompleted Boolean @default(false)
ceremonyDate DateTime?
presentedBy String?
witnessedBy String?
notes String?
progressPercentage Float @default(0.0)
isCurrentTarget Boolean @default(false)
ceremony DegreeCeremony?
degree SocietyDegree @relation(fields: [degreeId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, degreeId])
@@map("user_degrees")
}
model DegreeCeremony {
id String @id @default(cuid())
degreeId String
userDegreeId String @unique
ceremonyDate DateTime @default(now())
conductedBy String
witnesses String?
location String?
notes String?
isPublic Boolean @default(false)
userDegree UserDegree @relation(fields: [userDegreeId], references: [id])
degree SocietyDegree @relation(fields: [degreeId], references: [id])
@@map("degree_ceremonies")
}
model BrotherhoodMentorship {
id String @id @default(cuid())
mentorId String
menteeId String
degreeId String?
status String @default("ACTIVE")
startDate DateTime @default(now())
endDate DateTime?
sessionsCompleted Int @default(0)
goalSessions Int @default(5)
progressNotes String?
wasSuccessful Boolean?
mentorRating Int?
menteeRating Int?
degree SocietyDegree? @relation("MentorshipDegrees", fields: [degreeId], references: [id])
mentee User @relation("Menteeships", fields: [menteeId], references: [id])
mentor User @relation("Mentorships", fields: [mentorId], references: [id])
sessions MentorshipSession[]
@@unique([mentorId, menteeId, degreeId])
@@map("brotherhood_mentorships")
}
model MentorshipSession {
id String @id @default(cuid())
mentorshipId String
sessionDate DateTime @default(now())
duration Int?
topic String
objectives String?
outcomes String?
nextSteps String?
menteeProgress Int?
mentorship BrotherhoodMentorship @relation(fields: [mentorshipId], references: [id])
@@map("mentorship_sessions")
}
model Lodge {
id String @id @default(cuid())
name String @unique
description String
lodgeLevel String
track String @default("LAWYER")
minimumDegree Int
maximumMembers Int?
currentMembers Int @default(0)
isSecret Boolean @default(false)
foundedDate DateTime @default(now())
meetingSchedule String?
meetingLocation String?
memberships LodgeMembership[]
@@map("lodges")
}
model LodgeMembership {
id String @id @default(cuid())
userId String
lodgeId String
joinedDate DateTime @default(now())
role String @default("MEMBER")
isActive Boolean @default(true)
contributions Int @default(0)
lodge Lodge @relation(fields: [lodgeId], references: [id])
user User @relation("LodgeMemberships", fields: [userId], references: [id])
@@unique([userId, lodgeId])
@@map("lodge_memberships")
}
model CaseSupport {
id String @id @default(cuid())
userId String
caseId String
createdAt DateTime @default(now())
case LegalCase @relation(fields: [caseId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, caseId])
@@map("case_supports")
}
model ClientLawyerRelationship {
id String @id @default(cuid())
clientId String
lawyerId String
caseId String?
relationshipType String
startDate DateTime @default(now())
endDate DateTime?
isActive Boolean @default(true)
totalHoursWorked Float?
totalFeePaid Float?
feeStructure String?
caseStatus String?
outcomeDescription String?
settlementAmount Float?
clientSatisfaction Int?
wouldRecommend Boolean?
impactLevel String?
clientReview String?
lawyerNotes String?
publicTestimonial String?
isTestimonialPublic Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
case LegalCase? @relation(fields: [caseId], references: [id])
lawyer User @relation("LawyerRelationships", fields: [lawyerId], references: [id])
client User @relation("ClientRelationships", fields: [clientId], references: [id])
testimonials ClientTestimonial[]
milestones RelationshipMilestone[]
@@map("client_lawyer_relationships")
}
model RelationshipMilestone {
id String @id @default(cuid())
relationshipId String
milestoneType String
title String
description String?
date DateTime @default(now())
amount Float?
isPublic Boolean @default(false)
relationship ClientLawyerRelationship @relation(fields: [relationshipId], references: [id], onDelete: Cascade)
@@map("relationship_milestones")
}
model LawyerStats {
id String @id @default(cuid())
lawyerId String @unique
totalClients Int @default(0)
activeClients Int @default(0)
casesWon Int @default(0)
casesLost Int @default(0)
casesSettled Int @default(0)
casesDismissed Int @default(0)
winRate Float @default(0.0)
totalRevenue Float @default(0.0)
averageHourlyRate Float?
totalProBonoHours Float @default(0.0)
totalProBonoValue Float @default(0.0)
averageSatisfaction Float @default(0.0)
recommendationRate Float @default(0.0)
totalTestimonials Int @default(0)
lifeChangingCases Int @default(0)
totalSettlementValue Float @default(0.0)
lastCalculated DateTime @default(now())
lawyer User @relation(fields: [lawyerId], references: [id])
@@map("lawyer_stats")
}
model ClientTestimonial {
id String @id @default(cuid())
clientId String
lawyerId String
relationshipId String?
caseId String?
title String
content String
beforeSituation String?
afterSituation String?
category String
impactLevel String
isPublic Boolean @default(false)
isFeatured Boolean @default(false)
helpfulVotes Int @default(0)
views Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
case LegalCase? @relation(fields: [caseId], references: [id])
relationship ClientLawyerRelationship? @relation(fields: [relationshipId], references: [id])
lawyer User @relation("LawyerTestimonials", fields: [lawyerId], references: [id])
client User @relation("ClientTestimonials", fields: [clientId], references: [id])
@@map("client_testimonials")
}
model SubscriptionPlan {
id String @id @default(cuid())
name String @unique
description String
price Float
currency String @default("CAD")
billingCycle String @default("MONTHLY")
features String
maxCases Int @default(10)
maxUsers Int @default(10)
maxTeamMembers Int @default(5)
advancedAnalytics Boolean @default(false)
prioritySupport Boolean @default(false)
customBranding Boolean @default(false)
apiAccess Boolean @default(false)
societyDiscount Float @default(0.0)
xpMultiplier Float @default(1.0)
isActive Boolean @default(true)
sortOrder Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
subscriptions UserSubscription[]
@@map("subscription_plans")
}
model UserSubscription {
id String @id @default(cuid())
userId String
planId String
status String @default("ACTIVE")
currentPeriodStart DateTime
currentPeriodEnd DateTime
cancelAtPeriodEnd Boolean @default(false)
stripeSubscriptionId String? @unique
stripeCustomerId String?
lastPaymentDate DateTime?
nextPaymentDate DateTime?
amountPaid Float @default(0.0)
metadata String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
plan SubscriptionPlan @relation(fields: [planId], references: [id])
user User @relation(fields: [userId], references: [id])
@@unique([userId, planId])
@@map("user_subscriptions")
}
model ConsultationBooking {
id String @id @default(cuid())
lawyerId String
clientId String
preferredDate DateTime
preferredTime String
duration Int @default(60)
consultationType String @default("GENERAL")
status String @default("PENDING")
message String?
hourlyRate Float?
totalAmount Float?
meetingLink String?
meetingPlatform String?
notes String?
lawyerNotes String?
clientNotes String?
followUpDate DateTime?
followUpNotes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
client User @relation("ClientConsultations", fields: [clientId], references: [id])
lawyer User @relation("LawyerConsultations", fields: [lawyerId], references: [id])
@@map("consultation_bookings")
}
model Task {
id String @id @default(cuid())
title String
description String?
caseId String?
assignedTo String
assignedBy String
priority String @default("MEDIUM")
status String @default("PENDING")
dueDate DateTime?
completedAt DateTime?
estimatedHours Float?
actualHours Float?
tags String?
attachments String?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
case LegalCase? @relation(fields: [caseId], references: [id])
assignedByUser User @relation("CreatedTasks", fields: [assignedBy], references: [id])
assignedToUser User @relation("AssignedTasks", fields: [assignedTo], references: [id])
@@map("tasks")
}
model CalendarEvent {
id String @id @default(cuid())
title String
description String?
eventType String
date DateTime
startTime String?
endTime String?
duration Int?
priority String @default("MEDIUM")
caseId String?
clientId String?
lawyerId String
location String?
isVirtual Boolean @default(false)
meetingLink String?
courtJurisdiction String?
documentsRequired String?
notes String?
reminders String?
billingRate Float?
estimatedHours Float?
status String @default("SCHEDULED")
linkedEvents String?
aiSuggestions String?
participants String?
createdBy String?
type String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lawyer User @relation("LawyerEvents", fields: [lawyerId], references: [id])
client User? @relation("ClientEvents", fields: [clientId], references: [id])
case LegalCase? @relation(fields: [caseId], references: [id])
createdByUser User? @relation("CreatedEvents", fields: [createdBy], references: [id])
@@map("calendar_events")
}
model DocumentCollaboration {
id String @id @default(cuid())
documentId String
caseId String?
title String
description String?
filePath String
fileType String
fileSize Int
version Int @default(1)
status String @default("DRAFT")
createdBy String
assignedTo String?
dueDate DateTime?
completedAt DateTime?
comments String?
changes String?
permissions String?
tags String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
case LegalCase? @relation(fields: [caseId], references: [id])
assignedToUser User? @relation("AssignedDocuments", fields: [assignedTo], references: [id])
createdByUser User @relation("CreatedDocuments", fields: [createdBy], references: [id])
@@map("document_collaborations")
}
model ClientPortal {
id String @id @default(cuid())
clientId String @unique
caseId String?
accessToken String @unique
isActive Boolean @default(true)
lastAccess DateTime?
preferences String?
notifications Boolean @default(true)
language String @default("en")
theme String @default("light")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
case LegalCase? @relation(fields: [caseId], references: [id])
client User @relation(fields: [clientId], references: [id])
@@map("client_portals")
}
model AnalyticsTracking {
id String @id @default(cuid())
userId String?
caseId String?
eventType String
eventData String?
sessionId String?
userAgent String?
ipAddress String?
timestamp DateTime @default(now())
metadata String?
case LegalCase? @relation(fields: [caseId], references: [id])
user User? @relation(fields: [userId], references: [id])
@@map("analytics_tracking")
}
model Notification {
id String @id @default(cuid())
userId String
type String
title String
message String
data String?
isRead Boolean @default(false)
isArchived Boolean @default(false)
priority String @default("NORMAL")
scheduledFor DateTime?
sentAt DateTime?
readAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
@@map("notifications")
}
model AutomationTask {
id String @id @default(cuid())
name String
description String?
type String
schedule String
enabled Boolean @default(true)
status String @default("active")
lastRun DateTime?
nextRun DateTime?
successCount Int @default(0)
errorCount Int @default(0)
lastError String?
config String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
logs AutomationLog[]
@@map("automation_tasks")
}
model AutomationLog {
id String @id @default(cuid())
taskId String
status String
output String?
error String?
executionTime DateTime @default(now())
duration Int?
task AutomationTask @relation(fields: [taskId], references: [id], onDelete: Cascade)
@@map("automation_logs")
}
model RetainerAgreement {
id String @id @default(cuid())
lawyerId String
clientId String
monthlyRate Float
services String
startDate DateTime
message String?
status String @default("PENDING")
isActive Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lawyer User @relation("LawyerRetainers", fields: [lawyerId], references: [id])
client User @relation("ClientRetainers", fields: [clientId], references: [id])
@@map("retainer_agreements")
}