380 lines
11 KiB
Plaintext
380 lines
11 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
phone String @unique
|
|
avatar String?
|
|
managerName String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
organizationId String?
|
|
sentMessages Message[] @relation("SentMessages")
|
|
smsCodes SmsCode[]
|
|
organization Organization? @relation(fields: [organizationId], references: [id])
|
|
|
|
@@map("users")
|
|
}
|
|
|
|
model Admin {
|
|
id String @id @default(cuid())
|
|
username String @unique
|
|
password String // Хеш пароля
|
|
email String? @unique
|
|
isActive Boolean @default(true)
|
|
lastLogin DateTime?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@map("admins")
|
|
}
|
|
|
|
model SmsCode {
|
|
id String @id @default(cuid())
|
|
code String
|
|
phone String
|
|
expiresAt DateTime
|
|
isUsed Boolean @default(false)
|
|
attempts Int @default(0)
|
|
maxAttempts Int @default(3)
|
|
createdAt DateTime @default(now())
|
|
userId String?
|
|
user User? @relation(fields: [userId], references: [id])
|
|
|
|
@@map("sms_codes")
|
|
}
|
|
|
|
model Organization {
|
|
id String @id @default(cuid())
|
|
inn String @unique
|
|
kpp String?
|
|
name String?
|
|
fullName String?
|
|
ogrn String?
|
|
ogrnDate DateTime?
|
|
type OrganizationType
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
address String?
|
|
addressFull String?
|
|
status String?
|
|
actualityDate DateTime?
|
|
registrationDate DateTime?
|
|
liquidationDate DateTime?
|
|
managementName String?
|
|
managementPost String?
|
|
opfCode String?
|
|
opfFull String?
|
|
opfShort String?
|
|
okato String?
|
|
oktmo String?
|
|
okpo String?
|
|
okved String?
|
|
phones Json?
|
|
emails Json?
|
|
employeeCount Int?
|
|
revenue BigInt?
|
|
taxSystem String?
|
|
dadataData Json?
|
|
apiKeys ApiKey[]
|
|
carts Cart?
|
|
counterpartyOf Counterparty[] @relation("CounterpartyOf")
|
|
organizationCounterparties Counterparty[] @relation("OrganizationCounterparties")
|
|
receivedRequests CounterpartyRequest[] @relation("ReceivedRequests")
|
|
sentRequests CounterpartyRequest[] @relation("SentRequests")
|
|
employees Employee[]
|
|
favorites Favorites[]
|
|
receivedMessages Message[] @relation("ReceivedMessages")
|
|
sentMessages Message[] @relation("SentMessages")
|
|
products Product[]
|
|
services Service[]
|
|
supplies Supply[]
|
|
users User[]
|
|
logistics Logistics[]
|
|
|
|
@@map("organizations")
|
|
}
|
|
|
|
model ApiKey {
|
|
id String @id @default(cuid())
|
|
marketplace MarketplaceType
|
|
apiKey String
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
validationData Json?
|
|
organizationId String
|
|
organization Organization @relation(fields: [organizationId], references: [id])
|
|
|
|
@@unique([organizationId, marketplace])
|
|
@@map("api_keys")
|
|
}
|
|
|
|
model CounterpartyRequest {
|
|
id String @id @default(cuid())
|
|
status CounterpartyRequestStatus @default(PENDING)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
senderId String
|
|
receiverId String
|
|
message String?
|
|
receiver Organization @relation("ReceivedRequests", fields: [receiverId], references: [id])
|
|
sender Organization @relation("SentRequests", fields: [senderId], references: [id])
|
|
|
|
@@unique([senderId, receiverId])
|
|
@@map("counterparty_requests")
|
|
}
|
|
|
|
model Counterparty {
|
|
id String @id @default(cuid())
|
|
createdAt DateTime @default(now())
|
|
organizationId String
|
|
counterpartyId String
|
|
counterparty Organization @relation("CounterpartyOf", fields: [counterpartyId], references: [id])
|
|
organization Organization @relation("OrganizationCounterparties", fields: [organizationId], references: [id])
|
|
|
|
@@unique([organizationId, counterpartyId])
|
|
@@map("counterparties")
|
|
}
|
|
|
|
model Message {
|
|
id String @id @default(cuid())
|
|
content String?
|
|
type MessageType @default(TEXT)
|
|
voiceUrl String?
|
|
voiceDuration Int?
|
|
fileUrl String?
|
|
fileName String?
|
|
fileSize Int?
|
|
fileType String?
|
|
isRead Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
senderId String
|
|
senderOrganizationId String
|
|
receiverOrganizationId String
|
|
receiverOrganization Organization @relation("ReceivedMessages", fields: [receiverOrganizationId], references: [id])
|
|
sender User @relation("SentMessages", fields: [senderId], references: [id])
|
|
senderOrganization Organization @relation("SentMessages", fields: [senderOrganizationId], references: [id])
|
|
|
|
@@index([senderOrganizationId, receiverOrganizationId, createdAt])
|
|
@@index([receiverOrganizationId, isRead])
|
|
@@map("messages")
|
|
}
|
|
|
|
model Service {
|
|
id String @id @default(cuid())
|
|
name String
|
|
description String?
|
|
price Decimal @db.Decimal(10, 2)
|
|
imageUrl String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
organizationId String
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("services")
|
|
}
|
|
|
|
model Supply {
|
|
id String @id @default(cuid())
|
|
name String
|
|
description String?
|
|
price Decimal @db.Decimal(10, 2)
|
|
quantity Int @default(0)
|
|
imageUrl String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
organizationId String
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("supplies")
|
|
}
|
|
|
|
model Category {
|
|
id String @id @default(cuid())
|
|
name String @unique
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
products Product[]
|
|
|
|
@@map("categories")
|
|
}
|
|
|
|
model Product {
|
|
id String @id @default(cuid())
|
|
name String
|
|
article String
|
|
description String?
|
|
price Decimal @db.Decimal(12, 2)
|
|
quantity Int @default(0)
|
|
categoryId String?
|
|
brand String?
|
|
color String?
|
|
size String?
|
|
weight Decimal? @db.Decimal(8, 3)
|
|
dimensions String?
|
|
material String?
|
|
images Json @default("[]")
|
|
mainImage String?
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
organizationId String
|
|
cartItems CartItem[]
|
|
favorites Favorites[]
|
|
category Category? @relation(fields: [categoryId], references: [id])
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([organizationId, article])
|
|
@@map("products")
|
|
}
|
|
|
|
model Cart {
|
|
id String @id @default(cuid())
|
|
organizationId String @unique
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
items CartItem[]
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("carts")
|
|
}
|
|
|
|
model CartItem {
|
|
id String @id @default(cuid())
|
|
cartId String
|
|
productId String
|
|
quantity Int @default(1)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
cart Cart @relation(fields: [cartId], references: [id], onDelete: Cascade)
|
|
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([cartId, productId])
|
|
@@map("cart_items")
|
|
}
|
|
|
|
model Favorites {
|
|
id String @id @default(cuid())
|
|
organizationId String
|
|
productId String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([organizationId, productId])
|
|
@@map("favorites")
|
|
}
|
|
|
|
model Employee {
|
|
id String @id @default(cuid())
|
|
firstName String
|
|
lastName String
|
|
middleName String?
|
|
birthDate DateTime?
|
|
avatar String?
|
|
passportPhoto String?
|
|
passportSeries String?
|
|
passportNumber String?
|
|
passportIssued String?
|
|
passportDate DateTime?
|
|
address String?
|
|
position String
|
|
department String?
|
|
hireDate DateTime
|
|
salary Float?
|
|
status EmployeeStatus @default(ACTIVE)
|
|
phone String
|
|
email String?
|
|
telegram String?
|
|
whatsapp String?
|
|
emergencyContact String?
|
|
emergencyPhone String?
|
|
organizationId String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
scheduleRecords EmployeeSchedule[]
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("employees")
|
|
}
|
|
|
|
model EmployeeSchedule {
|
|
id String @id @default(cuid())
|
|
date DateTime
|
|
status ScheduleStatus
|
|
hoursWorked Float?
|
|
notes String?
|
|
employeeId String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([employeeId, date])
|
|
@@map("employee_schedules")
|
|
}
|
|
|
|
enum OrganizationType {
|
|
FULFILLMENT
|
|
SELLER
|
|
LOGIST
|
|
WHOLESALE
|
|
}
|
|
|
|
enum MarketplaceType {
|
|
WILDBERRIES
|
|
OZON
|
|
}
|
|
|
|
enum CounterpartyRequestStatus {
|
|
PENDING
|
|
ACCEPTED
|
|
REJECTED
|
|
CANCELLED
|
|
}
|
|
|
|
enum MessageType {
|
|
TEXT
|
|
VOICE
|
|
IMAGE
|
|
FILE
|
|
}
|
|
|
|
enum EmployeeStatus {
|
|
ACTIVE
|
|
VACATION
|
|
SICK
|
|
FIRED
|
|
}
|
|
|
|
enum ScheduleStatus {
|
|
WORK
|
|
WEEKEND
|
|
VACATION
|
|
SICK
|
|
ABSENT
|
|
}
|
|
|
|
model Logistics {
|
|
id String @id @default(cuid())
|
|
fromLocation String
|
|
toLocation String
|
|
priceUnder1m3 Float
|
|
priceOver1m3 Float
|
|
description String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
organizationId String
|
|
organization Organization @relation(fields: [organizationId], references: [id])
|
|
|
|
@@map("logistics")
|
|
}
|