Files
padmaja/prisma/schema.prisma
2026-01-17 14:17:42 +05:30

435 lines
11 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Account {
id String @id @default(cuid())
userId String
type String
provider String
providerAccountId String
refresh_token String? @db.Text
access_token String? @db.Text
expires_at Int?
token_type String?
scope String?
id_token String? @db.Text
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model User {
id String @id @default(cuid())
name String?
email String @unique
emailVerified DateTime?
image String?
password String?
role Role @default(CUSTOMER)
referralCode String @unique @default(cuid())
referrerId String?
phone String?
address String?
joinedAt DateTime @default(now())
isActive Boolean @default(true)
currentRankId String?
// Partner-specific fields
partnerTier String? // 'Diamond', 'Gold', 'Silver'
minReferrals Int @default(3) // Minimum members a partner needs to add
accounts Account[]
sessions Session[]
// Referral relationships
referrer User? @relation("UserReferrals", fields: [referrerId], references: [id])
referrals User[] @relation("UserReferrals")
// Orders and transactions
orders Order[]
commissions Commission[] @relation("UserCommissions")
commissionsFrom Commission[] @relation("UserCommissionsFrom")
payouts Payout[]
wallet Wallet?
// Address management
addresses Address[]
// Rank system
currentRank Rank? @relation(fields: [currentRankId], references: [id])
rankAchievements RankAchievement[]
// Form responses
formResponses FormResponse[]
// Reviews and feedback
reviews Review[]
reviewHelpfulVotes ReviewHelpfulVote[]
reviewReports ReviewReport[]
@@map("users")
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
}
model Category {
id String @id @default(cuid())
name String @unique
description String?
image String?
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
products Product[]
@@index([isActive])
@@index([name])
@@map("categories")
}
model Product {
id String @id @default(cuid())
name String
description String?
price Float
discount Float @default(0)
images String[]
stock Int @default(0)
manageStock Boolean @default(true)
sku String @unique
slug String @unique
isActive Boolean @default(true)
categoryId String
brand String?
origin String?
weight String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
category Category @relation(fields: [categoryId], references: [id])
orderItems OrderItem[]
reviews Review[]
@@index([isActive])
@@index([categoryId])
@@index([createdAt])
@@index([isActive, stock])
@@index([categoryId, isActive])
@@index([createdAt, isActive])
@@index([isActive, createdAt(sort: Desc)])
@@index([isActive, createdAt(sort: Desc), categoryId])
@@map("products")
}
model Order {
id String @id @default(cuid())
userId String
total Float
status OrderStatus @default(PENDING)
razorpayOrderId String?
razorpayPaymentId String?
shippingAddressId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
orderItems OrderItem[]
shippingAddress Address? @relation(fields: [shippingAddressId], references: [id])
@@map("orders")
}
model OrderItem {
id String @id @default(cuid())
orderId String
productId String
quantity Int
price Float
order Order @relation(fields: [orderId], references: [id])
product Product @relation(fields: [productId], references: [id])
@@map("order_items")
}
model Commission {
id String @id @default(cuid())
userId String
fromUserId String
orderId String
amount Float
level Int
type CommissionType @default(REFERRAL)
status CommissionStatus @default(PENDING)
createdAt DateTime @default(now())
user User @relation("UserCommissions", fields: [userId], references: [id])
fromUser User @relation("UserCommissionsFrom", fields: [fromUserId], references: [id])
@@map("commissions")
}
model Wallet {
id String @id @default(cuid())
userId String @unique
balance Float @default(0)
totalEarnings Float @default(0)
totalWithdrawn Float @default(0)
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
@@map("wallets")
}
model Payout {
id String @id @default(cuid())
userId String
amount Float
status PayoutStatus @default(PENDING)
bankDetails String?
adminNotes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
@@map("payouts")
}
model CommissionSettings {
id String @id @default(cuid())
level Int @unique
percentage Float
isActive Boolean @default(true)
@@map("commission_settings")
}
model Address {
id String @id @default(cuid())
userId String
firstName String
lastName String
company String?
address1 String
address2 String?
city String
state String
zipCode String
country String @default("India")
phone String?
isDefault Boolean @default(false)
type AddressType @default(HOME)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
orders Order[]
@@map("addresses")
}
model SystemSettings {
id String @id @default(cuid())
siteName String @default("Padmaaja Rasooi")
siteDescription String @default("Premium quality rice products and grains. Experience the finest rice sourced directly from local farmers.")
supportEmail String @default("info@padmajarice.com")
minimumPayout Float @default(1000)
enableReferrals Boolean @default(true)
enableCommissions Boolean @default(true)
maintenanceMode Boolean @default(false)
allowRegistration Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("system_settings")
}
model Rank {
id String @id @default(cuid())
name String @unique
description String?
minReferrals Int @default(0)
minSalesVolume Float @default(0)
minTeamVolume Float @default(0)
commissionMultiplier Float @default(1.0)
benefits String[]
color String @default("#3B82F6")
icon String @default("🏆")
order Int @unique
isActive Boolean @default(true)
createdAt DateTime @default(now())
users User[]
achievements RankAchievement[]
@@map("ranks")
}
model RankAchievement {
id String @id @default(cuid())
userId String
rankId String
achievedAt DateTime @default(now())
user User @relation(fields: [userId], references: [id])
rank Rank @relation(fields: [rankId], references: [id])
@@unique([userId, rankId])
@@map("rank_achievements")
}
enum Role {
ADMIN
MEMBER // For Partners
WHOLESALER // For Wholesale customers
PART_TIME // For those who want part-time job opportunities
CUSTOMER // Regular customers
}
enum OrderStatus {
PENDING
PAID
SHIPPED
DELIVERED
CANCELLED
}
enum CommissionType {
REFERRAL
LEVEL
BONUS
}
enum CommissionStatus {
PENDING
APPROVED
PAID
CANCELLED
}
enum PayoutStatus {
PENDING
APPROVED
REJECTED
PAID
}
enum AddressType {
HOME
WORK
OTHER
}
model FormResponse {
id String @id @default(cuid())
formId String // e.g., "contact", "partnership", "bulk_inquiry"
data Json @db.JsonB // Actual form submission data
status String @default("new")
metadata Json? @db.JsonB // Additional metadata like IP, user agent
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userId String? // Optional relation to user if logged in
user User? @relation(fields: [userId], references: [id])
@@index([status])
@@index([userId])
@@index([formId])
@@map("form_responses")
}
model Review {
id String @id @default(cuid())
productId String
userId String
rating Int @default(5) // 1-5 stars
title String?
comment String?
images String[] @default([])
isVerified Boolean @default(false) // Verified purchase
isApproved Boolean @default(false) // Admin approval
helpfulVotes Int @default(0)
reportCount Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
// Relations for helpful votes and reports
helpfulVotedBy ReviewHelpfulVote[]
reportedBy ReviewReport[]
@@unique([productId, userId]) // One review per user per product
@@index([productId])
@@index([userId])
@@index([rating])
@@index([isApproved])
@@index([createdAt])
@@index([productId, isApproved])
@@index([createdAt, isApproved])
@@index([isApproved, createdAt(sort: Desc)])
@@index([isApproved, createdAt(sort: Desc), productId])
@@map("reviews")
}
model ReviewHelpfulVote {
id String @id @default(cuid())
reviewId String
userId String
review Review @relation(fields: [reviewId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([reviewId, userId])
@@map("review_helpful_votes")
}
model ReviewReport {
id String @id @default(cuid())
reviewId String
userId String
reason ReportReason
comment String?
createdAt DateTime @default(now())
review Review @relation(fields: [reviewId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([reviewId, userId])
@@map("review_reports")
}
enum ReportReason {
SPAM
INAPPROPRIATE
FAKE
OFFENSIVE
OTHER
}