Files
sfera/prisma/schema.prisma

192 lines
6.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
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? // URL аватара в S3
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Связь с организацией
organization Organization? @relation(fields: [organizationId], references: [id])
organizationId String?
// SMS коды для авторизации
smsCodes SmsCode[]
@@map("users")
}
// Модель для SMS кодов
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())
// Связь с пользователем
user User? @relation(fields: [userId], references: [id])
userId String?
@@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? // ACTIVE, LIQUIDATED и т.д.
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? // Массив email адресов
// Финансовые данные
employeeCount Int? // Численность сотрудников
revenue BigInt? // Выручка
taxSystem String? // Система налогообложения
// Полные данные из DaData (для полноты)
dadataData Json?
// Связи
users User[]
apiKeys ApiKey[]
// Связи контрагентов
sentRequests CounterpartyRequest[] @relation("SentRequests")
receivedRequests CounterpartyRequest[] @relation("ReceivedRequests")
organizationCounterparties Counterparty[] @relation("OrganizationCounterparties")
counterpartyOf Counterparty[] @relation("CounterpartyOf")
@@map("organizations")
}
// Модель для API ключей маркетплейсов
model ApiKey {
id String @id @default(cuid())
marketplace MarketplaceType
apiKey String
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Данные для валидации (например, информация о продавце)
validationData Json?
// Связь с организацией
organization Organization @relation(fields: [organizationId], references: [id])
organizationId String
@@unique([organizationId, marketplace])
@@map("api_keys")
}
// Тип организации
enum OrganizationType {
FULFILLMENT // Фулфилмент
SELLER // Селлер
LOGIST // Логистика
WHOLESALE // Оптовик
}
// Тип маркетплейса
enum MarketplaceType {
WILDBERRIES
OZON
}
// Модель для заявок на добавление в контрагенты
model CounterpartyRequest {
id String @id @default(cuid())
status CounterpartyRequestStatus @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Кто отправил заявку
sender Organization @relation("SentRequests", fields: [senderId], references: [id])
senderId String
// Кому отправили заявку
receiver Organization @relation("ReceivedRequests", fields: [receiverId], references: [id])
receiverId String
// Комментарий к заявке
message String?
@@unique([senderId, receiverId])
@@map("counterparty_requests")
}
// Модель для связей контрагентов
model Counterparty {
id String @id @default(cuid())
createdAt DateTime @default(now())
// Основная организация
organization Organization @relation("OrganizationCounterparties", fields: [organizationId], references: [id])
organizationId String
// Контрагент
counterparty Organization @relation("CounterpartyOf", fields: [counterpartyId], references: [id])
counterpartyId String
@@unique([organizationId, counterpartyId])
@@map("counterparties")
}
// Статус заявки на добавление в контрагенты
enum CounterpartyRequestStatus {
PENDING // Ожидает ответа
ACCEPTED // Принята
REJECTED // Отклонена
CANCELLED // Отменена отправителем
}