datasource db { provider = "mongodb" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" } model User { id String @id @default(auto()) @map("_id") @db.ObjectId username String email String @unique password String status String // PENDING, VERIFIED personalName String? phrase String? // 12-word verification phrase balance Float @default(0) isAdmin Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations plans Plan[] verificationRequests VerificationRequest[] balanceHistory BalanceHistory[] withdrawalRequests WithdrawalRequest[] } model Plan { id String @id @default(auto()) @map("_id") @db.ObjectId userId String @db.ObjectId user User @relation(fields: [userId], references: [id]) planType String // A, B, C amount Float duration Int // in days status String // ACTIVE, COMPLETED, CANCELLED interest Float @default(0) startDate DateTime endDate DateTime lastInterestCalculation DateTime @default(now()) // Track last interest calculation reinvestedFromPlan String? @db.ObjectId // Reference to original plan if reinvested createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model VerificationRequest { id String @id @default(auto()) @map("_id") @db.ObjectId userId String @db.ObjectId user User @relation(fields: [userId], references: [id]) status String // PENDING, APPROVED, REJECTED adminNote String? // Optional note from admin createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model BalanceHistory { id String @id @default(auto()) @map("_id") @db.ObjectId userId String @db.ObjectId user User @relation(fields: [userId], references: [id]) amount Float type String // TOP_UP, WITHDRAWAL, PLAN_INVESTMENT, PLAN_RETURN, INTEREST description String? balanceBefore Float balanceAfter Float createdAt DateTime @default(now()) referenceId String? @db.ObjectId // Reference to Plan or WithdrawalRequest if applicable } model WithdrawalRequest { id String @id @default(auto()) @map("_id") @db.ObjectId userId String @db.ObjectId user User @relation(fields: [userId], references: [id]) amount Float status String // PENDING, APPROVED, REJECTED adminNote String? // Note from admin (especially if rejected) processedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }