generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" } enum UserRole { CLIENT MANAGER SUPER_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]) counterpartyProfile CounterpartyProfile? deliveryAddresses DeliveryAddress[] @relation("UserDeliveryAddresses") defaultDeliveryAddressId String? defaultDeliveryAddress DeliveryAddress? @relation("UserDefaultDeliveryAddress", fields: [defaultDeliveryAddressId], references: [id], onDelete: SetNull) registrationRequests RegistrationRequest[] @relation("RegistrationRequester") reviewedRequests RegistrationRequest[] @relation("RegistrationReviewer") sentInvitations Invitation[] @relation("InvitationManager") acceptedInvitations Invitation[] @relation("InvitationAcceptor") messengerConnections MessengerConnection[] cart Cart? clientOrders Order[] @relation("OrderClient") managerOrders Order[] @relation("OrderManager") orderStatusEvents OrderStatusEvent[] referralAsReferrer ReferralLink[] @relation("ReferralReferrer") referralAsReferee ReferralLink[] @relation("ReferralReferee") createdReferralLinks ReferralLink[] @relation("ReferralCreator") bonusTransactions BonusTransaction[] withdrawalRequests RewardWithdrawalRequest[] @relation("WithdrawalRequester") reviewedWithdrawals RewardWithdrawalRequest[] @relation("WithdrawalReviewer") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model DeliveryAddress { id String @id @default(cuid()) userId String user User @relation("UserDeliveryAddresses", fields: [userId], references: [id], onDelete: Cascade) label String? address String unrestrictedValue String? fiasId String? defaultForUsers User[] @relation("UserDefaultDeliveryAddress") carts Cart[] orders Order[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) } model CounterpartyProfile { id String @id @default(cuid()) userId String @unique user User @relation(fields: [userId], references: [id]) companyName String companyFullName String inn String kpp String? ogrn String? legalAddress String bankName String bik String correspondentAccount String checkingAccount String signerFullName String signerPosition String signerBasis String 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 displayName String? username String? avatarFileId String? avatarFileUniqueId 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 productType String? widthMm Int? lengthM Int? thicknessMicron Int? sleeveBrand String? quantityPerBox String? tags String[] @default([]) description String? isCustomizable Boolean @default(false) isActive Boolean @default(true) inventory ProductStock[] cartItems CartItem[] orderItems OrderItem[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Cart { id String @id @default(cuid()) userId String @unique user User @relation(fields: [userId], references: [id], onDelete: Cascade) deliveryAddressId String? deliveryAddress DeliveryAddress? @relation(fields: [deliveryAddressId], references: [id], onDelete: SetNull) items CartItem[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([deliveryAddressId]) } model CartItem { id String @id @default(cuid()) cartId String cart Cart @relation(fields: [cartId], references: [id], onDelete: Cascade) productId String product Product @relation(fields: [productId], references: [id], onDelete: Cascade) productName String sku String isCustomizable Boolean @default(false) quantity Decimal @db.Decimal(14, 3) parameters Json createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([cartId, productId]) @@index([productId]) } 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]) deliveryAddressId String? deliveryAddressRef DeliveryAddress? @relation(fields: [deliveryAddressId], references: [id], onDelete: SetNull) deliveryAddress String? 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) unitPrice Decimal? @db.Decimal(14, 2) 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]) createdById String createdBy User @relation("ReferralCreator", fields: [createdById], references: [id]) bonusPercent Decimal @db.Decimal(5, 2) bonusTransactions BonusTransaction[] createdAt DateTime @default(now()) @@unique([referrerId, refereeId]) @@index([referrerId]) @@index([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? referralLinkId String? referralLink ReferralLink? @relation(fields: [referralLinkId], references: [id], onDelete: SetNull) createdAt DateTime @default(now()) @@unique([orderId, referralLinkId]) } 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 }