generator client {
  provider = "prisma-client-js"
}

// Конфигурация для автоматического seeding
generator seed {
  provider = "prisma-client-js"
  output   = "./generated/client"
}

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[]
  supplyOrders               SupplyOrder[]
  partnerSupplyOrders        SupplyOrder[]             @relation("SupplyOrderPartner")
  fulfillmentSupplyOrders    SupplyOrder[]             @relation("SupplyOrderFulfillmentCenter")
  wildberriesSupplies        WildberriesSupply[]
  supplySuppliers            SupplySupplier[]          @relation("SupplySuppliers")

  @@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)
  unit           String       @default("шт")
  category       String       @default("Упаковка")
  status         String       @default("planned") // planned, in-transit, delivered, in-stock
  date           DateTime     @default(now())
  supplier       String       @default("Не указан")
  minStock       Int          @default(0)
  currentStock   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[]
  supplyOrderItems SupplyOrderItem[]
  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")
}

model WildberriesSupply {
  id                String                    @id @default(cuid())
  organizationId    String
  deliveryDate      DateTime?
  status            WildberriesSupplyStatus   @default(DRAFT)
  totalAmount       Decimal                   @db.Decimal(12, 2)
  totalItems        Int
  createdAt         DateTime                  @default(now())
  updatedAt         DateTime                  @updatedAt
  organization      Organization              @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  cards             WildberriesSupplyCard[]

  @@map("wildberries_supplies")
}

model WildberriesSupplyCard {
  id                String            @id @default(cuid())
  supplyId          String
  nmId              String
  vendorCode        String
  title             String
  brand             String?
  price             Decimal           @db.Decimal(12, 2)
  discountedPrice   Decimal?          @db.Decimal(12, 2)
  quantity          Int
  selectedQuantity  Int
  selectedMarket    String?
  selectedPlace     String?
  sellerName        String?
  sellerPhone       String?
  deliveryDate      DateTime?
  mediaFiles        Json              @default("[]")
  selectedServices  Json              @default("[]")
  createdAt         DateTime          @default(now())
  updatedAt         DateTime          @updatedAt
  supply            WildberriesSupply @relation(fields: [supplyId], references: [id], onDelete: Cascade)

  @@map("wildberries_supply_cards")
}

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
}

enum SupplyOrderStatus {
  PENDING
  CONFIRMED
  IN_TRANSIT
  DELIVERED
  CANCELLED
}

enum WildberriesSupplyStatus {
  DRAFT
  CREATED
  IN_PROGRESS
  DELIVERED
  CANCELLED
}

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")
}

model SupplyOrder {
  id                   String             @id @default(cuid())
  partnerId            String
  deliveryDate         DateTime
  status               SupplyOrderStatus  @default(PENDING)
  totalAmount          Decimal            @db.Decimal(12, 2)
  totalItems           Int
  fulfillmentCenterId  String?
  createdAt            DateTime           @default(now())
  updatedAt            DateTime           @updatedAt
  organizationId       String
  items                SupplyOrderItem[]
  organization         Organization       @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  partner              Organization       @relation("SupplyOrderPartner", fields: [partnerId], references: [id])
  fulfillmentCenter    Organization?      @relation("SupplyOrderFulfillmentCenter", fields: [fulfillmentCenterId], references: [id])

  @@map("supply_orders")
}

model SupplyOrderItem {
  id            String      @id @default(cuid())
  supplyOrderId String
  productId     String
  quantity      Int
  price         Decimal     @db.Decimal(12, 2)
  totalPrice    Decimal     @db.Decimal(12, 2)
  createdAt     DateTime    @default(now())
  updatedAt     DateTime    @updatedAt
  supplyOrder   SupplyOrder @relation(fields: [supplyOrderId], references: [id], onDelete: Cascade)
  product       Product     @relation(fields: [productId], references: [id])

  @@unique([supplyOrderId, productId])
  @@map("supply_order_items")
}

model SupplySupplier {
  id             String       @id @default(cuid())
  name           String
  contactName    String
  phone          String
  market         String?
  address        String?
  place          String?
  telegram       String?
  organizationId String
  createdAt      DateTime     @default(now())
  updatedAt      DateTime     @updatedAt
  organization   Organization @relation("SupplySuppliers", fields: [organizationId], references: [id], onDelete: Cascade)

  @@map("supply_suppliers")
}
