Files
web-frontend/docs/tz/data-entities.md
2026-05-04 10:48:29 +07:00

485 lines
14 KiB
Markdown
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.

# 6. Требования к данным и сущностям
## 6.1 Общие требования к данным
Основное хранилище данных программного продукта реализуется на `PostgreSQL`. Прикладной доступ к данным осуществляется через `Prisma ORM`.
Система должна обеспечивать хранение:
- пользователей и ролей
- компаний и профилей контрагентов
- адресов доставки
- каталога и складских остатков
- корзины и ее позиций
- заказов и расчетных заявок
- событий изменения статусов
- подключений мессенджеров
- бонусных и реферальных сущностей
В прикладной реализации должны использоваться фактические сущности базы данных, определенные в `schema.prisma`. Наименование сущностей в документации и в базе данных должно сопоставляться однозначно.
## 6.2 Справочник сущностей базы данных
| Модель в базе данных | Русское наименование | Назначение |
| --- | --- | --- |
| `Company` | Компания | Клиентская организация |
| `User` | Пользователь | Учетная запись клиента, менеджера или суперменеджера |
| `DeliveryAddress` | Адрес доставки | Справочник адресов доставки клиента |
| `CounterpartyProfile` | Профиль контрагента | Юридические и банковские реквизиты клиента |
| `RegistrationRequest` | Заявка на подключение | Самостоятельная заявка клиента на подключение |
| `Invitation` | Приглашение | Менеджерское приглашение на регистрацию |
| `MessengerConnection` | Подключение мессенджера | Связка пользователя с Telegram или MAX |
| `Product` | Товар | Карточка товарной позиции каталога |
| `CatalogProductTypeSetting` | Настройки типа товара | Правила параметров и кастомизации по товарному направлению |
| `Cart` | Корзина | Корзина клиента |
| `CartItem` | Позиция корзины | Конкретный выбранный товар в корзине |
| `Warehouse` | Склад | Справочник складов |
| `ProductStock` | Складской остаток | Остаток товара на складе |
| `Order` | Заказ / заявка | Единая заказная сущность для готовой продукции и расчета |
| `OrderItem` | Позиция заказа | Состав заказа |
| `OrderStatusEvent` | Событие статуса заказа | История изменения статусов |
| `ReferralLink` | Реферальная связь | Связь между рекомендателем и приглашенным клиентом |
| `BonusTransaction` | Бонусная транзакция | Начисление или списание бонусов |
| `RewardWithdrawalRequest` | Заявка на вывод бонусов | Заявка клиента на использование или вывод бонусов |
## 6.3 Служебные перечисления и статусы
В модели данных используются следующие перечисления:
- `UserRole`: `CLIENT`, `MANAGER`, `SUPER_MANAGER`
- `RegistrationStatus`: `PENDING`, `APPROVED`, `REJECTED`
- `MessengerType`: `TELEGRAM`, `MAX`
- `OrderKind`: `READY`, `CALCULATION`
- `OrderStatus`: `NEW`, `MANAGER_PROCESSING`, `WAITING_DOUBLE_CONFIRM`, `CLIENT_REJECTED`, `MANAGER_REJECTED`, `MANAGER_BLOCKED`, `CONFIRMED`, `IN_PROGRESS`, `COMPLETED`
- `WithdrawalStatus`: `PENDING`, `APPROVED`, `REJECTED`
## 6.4 Пользователи и компании
### 6.4.1 Company
Русское наименование: `Компания`
Назначение:
- хранение клиентской организации
- объединение пользователей одной компании
Основные поля:
- `id`
- `name`
- `inn`
- `createdAt`
- `updatedAt`
Связи:
- одна компания связана со многими пользователями
### 6.4.2 User
Русское наименование: `Пользователь`
Назначение:
- хранение клиентской, менеджерской или административной учетной записи
- связывание пользователя с заказами, корзиной, бонусами и адресами
Основные поля:
- `id`
- `email`
- `fullName`
- `role`
- `companyId`
- `defaultDeliveryAddressId`
- `createdAt`
- `updatedAt`
Связи:
- пользователь может быть связан с компанией
- пользователь может иметь профиль контрагента
- пользователь может иметь адреса доставки
- пользователь может иметь корзину
- пользователь может выступать клиентом или менеджером в заказах
- пользователь может иметь бонусные операции и заявки на вывод
### 6.4.3 DeliveryAddress
Русское наименование: `Адрес доставки`
Назначение:
- хранение адресов доставки клиента
- выбор адреса по умолчанию для корзины и заказов
Основные поля:
- `id`
- `userId`
- `label`
- `address`
- `unrestrictedValue`
- `fiasId`
- `createdAt`
- `updatedAt`
### 6.4.4 CounterpartyProfile
Русское наименование: `Профиль контрагента`
Назначение:
- хранение полных реквизитов клиента для договоров, счетов и поставки
Основные поля:
- `id`
- `userId`
- `companyName`
- `companyFullName`
- `inn`
- `kpp`
- `ogrn`
- `legalAddress`
- `bankName`
- `bik`
- `correspondentAccount`
- `checkingAccount`
- `signerFullName`
- `signerPosition`
- `signerBasis`
- `createdAt`
- `updatedAt`
### 6.4.5 RegistrationRequest
Русское наименование: `Заявка на подключение`
Назначение:
- хранение самостоятельной заявки клиента на подключение
Основные поля:
- `id`
- `companyName`
- `inn`
- `contactName`
- `email`
- `status`
- `rejectionReason`
- `requesterId`
- `reviewedById`
- `createdAt`
- `updatedAt`
### 6.4.6 Invitation
Русское наименование: `Приглашение`
Назначение:
- хранение менеджерского приглашения клиента на регистрацию
Основные поля:
- `id`
- `token`
- `email`
- `companyName`
- `managerId`
- `acceptedById`
- `expiresAt`
- `acceptedAt`
- `createdAt`
### 6.4.7 MessengerConnection
Русское наименование: `Подключение мессенджера`
Назначение:
- хранение подключенного Telegram или MAX-канала пользователя
Основные поля:
- `id`
- `userId`
- `type`
- `channelId`
- `displayName`
- `username`
- `avatarFileId`
- `avatarFileUniqueId`
- `isActive`
- `createdAt`
## 6.5 Каталог и складской контур
### 6.5.1 Product
Русское наименование: `Товар`
Назначение:
- хранение карточки товарной позиции каталога
- хранение параметров товара и признаков кастомизации
Основные поля:
- `id`
- `sku`
- `name`
- `productType`
- `widthMm`
- `lengthM`
- `thicknessMicron`
- `sleeveBrand`
- `quantityPerBox`
- `tags`
- `description`
- `isCustomizable`
- `isActive`
- `createdAt`
- `updatedAt`
### 6.5.2 CatalogProductTypeSetting
Русское наименование: `Настройки типа товара`
Назначение:
- хранение правил параметров по товарному направлению
- хранение разрешений на кастомизацию
Основные поля:
- `id`
- `productType`
- `showQuantityPerBox`
- `allowCustomLength`
- `customLengthMinM`
- `customLengthMaxM`
- `customLengthStepM`
- `allowCustomSleeveBrand`
- `allowCustomLabel`
- `widthOptionsMm`
- `lengthOptionsM`
- `thicknessOptionsMicron`
- `sleeveOptions`
- `colorOptions`
- `labelOptions`
- `createdAt`
- `updatedAt`
### 6.5.3 Warehouse
Русское наименование: `Склад`
Назначение:
- хранение справочника складов
Основные поля:
- `id`
- `code`
- `name`
- `createdAt`
- `updatedAt`
### 6.5.4 ProductStock
Русское наименование: `Складской остаток`
Назначение:
- хранение остатка товара на конкретном складе
Основные поля:
- `id`
- `productId`
- `warehouseId`
- `availableQty`
- `updatedAt`
## 6.6 Корзина, заявки и заказы
### 6.6.1 Cart
Русское наименование: `Корзина`
Назначение:
- хранение текущего набора выбранных клиентом позиций
Основные поля:
- `id`
- `userId`
- `deliveryAddressId`
- `createdAt`
- `updatedAt`
### 6.6.2 CartItem
Русское наименование: `Позиция корзины`
Назначение:
- хранение одной выбранной клиентом позиции с параметрами и количеством
Основные поля:
- `id`
- `cartId`
- `productId`
- `productName`
- `sku`
- `isCustomizable`
- `quantity`
- `parameters`
- `createdAt`
- `updatedAt`
### 6.6.3 Order
Русское наименование: `Заказ / заявка`
Назначение:
- хранение готовой заказной заявки и расчетной заявки в единой сущности
- хранение согласованных менеджером условий и статуса работы
Основные поля:
- `id`
- `code`
- `kind`
- `customerId`
- `deliveryAddressId`
- `deliveryAddress`
- `managerId`
- `status`
- `clientApproved`
- `managerApproved`
- `blockReason`
- `deliveryTerms`
- `deliveryFee`
- `totalPrice`
- `calculationPayload`
- `createdAt`
- `updatedAt`
Комментарий к модели:
- `kind = READY` означает сценарий заказа готовой продукции
- `kind = CALCULATION` означает сценарий расчета индивидуальной продукции
- поле `calculationPayload` хранит параметры расчетной заявки
### 6.6.4 OrderItem
Русское наименование: `Позиция заказа`
Назначение:
- хранение состава заказа
Основные поля:
- `id`
- `orderId`
- `productId`
- `productName`
- `quantity`
- `unitPrice`
- `createdAt`
### 6.6.5 OrderStatusEvent
Русское наименование: `Событие статуса заказа`
Назначение:
- хранение истории изменения статусов заказа или заявки
Основные поля:
- `id`
- `orderId`
- `status`
- `actorUserId`
- `note`
- `createdAt`
## 6.7 Бонусный и реферальный контур
### 6.7.1 ReferralLink
Русское наименование: `Реферальная связь`
Назначение:
- фиксация связи между рекомендателем и приглашенным клиентом
Основные поля:
- `id`
- `referrerId`
- `refereeId`
- `createdById`
- `bonusPercent`
- `createdAt`
### 6.7.2 BonusTransaction
Русское наименование: `Бонусная транзакция`
Назначение:
- хранение начисления или списания бонусов
Основные поля:
- `id`
- `userId`
- `amount`
- `reason`
- `orderId`
- `referralLinkId`
- `createdAt`
### 6.7.3 RewardWithdrawalRequest
Русское наименование: `Заявка на вывод бонусов`
Назначение:
- хранение заявки клиента на использование или вывод бонусов
Основные поля:
- `id`
- `requesterId`
- `amount`
- `status`
- `reviewedById`
- `reviewComment`
- `createdAt`
- `updatedAt`
## 6.8 Основные связи между сущностями
Укрупненная структура связей определяется следующими правилами:
- `Company` объединяет пользователей одной клиентской организации
- `User` связан с `CounterpartyProfile`, `DeliveryAddress`, `MessengerConnection`, `Cart`, `Order`, `BonusTransaction` и `RewardWithdrawalRequest`
- `Cart` содержит набор `CartItem`, привязанных к конкретным `Product`
- `Order` содержит набор `OrderItem` и историю `OrderStatusEvent`
- `Product` связан с остатками `ProductStock`, распределенными по сущностям `Warehouse`
- настройки параметров по товарному направлению хранятся в `CatalogProductTypeSetting`
- реферальные связи реализуются через `ReferralLink`, связывающий одного пользователя с другим пользователем