# ПРАВИЛА КАБИНЕТА ПОСТАВЩИКА (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) - Визуальные правила