Добавлены новые зависимости, обновлены стили и улучшена структура проекта. Обновлен README с описанием функционала и технологий. Реализована анимация и адаптивный дизайн. Настроена авторизация с использованием Apollo Client.

This commit is contained in:
Bivekich
2025-07-16 18:00:41 +03:00
parent d260749bc9
commit 823ef9a28c
69 changed files with 15539 additions and 210 deletions

191
prisma/schema.prisma Normal file
View File

@ -0,0 +1,191 @@
// 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 // Отменена отправителем
}