435 lines
11 KiB
Plaintext
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
|
|
}
|