# 🚚 WORKFLOW ЦЕПОЧКИ ПОСТАВОК SFERA v2.0

> **⚠️ ВАЖНО:** Этот документ описывает НОВУЮ архитектуру системы поставок с разделением на отдельные типы. Для старой системы см. SUPPLY_CHAIN_WORKFLOW.md

## 🎯 ОБЗОР НОВОЙ СИСТЕМЫ

Система поставок SFERA v2.0 включает **5 типов поставок**, разделенных на две категории:

### 📦 **ПОСТАВКИ НА ФУЛФИЛМЕНТ**
- `GoodsSupplyOrder` - товары селлера → склад ФФ
- `FulfillmentConsumableSupplyOrder` - расходники ФФ → склад ФФ
- `SellerConsumableSupplyOrder` - расходники селлера → склад ФФ

### 🛒 **ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ**
- `OzonSupplyOrder` - готовые продукты → Ozon
- `WildberriesSupplyOrder` - готовые продукты → Wildberries

---

## 🔄 WORKFLOW ПО ТИПАМ ПОСТАВОК

### 1️⃣ **WORKFLOW: V2-поставки расходников фулфилмента** 🔄

```mermaid
graph TD
    A[ФФ создает заказ расходников] --> B[PENDING]
    B --> C{Поставщик одобряет?}
    C -->|Да| D[SUPPLIER_APPROVED]
    C -->|Нет| X[CANCELLED]
    D --> E{Логистика назначена?}
    E -->|Да| F[LOGISTICS_CONFIRMED] 
    E -->|Нет| D
    F --> G[Поставщик отгружает]
    G --> H[SHIPPED]
    H --> I[IN_TRANSIT]
    I --> J[ФФ принимает на склад]
    J --> K[DELIVERED]
    
    style A fill:#e1f5fe
    style K fill:#c8e6c9
    style X fill:#ffcdd2
```

**Участники:**
- 🏭 **Фулфилмент** - создатель, получатель
- 🏪 **Поставщик (WHOLESALE)** - одобрение, отгрузка
- 🚛 **Логистика (LOGIST)** - доставка

**Особенности:**
- ✅ ФФ видит все детали + устанавливает цены продажи селлерам
- ✅ Поставщик видит товары/количества, НЕ видит цены продажи ФФ
- ✅ Показывается сразу после создания

### 2️⃣ **WORKFLOW: V2-поставки товаров** ⏳

```mermaid
graph TD
    A[Селлер заказывает товары у поставщика] --> B[PENDING]
    B --> C{Поставщик одобряет?}
    C -->|Да| D[SUPPLIER_APPROVED]
    C -->|Нет| X[CANCELLED]
    D --> E{Логистика назначена?}
    E -->|Да| F[LOGISTICS_CONFIRMED]
    E -->|Нет| D
    F --> G[Поставщик отгружает]
    G --> H[SHIPPED]
    H --> I[IN_TRANSIT]
    I --> J[ФФ принимает + обрабатывает]
    J --> K[DELIVERED]
    
    style A fill:#fff3e0
    style K fill:#c8e6c9
    style X fill:#ffcdd2
```

**Участники:**
- 🛒 **Селлер** - создатель, владелец товара
- 🏪 **Поставщик (WHOLESALE)** - поставка
- 🚛 **Логистика (LOGIST)** - доставка  
- 🏭 **Фулфилмент** - получатель, обработка

**Особенности:**
- ✅ Селлер видит свои товары + рецептуры + закупочные цены
- ✅ ФФ видит товары + рецептуры + услуги, НЕ видит закупочные цены селлера
- ✅ Поставщик видит товары + количества, НЕ видит рецептуры
- ✅ Расходники селлера идут **в состав продукта**, не отслеживаются отдельно

### 3️⃣ **WORKFLOW: V2-поставки расходников селлеров** ⏳

```mermaid
graph TD
    A[Селлер заказывает "расходники селлера" у поставщика для хранения на ФФ] --> B[PENDING]
    B --> C{Поставщик одобряет?}
    C -->|Да| D[SUPPLIER_APPROVED]
    C -->|Нет| X[CANCELLED]
    D --> E{Логистика назначена?}
    E -->|Да| F[LOGISTICS_CONFIRMED]
    E -->|Нет| D
    F --> G[Поставщик отгружает]
    G --> H[SHIPPED]
    H --> I[IN_TRANSIT]
    I --> J[ФФ принимает НА ХРАНЕНИЕ]
    J --> K[DELIVERED]
    
    style A fill:#f3e5f5
    style K fill:#c8e6c9
    style X fill:#ffcdd2
```

