# ПРАВИЛА СОЗДАНИЯ ПОСТАВКИ ТОВАРОВ **Полный анализ 4-участнической цепочки поставок** **Дата создания:** 2024-12-19 **Версия:** 1.0 **Основано на глубоком анализе кода системы** --- ## 🎯 ОБЗОР СИСТЕМЫ ### **4 УЧАСТНИКА ПРОЦЕССА:** 1. **СЕЛЛЕР** - создает поставку товаров в кабинете 2. **ПОСТАВЩИК (WHOLESALE)** - одобряет заказ и подготавливает товары 3. **ФУЛФИЛМЕНТ** - принимает товары на склад и обрабатывает 4. **ЛОГИСТИКА** - организует доставку между участниками ### **ПОЛНЫЙ WORKFLOW ЦЕПОЧКИ:** ``` СЕЛЛЕР создает поставку → ПОСТАВЩИК одобряет → ФУЛФИЛМЕНТ принимает → ЛОГИСТИКА доставляет ``` --- ## 📋 ЭТАП 1: АНАЛИЗ СОЗДАНИЯ ПОСТАВКИ СЕЛЛЕРОМ ### **Найденный код:** - **Файл:** `/src/components/supplies/create-suppliers/index.tsx` - **Компоненты:** `SupplyCreationProvider`, `CartBlock`, `ProductCardsBlock`, `SuppliersBlock` - **Хуки:** `useSupplyCart`, `useProductCatalog`, `useRecipeBuilder` ### **Процесс создания:** 1. Селлер выбирает товары из каталога 2. Настраивает рецептуру и количества 3. Выбирает поставщика из списка партнеров 4. Выбирает фулфилмент-центр для доставки 5. Создает заказ через мутацию `createSupplyOrder` ### **GraphQL мутация создания:** ```javascript // src/graphql/mutations.ts createSupplyOrder: { organizationId: string, // Селлер (создатель) partnerId: string, // Выбранный поставщик items: SupplyOrderItem[], // Товары и количества fulfillmentCenterId: string, // Куда доставить deliveryDate: DateTime // Когда доставить } ``` ### ✅ **Что работает корректно:** - Выбор товаров и настройка рецептуры - Расчет общей стоимости заказа - Интеграция с каталогом продуктов - UI создания поставки ### ❌ **Выявленные проблемы:** - Нет валидации минимальных количеств заказа - Отсутствует проверка доступности товаров у поставщика - Нет уведомления поставщика о новом заказе --- ## 📋 ЭТАП 2: АНАЛИЗ ОДОБРЕНИЯ ПОСТАВЩИКОМ ### **Найденный код:** - **Файл:** `/src/components/supplier-orders/supplier-orders-tabs.tsx` - **Резолвер:** `/src/graphql/resolvers.ts:2573-2588` (исправленный фильтр) - **Мутация:** `supplierApproveOrder` ### **Процесс одобрения:** 1. Поставщик видит входящие заказы в разделе "Заявки/Новые" 2. Проверяет детали заказа (товары, количества, сроки) 3. Видит только кнопки "Одобрить"/"Отклонить" (БЕЗ отображения статуса) 4. При одобрении статус меняется на `SUPPLIER_APPROVED` ### **Исправленный код фильтрации:** ```javascript // Для кабинета ПОСТАВЩИКА фильтруем по partnerId let whereClause if (currentUser.organization.type === 'WHOLESALE') { // Поставщик видит заказы, где он является поставщиком whereClause = { partnerId: currentUser.organization.id, } } else { // Остальные видят заказы, которые они создали whereClause = { organizationId: currentUser.organization.id, } } ``` ### ✅ **Что работает корректно:** - Корректная фильтрация заказов для поставщиков - Отображение деталей заказа - Мутации одобрения/отклонения ### ❌ **Выявленные критические проблемы:** - **Отображается статус**: поставщик видит "ожидает подтверждения" вместо только кнопок действий - **Отсутствуют поля ввода**: поставщик не может указать количество грузовых мест (packagesCount) и объем (volume) - **Нет даты готовности**: поставщик не может указать, когда товары будут готовы к отгрузке - **Неполная мутация**: `supplierApproveOrder` не принимает дополнительные параметры --- ## 📋 ЭТАП 3: АНАЛИЗ ПРИЕМКИ ФУЛФИЛМЕНТОМ ### **Найденный код:** - **Файл:** `/src/components/fulfillment-supplies/fulfillment-supplies/fulfillment-detailed-supplies-tab.tsx` - **Резолвер:** `fulfillmentReceiveOrder` в `/src/graphql/resolvers.ts` ### **Критическая проблема статусов:** ```javascript // ❌ КОНФЛИКТ: Резолвер ожидает статус SHIPPED if (supplyOrder.status !== 'SHIPPED') { return { success: false, message: 'Заказ должен быть в статусе SHIPPED для приемки' } } // ❌ Но UI пытается принять заказ со статусом SUPPLIER_APPROVED // Это блокирует весь процесс приемки! ``` ### **Процесс приемки (правильный workflow):** 1. После одобрения поставщиком товары должны отображаться в кабинете фулфилмента: - **Поставки товаров**: "Входящие поставки / Поставки на фулфилмент / Товар / Новые" - **Расходники селлера**: "Входящие поставки / Поставки на фулфилмент / Расходники селлера" 2. Фулфилмент выбирает ответственного сотрудника (из раздела "Сотрудники") 3. Фулфилмент выбирает логистического партнера (из раздела "Партнеры / Логистика") 4. Нажимает кнопку "Принять" (НЕ "Принять поставку") 5. Статус меняется на следующий этап ### ❌ **Критические проблемы:** - **НЕПРАВИЛЬНАЯ ФИЛЬТРАЦИЯ**: поставки товаров отображаются в "Расходники селлера" вместо "Товар/Новые" - **Нарушен workflow**: отсутствует промежуточный статус между SUPPLIER_APPROVED и LOGISTICS_CONFIRMED - **Нет UI выбора**: фулфилмент не может выбрать ответственного сотрудника - **Нет UI выбора**: фулфилмент не может выбрать логистического партнера - **Блокирующий баг**: невозможно принять товары из-за неправильной проверки статуса --- ## 📋 ЭТАП 4: АНАЛИЗ РОЛИ ЛОГИСТИКИ ### **Найденный код:** - **Файл:** `/src/components/logistics-orders/logistics-orders-dashboard.tsx` - **Фильтрация:** по `logisticsPartnerId` - **Мутации:** `LOGISTICS_CONFIRM_ORDER`, `LOGISTICS_REJECT_ORDER` ### **Процесс работы логистики:** 1. Логистика видит заказы, где назначена как логистический партнер 2. Может подтвердить или отклонить логистическое сопровождение 3. При подтверждении статус меняется на `LOGISTICS_CONFIRMED` 4. После отгрузки статус меняется на `SHIPPED` ### **Статусы, которые логистика может обработать:** ```javascript // Логистика может подтвердить заказы со статусами: order.status === 'SUPPLIER_APPROVED' || order.status === 'CONFIRMED' ``` ### ✅ **Что работает:** - Корректная фильтрация заказов для логистических партнеров - UI для подтверждения/отклонения заказов - Статистика заказов по статусам ### ❌ **Выявленные проблемы:** - **Нет маршрутизации**: отсутствует система планирования маршрутов - **Нет трекинга**: отсутствует детальное отслеживание статуса доставки - **Нет интеграции**: отсутствует интеграция с внешними логистическими системами --- ## 📋 ЭТАП 5: АНАЛИЗ СТАТУСОВ И ПЕРЕХОДОВ ### **Текущие статусы системы:** ```prisma enum SupplyOrderStatus { PENDING // Создан селлером, ждет поставщика SUPPLIER_APPROVED // Одобрен поставщиком CONFIRMED // Устаревший статус LOGISTICS_CONFIRMED // Подтвержден логистикой SHIPPED // Отправлен в доставку IN_TRANSIT // Устаревший статус DELIVERED // Доставлен получателю CANCELLED // Отменен } ``` ### **Проблемы в переходах статусов:** #### ❌ **Критическая проблема workflow:** ``` Текущий поток: PENDING → SUPPLIER_APPROVED → ??? → LOGISTICS_CONFIRMED → SHIPPED → DELIVERED ↑ ПРОПУЩЕН ЭТАП! ``` **Отсутствует статус `FULFILLMENT_ACCEPTED`** между одобрением поставщиком и подтверждением логистикой! #### **Правильный workflow должен быть:** ``` PENDING → SUPPLIER_APPROVED → FULFILLMENT_ACCEPTED → LOGISTICS_CONFIRMED → SHIPPED → DELIVERED ``` ### **Анализ переходов по участникам:** 1. **СЕЛЛЕР**: `null → PENDING` (создание) 2. **ПОСТАВЩИК**: `PENDING → SUPPLIER_APPROVED` (одобрение) 3. **ФУЛФИЛМЕНТ**: `SUPPLIER_APPROVED → FULFILLMENT_ACCEPTED` (❌ ОТСУТСТВУЕТ) 4. **ЛОГИСТИКА**: `FULFILLMENT_ACCEPTED → LOGISTICS_CONFIRMED` (подтверждение) 5. **ЛОГИСТИКА**: `LOGISTICS_CONFIRMED → SHIPPED` (отгрузка) 6. **СИСТЕМА**: `SHIPPED → DELIVERED` (финал) --- ## 📋 ЭТАП 6: АНАЛИЗ UI КОМПОНЕНТОВ ВСЕХ УЧАСТНИКОВ ### **6.1 СЕЛЛЕР** (`/src/components/supplies/supplies-dashboard.tsx`) ✅ **Работает корректно:** - Многоуровневая навигация (фулфилмент/маркетплейсы → товар/расходники → карточки/поставщики) - Интеграция с `AllSuppliesTab` для отображения поставок - Статистика и уведомления - Кнопки создания поставок ### **6.2 ПОСТАВЩИК** (`/src/components/supplier-orders/supplier-orders-dashboard.tsx`) ✅ **Работает:** - Отображение входящих заявок - Кнопки одобрения/отклонения ❌ **Критические недостатки:** - Нет формы ввода дополнительных данных при одобрении - Отсутствуют поля packagesCount, volume, readyDate ### **6.3 ФУЛФИЛМЕНТ** (`/src/components/fulfillment-supplies/fulfillment-supplies-dashboard.tsx`) ✅ **Работает:** - Сложная многоуровневая навигация - Статистика по типам поставок - Уведомления о новых поставках ❌ **Критические недостатки:** - Нет формы выбора ответственного сотрудника - Нет формы выбора логистического партнера - Компонент `FulfillmentDetailedSuppliesTab` не может принять товары из-за бага статусов ### **6.4 ЛОГИСТИКА** (`/src/components/logistics-orders/logistics-orders-dashboard.tsx`) ✅ **Работает:** - Фильтрация заказов по логистическому партнеру - Статистика заказов - Подтверждение/отклонение заказов ❌ **Недостатки:** - Отсутствует система маршрутизации - Нет планировщика доставок - Нет детального трекинга --- ## 📋 ЭТАП 7: ПОЛНЫЙ СПИСОК ПРОБЕЛОВ И НЕДОСТАЮЩЕЙ ФУНКЦИОНАЛЬНОСТИ ### **🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ (11 шт.):** #### **Backend/Workflow:** 1. **Отсутствует статус `FULFILLMENT_ACCEPTED`** в workflow между SUPPLIER_APPROVED и LOGISTICS_CONFIRMED 2. **Баг в `fulfillmentReceiveOrder`**: резолвер ожидает статус SHIPPED, но получает SUPPLIER_APPROVED 3. **Неполная мутация `supplierApproveOrder`**: не принимает поля packagesCount, volume, readyDate 4. **Отсутствует мутация для промежуточной приемки** фулфилментом с выбором сотрудника и логистики #### **UI Формы:** 5. **Поставщик не может ввести packagesCount** (количество грузовых мест) при одобрении 6. **Поставщик не может ввести volume** (объем товара в м³) при одобрении 7. **Поставщик не может указать дату готовности** товаров к отгрузке 8. **Фулфилмент не может выбрать ответственного сотрудника** для приемки товаров 9. **Фулфилмент не может выбрать логистического партнера** для дальнейшей доставки #### **Валидация:** 10. **Нет валидации обязательных полей** при одобрении поставщиком 11. **Нет проверки доступности логистических партнеров** при выборе фулфилментом ### **🟡 ВЫСОКИЙ ПРИОРИТЕТ (6 шт.):** #### **Бизнес-логика:** 12. **Нет проверки минимальных количеств заказа** при создании поставки селлером 13. **Отсутствует валидация доступности товаров** у поставщика в момент заказа 14. **Нет связи между сотрудниками и фулфилмент-центрами** для корректного выбора #### **Интеграция и уведомления:** 15. **Отсутствуют автоматические уведомления** поставщику о новых заказах 16. **Нет real-time обновлений статусов** между всеми участниками процесса 17. **Отсутствует система уведомлений** о смене статуса для всех участников ### **🟠 СРЕДНИЙ ПРИОРИТЕТ (3 шт.):** #### **Логистика и маршрутизация:** 18. **Отсутствует система маршрутизации** для планирования оптимальных доставок 19. **Нет детального трекинга статуса доставки** с промежуточными точками 20. **Отсутствует интеграция с внешними логистическими API** для расчета расстояний и времени --- ## 🎯 СТРУКТУРИРОВАННЫЙ ПЛАН ДОРАБОТКИ ### **ЭТАП 1: КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ WORKFLOW** **🔴 Приоритет: КРИТИЧЕСКИЙ** | **Время: 2-3 дня** #### 1.1 Исправление фильтрации в кабинете фулфилмента - [ ] **КРИТИЧНО**: Исправить неправильную фильтрацию - поставки товаров должны отображаться в "Товар/Новые", а НЕ в "Расходники селлера" - [ ] **Логика разделения**: - Если селлер создал поставку товаров → отображать в "Поставки на фулфилмент/Товар/Новые" - Если селлер создал поставку расходников → отображать в "Поставки на фулфилмент/Расходники селлера" #### 1.2 Убрать отображение статуса у поставщика - [ ] **UI поставщика**: Убрать текст "ожидает подтверждения" - оставить только кнопки "Одобрить"/"Отклонить" - [ ] **Файл**: `/src/components/supplier-orders/supplier-orders-tabs.tsx` #### 1.3 Создать форму выбора для фулфилмента - [ ] **Компонент**: Форма с выбором: - Ответственный сотрудник (из раздела "Сотрудники") - Логистический партнер (из раздела "Партнеры/Логистика") - [ ] **Кнопка**: "Принять" (НЕ "Принять поставку") - [ ] **Интеграция**: Обновить таблицу товаров по образцу "Партнеры/Контрагенты" ### **ЭТАП 2: СТАТУСЫ И BACKEND** **🔴 Приоритет: КРИТИЧЕСКИЙ** | **Время: 1-2 дня** #### 2.1 Исправление workflow статусов - [ ] **Prisma**: Добавить статус `FULFILLMENT_ACCEPTED` в enum SupplyOrderStatus - [ ] **GraphQL**: Обновить резолверы для поддержки нового workflow - [ ] **Backend**: Исправить мутацию `fulfillmentReceiveOrder` для корректной работы с SUPPLIER_APPROVED → FULFILLMENT_ACCEPTED - [ ] **Мутация**: Создать `fulfillmentAcceptOrder` для промежуточной приемки с выбором сотрудника и логистики ### **ЭТАП 3: СИСТЕМА УВЕДОМЛЕНИЙ** **🟡 Приоритет: ВЫСОКИЙ** | **Время: 1 день** #### 3.1 Real-time уведомления между участниками - [ ] **WebSocket**: Настроить уведомления о смене статусов - [ ] **Email**: Уведомления поставщику о новых заказах - [ ] **Dashboard**: Обновить бейджи уведомлений для всех участников ### **ЭТАП 4: ИНТЕГРАЦИЯ С ЛОГИСТИКОЙ** **🟠 Приоритет: СРЕДНИЙ** | **Время: 2-3 дня** #### 4.1 Система маршрутизации и планирования - [ ] **Компонент**: Система планирования маршрутов для логистики - [ ] **API**: Интеграция с внешними сервисами для расчета расстояний - [ ] **Планировщик**: Календарь доставок и оптимизация маршрутов #### 4.2 Детальный трекинг доставки - [ ] **Статусы**: Промежуточные статусы доставки (в пути, на складе, доставлено) - [ ] **UI**: Компонент отслеживания доставки для всех участников --- ## 📁 ФАЙЛОВАЯ СТРУКТУРА ДЛЯ РЕАЛИЗАЦИИ ### **Backend изменения:** ``` prisma/schema.prisma - добавить FULFILLMENT_ACCEPTED статус src/graphql/resolvers.ts - исправить переходы статусов src/graphql/mutations.ts - обновить мутации с доп. полями src/graphql/typedefs.ts - типы для новых полей ``` ### **Frontend компоненты:** ``` src/components/supplier-orders/ ├── supplier-approval-form.tsx - новый компонент └── supplier-orders-tabs.tsx - обновить src/components/fulfillment-supplies/ ├── fulfillment-acceptance-form.tsx - новый компонент └── fulfillment-detailed-supplies-tab.tsx - обновить src/components/logistics-orders/ ├── route-planner.tsx - новый компонент └── logistics-orders-dashboard.tsx - обновить ``` --- ## 🔧 ТЕХНИЧЕСКИЕ ТРЕБОВАНИЯ ### **GraphQL Схемы (обновить):** ```graphql # Обновить мутацию поставщика: supplierApproveOrder( id: String! packagesCount: Int! # Обязательное volume: Float! # Обязательное readyDate: DateTime # Опциональное notes: String # Опциональное ): SupplyOrderResponse! # Новая мутация фулфилмента: fulfillmentAcceptOrder( id: String! responsibleEmployee: String! # ID сотрудника logisticsPartnerId: String! # ID логистики notes: String # Примечания ): SupplyOrderResponse! ``` ### **Prisma Schema (добавить):** ```prisma enum SupplyOrderStatus { PENDING SUPPLIER_APPROVED FULFILLMENT_ACCEPTED # ← НОВЫЙ СТАТУС LOGISTICS_CONFIRMED SHIPPED DELIVERED CANCELLED } model SupplyOrder { // ... существующие поля packagesCount Int? # Активное использование volume Float? # Активное использование readyDate DateTime? # Дата готовности от поставщика responsibleEmployee String? # ID ответственного сотрудника ФФ acceptanceNotes String? # Примечания при приемке } ``` --- ## ⚠️ КРИТИЧЕСКИЕ ЗАМЕЧАНИЯ ДЛЯ РАЗРАБОТКИ ### **1. Обратная совместимость:** - НЕ НАРУШАТЬ существующие поставки при добавлении нового статуса - Добавить миграцию для корректного обновления существующих записей - Протестировать на существующих данных ### **2. Права доступа:** - ВАЛИДИРОВАТЬ права каждого участника на каждом этапе - Поставщик может работать только с заказами где он partnerId - Фулфилмент может работать только с заказами своего центра - Логистика может работать только с назначенными ей заказами ### **3. Тестирование:** - ОБЯЗАТЕЛЬНО протестировать все переходы статусов - Проверить корректность фильтрации для каждого типа организации - Тестировать валидацию полей на frontend и backend ### **4. Производительность:** - Учесть индексы в БД для новых полей - Оптимизировать запросы при добавлении новых фильтров - Проверить нагрузку при увеличении количества статусов --- ## 📊 МЕТРИКИ УСПЕХА РЕАЛИЗАЦИИ ### **Функциональные метрики:** - [ ] Поставщик может успешно одобрить заказ с указанием packagesCount и volume - [ ] Фулфилмент может выбрать сотрудника и логистику при приемке - [ ] Все статусы корректно переходят от PENDING до DELIVERED - [ ] Каждый участник видит только свои заказы в правильных статусах ### **Технические метрики:** - [ ] Нет ошибок в консоли при переходах статусов - [ ] Все GraphQL мутации возвращают корректные результаты - [ ] UI формы корректно валидируют обязательные поля - [ ] Real-time обновления работают для всех участников --- **Документ содержит полный анализ существующей системы и детальный план реализации недостающего функционала для создания полноценной 4-участнической цепочки поставок товаров.**