# ПРАВИЛА КАБИНЕТА ПОСТАВЩИКА (WHOLESALE)
> ⚠️ **ВАЖНО**: Это файл с техническими деталями кабинета поставщика.
> Общие бизнес-правила находятся в **[rules-complete.md](./rules-complete.md)**
## Когда использовать этот файл:
- Работа с компонентами `/warehouse`, `/supplier-orders`
- GraphQL запросы для поставщиков
- UI/UX специфика кабинета поставщика
- Технические детали реализации
## 1. 🏪 СТРУКТУРА КАБИНЕТА ПОСТАВЩИКА
### 1.1 Основные разделы
**ПОСТАВЩИК (`WHOLESALE`)** имеет доступ к следующим разделам:
- **Склад** (`/warehouse`) - управление товарами и расходниками
- **Поставки** (`/supplies`) - обработка заказов от селлеров
- **Маркет** (`/market`) - просмотр глобального каталога
- **Партнеры** (`/partners`) - управление контрагентами
- **Мессенджер** (`/messenger`) - связь с партнерами
- **Настройки** (`/settings`) - профиль и API ключи
- **Экономика** (`/economics`) - финансовая аналитика
### 1.2 Навигация и роутинг
#### При входе в систему:
```typescript
switch (user?.organization?.type) {
case 'WHOLESALE':
router.push('/supplies') // Направляем на страницу поставок
break
}
```
#### Специальная логика роутинга:
> 📖 **Бизнес-логика роутинга**: См. [rules-complete.md#4-система-ролей-и-доступов](./rules-complete.md#4--система-ролей-и-доступов)
## 2. 🎨 UI/UX КОМПОНЕНТЫ
### 2.1 Dashboard компоненты
#### Основные компоненты кабинета:
- `WarehouseDashboard` - главный компонент склада
- `SupplierOrdersDashboard` - управление заказами
- `WholesaleEconomicsPage` - экономическая аналитика
- `WholesaleHomePage` - домашняя страница поставщика
#### Wrapper-компоненты:
- `HomePageWrapper` - маршрутизация по типам организаций
- `EconomicsPageWrapper` - адаптивная экономика по кабинетам
#### Специализированные компоненты:
- `SupplierOrderCard` - карточка заказа для поставщика
- `SupplierOrdersContent` - контент страницы заказов
- `SupplierOrdersSearch` - поиск по заказам
- `SupplierOrdersTabs` - табы (активные/завершенные)
- `SupplierOrderStats` - статистика и аналитика заказов
### 2.2 Карточка поставщика в интерфейсе
#### Структура карточки:
```jsx
{/* Аватар организации */}
{/* Название поставщика */}
{supplier.name || supplier.fullName}
{/* ИНН и рынок */}
ИНН: {supplier.inn}
{supplier.market &&
{getMarketLabel(supplier.market)}}
```
#### Визуальные правила:
- **Аватар**: Размер `sm`, слева от текста
- **Название**: Приоритет `name` над `fullName`
- **ИНН**: Моноширинный шрифт, цвет `text-white/60`
- **Рынок**: Badge компонент с индивидуальными цветами
### 2.3 Поисковый интерфейс
```jsx
handleSearch(e.target.value)}
/>
```
### 2.4 Цветовые схемы рынков
> 📖 **Полная палитра цветов**: См. [visual-design-rules.md](./visual-design-rules.md)
Примеры для рынков:
- **"Садовод"** (`sadovod`): `bg-green-500/20 text-green-300 border-green-500/30`
- **"ТЯК Москва"** (`tyak-moscow`): `bg-blue-500/20 text-blue-300 border-blue-500/30`
## 3. 📊 ФУНКЦИОНАЛЬНЫЕ ВОЗМОЖНОСТИ
> 📖 **Бизнес-правила**: См. [rules-complete.md#10-кабинет-поставщика](./rules-complete.md#10--кабинет-поставщика) для правил создания товаров, обязательных полей и статистики
## 4. 🛠️ GRAPHQL API
### 4.1 Основные запросы (Queries)
#### Получение товаров поставщика:
```graphql
query GetMyProducts {
myProducts {
id
name
article
price
quantity
organization {
id
name
market # Физический рынок поставщика
}
}
}
```
#### Получение заказов:
```graphql
query GetSupplierOrders {
supplyOrders(where: { partnerId: $myOrgId }) {
id
status
totalAmount
organization {
name # Заказчик
}
}
}
```
#### Получение партнеров:
```graphql
query GetMyCounterparties {
myCounterparties {
id
name
type
market
fullName
inn
}
}
```
### 4.2 Мутации (Mutations)
#### Создание товара:
```graphql
mutation CreateProduct($input: ProductInput!) {
createProduct(input: $input) {
success
product {
id
article
organization {
id
name
}
}
}
}
```
#### Обработка заказов поставщиком:
```graphql
mutation ApproveSupplyOrder($orderId: ID!) {
approveSupplyOrder(id: $orderId) {
success
order {
id
status
organization {
id
name
}
}
}
}
mutation RejectSupplyOrder($orderId: ID!, $reason: String) {
rejectSupplyOrder(id: $orderId, reason: $reason) {
success
message
}
}
```
#### Отгрузка заказов:
```graphql
mutation ShipSupplyOrder($orderId: ID!) {
shipSupplyOrder(id: $orderId) {
success
order {
id
status # SHIPPED -> IN_TRANSIT
organization {
id
name
}
}
}
}
```
### 4.3 Правила партнерства
**КРИТИЧЕСКОЕ ПРАВИЛО**: Поставщики в формах берутся ТОЛЬКО из партнеров с типом `WHOLESALE`
```typescript
// ✅ ПРАВИЛЬНО
const suppliers = await useQuery(GET_MY_COUNTERPARTIES, {
variables: { type: 'WHOLESALE' },
})
// ❌ НЕПРАВИЛЬНО
const suppliers = await useQuery(GET_SUPPLY_SUPPLIERS)
```
> 📖 **Система партнерства**: См. [rules-complete.md#13-система-партнерства-и-контрагентов](./rules-complete.md#13--система-партнерства-и-контрагентов)
## 5. 📁 ТЕХНИЧЕСКИЕ КОМПОНЕНТЫ
> 📖 **Архитектура рынков**: См. [rules-complete.md#10-кабинет-поставщика](./rules-complete.md#10--кабинет-поставщика) для бизнес-логики принадлежности к рынкам
### 5.1 Расположение компонентов
```
src/components/
├── warehouse/ # Компоненты склада
│ ├── warehouse-dashboard.tsx
│ ├── product-card.tsx
│ ├── product-form.tsx
│ └── warehouse-statistics.tsx
├── supplier-orders/ # Компоненты заказов
│ ├── supplier-orders-dashboard.tsx
│ ├── supplier-order-card.tsx
│ └── supplier-orders-tabs.tsx
└── economics/ # Экономика
└── wholesale-economics-page.tsx
```
### 5.2 Страницы (Pages)
```
src/app/
├── warehouse/
│ └── page.tsx # Страница склада
├── supplier-orders/
│ └── page.tsx # Страница заказов
└── [общие страницы] # См. rules-complete.md
```
## 6. 🚨 ТЕХНИЧЕСКИЕ ПРАВИЛА И ОГРАНИЧЕНИЯ
> 📖 **Workflow поставок**: См. [rules-complete.md#5-workflow-поставок](./rules-complete.md#5--workflow-поставок) для бизнес-процессов
### 6.1 Обязательные проверки:
- Проверка типа организации: `organization.type === 'WHOLESALE'`
- Валидация прав доступа на уровне GraphQL резолверов
- Контроль остатков при подтверждении заказов
### 6.2 Правила безопасности доступа:
#### Контроль на уровне компонентов:
```typescript
{user?.organization?.type === "WHOLESALE" && (
)}
```
#### Проверки в GraphQL резолверах:
```typescript
// Проверка что пользователь - поставщик
if (context.user.organization.type !== 'WHOLESALE') {
throw new Error('Access denied: Wholesale access required')
}
// Проверка доступа к своим товарам
const product = await prisma.product.findFirst({
where: {
id: productId,
organizationId: context.user.organizationId,
},
})
```
### 6.3 Запрещено:
- Создавать товары с типами `DEFECT` или `FINISHED_PRODUCT`
- Изменять статусы заказов минуя workflow
- Показывать данные других поставщиков
> 📖 **Критические запреты**: См. [rules-complete.md#17-критические-запреты](./rules-complete.md#17--критические-запреты)
---
**Последнее обновление**: Декабрь 2024
**Связанные файлы**:
- [rules-complete.md](./rules-complete.md) - Общие бизнес-правила
- [visual-design-rules.md](./visual-design-rules.md) - Визуальные правила