**Участники:**
- 🛒 **Селлер** - создатель, владелец расходников
- 🏪 **Поставщик (WHOLESALE)** - поставка
- 🚛 **Логистика (LOGIST)** - доставка
- 🏭 **Фулфилмент** - хранитель (НЕ владелец)

**Особенности:**
- ✅ Селлер видит свои расходники + закупочные цены
- ✅ ФФ видит факт хранения + количества, НЕ видит закупочные цены селлера
- ✅ Срок хранения + права доступа настраиваются
- ✅ Используются селлером в рецептурах своих товаров

---

## 📊 СТАТУСЫ И ПЕРЕХОДЫ

### **SupplyOrderStatus (поставки НА фулфилмент)**

| Статус | Описание | Ответственный | Действия |
|--------|----------|---------------|----------|
| `PENDING` | Ожидает одобрения поставщика | Поставщик | Одобрить/Отклонить |
| `SUPPLIER_APPROVED` | Одобрено поставщиком | Логистика | Назначить маршрут |
| `LOGISTICS_CONFIRMED` | Логистика подтверждена | Поставщик | Отгрузить товар |
| `SHIPPED` | Отгружено | Система | Автоматический переход |
| `IN_TRANSIT` | В пути | Логистика | Отслеживание доставки |
| `DELIVERED` | Доставлено | ФФ | Принять на склад |
| `CANCELLED` | Отменено | Любой участник | Указать причину |

### **MarketplaceSupplyStatus (поставки НА маркетплейсы)**

| Статус | Описание | Ответственный | Действия |
|--------|----------|---------------|----------|
| `PLANNED` | Запланирована | ФФ | Подготовить товары |
| `PREPARED` | Подготовлена | ФФ | Отгрузить |
| `SHIPPED_TO_MARKETPLACE` | Отгружена | Маркетплейс | Принять товар |
| `ACCEPTED_BY_MARKETPLACE` | Принята | Система | Обновить остатки |
| `CANCELLED` | Отменена | ФФ/Маркетплейс | Указать причину |

---

## 🎭 РОЛИ И ПРАВА ДОСТУПА

### 🏭 **ФУЛФИЛМЕНТ**

**Может создавать:**
- ✅ Поставки расходников ФФ
- ✅ Поставки на маркетплейсы

**Может видеть:**
- ✅ Свои поставки расходников: все детали + цены продажи
- ✅ Товарные поставки селлеров: товары + рецептуры, НЕ закупочные цены
- ✅ Расходники селлеров на хранении: количества, НЕ закупочные цены

### 🛒 **СЕЛЛЕР** 

**Может создавать:**
- ✅ Товарные поставки
- ✅ Поставки расходников селлера

**Может видеть:**
- ✅ Свои товарные поставки: все детали + рецептуры + закупочные цены
- ✅ Свои расходники: все детали + закупочные цены
- ❌ Чужие поставки
- ❌ Поставки расходников ФФ

### 🏪 **ПОСТАВЩИК (WHOLESALE)**

**Может видеть:**
- ✅ Заказы к себе: товары + количества
- ❌ Рецептуры товаров
- ❌ Цены продажи ФФ селлерам
- ❌ Услуги ФФ

### 🚛 **ЛОГИСТИКА (LOGIST)**

**Может видеть:**
- ✅ Маршруты + объемы + вес
- ❌ Коммерческие данные (цены, услуги)
- ❌ Рецептуры товаров

---

## 🌐 ИНТЕРФЕЙСЫ СИСТЕМЫ

### 📦 **Кабинет фулфилмента**

**URL:** `/fulfillment-supplies/`

**Вкладки:**
- `ff-consumables` - поставки расходников ФФ (создание + просмотр)
- `seller-consumables` - расходники селлеров на хранении  
- `goods?status=new` - новые товарные поставки
- `goods?status=receiving` - товары в приемке
- `goods?status=accepted` - принятые товары

### 🛒 **Кабинет селлера**

**URL:** `/seller-supplies/`

**Вкладки:**
- `my-goods` - мои товарные поставки
- `my-consumables` - мои расходники
- `create-goods` - создать поставку товаров  
- `create-consumables` - заказать расходники

### 🛍️ **Кабинет маркетплейсов**

**URL:** `/marketplace-supplies/`

**Вкладки:**
- `ozon` - поставки на Ozon
- `wildberries` - поставки на Wildberries
- `create-ozon` - создать поставку на Ozon
- `create-wildberries` - создать поставку на WB

