Files
apollo-backend/prisma/schema.prisma
2026-03-30 21:41:06 +07:00

234 lines
7.1 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
}
enum UserRole {
CLIENT
MANAGER
}
enum RegistrationStatus {
PENDING
APPROVED
REJECTED
}
enum MessengerType {
TELEGRAM
MAX
}
enum OrderKind {
READY
CALCULATION
}
enum OrderStatus {
NEW
MANAGER_PROCESSING
WAITING_DOUBLE_CONFIRM
CLIENT_REJECTED
MANAGER_REJECTED
MANAGER_BLOCKED
CONFIRMED
IN_PROGRESS
COMPLETED
}
enum WithdrawalStatus {
PENDING
APPROVED
REJECTED
}
model Company {
id String @id @default(cuid())
name String @unique
inn String? @unique
users User[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model User {
id String @id @default(cuid())
email String @unique
fullName String
role UserRole
companyId String?
company Company? @relation(fields: [companyId], references: [id])
registrationRequests RegistrationRequest[] @relation("RegistrationRequester")
reviewedRequests RegistrationRequest[] @relation("RegistrationReviewer")
sentInvitations Invitation[] @relation("InvitationManager")
acceptedInvitations Invitation[] @relation("InvitationAcceptor")
messengerConnections MessengerConnection[]
clientOrders Order[] @relation("OrderClient")
managerOrders Order[] @relation("OrderManager")
orderStatusEvents OrderStatusEvent[]
referralAsReferrer ReferralLink[] @relation("ReferralReferrer")
referralAsReferee ReferralLink[] @relation("ReferralReferee")
bonusTransactions BonusTransaction[]
withdrawalRequests RewardWithdrawalRequest[] @relation("WithdrawalRequester")
reviewedWithdrawals RewardWithdrawalRequest[] @relation("WithdrawalReviewer")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model RegistrationRequest {
id String @id @default(cuid())
companyName String
inn String?
contactName String
email String
status RegistrationStatus @default(PENDING)
rejectionReason String?
requesterId String?
requester User? @relation("RegistrationRequester", fields: [requesterId], references: [id])
reviewedById String?
reviewedBy User? @relation("RegistrationReviewer", fields: [reviewedById], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Invitation {
id String @id @default(cuid())
token String @unique
email String
companyName String
managerId String
manager User @relation("InvitationManager", fields: [managerId], references: [id])
acceptedById String?
acceptedBy User? @relation("InvitationAcceptor", fields: [acceptedById], references: [id])
expiresAt DateTime
acceptedAt DateTime?
createdAt DateTime @default(now())
}
model MessengerConnection {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
type MessengerType
channelId String
isActive Boolean @default(true)
createdAt DateTime @default(now())
@@unique([userId, type, channelId])
}
model Product {
id String @id @default(cuid())
sku String @unique
name String
description String?
isCustomizable Boolean @default(false)
isActive Boolean @default(true)
inventory ProductStock[]
orderItems OrderItem[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Warehouse {
id String @id @default(cuid())
code String @unique
name String
inventory ProductStock[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model ProductStock {
id String @id @default(cuid())
productId String
product Product @relation(fields: [productId], references: [id])
warehouseId String
warehouse Warehouse @relation(fields: [warehouseId], references: [id])
availableQty Decimal @db.Decimal(14, 3)
updatedAt DateTime @updatedAt
@@unique([productId, warehouseId])
}
model Order {
id String @id @default(cuid())
code String @unique
kind OrderKind
customerId String
customer User @relation("OrderClient", fields: [customerId], references: [id])
managerId String?
manager User? @relation("OrderManager", fields: [managerId], references: [id])
status OrderStatus @default(NEW)
clientApproved Boolean?
managerApproved Boolean?
blockReason String?
deliveryTerms String?
deliveryFee Decimal? @db.Decimal(14, 2)
totalPrice Decimal? @db.Decimal(14, 2)
calculationPayload Json?
items OrderItem[]
history OrderStatusEvent[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model OrderItem {
id String @id @default(cuid())
orderId String
order Order @relation(fields: [orderId], references: [id])
productId String?
product Product? @relation(fields: [productId], references: [id])
productName String
quantity Decimal @db.Decimal(14, 3)
createdAt DateTime @default(now())
}
model OrderStatusEvent {
id String @id @default(cuid())
orderId String
order Order @relation(fields: [orderId], references: [id])
status OrderStatus
actorUserId String
actorUser User @relation(fields: [actorUserId], references: [id])
note String?
createdAt DateTime @default(now())
}
model ReferralLink {
id String @id @default(cuid())
referrerId String
referrer User @relation("ReferralReferrer", fields: [referrerId], references: [id])
refereeId String
referee User @relation("ReferralReferee", fields: [refereeId], references: [id])
createdAt DateTime @default(now())
@@unique([referrerId, refereeId])
}
model BonusTransaction {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
amount Decimal @db.Decimal(14, 2)
reason String
orderId String?
createdAt DateTime @default(now())
}
model RewardWithdrawalRequest {
id String @id @default(cuid())
requesterId String
requester User @relation("WithdrawalRequester", fields: [requesterId], references: [id])
amount Decimal @db.Decimal(14, 2)
status WithdrawalStatus @default(PENDING)
reviewedById String?
reviewedBy User? @relation("WithdrawalReviewer", fields: [reviewedById], references: [id])
reviewComment String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}