---

## ⚡ ОСОБЕННОСТИ РЕАЛИЗАЦИИ

### 🔄 **Дополнение данных по этапам**

Каждая поставка - это **одна запись**, которая дополняется участниками:

```typescript
// Создание (селлер/ФФ)
supply = {
  id: "...",
  status: "PENDING",
  sellerId: "...",        // кто создал
  requestedDate: "...",   // когда нужно
  items: [...]           // что заказано
}

// Одобрение (поставщик)
supply = {
  ...supply,
  status: "SUPPLIER_APPROVED",
  supplierId: "...",      // кто одобрил
  approvedAt: "...",      // когда одобрил
  packagesCount: 5,       // уточненные параметры
  estimatedVolume: 2.5
}

// Назначение логистики (ФФ)
supply = {
  ...supply, 
  status: "LOGISTICS_CONFIRMED",
  logisticsPartnerId: "...",  // кто повезет
  routeId: "...",             // маршрут
  logisticsCost: 1500         // стоимость
}
```

### 🔐 **Фильтрация по безопасности**

Каждый resolver применяет фильтрацию по роли:

```typescript
// Пример: поставки расходников ФФ
const supplies = await prisma.fulfillmentConsumableSupplyOrder.findMany({
  where: {
    // Только свои поставки для ФФ
    fulfillmentCenterId: user.organizationId  
  }
})

// Фильтрация полей по роли
return supplies.map(supply => 
  SupplyDataFilter.filterByRole(supply, user.organizationType)
)
```

### 📈 **Масштабируемость**

Новые типы поставок добавляются независимо:

```typescript
// Будущее: Поставки на Яндекс.Маркет
interface YandexMarketSupplyOrder {
  // специфичные поля для Яндекс.Маркета
}

// Отдельные операции
createYandexMarketSupply()
myYandexMarketSupplies()
```

---

## ✅ ПРЕИМУЩЕСТВА НОВОЙ АРХИТЕКТУРЫ

### 🎯 **Четкое разделение ответственности**
- Каждый тип поставки имеет свою логику
- Независимая разработка и тестирование
- Простота добавления новых типов

### 🔒 **Надежная безопасность**  
- Раздельные правила доступа для каждого типа
- Невозможно случайно показать чужие данные
- Гранулярные права по ролям

### 📈 **Масштабируемость**
- Легко добавлять новые маркетплейсы
- Независимые схемы для разных процессов  
- Оптимизация каждого типа отдельно

### 🛡️ **Безопасная миграция**
- Поэтапное внедрение без остановки системы
- Система откатов на каждом этапе
- Сохранение работоспособности старой системы

---

## 🚀 ПЛАН ВНЕДРЕНИЯ

### **Phase 1:** V2-поставки расходников фулфилмента 🔄 В РАЗРАБОТКЕ
**Workflow:** ФФ заказывает расходники у поставщика
- ✅ Модель данных FulfillmentConsumableSupplyOrder
- ✅ GraphQL операции (queries + mutations)
- ✅ Backend resolvers для всех ролей
- ✅ Интеграция в кабинет фулфилмента (создание)
- ✅ Интеграция в кабинет поставщика (обработка)  
- ✅ Интеграция в кабинет логистики (подтверждение)
- ✅ Исправление критических багов workflow
- 🔄 Финальное тестирование и доработки

### **Phase 2:** V2-поставки расходников селлеров ⏳ ПЛАНИРУЕТСЯ
**Workflow:** Селлер заказывает "расходники селлера" у поставщика для хранения на ФФ
- Модель SellerConsumableSupplyOrder
- Интеграция с системой хранения на ФФ
- Права доступа селлера к своим расходникам

### **Phase 3:** V2-поставки товаров ⏳ ПЛАНИРУЕТСЯ  
**Workflow:** Селлер заказывает товары у поставщика
- Модель GoodsSupplyOrder
- Самый сложный тип с рецептурами
- Миграция существующих товарных поставок

### **Phase 4:** V2-поставки на маркетплейсы ⏳ ПЛАНИРУЕТСЯ
**Workflow:** ФФ отгружает товары на маркетплейсы
- Модели OzonSupplyOrder, WildberriesSupplyOrder
- API интеграции с маркетплейсами

### **Phase 5:** Очистка и оптимизация ⏳ ПЛАНИРУЕТСЯ
- Миграция старых данных V1 → V2
- Удаление устаревшего кода (с одобрения)
- Финальная оптимизация системы

**Текущий этап:** Завершение Phase 1 - V2-поставки расходников фулфилмента