diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 19fb48a..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,58 +0,0 @@ -# СИСТЕМНЫЕ ПРАВИЛА ДЛЯ CLAUDE CODE - -## 🚨 ОБЯЗАТЕЛЬНЫЕ ФАЙЛЫ ДЛЯ ПРОВЕРКИ - -**ПЕРЕД ЛЮБЫМ ИЗМЕНЕНИЕМ КОДА ВСЕГДА ЧИТАТЬ:** - -1. **`development-checklist.md`** - Критические проверки и запреты -2. **`rules-unified.md`** - Полная база знаний системы (v4.0) -3. **`fulfillment-cabinet-rules.md`** - Правила кабинета фулфилмента -4. **`visual-design-rules.md`** - Правила визуального дизайна - -> **Архивированы**: `rules.md`, `rules1.md`, `rules2.md` → `archive/` - -## 🔄 WORKFLOW РАЗРАБОТКИ - -### Шаг 1: Анализ задачи -- [ ] Прочитать `development-checklist.md` -- [ ] Проверить применимые правила из всех файлов правил -- [ ] Убедиться что задача не нарушает критические запреты - -### Шаг 2: Планирование -- [ ] Использовать TodoWrite для планирования задач -- [ ] Проверить соответствие архитектуре системы -- [ ] Учесть все обязательные проверки - -### Шаг 3: Реализация -- [ ] Следовать техническим правилам (GraphQL, TypeScript) -- [ ] Соблюдать систему партнерства и типизацию -- [ ] Добавлять необходимое логирование - -### Шаг 4: Проверка -- [ ] Проверить все пункты checklist'а -- [ ] Протестировать функциональность -- [ ] Убедиться в отсутствии нарушений запретов - -## 🎯 КЛЮЧЕВЫЕ ПРИНЦИПЫ - -1. **НЕ ПРЕДПОЛАГАТЬ** - всегда уточнять при сомнениях -2. **ПРОВЕРЯТЬ СХЕМЫ** - GraphQL и Prisma должны соответствовать коду -3. **СЛЕДОВАТЬ WORKFLOW** - не нарушать последовательность статусов -4. **ДОКУМЕНТИРОВАТЬ** - обновлять правила при решении проблем - -## 📋 КРИТИЧЕСКИЕ ФАЙЛЫ - -### Файлы с правилами (ВСЕГДА ПРОВЕРЯТЬ): -- `development-checklist.md` - ОБЯЗАТЕЛЬНЫЕ проверки -- `rules-unified.md` - Полная база знаний системы (v4.0) -- `fulfillment-cabinet-rules.md` - Правила кабинета фулфилмента -- `visual-design-rules.md` - Правила визуального дизайна - -### Технические файлы: -- `prisma/schema.prisma` - Схема базы данных -- `src/graphql/typedefs.ts` - GraphQL схема -- `src/graphql/resolvers.ts` - GraphQL резолверы - -## 🚨 НАПОМИНАНИЕ - -**ЭТОТ ФАЙЛ СЛУЖИТ ПОСТОЯННЫМ НАПОМИНАНИЕМ О НЕОБХОДИМОСТИ ПРОВЕРКИ ВСЕХ ФАЙЛОВ С ПРАВИЛАМИ ПЕРЕД КАЖДЫМ ИЗМЕНЕНИЕМ КОДА!** \ No newline at end of file diff --git a/archive/rules-v1.0.md b/archive/rules-v1.0.md deleted file mode 100644 index a90f5ac..0000000 --- a/archive/rules-v1.0.md +++ /dev/null @@ -1,813 +0,0 @@ -# ПРАВИЛА СИСТЕМЫ СКЛАДА ПОСТАВЩИКА - -> ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данные из этого файла могут быть удалены только с разрешения пользователя. Все изменения должны согласовываться. - -## 🔤 ТЕРМИНЫ СИСТЕМЫ -> Для людей → `В коде` -- ТОВАР → `PRODUCT` -- РАСХОДНИКИ → `CONSUMABLE` -- БРАК → `DEFECT` *(планируется)* -- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* - -## 1. 🎯 ОСНОВНЫЕ ПРИНЦИПЫ - -### 1.0 Структура системы по кабинетам - -**🏢 КАБИНЕТ ПОСТАВЩИКА** - управляет созданием и поставкой: - -- **ТОВАР** - базовые товары от поставщика -- **РАСХОДНИКИ** - материалы и вспомогательные товары - -**🏭 КАБИНЕТ ФУЛФИЛМЕНТА** - принимает, обрабатывает и управляет всеми типами: - -- **ТОВАР** - базовые товары от поставщиков (принятые на склад) -- **БРАК** - товары с дефектами (производные от товара) -- **ПРОДУКТ** - готовые к продаже товары (производные от товара) -- **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров - -### 1.1 Типизация предметов - -- **ОБЯЗАТЕЛЬНО**: Каждый предмет должен иметь один из следующих типов: - -**ТИПЫ ПРЕДМЕТОВ ПО КАБИНЕТАМ:** - -**🏢 КАБИНЕТ ПОСТАВЩИКА:** - -1. **ТОВАР** (`PRODUCT`) - базовый тип товара от поставщика -2. **РАСХОДНИКИ** (`CONSUMABLE`) - материалы и вспомогательные товары от поставщика - -**🏭 КАБИНЕТ ФУЛФИЛМЕНТА:** - -1. **ТОВАР** (`PRODUCT`) - базовые товары от поставщиков (принятые на склад) -2. **БРАК** (`DEFECT` - планируется) - производная от товара (товар с дефектами) -3. **ПРОДУКТ** (`FINISHED_PRODUCT` - планируется) - готовый к продаже товар -4. **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента -5. **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров - -- **ЗАПРЕЩЕНО**: Создание предметов без указания типа -- **ВАЖНО**: Товар ≠ Продукт (это разные сущности в системе) -- **ПРАВИЛО**: Тип определяет логику обработки, отображения и workflow в системе -- **КЛАССИФИКАЦИЯ РАСХОДНИКОВ**: Поставщик создает просто "РАСХОДНИКИ". При заказе, в зависимости от типа заказчика, они становятся: - - **Расходники фулфилмента** - если заказывает фулфилмент-центр - - **Расходники селлеров** - если заказывает селлер - -### 1.2 Правила производных типов - -- **БРАК**: - - - **ПРОИСХОЖДЕНИЕ**: Создается на основе существующего товара - - **СВЯЗЬ**: Обязательная связь с родительским товаром - - **УЧЕТ**: Отдельный учет в статистике потерь - - **WORKFLOW**: Особый процесс списания и утилизации - -- **ПРОДУКТ**: - - - **ПРОИСХОЖДЕНИЕ**: Создается на основе товара после обработки - - **ОТЛИЧИЕ**: Товар - сырье, Продукт - готовая единица к продаже - - **СТАТУС**: Имеет собственный жизненный цикл - - **УЧЕТ**: Отдельная статистика от базового товара - -- **РАСХОДНИКИ ФУЛФИЛМЕНТА**: - - - **НАЗНАЧЕНИЕ**: Для внутренних операций фулфилмент-центра - - **ЗАКАЗЧИК**: Фулфилмент-центр заказывает для себя - - **УЧЕТ**: В статистике операционных расходов фулфилмента - -- **РАСХОДНИКИ СЕЛЛЕРОВ**: - - **НАЗНАЧЕНИЕ**: Для товаров и операций селлеров - - **ЗАКАЗЧИК**: Селлер заказывает через фулфилмент - - **УЧЕТ**: В статистике расходов селлера - -### 1.3 Уникальность артикулов - -- **ОБЯЗАТЕЛЬНО**: Артикул должен быть уникальным в рамках организации -- **ПРАВИЛО**: Система должна автоматически генерировать артикул СФ при создании -- **ФОРМАТ**: `СФ-{ТИП}-{КОД_КАТЕГОРИИ}-{КОД_ОРГАНИЗАЦИИ}-{TIMESTAMP}-{RANDOM}` -- **ТИПЫ В АРТИКУЛЕ**: - - `TOV` - Товар - - `BRK` - Брак - - `R` - Расходники (классифицируются при заказе) - - `PRD` - Продукт - -### 1.4 Обязательные поля - -- **КРИТИЧЕСКИ ВАЖНО**: Название, артикул, цена > 0, тип предмета -- **ОБЯЗАТЕЛЬНО**: Количество (может быть 0 для предзаказа) -- **ДЛЯ ПРОИЗВОДНЫХ ТИПОВ**: Обязательная связь с родительским предметом (для брака и продукта) -- **ДЛЯ РАСХОДНИКОВ**: Обязательно указание подтипа (фулфилмента или селлеров) -- **РЕКОМЕНДУЕТСЯ**: Описание, категория, основное изображение - -## 2. 🔒 ПРАВИЛА ДОСТУПА И БЕЗОПАСНОСТИ - -### 2.1 Контроль доступа - -- **ЗАПРЕЩЕНО**: Поставщик не может добавлять собственные предметы в корзину -- **ПРАВИЛО**: Только активные предметы (`isActive: true`) отображаются в маркете -- **ОГРАНИЧЕНИЕ**: Доступ к заказам только для участников процесса (создатель, поставщик, фулфилмент) -- **ПО ТИПАМ ПРЕДМЕТОВ**: - - **ТОВАР**: Доступен всем типам организаций для заказа - - **БРАК**: Доступен только для просмотра, заказ запрещен - - **РАСХОДНИКИ**: Доступны всем типам организаций для заказа - - При заказе фулфилмент-центром классифицируются как "расходники фулфилмента" - - При заказе селлером классифицируются как "расходники селлеров" - - **ПРОДУКТ**: Доступен для заказа после подтверждения готовности - -### 2.2 Проверка остатков - -- **ОБЯЗАТЕЛЬНО**: Проверять наличие предмета перед добавлением в корзину -- **ПРАВИЛО**: Количество в заказе не может превышать остаток на складе -- **ИСКЛЮЧЕНИЕ**: Предзаказы (если реализована функция) -- **ОСОБЕННОСТИ ПО ТИПАМ**: - - **ТОВАР/ПРОДУКТ**: Стандартная проверка остатков - - **БРАК**: Остатки учитываются, но заказ запрещен - - **РАСХОДНИКИ**: Проверка с учетом резервирования под активные заказы - -### 2.3 Валидация данных - -- **ОБЯЗАТЕЛЬНО**: Проверка корректности всех числовых значений (цена, вес, количество) -- **ПРАВИЛО**: Цена должна быть больше 0 -- **ОГРАНИЧЕНИЕ**: Вес и габариты должны быть положительными числами - -## 3. 📊 ПРАВИЛА СТАТИСТИКИ И АНАЛИТИКИ - -### 3.1 Актуализация данных - -- **КРИТИЧЕСКИ ВАЖНО**: При изменении количества в карточке данные актуализируются во всей системе -- **ПРАВИЛО**: Статистика обновляется в реальном времени -- **ОБЯЗАТЕЛЬНО**: Отслеживание изменений для аналитики - -### 3.2 Отображение метрик - -- **ОБЯЗАТЕЛЬНО**: Блок статистики в верхней части раздела склад -- **СОСТАВ**: Общие остатки, заказано, в пути, остаток, продано -- **ПРАВИЛО**: Подсвечивать предметы с остатками ниже критического уровня -- **РАЗДЕЛЕНИЕ ПО ТИПАМ И КАБИНЕТАМ**: - -**В КАБИНЕТЕ ПОСТАВЩИКА**: - -- **ТОВАРЫ**: Общая статистика товаров поставщика -- **РАСХОДНИКИ**: Материалы и вспомогательные товары (классифицируются при заказе) - -**В КАБИНЕТЕ ФУЛФИЛМЕНТА**: - -- **ТОВАРЫ**: Базовые товары от поставщиков (принятые на склад) -- **ПРОДУКТЫ**: Отдельный блок готовой продукции -- **БРАК**: Статистика потерь и списаний -- **РАСХОДНИКИ ФУЛФИЛМЕНТА**: Операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ**: Материалы для товаров селлеров - -## 4. 🚚 ПРАВИЛА WORKFLOW ПОСТАВОК - -### 4.1 Жизненный цикл статусов - -``` -PENDING → SUPPLIER_APPROVED → CONFIRMED → LOGISTICS_CONFIRMED → SHIPPED → IN_TRANSIT → DELIVERED -``` - -- **ЗАПРЕЩЕНО**: Пропускать промежуточные статусы -- **ПРАВИЛО**: Каждое изменение статуса должно сопровождаться уведомлением -- **ОБЯЗАТЕЛЬНО**: Логирование всех изменений статусов - -### 4.2 Уведомления - -- **АВТОМАТИЧЕСКИ**: Отправка уведомления поставщику при создании заказа -- **ОБЯЗАТЕЛЬНО**: Уведомление всех участников при изменении статуса -- **ФОРМАТ**: Структурированные сообщения с деталями заказа - -### 4.3 Роли и ответственность - -- **ПОСТАВЩИК**: Создание товаров, одобрение заказов, отгрузка -- **СЕЛЛЕР**: Создание заказов, отслеживание поставок -- **ФУЛФИЛМЕНТ**: Приемка товаров, выбор логистики, управление складом -- **ЛОГИСТИКА**: Подтверждение доставки, транспортировка - -## 5. 🖼️ ПРАВИЛА РАБОТЫ С ИЗОБРАЖЕНИЯМИ - -### 5.1 Управление изображениями - -- **РЕКОМЕНДУЕТСЯ**: Загружать несколько изображений для каждого товара -- **ОБЯЗАТЕЛЬНО**: Выбирать основное изображение для отображения в списках -- **ПРАВИЛО**: Изображения должны быть в поддерживаемых форматах (JPG, PNG, WebP) -- **ОГРАНИЧЕНИЕ**: Максимальный размер файла изображения - -### 5.2 Отображение товаров - -- **ПРАВИЛО**: 5 карточек в ряд в карточном режиме -- **ОБЯЗАТЕЛЬНО**: Возможность переключения между строчным и карточным режимами -- **ФУНКЦИЯ**: Предпросмотр изображений при наведении/клике - -## 6. 🛒 ПРАВИЛА КОРЗИНЫ И ИЗБРАННОГО - -### 6.1 Система корзины - -- **ПРАВИЛО**: Одна корзина на организацию -- **ПРОВЕРКА**: Автоматическая проверка доступности товаров при добавлении -- **ОГРАНИЧЕНИЕ**: Нельзя добавлять неактивные товары -- **ФУНКЦИЯ**: Автоматическое обновление количества при повторном добавлении - -### 6.2 Система избранного - -- **ПРАВИЛО**: Индивидуальные избранные для каждого пользователя -- **ФУНКЦИЯ**: Быстрое добавление из избранного в корзину -- **СИНХРОНИЗАЦИЯ**: Проверка актуальности товаров в избранном - -## 7. 🔄 ПРАВИЛА ИНТЕГРАЦИИ - -### 7.1 Интеграция с маркетплейсами - -- **WILDBERRIES**: Обязательная проверка активности API ключа -- **СИНХРОНИЗАЦИЯ**: Регулярное обновление данных из внешних источников -- **ПРАВИЛО**: Сохранение локальных копий данных для офлайн работы - -### 7.2 Глобальная интеграция - -- **ОБЯЗАТЕЛЬНО**: Товары поставщиков отображаются в глобальном маркете -- **ПРАВИЛО**: Разделение по типам (товары/расходники) в интерфейсе -- **СИНХРОНИЗАЦИЯ**: Данные склада синхронизируются с модулем аналитики - -### 7.3 Интеграция с модулем "Услуги" - -- **РАСХОДНИКИ ФУЛФИЛМЕНТА В УСЛУГАХ**: - - Селлеры могут использовать расходники фулфилмента в разделе "Услуги / Расходники" - - Для создания продукта из товара - - Расходники списываются с остатков фулфилмента - - Стоимость включается в стоимость услуги -- **WORKFLOW ИСПОЛЬЗОВАНИЯ**: - 1. Селлер выбирает услугу "Создание продукта" - 2. Указывает базовый товар - 3. Выбирает необходимые расходники фулфилмента - 4. Фулфилмент обрабатывает заказ и создает продукт - 5. Расходники списываются, создается готовый продукт - -## 8. 💰 ПРАВИЛА ЦЕНООБРАЗОВАНИЯ И ЛОГИСТИКИ - -### 8.1 Система тарификации - -- **ОБЯЗАТЕЛЬНО**: Указание тарифов для грузов до 1м³ и свыше 1м³ -- **ПРАВИЛО**: Автоматический расчет стоимости доставки по объему -- **ФУНКЦИЯ**: Отображение примерной стоимости доставки при заказе - -### 8.2 Управление ценами - -- **ПРАВИЛО**: Цена за единицу и цена за комплект (если применимо) -- **ВАЛИДАЦИЯ**: Все цены должны быть больше 0 -- **ФУНКЦИЯ**: История изменения цен для аналитики - -## 9. 🔍 ПРАВИЛА ПОИСКА И ФИЛЬТРАЦИИ - -### 9.1 Система поиска - -- **ПОИСК ПО**: Название, артикул, категория, бренд, описание -- **ПРАВИЛО**: Поиск должен быть регистронезависимым -- **ФУНКЦИЯ**: Автодополнение при вводе поискового запроса - -### 9.2 Фильтрация и сортировка - -- **ФИЛЬТРЫ**: По категории, типу товара, статусу активности, остаткам -- **СОРТИРОВКА**: По дате создания, названию, цене, остаткам -- **ПРАВИЛО**: Сохранение настроек фильтров для пользователя - -## 10. 📱 ПРАВИЛА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА - -### 10.1 Отзывчивость интерфейса - -- **ОБЯЗАТЕЛЬНО**: Интерфейс должен работать на всех устройствах -- **ПРАВИЛО**: Адаптивная сетка для карточек товаров -- **ФУНКЦИЯ**: Оптимизация для мобильных устройств - -### 10.2 Обратная связь пользователю - -- **ОБЯЗАТЕЛЬНО**: Уведомления об успешных/неуспешных операциях -- **ПРАВИЛО**: Индикаторы загрузки для длительных операций -- **ФУНКЦИЯ**: Подтверждение критических действий (удаление, деактивация) - -## 11. 🚨 ПРАВИЛА ОБРАБОТКИ ОШИБОК - -### 11.1 Обработка ошибок - -- **ОБЯЗАТЕЛЬНО**: Логирование всех ошибок -- **ПРАВИЛО**: Понятные сообщения об ошибках для пользователя -- **ФУНКЦИЯ**: Автоматическое восстановление после сбоев - -### 11.2 Резервное копирование - -- **КРИТИЧЕСКИ ВАЖНО**: Регулярное резервное копирование данных товаров -- **ПРАВИЛО**: Версионность изменений для возможности отката -- **ФУНКЦИЯ**: Автоматическое восстановление связей при сбоях - -## 12. 📈 ПРАВИЛА ПРОИЗВОДИТЕЛЬНОСТИ - -### 12.1 Оптимизация загрузки - -- **ПРАВИЛО**: Пагинация для больших списков товаров -- **ФУНКЦИЯ**: Ленивая загрузка изображений -- **ОПТИМИЗАЦИЯ**: Кэширование часто запрашиваемых данных - -### 12.2 Масштабируемость - -- **АРХИТЕКТУРА**: Модульная структура для легкого расширения -- **ПРАВИЛО**: Использование индексов для быстрого поиска -- **ФУНКЦИЯ**: Горизонтальное масштабирование при росте нагрузки - -## 13. 🔐 ПРАВИЛА БЕЗОПАСНОСТИ ДАННЫХ - -### 13.1 Защита данных - -- **ОБЯЗАТЕЛЬНО**: Шифрование чувствительных данных -- **ПРАВИЛО**: Аудит всех действий пользователей -- **ФУНКЦИЯ**: Контроль доступа на уровне API - -### 13.2 Соответствие требованиям - -- **GDPR**: Право на удаление и экспорт данных -- **ПРАВИЛО**: Прозрачность обработки персональных данных -- **ФУНКЦИЯ**: Логирование согласий пользователей - -## 14. 🎯 ПРАВИЛА КАЧЕСТВА КОДА - -### 14.1 Стандарты разработки - -- **ОБЯЗАТЕЛЬНО**: Покрытие тестами критической функциональности -- **ПРАВИЛО**: Следование принципам SOLID -- **ФУНКЦИЯ**: Автоматическое тестирование при развертывании - -### 14.2 Документация - -- **ОБЯЗАТЕЛЬНО**: Документирование всех API методов -- **ПРАВИЛО**: Комментарии к сложной бизнес-логике -- **ФУНКЦИЯ**: Автоматическая генерация документации - ---- - -## 15. 📦 СПЕЦИАЛЬНЫЕ ПРАВИЛА ДЛЯ ТИПОВ ПРЕДМЕТОВ - -### 15.1 Правила для ТОВАРА - -- **СОЗДАНИЕ**: Базовый тип, создается поставщиком -- **СТАТУС**: Может быть активным/неактивным -- **ЗАКАЗ**: Доступен для заказа всеми типами организаций -- **ТРАНСФОРМАЦИЯ**: Может быть преобразован в ПРОДУКТ или БРАК -- **УЧЕТ**: Основная единица складского учета -- **ЦЕНА**: Обязательна, больше 0 - -### 15.2 Правила для БРАКА - -- **СОЗДАНИЕ**: Только на основе существующего ТОВАРА -- **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) -- **СТАТУС**: Всегда неактивен для заказа -- **ЗАКАЗ**: ЗАПРЕЩЕН заказ брака -- **ОТОБРАЖЕНИЕ**: Виден только для учета потерь -- **СПИСАНИЕ**: Особый workflow списания и утилизации -- **СТАТИСТИКА**: Учитывается в потерях и браке -- **ЦЕНА**: Может быть 0 (списанный товар) - -### 15.3 Правила для ПРОДУКТА - -- **СОЗДАНИЕ**: Только на основе существующего ТОВАРА через процесс "Создания продукта" -- **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) -- **ОТЛИЧИЕ**: Товар = сырье, Продукт = готовая единица -- **СТАТУСЫ ЖИЗНЕННОГО ЦИКЛА**: - - Товар "на складе" → "в работе" → Продукт "готов к отправке" -- **РЕЦЕПТУРА**: Определяется селлером при создании поставки -- **СОСТАВ**: Товар + Услуга фулфилмента + Расходники (опционально) -- **АРТИКУЛЫ**: Наследует от товара + артикул MP (если связан) -- **ЗАКАЗ**: Доступен только в статусе "готов к отправке" -- **ПРОЦЕСС**: Обязательно проходит этап обработки на фулфилменте -- **УЧЕТ**: Отдельная статистика от базового товара -- **ЦЕНА**: Формируется из стоимости товара + услуг + расходников -- **СВЯЗЬ С MP**: Опциональная связь с карточкой маркетплейса - -### 15.4 Правила для РАСХОДНИКОВ - -- **СОЗДАНИЕ**: Поставщик создает карточки типа "РАСХОДНИКИ" -- **УНИВЕРСАЛЬНОСТЬ**: Один тип расходников для всех заказчиков -- **ПРИМЕРЫ**: Упаковочные материалы, этикетки, пленка, коробки, бирки, вкладыши -- **ДОСТУП**: Видны всем типам организаций в маркете -- **ЗАКАЗ**: Любая организация может заказать расходники - -### 15.5 Классификация при заказе - -**РАСХОДНИКИ → РАСХОДНИКИ ФУЛФИЛМЕНТА (при заказе фулфилмент-центром):** - -- **НАЗНАЧЕНИЕ**: Для внутренних операций фулфилмент-центра и услуг селлерам -- **УЧЕТ**: В операционных расходах фулфилмента -- **WORKFLOW**: Поставщик → фулфилмент (прямая поставка) -- **ИСПОЛЬЗОВАНИЕ**: Для операций фулфилмента и услуг селлерам - -**РАСХОДНИКИ → РАСХОДНИКИ СЕЛЛЕРОВ (при заказе селлером):** - -- **НАЗНАЧЕНИЕ**: Для товаров и операций селлеров -- **УЧЕТ**: В расходах селлера -- **WORKFLOW**: Поставщик → фулфилмент → селлер -- **ПРИВЯЗКА**: Могут быть привязаны к конкретным товарам селлера - -## 16. ⚠️ КРИТИЧЕСКИЕ ЗАПРЕТЫ - -### 16.1 НИКОГДА НЕ ДЕЛАТЬ: - -1. ❌ Удалять предметы с существующими заказами -2. ❌ Изменять статусы заказов без уведомлений -3. ❌ Обходить проверки остатков предметов -4. ❌ Давать доступ к чужим данным -5. ❌ Игнорировать ошибки валидации -6. ❌ Сохранять пароли в открытом виде -7. ❌ Пропускать логирование критических операций -8. ❌ Блокировать интерфейс без индикации загрузки -9. ❌ Создавать брак или продукт без связи с родительским товаром -10. ❌ Создавать отдельные типы расходников (только общий тип "РАСХОДНИКИ") -11. ❌ Разрешать заказ брака -12. ❌ Нарушать иерархию типов предметов - ---- - -## 17. 🏢 ПРАВИЛА СИСТЕМЫ СКЛАДА ФУЛФИЛМЕНТА - -### 17.1 Структура раздела склад фулфилмента - -#### 17.1.1 Блок статистика склада - -**ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ МОДУЛЕЙ:** - -1. **ПРОДУКТ** - готовые к продаже товары -2. **ТОВАР** - базовые товары от поставщиков -3. **БРАК** - товары с дефектами -4. **ВОЗВРАТЫ С ПВЗ** - возвращенные товары -5. **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров -6. **РАСХОДНИКИ ФУЛФИЛМЕНТ** - операционные материалы - -**ТРЕБОВАНИЯ К МОДУЛЯМ:** - -- **ОБЯЗАТЕЛЬНО**: Каждый модуль отображает текущее наличие на складе -- **ПРАВИЛО**: Последовательность модулей не может быть изменена -- **СТАТУС**: Все модули отображают актуальные данные в реальном времени - -#### 17.1.2 Система учёта движения товаров - -**ОСНОВНЫЕ ПРИНЦИПЫ:** - -- **ПРИХОД**: Товары поступают через принятые поставки (из состояния "в пути" → "на складе") -- **ОБРАБОТКА**: Товары переходят в статус "в работе" для создания продуктов -- **РАСХОД**: Товары убывают при отгрузке, списании, возврате, превращении в продукты -- **УЧЁТ**: Ведется учет прихода и расхода для каждого типа предметов -- **ВИЗУАЛИЗАЦИЯ**: Движение отображается в дополнительных значениях - -**ДОПОЛНИТЕЛЬНЫЕ ЗНАЧЕНИЯ (показатели движения):** - -- **ПРИБЫЛО**: Количество предметов, поступивших на склад -- **УБЫЛО**: Количество предметов, списанных со склада -- **ВЛИЯНИЕ**: От этих значений зависят основные значения (общее количество) - -**ОСНОВНЫЕ ЗНАЧЕНИЯ (текущие остатки):** - -- **ОПРЕДЕЛЕНИЕ**: Итоговое количество предметов на складе -- **РАСЧЁТ**: Основные значения = Предыдущие остатки + Прибыло - Убыло -- **ОТОБРАЖЕНИЕ**: Показываются в каждом модуле статистики -- **РАЗДЕЛЕНИЕ ТОВАРОВ**: - - Товары "на складе" - готовы к обработке - - Товары "в обработке" - находятся в процессе создания продукта - -#### 17.1.3 Модуль "Расходники фулфилмента" - -**ОСОБЕННОСТИ МОДУЛЯ:** - -- **ИНТЕРАКТИВНОСТЬ**: Является кликабельным элементом -- **ФУНКЦИОНАЛЬНОСТЬ**: Содержит полноценный раздел учёта -- **ДОСТУП**: Переход к детальному управлению расходниками фулфилмента -- **СОДЕРЖАНИЕ**: Полный функционал работы с расходниками фулфилмента - -#### 17.1.4 Блок детализация по Магазинам - -**НАЗНАЧЕНИЕ**: Распределение товаров по торговым точкам/магазинам -**ФУНКЦИИ**: - -- Отображение остатков по каждому магазину -- Управление распределением товаров -- Контроль движения между магазинами - -### 17.2 Правила движения товаров в системе фулфилмента - -#### 17.2.1 Поступление товаров - -**ИСТОЧНИКИ ПОСТУПЛЕНИЯ:** - -- **ПОСТАВКИ**: От поставщиков через систему заказов -- **ВОЗВРАТЫ**: Товары, возвращенные с ПВЗ -- **ПЕРЕМЕЩЕНИЯ**: Между складами и магазинами - -**ПРОЦЕСС ПРИЁМКИ:** - -1. Поставка переходит в статус "принято" -2. Товары из "в пути" → "на складе" -3. Обновляются основные значения -4. Фиксируется в дополнительных значениях как "прибыло" - -#### 17.2.2 Расход товаров - -**ПРИЧИНЫ РАСХОДА:** - -- **ОТГРУЗКА**: Товары отправлены селлерам -- **СПИСАНИЕ**: Брак, утрата, утилизация -- **ВОЗВРАТ**: Возврат поставщику -- **ИСПОЛЬЗОВАНИЕ**: Расходники для операций - -### 17.3 Процесс "Создания продукта" - -#### 17.3.1 Workflow создания продукта - -**ЭТАПЫ ПРОЦЕССА:** - -1. **ПОСТУПЛЕНИЕ**: Товар приходит на склад фулфилмента (статус "на складе") -2. **СОРТИРОВКА**: Перебор товара, отсеивание брака -3. **ПОДГОТОВКА К РАБОТЕ**: Менеджер задает параметры работы -4. **ОБРАБОТКА**: Превращение товара в продукт по "рецептуре" селлера -5. **ЗАВЕРШЕНИЕ**: Готовый продукт (статус "готов к отправке") - -#### 17.3.2 Управление процессом - -**РАЗДЕЛ "СОЗДАНИЕ ПРОДУКТА":** - -- **НОВЫЕ**: Поставки после нажатия "принято", ожидающие назначения -- **В РАБОТЕ**: Поставки в процессе обработки -- **ВЫПОЛНЕНО**: Завершенные поставки с готовыми продуктами - -**ДЕЙСТВИЯ МЕНЕДЖЕРА В "НОВЫЕ":** - -- **ДЕДЛАЙН**: Указание срока выполнения работы -- **ОТВЕТСТВЕННЫЙ**: Назначение исполнителя -- **МЕСТО ХРАНЕНИЯ**: Указание локации для готовых продуктов (опционально) -- **ЗАПУСК**: Нажатие кнопки "В работе" - -#### 17.3.3 Рецептура продукта (задается селлером) - -**СЕЛЛЕР УКАЗЫВАЕТ В ПОСТАВКЕ:** - -- **БАЗОВЫЙ ТОВАР**: Исходный материал (например, футболка) -- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг (например, "погладить") -- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (например, фирменный пакет) -- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (например, короб + маркировка) - -**РЕЗУЛЬТАТ**: ПРОДУКТ = Товар + Услуга + Расходники - -#### 17.3.4 Учет план/факт в процессе работы - -**ПЛАН**: Количество товара из поставки селлера -**ФАКТ**: Реальное количество после сортировки - -**ФИКСАЦИЯ БРАКА:** - -- **КОГДА**: В процессе работы (вкладка "В работе") -- **КТО**: Ответственный исполнитель -- **ДЕТАЛИЗАЦИЯ**: По каждому предмету (размер/объем) -- **ОБНОВЛЕНИЕ**: Можно вносить изменения до нажатия "Выполнено" - -**ВЛИЯНИЕ НА СТАТИСТИКУ:** - -- При принятии поставки: +План в статистику -- При выявлении факта: корректировка на реальные данные -- **ФОРМУЛА**: Факт = Брак + Хороший товар -- **ЛОГИКА**: Фактическое количество = сумма всех пересчитанных предметов - -#### 17.3.5 Связь с маркетплейсами - -**АРТИКУЛЫ ПРОДУКТА:** - -- **ОСНОВНОЙ**: Наследует артикул исходного товара -- **ДОПОЛНИТЕЛЬНЫЙ**: Артикул карточки маркетплейса (если связан) - -**СВЯЗЫВАНИЕ С MP:** - -- **МОМЕНТ**: При создании поставки селлером -- **ПОЛЕ**: "Связать с карточкой маркетплейса" (опционально) -- **ИСТОЧНИК**: Карточки, полученные через API маркетплейсов -- **ПРАВИЛО**: Карточка товара селлера на MP = карточке продукта в системе - -### 17.4 Валидация и контроль в складе фулфилмента - -**ОБЯЗАТЕЛЬНЫЕ ПРОВЕРКИ:** - -- **ОСТАТКИ**: Не могут быть отрицательными -- **ДВИЖЕНИЕ**: Каждое изменение должно быть зафиксировано -- **СИНХРОНИЗАЦИЯ**: Основные и дополнительные значения должны соответствовать -- **ДОСТУП**: Только авторизованный персонал фулфилмента -- **ПЛАН/ФАКТ**: Корректировка статистики при выявлении расхождений - ---- - -## 18. 🎖️ ПРИОРИТЕТЫ РАЗРАБОТКИ - -### 18.1 ВЫСОКИЙ ПРИОРИТЕТ: - -1. 🔴 Безопасность и контроль доступа -2. 🔴 Целостность данных и валидация -3. 🔴 Корректность статусов поставок -4. 🔴 Уведомления участников процесса -5. 🔴 Правильная типизация предметов -6. 🔴 Связи между товарами и производными типами - -### 18.2 СРЕДНИЙ ПРИОРИТЕТ: - -1. 🟡 Производительность и оптимизация -2. 🟡 Пользовательский опыт -3. 🟡 Аналитика и отчетность -4. 🟡 Интеграции с внешними системами -5. 🟡 Workflow для брака и продуктов -6. 🟡 Разделение расходников по типам - -### 18.3 НИЗКИЙ ПРИОРИТЕТ: - -1. 🟢 Дополнительные фильтры -2. 🟢 Косметические улучшения -3. 🟢 Экспериментальные функции -4. 🟢 Расширенная кастомизация - ---- - -## 19. 🏠 ПРАВИЛА КАБИНЕТА СЕЛЛЕРА / РАЗДЕЛ "МОИ ПОСТАВКИ" - -### 19.1 Структура и навигация - -#### 19.1.1 Основная структура - -**ОБЯЗАТЕЛЬНАЯ СТРУКТУРА РАЗДЕЛА:** - -- **ПОСТАВКИ НА ФУЛФИЛМЕНТ**: - - Товар → Карточки / Поставщики - - Расходники селлера -- **ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ**: - - Wildberries - - Ozon - -**НАВИГАЦИЯ**: Переключение через кнопки между основными разделами - -#### 19.1.2 Различия подразделов товаров - -**КАРТОЧКИ**: - -- **ИСТОЧНИК**: WB API карточки селлера -- **ФУНКЦИИ**: Указание рецептуры + выбор логистики -- **РЕЗУЛЬТАТ**: WildberriesSupply - -**ПОСТАВЩИКИ**: - -- **ИСТОЧНИК**: Каталог товаров поставщиков -- **ФУНКЦИИ**: Заказ товаров + рецептура для продукта -- **РЕЗУЛЬТАТ**: SupplyOrder - -### 19.2 Правила создания поставки расходников селлера - -#### 19.2.1 Структура страницы - -**БЛОК 1: ПОСТАВЩИКИ** _(обязательный)_ - -- **РАСПОЛОЖЕНИЕ**: Верхняя часть экрана -- **ИСТОЧНИК**: Только поставщики из раздела "Партнеры" -- **НАВИГАЦИЯ**: Горизонтальный скролл при превышении ширины -- **ВЫБОР**: Только один поставщик одновременно -- **ИНДИКАЦИЯ**: Визуальное выделение выбранной карточки - -**БЛОК 2: РАСХОДНИКИ** _(зависимый)_ - -- **УСЛОВИЕ**: Активен только после выбора поставщика -- **СОДЕРЖАНИЕ**: Только расходники выбранного поставщика -- **ОБЯЗАТЕЛЬНЫЕ ЭЛЕМЕНТЫ**: - - Сортировка: цена, название, категория - - Фильтры: категория, ценовой диапазон -- **КАРТОЧКА РАСХОДНИКА**: - - Фото, название, цена, остаток, категория - - Количество в комплекте (если применимо) - - Поле ввода количества с валидацией - - Кнопки +/- для изменения по единице - -**БЛОК 3: КОРЗИНА** _(справа)_ - -- **РАСПОЛОЖЕНИЕ**: Правая часть экрана -- **СОДЕРЖАНИЕ**: - - Счетчик видов расходников - - Детализация по каждому расходнику - - Общая сумма -- **УПРАВЛЕНИЕ**: - - Изменение количества (с валидацией остатков) - - Удаление позиций -- **ОБЯЗАТЕЛЬНЫЕ ПОЛЯ**: - - Выбор фулфилмент-центра (из партнеров) - - Дата поставки (не прошедшая, по умолчанию - текущая) - -#### 19.2.2 Валидация и ограничения - -**КОЛИЧЕСТВО ТОВАРОВ**: - -- **МИНИМУМ**: 1 единица/комплект -- **МАКСИМУМ**: Остаток у поставщика -- **ПРОВЕРКА**: В реальном времени при изменении - -**ДАТА ПОСТАВКИ**: - -- **ЗАПРЕТ**: Выбор прошедших дат -- **ПО УМОЛЧАНИЮ**: Дата создания поставки - -**ОБЯЗАТЕЛЬНЫЕ ПОЛЯ**: - -- Выбор поставщика -- Минимум один расходник в корзине -- Выбор фулфилмент-центра -- Дата поставки - -### 19.3 Отображение и управление поставками - -#### 19.3.1 Многоуровневая таблица - -**ПЕРВЫЙ УРОВЕНЬ** _(основной список)_: - -- **СОРТИРОВКА**: Номер поставки от большего к меньшему -- **ОБЯЗАТЕЛЬНЫЕ КОЛОНКИ**: - - Порядковый номер поставки - - Количество видов расходников - - Стоимость всей поставки - - Количество категорий - - Статус поставки - -**ВТОРОЙ УРОВЕНЬ** _(детализация)_: - -- **АКТИВАЦИЯ**: По клику на строку первого уровня -- **СОДЕРЖАНИЕ**: - - Название расходника - - Количество - - Цена - - Категория - - Поставщик -- **ОГРАНИЧЕНИЯ**: Только просмотр, редактирование запрещено - -#### 19.3.2 Статусы поставок - -**ЖИЗНЕННЫЙ ЦИКЛ СТАТУСОВ**: - -1. **В работе** - создана селлером -2. **Одобрена** - подтверждена поставщиком -3. **Ожидает отгрузки** - логистика назначена -4. **В пути** - товар отгружен -5. **Доставлена/Принято** - получена фулфилментом - -### 19.4 Workflow и бизнес-логика - -#### 19.4.1 Участники процесса - -**СЕЛЛЕР**: - -- Создает поставку -- Отслеживает статусы -- Получает уведомления об изменениях - -**ПОСТАВЩИК**: - -- Получает уведомление о заказе -- Вносит данные о грузовых местах и объеме -- Подтверждает поставку -- Отмечает отгрузку - -**ФУЛФИЛМЕНТ**: - -- Назначает ответственного -- Выбирает логистику -- Принимает товар -- Указывает место хранения - -**ЛОГИСТИКА**: - -- Получает заявку -- Подтверждает возможность доставки -- Осуществляет транспортировку - -#### 19.4.2 Уведомления - -**ОБЯЗАТЕЛЬНЫЕ УВЕДОМЛЕНИЯ**: - -- Поставщику: о новом заказе расходников -- Фулфилменту: о подтвержденной поставке -- Логистике: о назначении на заявку -- Селлеру: об изменении каждого статуса - -### 19.5 Ограничения и запреты - -**ЗАПРЕЩЕНО**: - -- Редактирование созданной поставки -- Выбор нескольких поставщиков одновременно -- Заказ количества сверх остатков -- Выбор прошедших дат поставки -- Создание поставки без выбора фулфилмент-центра - -**ОБЯЗАТЕЛЬНО**: - -- Валидация остатков перед добавлением в корзину -- Проверка доступности фулфилмент-центра -- Отправка уведомлений на каждом этапе -- Логирование всех изменений статусов - ---- - -_Эти правила являются обязательными для всех участников разработки и должны соблюдаться на всех этапах жизненного цикла системы._ - -_Версия: 1.0_ -_Дата создания: 2024_ -_Статус: АКТИВНЫЕ ПРАВИЛА_ diff --git a/archive/rules-v1.1.md b/archive/rules-v1.1.md deleted file mode 100644 index 3124ac1..0000000 --- a/archive/rules-v1.1.md +++ /dev/null @@ -1,642 +0,0 @@ -# ПРАВИЛА СИСТЕМЫ УПРАВЛЕНИЯ СКЛАДАМИ И ПОСТАВКАМИ - -> ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данные из этого файла могут быть удалены только с разрешения пользователя. Все изменения должны согласовываться. - -## 🔤 ТЕРМИНЫ СИСТЕМЫ -> Для людей → `В коде` -- ТОВАР → `PRODUCT` -- РАСХОДНИКИ → `CONSUMABLE` -- БРАК → `DEFECT` *(планируется)* -- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* - ---- - -## 📑 ОГЛАВЛЕНИЕ - -### 🎯 **ОБЩИЕ ПРАВИЛА** - -1. [Основные принципы системы](#1-основные-принципы-системы) -2. [Типизация предметов](#2-типизация-предметов) -3. [Workflow поставок](#3-workflow-поставок) -4. [Система ролей и доступов](#4-система-ролей-и-доступов) - -### 🏢 **ПРАВИЛА ПО КАБИНЕТАМ** - -5. [Кабинет селлера](#5-кабинет-селлера) -6. [Кабинет поставщика](#6-кабинет-поставщика) -7. [Кабинет фулфилмента](#7-кабинет-фулфилмента) -8. [Интеграции и связи между кабинетами](#8-интеграции-и-связи-между-кабинетами) - ---- - -## 1. 🎯 ОСНОВНЫЕ ПРИНЦИПЫ СИСТЕМЫ - -### 1.1 Архитектура системы - -**СТРУКТУРА СИСТЕМЫ ПО КАБИНЕТАМ:** - -**🏢 КАБИНЕТ ПОСТАВЩИКА** - создает и управляет: - -- **ТОВАР** (`PRODUCT`) - базовые товары от поставщика -- **РАСХОДНИКИ** (`CONSUMABLE`) - материалы и вспомогательные товары от поставщика - -**🏭 КАБИНЕТ ФУЛФИЛМЕНТА** - принимает, обрабатывает и управляет всеми типами: - -- **ТОВАР** (`PRODUCT`) - базовые товары от поставщиков (принятые на склад) -- **БРАК** (`DEFECT` - планируется) - производная от товара (товар с дефектами) -- **ПРОДУКТ** (`FINISHED_PRODUCT` - планируется) - готовый к продаже товар -- **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров - -**🛍️ КАБИНЕТ СЕЛЛЕРА** - заказывает и управляет поставками: - -- Создает заказы товаров и расходников -- Управляет поставками на фулфилмент и маркетплейсы -- Отслеживает статусы поставок - -### 1.2 Основные сущности системы - -| Сущность | Название в системе | Описание | Статус | -| ---------- | ---------------------------------- | ----------------------------------------------- | --------------- | -| Товар | `Product` (type: PRODUCT) | Базовый тип товара от поставщика | ✅ Реализовано | -| Брак | `Product` (type: DEFECT) | Производная от товара с дефектами | 🔄 В разработке | -| Расходники | `Product` (type: CONSUMABLE) | Материалы и вспомогательные товары | ✅ Реализовано | -| Продукт | `Product` (type: FINISHED_PRODUCT) | Готовый к продаже товар (производная от товара) | 🔄 В разработке | - ---- - -## 2. 📦 ТИПИЗАЦИЯ ПРЕДМЕТОВ - -### 2.1 Обязательные типы - -**ВАЖНО**: Товар ≠ Продукт (это разные сущности в системе) - -**4 основных типа предметов в системе:** - -1. **ТОВАР** - базовый тип товара от поставщика -2. **БРАК** - производная от товара (товар с дефектами) -3. **РАСХОДНИКИ** - материалы и вспомогательные товары от поставщика -4. **ПРОДУКТ** - производная от товара (готовый к продаже товар) - -### 2.2 Классификация расходников - -- Поставщик создает карточки типа **"РАСХОДНИКИ"** (без уточнения назначения) -- При заказе, в зависимости от заказчика, они классифицируются как: - - **"Расходники фулфилмента"** - если заказывает фулфилмент-центр - - **"Расходники селлеров"** - если заказывает селлер - -### 2.3 Обязательные поля карточки - -**Базовые параметры:** - -- **Фото** - система загрузки и управления изображениями товаров -- **Название** -- **Автоматическая генерация системой уникального номера** (артикул СФ) -- **Описание** -- **Количество предметов** в единицах -- **Количество комплектов** если продается комплектом -- **Категория** (28 предустановленных универсальных категорий + специализированные категории расходников) -- **Бренд**, **Цвет**, **Размер/объем**, **Вес**, **Габариты**, **Материал** -- **Цена за единицу** и **Цена за комплект** -- **Заказано**, **В пути**, **Остаток**, **Продано** - -**Дополнительные параметры:** - -- **Статус активности** (`isActive`) - возможность деактивировать предметы -- **Тип предмета** - строгое разделение на 4 основных типа -- **Связь с родительским предметом** - для производных типов (брак, продукт) - ---- - -## 3. 🚚 WORKFLOW ПОСТАВОК - -### 3.1 Детализированная система статусов - -**Статусы SupplyOrder (Заказ поставки):** - -1. **PENDING** - Ожидает подтверждения поставщиком -2. **SUPPLIER_APPROVED** - Одобрено поставщиком -3. **CONFIRMED** - Подтвержден (готов к обработке) -4. **LOGISTICS_CONFIRMED** - Подтверждено логистикой -5. **SHIPPED** - Отгружено поставщиком -6. **IN_TRANSIT** - В пути (логистика доставляет) -7. **DELIVERED** - Доставлен на фулфилмент -8. **CANCELLED** - Отменен - -### 3.2 Пошаговый процесс поставки - -**ЭТАП 1: Создание заказа** - -1. Селлер заказывает товар/расходники у поставщика -2. Система создает SupplyOrder со статусом `PENDING` -3. Автоматическое уведомление поставщику - -**ЭТАП 2: Обработка поставщиком** 4. Поставщик получает оповещение 5. Поставщик нажимает "Одобрить" 6. Статус меняется на `SUPPLIER_APPROVED` - -**ЭТАП 3: Передача в фулфилмент** 7. Поставка отображается в кабинете фулфилмента 8. Фулфилмент выбирает ответственного и логистику 9. Статус меняется на `CONFIRMED` - -**ЭТАП 4: Логистическое подтверждение** 10. Логистика подтверждает доставку 11. Статус меняется на `LOGISTICS_CONFIRMED` - -**ЭТАП 5: Отгрузка** 12. Поставщик отгружает товар 13. Статус меняется на `SHIPPED`, затем `IN_TRANSIT` - -**ЭТАП 6: Доставка и приемка** 14. Логистика доставляет на фулфилмент 15. Фулфилмент принимает товар 16. Статус меняется на `DELIVERED` - -### 3.3 Система уведомлений - -**Обязательные уведомления:** - -- Поставщику: о новом заказе -- Фулфилменту: о подтвержденной поставке -- Логистике: о назначении на заявку -- Селлеру: об изменении каждого статуса - ---- - -## 4. 🔐 СИСТЕМА РОЛЕЙ И ДОСТУПОВ - -### 4.1 Типы организаций - -| Тип организации | Роль в системе | Основные функции | -| ---------------------------- | ----------------- | ------------------------------------------------------- | -| **WHOLESALE** (Поставщик) | Создатель товаров | Создание товаров, управление складом, обработка заказов | -| **SELLER** (Селлер) | Заказчик | Заказ товаров, управление поставками | -| **FULFILLMENT** (Фулфилмент) | Обработчик | Приемка товаров, управление складом, создание продуктов | -| **LOGIST** (Логистика) | Доставщик | Управление доставками | - -### 4.2 Контроль доступа к заказам - -- **Создатель заказа** - полный доступ к своим заказам -- **Поставщик** - доступ к заказам, где он является поставщиком -- **Фулфилмент-центр** - доступ к заказам, направленным в его центр -- **Логистическая компания** - доступ к заказам для доставки - ---- - -## 5. 🛍️ КАБИНЕТ СЕЛЛЕРА - -### 5.1 Структура раздела "Мои поставки" - -**🏢 ПОСТАВКИ НА ФУЛФИЛМЕНТ:** - -- **Товар** - поставка товаров для создания продуктов - - **Карточки** - поставка через WB API с рецептурой - - **Поставщики** - заказ товаров у поставщиков с рецептурой -- **Расходники селлера** - поставка материалов для товаров селлера - -**🛒 ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ** _(планируется)_ - -- **Wildberries** - прямые поставки на WB -- **Ozon** - прямые поставки на Ozon - -### 5.2 Создание поставки расходников селлера - -**БЛОК 1: ПОСТАВЩИКИ** _(верхняя часть экрана)_ - -- Отображение карточек поставщиков из раздела "Партнеры" -- Горизонтальный скролл при превышении ширины экрана -- Выбор одного поставщика - -**БЛОК 2: РАСХОДНИКИ** _(центральная часть)_ - -- Расходники выбранного поставщика -- Сортировка по цене, названию, категории -- Фильтры по категории, ценовому диапазону -- Карточка расходника с фото, названием, ценой, остатком - -**БЛОК 3: КОРЗИНА** _(правая часть)_ - -- Количество видов расходников -- Детализация по каждому расходнику -- Общая сумма -- Выбор фулфилмент-центра -- Дата поставки - -### 5.3 Правила селлера - -**ОБЯЗАТЕЛЬНО:** - -- Валидация остатков перед добавлением в корзину -- Проверка доступности фулфилмент-центра -- Выбор даты поставки (не прошедшей) - -**ЗАПРЕЩЕНО:** - -- Редактирование созданной поставки -- Выбор нескольких поставщиков одновременно -- Заказ количества сверх остатков -- Выбор прошедших дат поставки - ---- - -## 6. 📦 КАБИНЕТ ПОСТАВЩИКА - -### 6.1 Раздел склад - основные возможности - -**СОЗДАНИЕ КАРТОЧЕК:** - -- **ТОВАР** - базовые товары поставщика -- **РАСХОДНИКИ** - материалы и вспомогательные товары - -### 6.2 Управление карточками - -**Основные функции:** - -- Создание карточек с обязательными полями -- Редактирование и удаление карточек -- Изменение количества в карточке -- Система загрузки изображений товаров - -**Система проверок:** - -- Проверка остатков при добавлении в корзину -- Валидация данных при создании/редактировании -- Проверка уникальности артикула в рамках организации - -### 6.3 Статистика и аналитика поставщика - -**В КАБИНЕТЕ ПОСТАВЩИКА:** - -- **ТОВАРЫ**: Общая статистика товаров поставщика -- **РАСХОДНИКИ**: Материалы и вспомогательные товары - - Классифицируются при заказе в зависимости от заказчика - - Общая статистика по всем расходникам - -**Блок статистики включает:** - -- Общие остатки всех предметов -- Количество заказанных позиций -- Предметы в пути -- Проданные предметы -- Уведомления о низких остатках - -### 6.4 Интерфейс и управление - -**Режимы отображения:** - -- Переключение между строчным и карточным режимами -- 5 карточек в ряд в карточном режиме -- Система фильтрации и сортировки -- Поиск по названию, артикулу, категории, бренду - -**Система уведомлений:** - -- Подсветка при низких остатках -- Автоматические уведомления о новых заказах -- Уведомления об изменении статусов поставок - -### 6.4.1 ОТОБРАЖЕНИЕ ИНФОРМАЦИИ В КАРТОЧКАХ - -**Каждая карточка товара/расходника содержит:** - -**Основная информация:** - -- **Основное изображение** -- **Название** -- **Артикул СФ** (автоматически сгенерированный) -- **Цена за единицу/комплект** -- **Категория** -- **Статус активности** (активен/неактивен) - -**Данные о движении товара:** - -- **Остаток** - текущее количество на складе -- **Заказано** - количество товара в активных заказах -- **В пути** - количество товара, которое находится в доставке -- **Продано** - количество проданного товара - -**Индикаторы:** - -- **Индикатор низких остатков** (если применимо) -- **Подсветка** при остатках ниже критического уровня - -### 6.4.2 АКТУАЛИЗАЦИЯ ДАННЫХ - -**КРИТИЧЕСКИ ВАЖНО**: При изменении количества в карточке данные актуализируются во всей системе: - -- **Статистика обновляется в реальном времени** -- **Отслеживание изменений** для аналитики -- **Данные синхронизируются** с модулем аналитики -- **Обновление во всех связанных модулях** системы - -### 6.5 Правила поставщика - -**ОБЯЗАТЕЛЬНО:** - -- Указание всех обязательных полей при создании карточки -- Своевременная обработка заказов -- Подтверждение поставок в установленные сроки -- Ведение актуального учета остатков - -**ЗАПРЕЩЕНО:** - -- Добавление собственных товаров в корзину -- Создание предметов без указания типа -- Нарушение сроков обработки заказов - ---- - -## 7. 🏭 КАБИНЕТ ФУЛФИЛМЕНТА - -### 7.1 Структура раздела склад фулфилмента - -**Модули в обязательной последовательности:** - -1. **📦 ПРОДУКТ** - готовые к продаже товары -2. **🛒 ТОВАР** - базовые товары от поставщиков - - Товары "на складе" - готовы к обработке - - Товары "в обработке" - в процессе создания продукта -3. **❌ БРАК** - товары с дефектами -4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары -5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров -6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТ** - операционные материалы - - **КЛИКАБЕЛЬНЫЙ МОДУЛЬ** - содержит полноценный раздел учёта - -### 7.2 Система учёта движения товаров - -**Основные принципы учёта:** - -- **ПРИХОД ТОВАРОВ**: Через принятые поставки (статус "в пути" → "на складе") -- **РАСХОД ТОВАРОВ**: При отгрузке, списании, использовании для услуг -- **ДВОЙНОЙ УЧЁТ**: Основные значения + дополнительные значения - -**Дополнительные значения (показатели движения):** - -- **ПРИБЫЛО** - количество поступивших на склад за период -- **УБЫЛО** - количество списанных со склада за период - -**Основные значения (текущие остатки):** - -- **ФОРМУЛА**: Основные значения = Предыдущие остатки + Прибыло - Убыло -- **ОТОБРАЖЕНИЕ**: Показываются в каждом модуле статистики -- **АКТУАЛЬНОСТЬ**: Обновляются в реальном времени - -### 7.3 Процесс "Создания продукта" - -**ЭТАП 1: ПОСТУПЛЕНИЕ И СОРТИРОВКА** - -1. Товар поступает на склад фулфилмента (статус "на складе") -2. Перебор и сортировка товара -3. Выявление и отсеивание брака - -**ЭТАП 2: ПОДГОТОВКА К РАБОТЕ** 4. Поставка попадает в раздел "Создание продукта" / Новые 5. Менеджер фулфилмента: - -- Устанавливает дедлайн выполнения -- Назначает ответственного исполнителя -- Указывает место хранения готовых продуктов -- Нажимает "В работе" - -**ЭТАП 3: ОБРАБОТКА** 6. Поставка переходит в "В работе" 7. Товары получают статус "в работе" 8. Исполнитель работает по "рецептуре" селлера: - -- Применяет услуги фулфилмента -- Использует расходники селлера -- Использует расходники фулфилмента - -**ЭТАП 4: УЧЕТ ПЛАН/ФАКТ** 9. Фиксируется: - -- **ПЛАН**: Количество из поставки селлера -- **ФАКТ**: Реальное количество = Брак + Хороший товар -- **ДЕТАЛИЗАЦИЯ**: По каждому размеру/объему - -**ЭТАП 5: ЗАВЕРШЕНИЕ** 10. Исполнитель нажимает "Выполнено" 11. Товары становятся продуктами со статусом "готов к отправке" 12. Поставка переходит в "Выполнено" - -**РЕЗУЛЬТАТ**: ПРОДУКТ = Товар + Услуга + Расходники - -### 7.4 Рецептура продукта - -**Задается селлером при создании поставки:** - -- **БАЗОВЫЙ ТОВАР**: Исходный материал -- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг фулфилмента -- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (опционально) -- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (опционально) -- **СВЯЗЬ С MP**: Связь с карточкой маркетплейса (опционально) - -### 7.5 Статистика и аналитика фулфилмента - -**В КАБИНЕТЕ ФУЛФИЛМЕНТА:** - -- **ТОВАРЫ**: Базовые товары от поставщиков (принятые на склад) -- **ПРОДУКТЫ**: Готовая продукция (созданная из товаров) -- **БРАК**: Статистика потерь и списаний -- **РАСХОДНИКИ ФУЛФИЛМЕНТА**: Операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ**: Материалы для товаров селлеров - -### 7.6 Правила фулфилмента - -**ОБЯЗАТЕЛЬНО:** - -- Своевременная приемка поставок -- Ведение точного учета остатков -- Контроль качества товаров -- Фиксация брака в процессе работы -- Соблюдение сроков создания продуктов - -**ЗАПРЕЩЕНО:** - -- Принятие товаров без проверки качества -- Нарушение технологии создания продуктов -- Несоблюдение сроков обработки - ---- - -## 8. 🔄 ИНТЕГРАЦИИ И СВЯЗИ МЕЖДУ КАБИНЕТАМИ - -### 8.1 Глобальная интеграция - -- **Маркет** - данные карточки товаров и расходников отображаются в глобальной сущности -- **Синхронизация данных** между всеми модулями системы -- **Единая система уведомлений** через встроенный мессенджер - -### 8.2 Интеграция с маркетплейсами - -- **Wildberries API** - загрузка карточек товаров из WB -- **Синхронизация данных** с маркетплейсами -- **Создание поставок** на основе WB карточек -- **Управление API ключами** с проверкой активности - -### 8.3 Интеграция с модулем "Услуги" - -**Расходники фулфилмента в услугах:** - -- Селлеры могут использовать расходники фулфилмента в разделе "Услуги / Расходники" -- Для создания продукта из базового товара -- Расходники списываются с остатков фулфилмента -- Стоимость включается в стоимость услуги фулфилмента - -**Процесс создания продукта через услуги:** - -1. Селлер выбирает услугу "Создание продукта" -2. Указывает базовый товар для обработки -3. Выбирает необходимые расходники фулфилмента -4. Фулфилмент обрабатывает заказ -5. Создается готовый продукт с использованием расходников - -### 8.4 Система тарификации логистики - -**Расчет стоимости доставки:** - -- **Тариф до 1м³** - базовая стоимость для малых грузов -- **Тариф свыше 1м³** - стоимость для крупных грузов -- **Маршруты доставки** - от точки отправления до точки назначения -- **Описание услуг** - дополнительные условия доставки - ---- - -## 📋 КРИТИЧЕСКИЕ ЗАПРЕТЫ - -### ❌ НИКОГДА НЕ ДЕЛАТЬ: - -1. Удалять предметы с существующими заказами -2. Изменять статусы заказов без уведомлений -3. Обходить проверки остатков предметов -4. Давать доступ к чужим данным -5. Игнорировать ошибки валидации -6. Пропускать логирование критических операций -7. Создавать брак или продукт без связи с родительским товаром -8. Создавать отдельные типы расходников (только общий тип "РАСХОДНИКИ") -9. Разрешать заказ брака -10. Нарушать иерархию типов предметов - ---- - -## 🎖️ ПРИОРИТЕТЫ РАЗРАБОТКИ - -### ВЫСОКИЙ ПРИОРИТЕТ: - -1. 🔴 Безопасность и контроль доступа -2. 🔴 Целостность данных и валидация -3. 🔴 Корректность статусов поставок -4. 🔴 Уведомления участников процесса -5. 🔴 Правильная типизация предметов - -### СРЕДНИЙ ПРИОРИТЕТ: - -1. 🟡 Производительность и оптимизация -2. 🟡 Пользовательский опыт -3. 🟡 Аналитика и отчетность -4. 🟡 Интеграции с внешними системами - -### НИЗКИЙ ПРИОРИТЕТ: - -1. 🟢 Дополнительные фильтры -2. 🟢 Косметические улучшения -3. 🟢 Экспериментальные функции - ---- - -## 📦 ПРИЛОЖЕНИЕ: КАТЕГОРИИ РАСХОДНИКОВ - -### Специализированные категории для расходников - -**В дополнение к 28 универсальным категориям, для расходников рекомендуются следующие специализированные категории:** - -#### 🎁 **УПАКОВКА И ЗАЩИТА** - -- Коробки (различных размеров) -- Пакеты (полиэтиленовые, бумажные, фирменные) -- Пузырчатая пленка, воздушные подушки -- Стрейч-пленка, гофрокартон -- Паллетная пленка, защитные уголки - -#### 🏷️ **МАРКИРОВКА И ИДЕНТИФИКАЦИЯ** - -- Этикетки (адресные, штрих-код, QR-код) -- Бирки (ценники, размерники) -- Стикеры и наклейки -- Маркеры и ручки -- Штампы и печати, термоэтикетки - -#### 🔧 **КРЕПЕЖ И СОЕДИНЕНИЕ** - -- Скотч (прозрачный, цветной, армированный) -- Клей и клеевые составы -- Стяжки пластиковые -- Степлер и скобы -- Веревки и шнуры, стрейч-лента - -#### 📄 **ДОКУМЕНТООБОРОТ И ВКЛАДЫШИ** - -- Накладные и сопроводительные документы -- Инструкции по эксплуатации -- Гарантийные талоны -- Рекламные буклеты, визитки и флаеры -- Благодарственные письма, купоны и промокоды - -#### 🧼 **ГИГИЕНА И БЕЗОПАСНОСТЬ** - -- Перчатки (латексные, нитриловые) -- Маски и респираторы -- Антисептики и дезинфекторы -- Салфетки и тряпки -- Фартуки и халаты, бахилы - -#### 🛠️ **ИНСТРУМЕНТЫ И ПРИСПОСОБЛЕНИЯ** - -- Ножи и резаки, ножницы -- Линейки и рулетки -- Упаковочные машины (ленточные) -- Дозаторы скотча -- Пистолеты для термоклея -- Весы и мерная тара - -#### 🎨 **БРЕНДИНГ И ДИЗАЙН** - -- Фирменные пакеты с логотипом -- Брендированные коробки -- Цветная упаковочная бумага -- Ленты и банты -- Наклейки с логотипом компании -- Подарочная упаковка - -#### ⚡ **СПЕЦИАЛИЗИРОВАННЫЕ МАТЕРИАЛЫ** - -- Антистатические пакеты -- Влагопоглотители -- Температурные индикаторы -- Хрупкие наклейки -- Пломбы и пломбировочные материалы -- Защита от краж (магнитные датчики) - -#### 🏪 **ТОРГОВОЕ ОБОРУДОВАНИЕ** - -- Манекены и вешалки -- Ценникодержатели -- Подставки и стойки -- Корзины и тележки -- Зеркала примерочные -- Освещение витрин - -#### 🚚 **ЛОГИСТИКА И СКЛАДИРОВАНИЕ** - -- Паллеты и поддоны -- Контейнеры и ящики -- Стеллажные системы -- Погрузочные ремни -- Защитные чехлы -- Адресные ярлыки для груза - -#### 💻 **ТЕХНИЧЕСКИЕ РАСХОДНИКИ** - -- Картриджи для принтеров -- Термоголовки, красящие ленты -- Батарейки для сканеров -- Чистящие средства для техники -- Запчасти для упаковочного оборудования - -#### 🎪 **СЕЗОННЫЕ И ПРАЗДНИЧНЫЕ** - -- Новогодняя упаковка -- Подарочные мешки -- Праздничные ленты -- Тематические наклейки -- Открытки и поздравления -- Сезонная упаковочная бумага - -**ПРИМЕЧАНИЕ**: Данные категории являются рекомендательными и могут быть адаптированы под специфику конкретного поставщика расходников. - ---- - -_Документ создан на основе файла description.md_ -_Версия: 1.1_ -_Дата: 2024_ -_Статус: АКТИВНЫЕ ПРАВИЛА_ diff --git a/archive/rules-v2.0.md b/archive/rules-v2.0.md deleted file mode 100644 index fd93199..0000000 --- a/archive/rules-v2.0.md +++ /dev/null @@ -1,1819 +0,0 @@ -# ПРАВИЛА СИСТЕМЫ УПРАВЛЕНИЯ СКЛАДАМИ И ПОСТАВКАМИ - БАЗА ЗНАНИЙ v2.0 - -> ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данный файл является объединенной базой знаний системы на основе анализа rules.md, rules1.md и description.md. Все изменения должны согласовываться. - -## 🔤 ТЕРМИНЫ СИСТЕМЫ -> Для людей → `В коде` -- ТОВАР → `PRODUCT` -- РАСХОДНИКИ → `CONSUMABLE` -- БРАК → `DEFECT` *(планируется)* -- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* -- ПОСТАВЩИК → `WHOLESALE` -- СЕЛЛЕР → `SELLER` -- ФУЛФИЛМЕНТ → `FULFILLMENT` -- ЛОГИСТИКА → `LOGIST` - ---- - -## 📑 ОГЛАВЛЕНИЕ - -### 🏗️ **АРХИТЕКТУРА И ОСНОВЫ** - -1. [🎯 Основные принципы системы](#1--основные-принципы-системы) -2. [📦 Типизация предметов](#2--типизация-предметов) -3. [🏢 Структура кабинетов](#3--структура-кабинетов) -4. [🔐 Система ролей и доступов](#4--система-ролей-и-доступов) - -### 🚚 **WORKFLOW И ПРОЦЕССЫ** - -5. [🚚 Workflow поставок](#5--workflow-поставок) -6. [🔄 Процесс создания продукта](#6--процесс-создания-продукта) -7. [📊 Система учета движения товаров](#7--система-учета-движения-товаров) - -### 🏢 **КАБИНЕТЫ СИСТЕМЫ** - -8. [🏠 Общие правила кабинетов](#8--общие-правила-кабинетов) -9. [🏠 Кабинет селлера](#9--кабинет-селлера) -10. [🏪 Кабинет поставщика](#10--кабинет-поставщика) -11. [🏭 Кабинет фулфилмента](#11--кабинет-фулфилмента) -12. [🚚 Кабинет логистики](#12--кабинет-логистики) - -### 🤝 **СИСТЕМА ПАРТНЕРСТВА** - -13. [🤝 Система партнерства и контрагентов](#13--система-партнерства-и-контрагентов) - -### 🌐 **ИНТЕГРАЦИИ И ФУНКЦИИ** - -14. [🌐 Интеграции с системой](#14--интеграции-с-системой) -15. [📊 Статистика и аналитика](#15--статистика-и-аналитика) -16. [⚠️ Критические запреты](#16--критические-запреты) - -### 💻 **ТЕХНИЧЕСКИЕ ПРАВИЛА** - -17. [📱 Правила пользовательского интерфейса](#17--правила-пользовательского-интерфейса) -18. [🚨 Правила обработки ошибок](#18--правила-обработки-ошибок) -19. [📈 Правила производительности](#19--правила-производительности) -20. [🔐 Правила безопасности данных](#20--правила-безопасности-данных) -21. [🎯 Правила качества кода](#21--правила-качества-кода) - -### 📋 **ДОПОЛНИТЕЛЬНО** - -22. [📋 Приложение: Дополнительные возможности и планы](#22-приложение-дополнительные-возможности-и-планы) - ---- - -## 🏷️ РЕЕСТР СУЩНОСТЕЙ СИСТЕМЫ - -### 📦 **ОСНОВНЫЕ ПРЕДМЕТЫ** - -| Сущность | Название в системе | Кабинет создания | Описание | Статус | -| ---------- | ---------------------------------- | ---------------- | ----------------------------------------------- | --------------- | -| Товар | `Product` (type: `PRODUCT`) | Поставщик | Базовый тип товара от поставщика | ✅ Реализовано | -| Расходники | `Product` (type: `CONSUMABLE`) | Поставщик | Материалы и вспомогательные товары | ✅ Реализовано | -| Брак | `Product` (type: `DEFECT`)* | Фулфилмент | Производная от товара с дефектами | 📋 Планируется | -| Продукт | `Product` (type: `FINISHED_PRODUCT`)* | Фулфилмент | Готовый к продаже товар (производная от товара) | 📋 Планируется | - -> **\* Планируется**: Типы `DEFECT` и `FINISHED_PRODUCT` еще не добавлены в Prisma схему - -### 🏢 **ОРГАНИЗАЦИИ И РОЛИ** - -| Сущность | Название в системе | Основные функции | Статус | -| ---------- | ---------------------------------- | --------------------------------------- | -------------- | -| Поставщик | `Organization` (type: WHOLESALE) | Создает товары и расходники | ✅ Реализовано | -| Селлер | `Organization` (type: SELLER) | Заказывает товары, управляет поставками | ✅ Реализовано | -| Фулфилмент | `Organization` (type: FULFILLMENT) | Принимает товары, создает продукты | ✅ Реализовано | -| Логистика | `Organization` (type: LOGIST) | Управляет доставками | ✅ Реализовано | - ---- - -## 1. 🎯 ОСНОВНЫЕ ПРИНЦИПЫ СИСТЕМЫ - -### 1.1 Главная логика системы - -**КЛЮЧЕВОЕ ПРАВИЛО**: Товар ≠ Продукт (это разные сущности в системе) - -- **ТОВАР** - сырье, базовый материал от поставщика -- **ПРОДУКТ** - готовая к продаже единица после обработки - -### 1.2 Потоки в системе - -**ПОТОК ТОВАРОВ**: Поставщик → Фулфилмент → Селлер/Маркетплейс -**ПОТОК РАСХОДНИКОВ**: Поставщик → Фулфилмент/Селлер (в зависимости от заказчика) - -### 1.3 Уникальность артикулов - -- **ФОРМАТ**: `СФ-{ТИП}-{КОД_КАТЕГОРИИ}-{КОД_ОРГАНИЗАЦИИ}-{TIMESTAMP}-{RANDOM}` -- **ТИПЫ В АРТИКУЛЕ**: - - `TOV` - Товар - - `BRK` - Брак - - `R` - Расходники - - `PRD` - Продукт - ---- - -## 2. 📦 ТИПИЗАЦИЯ ПРЕДМЕТОВ - -### 2.1 Два реализованных и два планируемых типа предметов - -#### **1. ТОВАР** (`PRODUCT` - базовый тип) - -- **СОЗДАЕТСЯ**: Поставщиком -- **СТАТУС**: Может быть активным/неактивным -- **ЗАКАЗ**: Доступен для заказа всеми типами организаций -- **ТРАНСФОРМАЦИЯ**: Может стать ПРОДУКТОМ или БРАКОМ -- **ЦЕНА**: Обязательна, больше 0 - -#### **2. РАСХОДНИКИ** (`CONSUMABLE` - базовый тип) - -- **СОЗДАЕТСЯ**: Поставщиком как универсальный тип -- **КЛАССИФИКАЦИЯ ПРИ ЗАКАЗЕ**: - - Фулфилмент заказывает → "Расходники фулфилмента" - - Селлер заказывает → "Расходники селлеров" -- **ДОСТУП**: Видны всем типам организаций в маркете - -#### **3. БРАК** (`DEFECT` - планируется, производная от товара) - -- **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе существующего ТОВАРА при обнаружении дефектов -- **МОМЕНТ СОЗДАНИЯ**: В процессе "Создание продукта" / "В работе" после подсчета факта -- **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) -- **ЗАКАЗ**: ЗАПРЕЩЕН заказ брака -- **СТАТУС**: Всегда неактивен для заказа -- **ЦЕНА**: Для селлера - себестоимость дефектного товара, для фулфилмента - 0 -- **WORKFLOW**: Особый процесс списания и утилизации -- **УЧЕТ**: Отдельный учет в статистике потерь -- **ОТОБРАЖЕНИЕ**: Виден только для учета потерь -- **⚠️ СТАТУС РАЗРАБОТКИ**: Тип `DEFECT` еще не добавлен в схему БД - -#### **4. ПРОДУКТ** (`FINISHED_PRODUCT` - планируется, производная от товара) - -- **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе ТОВАРА по заказу селлера -- **ИНИЦИАТОР**: Селлер создает заказ с рецептурой, фулфилмент исполняет -- **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) -- **РЕЦЕПТУРА**: Задается селлером при создании заказа (Товар + Услуга + Расходники) -- **СТАТУСЫ**: "в работе" → "готов к отправке" -- **ЗАКАЗ**: Доступен только в статусе "готов к отправке" -- **⚠️ СТАТУС РАЗРАБОТКИ**: Тип `FINISHED_PRODUCT` еще не добавлен в схему БД - -### 2.2 Обязательные поля карточки - -**КРИТИЧЕСКИ ВАЖНО**: Название, артикул, цена > 0, тип предмета -**ИСКЛЮЧЕНИЕ ДЛЯ БРАКА**: Цена может быть 0 для фулфилмента (себестоимость для селлера) -**ОБЯЗАТЕЛЬНО**: Количество (может быть 0 для предзаказа) -**ДЛЯ ПРОИЗВОДНЫХ ТИПОВ**: Обязательная связь с родительским предметом - ---- - -## 3. 🏢 СТРУКТУРА КАБИНЕТОВ - -### 3.1 Кабинет поставщика - -**СОЗДАЕТ И УПРАВЛЯЕТ**: - -- **ТОВАР** - базовые товары поставщика -- **РАСХОДНИКИ** - материалы и вспомогательные товары - -### 3.2 Кабинет фулфилмента - -**ПРИНИМАЕТ, ОБРАБАТЫВАЕТ И УПРАВЛЯЕТ**: - -- **ТОВАР** - базовые товары от поставщиков (принятые на склад) -- **БРАК** - производная от товара (товары с дефектами) -- **ПРОДУКТ** - производная от товара (готовые к продаже товары) -- **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров - -### 3.3 Кабинет селлера - -**ЗАКАЗЫВАЕТ И УПРАВЛЯЕТ ПОСТАВКАМИ**: - -- Создает заказы товаров и расходников -- Управляет поставками на фулфилмент и маркетплейсы -- Отслеживает статусы поставок - ---- - -## 4. 🔐 СИСТЕМА РОЛЕЙ И ДОСТУПОВ - -### 4.1 Роли в системе - -| Роль | Функции | -| ---------- | ------------------------------------------------------------------------ | -| Поставщик | Создание товаров, одобрение заказов, отгрузка | -| Селлер | Создание заказов, отслеживание поставок | -| Фулфилмент | Приемка товаров, выбор логистики, управление складом, создание продуктов | -| Логистика | Подтверждение доставки, транспортировка | - -### 4.2 Контроль доступа - -- **ЗАПРЕЩЕНО**: Поставщик не может добавлять собственные предметы в корзину -- **ПРАВИЛО**: Только активные предметы (`isActive: true`) отображаются в маркете -- **ОГРАНИЧЕНИЕ**: Доступ к заказам только для участников процесса -- **БРАК**: Доступен только для просмотра, заказ запрещен - -### 4.3 Проверка остатков - -- **ОБЯЗАТЕЛЬНО**: Проверять наличие предмета перед добавлением в корзину -- **ПРАВИЛО**: Количество в заказе не может превышать остаток на складе -- **ИСКЛЮЧЕНИЕ**: Предзаказы (если реализована функция) -- **ОСОБЕННОСТИ ПО ТИПАМ**: - - **ТОВАР/ПРОДУКТ**: Стандартная проверка остатков - - **БРАК**: Остатки учитываются, но заказ запрещен - - **РАСХОДНИКИ**: Проверка с учетом резервирования под активные заказы - ---- - -## 5. 🚚 WORKFLOW ПОСТАВОК - -### 5.1 Жизненный цикл статусов - -``` -PENDING → SUPPLIER_APPROVED → CONFIRMED → LOGISTICS_CONFIRMED → SHIPPED → IN_TRANSIT → DELIVERED -``` - -### 5.2 Детальный процесс поставки - -#### **ЭТАП 1: Создание заказа** - -1. Селлер заказывает товар/расходники у поставщика -2. Система создает SupplyOrder со статусом `PENDING` -3. Автоматическое уведомление поставщику - -#### **ЭТАП 2: Обработка поставщиком** - -4. Поставщик получает оповещение -5. Поставщик нажимает "Одобрить" -6. Статус меняется на `SUPPLIER_APPROVED` - -#### **ЭТАП 3: Передача в фулфилмент** - -7. Поставка отображается в кабинете фулфилмента -8. Фулфилмент выбирает ответственного и логистику -9. Статус меняется на `CONFIRMED` - -#### **ЭТАП 4: Логистическое подтверждение** - -10. Логистика подтверждает доставку -11. Статус меняется на `LOGISTICS_CONFIRMED` - -#### **ЭТАП 5: Отгрузка** - -12. Поставщик отгружает товар -13. Статус меняется на `SHIPPED`, затем `IN_TRANSIT` - -#### **ЭТАП 6: Доставка и приемка** - -14. Логистика доставляет на фулфилмент -15. Фулфилмент принимает товар -16. Статус меняется на `DELIVERED` - -### 5.3 Система уведомлений - -**ОБЯЗАТЕЛЬНЫЕ УВЕДОМЛЕНИЯ**: - -- Поставщику: о новом заказе -- Фулфилменту: о подтвержденной поставке -- Логистике: о назначении на заявку -- Селлеру: об изменении каждого статуса - ---- - -## 6. 🔄 ПРОЦЕСС СОЗДАНИЯ ПРОДУКТА - -### 6.1 Workflow создания продукта - -#### **ЭТАП 1: ПОСТУПЛЕНИЕ И ПОДСЧЕТ** - -1. Товар приходит на склад фулфилмента (статус "на складе") -2. Подсчет фактического количества товара (может отличаться от плана) -3. Проверка товара на дефекты и выявление брака - -#### **ЭТАП 2: ПОДГОТОВКА К РАБОТЕ** - -4. Поставка попадает в раздел "Создание продукта" / "Новые" -5. Менеджер задает: - - Дедлайн выполнения - - Ответственного исполнителя - - Место хранения готовых продуктов -6. Нажимает "В работе" - -#### **ЭТАП 3: ОБРАБОТКА** - -7. Товары получают статус "в работе" -8. Исполнитель работает по "рецептуре" селлера: - - Применяет услуги фулфилмента - - Использует расходники селлера - - Использует расходники фулфилмента - -#### **ЭТАП 4: УЧЕТ ПЛАН/ФАКТ** - -9. Фиксируется в разделе "В работе": - - **ПЛАН**: Количество из поставки селлера - - **ФАКТ**: Реальное количество после подсчета = Брак + Хороший товар - - **СОЗДАНИЕ БРАКА**: Данные о браке вносятся в кабинете фулфилмента - - **ДЕТАЛИЗАЦИЯ**: По каждому размеру/объему - -#### **ЭТАП 5: ЗАВЕРШЕНИЕ** - -10. Исполнитель нажимает "Выполнено" -11. Товары становятся продуктами со статусом "готов к отправке" -12. Поставка переходит в "Выполнено" - -### 6.2 Рецептура продукта (задается селлером) - -**РЕЗУЛЬТАТ**: ПРОДУКТ = Товар + Услуга + Расходники - -**КОМПОНЕНТЫ**: - -- **БАЗОВЫЙ ТОВАР**: Исходный материал (например, футболка) -- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг (например, "погладить") -- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (например, фирменный пакет) -- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (например, короб + маркировка) -- **СВЯЗЬ С MP**: Опциональная связь с карточкой маркетплейса - ---- - -## 7. 📊 СИСТЕМА УЧЕТА ДВИЖЕНИЯ ТОВАРОВ - -### 7.1 Основные принципы учета - -- **ПРИХОД**: Товары поступают через принятые поставки (из "в пути" → "на складе") -- **ОБРАБОТКА**: Товары переходят в статус "в работе" для создания продуктов -- **РАСХОД**: Товары убывают при отгрузке, списании, возврате, превращении в продукты - -### 7.2 Двойной учет - -**ДОПОЛНИТЕЛЬНЫЕ ЗНАЧЕНИЯ (показатели движения)**: - -- **ПРИБЫЛО**: Количество предметов, поступивших на склад -- **УБЫЛО**: Количество предметов, списанных со склада - -**ОСНОВНЫЕ ЗНАЧЕНИЯ (текущие остатки)**: - -- **ФОРМУЛА**: Основные значения = Предыдущие остатки + Прибыло - Убыло -- **ОТОБРАЖЕНИЕ**: Показываются в каждом модуле статистики - -### 7.3 Состояния процессов в фулфилменте - -- **"На складе"** - состояние завершения процесса поставки (товар принят) -- **"В работе"** - состояние процесса "Создание продукта" (товар обрабатывается) -- **ВАЖНО**: Это состояния процессов, а не взаимоисключающие характеристики товара - ---- - -## 8. 🏠 ОБЩИЕ ПРАВИЛА КАБИНЕТОВ - -### 8.1 Универсальная структура кабинетов - -**ВСЕ ТИПЫ КАБИНЕТОВ** включают следующие обязательные разделы: - -#### 8.1.1 Страница "Главная" - -**СТАТУС**: Планируется к реализации -**ДОСТУП**: Через навигацию в sidebar для всех типов кабинетов -**СОДЕРЖАНИЕ**: Пока пустые страницы, будут наполнены позже - -**ПРАВИЛА**: - -- **ОБЯЗАТЕЛЬНО**: Каждый тип кабинета должен иметь страницу "Главная" -- **НАВИГАЦИЯ**: Доступ через кнопку в sidebar (первая в списке) -- **УНИВЕРСАЛЬНОСТЬ**: Одинаковая структура навигации для всех кабинетов -- **ПЛАНЫ**: Содержание страниц будет определено на следующих этапах - -#### 8.1.2 Общие разделы для всех кабинетов - -**УНИВЕРСАЛЬНЫЕ РАЗДЕЛЫ** (доступны всем типам): - -- 🏠 **Главная** - основная страница кабинета (планируется) -- 🛒 **Маркет** - просмотр и заказ товаров -- 🤝 **Партнеры** - управление контрагентами -- 💬 **Мессенджер** - внутренняя связь -- ⚙️ **Настройки** - профиль и конфигурация - -**СПЕЦИАЛИЗИРОВАННЫЕ РАЗДЕЛЫ** (зависят от типа кабинета): - -- Определяются в соответствующих разделах каждого кабинета - -### 8.2 Правила sidebar навигации - -#### 8.2.1 Структура навигации - -**ОБЩИЙ ПРИНЦИП**: - -- Условное отображение: `{user?.organization?.type === "TYPE" && (...)}` -- Адаптивность: сворачиваемый sidebar с `getSidebarMargin()` -- Состояния активности: подсветка текущего раздела - -**ПОРЯДОК РАЗДЕЛОВ В SIDEBAR**: - -1. 🏠 **Главная** (планируется для всех) -2. **Специализированные разделы** (зависят от типа кабинета) -3. 🛒 **Маркет** (универсальный) -4. 🤝 **Партнеры** (универсальный) -5. 💬 **Мессенджер** (универсальный) -6. ⚙️ **Настройки** (универсальный) -7. **Выход** (универсальный) - -#### 8.2.2 Типо-зависимая логика - -**АДАПТИВНЫЙ РОУТИНГ**: - -```typescript -// Пример: кнопка "Поставки" ведет на разные страницы -const handleSuppliesClick = () => { - switch (user?.organization?.type) { - case "FULFILLMENT": - router.push("/fulfillment-supplies"); - break; - case "SELLER": - router.push("/supplies"); - break; - case "WHOLESALE": - router.push("/supplies"); - break; - case "LOGIST": - router.push("/logistics-orders"); - break; - } -}; -``` - ---- - -## 9. 🏠 КАБИНЕТ СЕЛЛЕРА - -### 9.1 Структура раздела "Мои поставки" - -#### **🏢 ПОСТАВКИ НА ФУЛФИЛМЕНТ**: - -- **Товар** - поставка товаров для создания продуктов - - **Карточки** - поставка через WB API с рецептурой (результат: WildberriesSupply) - - **Поставщики** - заказ товаров у поставщиков с рецептурой (результат: SupplyOrder) -- **Расходники селлера** - поставка материалов для товаров селлера - -#### **🛒 ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ** _(планируется)_: - -- **Wildberries** - прямые поставки на WB -- **Ozon** - прямые поставки на Ozon - -### 9.2 Создание поставки расходников селлера - -#### **Структура страницы**: - -**БЛОК 1: ПОСТАВЩИКИ** _(обязательный, верхняя часть)_: - -- Карточки поставщиков из раздела "Партнеры" -- Горизонтальный скролл при превышении ширины -- Выбор только одного поставщика одновременно - -**БЛОК 2: РАСХОДНИКИ** _(зависимый, центральная часть)_: - -- Активен только после выбора поставщика -- Сортировка: цена, название, категория -- Фильтры: категория, ценовой диапазон -- Карточка с полем ввода количества и кнопками +/- - -**БЛОК 3: КОРЗИНА** _(правая часть)_: - -- **РАСПОЛОЖЕНИЕ**: Правая часть экрана -- **СОДЕРЖАНИЕ**: - - Счетчик видов расходников - - Детализация по каждому расходнику (название, количество, цена, сумма) - - Общая сумма всех расходников -- **УПРАВЛЕНИЕ**: - - Изменение количества (с валидацией остатков) - - Удаление позиций -- **ОБЯЗАТЕЛЬНЫЕ ПОЛЯ**: - - Выбор фулфилмент-центра (из партнеров) - - Дата поставки (не прошедшая, по умолчанию - текущая) - -#### **Валидация и ограничения**: - -**КОЛИЧЕСТВО ТОВАРОВ**: - -- **МИНИМУМ**: 1 единица/комплект -- **МАКСИМУМ**: Остаток у поставщика -- **ПРОВЕРКА**: В реальном времени при изменении - -**ДАТА ПОСТАВКИ**: - -- **ЗАПРЕТ**: Выбор прошедших дат -- **ПО УМОЛЧАНИЮ**: Дата создания поставки - -**ОБЯЗАТЕЛЬНЫЕ ПОЛЯ**: - -- Выбор поставщика -- Минимум один расходник в корзине -- Выбор фулфилмент-центра -- Дата поставки - -### 8.3 Отображение созданных поставок - -#### **Многоуровневая таблица**: - -**ПЕРВЫЙ УРОВЕНЬ** _(основной список)_: - -- **СОРТИРОВКА**: Номер поставки от большего к меньшему -- **ОБЯЗАТЕЛЬНЫЕ КОЛОНКИ**: - - Порядковый номер поставки - - Количество видов расходников - - Стоимость всей поставки - - Количество категорий - - Статус поставки - -**ВТОРОЙ УРОВЕНЬ** _(детализация по клику)_: - -- **АКТИВАЦИЯ**: По клику на строку первого уровня -- **СОДЕРЖАНИЕ**: - - Название расходника - - Количество - - Цена - - Категория - - Поставщик -- **ОГРАНИЧЕНИЯ**: Только просмотр, редактирование запрещено - -### 8.4 Статусы поставок селлера - -1. **В работе** - создана селлером -2. **Одобрена** - подтверждена поставщиком -3. **Ожидает отгрузки** - логистика назначена -4. **В пути** - товар отгружен -5. **Доставлена/Принято** - получена фулфилментом - -### 9.3 Правила кнопки "Создать поставку" в разделе "Мои поставки" - -#### **9.3.1 Общие принципы** - -- **КОНТЕКСТНОСТЬ**: Кнопка создания появляется только в активном табе -- **РАСПОЛОЖЕНИЕ**: Правая часть строки таба, на том же уровне что и название -- **СТИЛИСТИКА**: В том же стиле что и сами табы (соответствует уровню иерархии) -- **ФУНКЦИОНАЛЬНОСТЬ**: Кнопка ведет на страницу создания поставки соответствующего типа - -#### **9.3.2 Размещение кнопок по табам** - -**УРОВЕНЬ 2 (Подтабы фулфилмента):** - -- **📦 Товар → Карточки**: Кнопка "Создать поставку" → `/supplies/create-cards` -- **📦 Товар → Поставщики**: Кнопка "Создать поставку" → `/supplies/create-suppliers` -- **🔧 Расходники селлера**: Кнопка "Создать поставку" → `/supplies/create-consumables` - -**УРОВЕНЬ 2 (Подтабы маркетплейсов):** - -- **🟣 Wildberries**: Кнопка "Создать поставку" → `/supplies/create-wildberries` -- **🔵 Ozon**: Кнопка "Создать поставку" → `/supplies/create-ozon` - -#### **9.3.3 Стили кнопок** - -**ДЛЯ УРОВНЯ 2 (h-9):** - -```css -/* Размер и отступы */ -h-9 px-3 py-1 ml-auto - -/* Фон и границы */ -bg-white/8 border border-white/20 hover:bg-white/12 - -/* Текст и иконки */ -text-xs font-medium text-white/80 hover:text-white - -/* Скругления */ -rounded-lg - -/* Переходы */ -transition-all duration-150 -``` - -**ДЛЯ УРОВНЯ 3 (h-8):** - -```css -/* Размер и отступы */ -h-8 px-2 py-1 ml-auto - -/* Фон и границы */ -bg-white/5 border border-white/15 hover:bg-white/8 - -/* Текст и иконки */ -text-xs font-normal text-white/60 hover:text-white/80 - -/* Скругления */ -rounded-md - -/* Переходы */ -transition-all duration-150 -``` - -#### **9.3.4 Поведение кнопок** - -- **ВИДИМОСТЬ**: Кнопка показывается только в активном табе -- **ИКОНКА**: `Plus` размером `h-3 w-3` слева от текста -- **ТЕКСТ**: "Создать" на мобильных, "Создать поставку" на десктопах -- **АДАПТИВНОСТЬ**: Скрытие текста на маленьких экранах (`hidden sm:inline`) - -#### **9.3.5 Удаление старой кнопки** - -- **УБРАТЬ**: Текущий dropdown "Создать поставку" из верхней части -- **ПРИЧИНА**: Заменяется контекстными кнопками в табах -- **СОХРАНИТЬ**: Стили и логику навигации, но адаптировать под новые роуты - -### 9.4 Структура страницы "Мои поставки" - Трёхблочная архитектура - -#### **9.4.1 Обязательная структура страницы** - -**ПРИНЦИП**: Страница состоит из трёх визуально разделённых блоков - -``` -┌─────────────────────────────────────────┐ -│ 1. БЛОК ТАБОВ (навигация) │ -│ - Фиксированная высота │ -│ - Glass-эффект │ -│ - Иерархическая структура │ -├─────────────────────────────────────────┤ -│ 2. БЛОК СТАТИСТИКИ (метрики) │ -│ - Контекстные данные │ -│ - 4 карточки в ряд (desktop) │ -│ - Динамическое обновление │ -├─────────────────────────────────────────┤ -│ 3. ОСНОВНОЙ БЛОК (контент) │ -│ - Сохраняет весь функционал │ -│ - Таблицы, фильтры, действия │ -│ - Высота до низа sidebar │ -└─────────────────────────────────────────┘ -``` - -#### **9.4.2 Блок статистики - контекстные метрики** - -**ПРАВИЛО**: Статистика меняется в зависимости от выбранных табов - -**Для путей "Фулфилмент → Товар → Карточки/Поставщики":** -- Всего поставок -- Активных поставок -- Сумма активных поставок -- В пути - -**Для пути "Фулфилмент → Расходники селлера":** -- Всего поставок -- Активных поставок -- Видов расходников -- Критические остатки - -**Для путей "Маркетплейсы → Wildberries/Ozon":** -- Поставок на маркетплейс -- Товаров отправлено -- Возвраты за неделю -- Эффективность поставок - -#### **9.4.3 Высота основного блока** - -**ФОРМУЛА РАСЧЕТА**: -```css -height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins) -``` - -**ПРАВИЛО ВЫРАВНИВАНИЯ**: -- Нижняя граница основного блока должна быть на одном уровне с нижней границей sidebar -- При изменении размера окна высота пересчитывается -- Внутренний скролл: `overflow-y-auto` - -#### **9.4.4 Сохранение функционала** - -**КРИТИЧЕСКИ ВАЖНО**: При добавлении блока статистики весь существующий функционал сохраняется: -- Таблицы с данными поставок -- Фильтры и сортировка -- Кнопки действий -- Детализация при клике -- Пагинация -- Поиск - -**ЗАПРЕЩЕНО**: -- Удалять существующие компоненты -- Изменять логику работы таблиц -- Нарушать существующие API вызовы - -#### **9.4.5 Проверка остатков при создании поставки** - -**ОБЯЗАТЕЛЬНАЯ ВАЛИДАЦИЯ**: - -1. **Проверка на клиенте**: -```typescript -// При изменении количества -if (quantity > product.stock) { - toast.error(`Недостаточно товара. Доступно: ${product.stock}`); - return; -} -``` - -2. **Проверка на сервере**: -```typescript -// Перед созданием заказа -const stockAvailable = await checkStockAvailability(productId, quantity); -if (!stockAvailable) { - throw new Error("Insufficient stock"); -} -``` - -3. **Логирование проверок**: -- Все попытки добавления в корзину -- Результаты проверки остатков -- ID пользователя и timestamp - -#### **9.4.6 Адаптивность блоков** - -**Desktop (>1024px)**: -- Все три блока вертикально -- Статистика: 4 карточки в ряд - -**Tablet (768-1024px)**: -- Все три блока вертикально -- Статистика: 2 карточки в ряд - -**Mobile (<768px)**: -- Блоки в колонку -- Статистика: 1 карточка в ряд -- Сворачиваемая статистика - -### 9.5 Табы "Карточки" и "Поставщики" - объединённая логика - -#### **9.5.1 Принцип единого типа предмета** - -**КЛЮЧЕВОЕ ПРАВИЛО**: Табы "Карточки" и "Поставщики" - это два способа создания поставок одного типа предмета (ТОВАР) - -**СПОСОБЫ СОЗДАНИЯ**: -- **Карточки** - импорт товаров через WB API с автоматическим созданием поставки -- **Поставщики** - прямой заказ товаров у поставщика с указанием рецептуры - -**РЕЗУЛЬТАТ**: Оба способа создают `SupplyOrder` с товарами типа `PRODUCT` - -#### **9.5.2 Общая статистика** - -**ПРАВИЛО**: Блок статистики показывает ОДИНАКОВЫЕ данные для обоих табов - -**МЕТРИКИ ДЛЯ ТАБОВ "КАРТОЧКИ" И "ПОСТАВЩИКИ"**: -- Всего поставок товаров (из всех источников) -- Активных поставок товаров (в работе) -- Сумма активных поставок товаров -- Товаров в пути (все способы доставки) - -**ЗАПРЕЩЕНО**: Разделять статистику по способу создания - -#### **9.5.3 Общий основной блок** - -**СОДЕРЖИМОЕ**: Единая таблица всех поставок товаров - -**ИСТОЧНИКИ ДАННЫХ**: -- Поставки, созданные через импорт карточек WB -- Поставки, созданные через заказ у поставщиков -- Все промежуточные и завершённые поставки - -**РАЗЛИЧИЯ ТАБОВ**: -- Только кнопки создания ведут на разные страницы -- Таб "Карточки": `/supplies/create-cards` -- Таб "Поставщики": `/supplies/create-suppliers` - -#### **9.5.4 Структура таблицы поставок товаров** - -**ОБЯЗАТЕЛЬНЫЕ КОЛОНКИ**: -- Номер поставки -- Способ создания (иконка: 📱 карточки / 🏢 поставщик) -- Количество товаров -- Общая стоимость -- Поставщик/Источник -- Дата поставки (планируемая дата доставки) -- Статус -- Дата создания -- Действия - -**ФИЛЬТРЫ**: -- По статусу workflow -- По способу создания -- По поставщику -- По периоду -- По дате поставки -- По сумме заказа - -#### **9.5.5 Детализация поставки** - -**ПРИ КЛИКЕ НА ПОСТАВКУ**: -- Раскрывается детализация товаров в поставке -- Информация о рецептуре (если применимо) -- История изменения статусов -- Логистическая информация -- Связанные документы - -**ДЕЙСТВИЯ В ДЕТАЛИЗАЦИИ**: -- Отслеживание статуса -- Связь с поставщиком/логистикой -- Отмена (если статус позволяет) -- Экспорт данных - -#### **9.5.6 Принципы реализации** - -**ОБЯЗАТЕЛЬНО**: -- Использовать единый компонент для отображения таблицы -- Агрегировать данные из всех источников в статистике -- Сохранять фильтрацию при переключении между табами - -**ЗАПРЕЩЕНО**: -- Создавать отдельные таблицы для разных способов создания -- Разделять статистику по источникам -- Дублировать логику отображения поставок - -### 9.7 Форма создания поставки товаров через поставщиков - -#### **9.7.1 Маршрут и навигация** -**URL**: `/supplies/create-suppliers` -**Доступ**: Только для селлеров и администраторов -**Возврат**: Кнопка "Назад" ведет к табу "Поставщики" в разделе товаров - -#### **9.7.2 Структура страницы - 3 блока (аналогично create-consumables)** - -**БЛОК 1: ЗАГОЛОВОК И НАВИГАЦИЯ** -- Заголовок: "Создание поставки товаров через поставщиков" -- Подзаголовок: "Прямой заказ товаров у поставщика с указанием рецептуры" -- Кнопка "Назад" (возврат к табу "Поставщики") -- Индикатор прогресса: "Шаг 1 из 3" (Товары → Логистика → Подтверждение) - -**БЛОК 2: ФОРМА ТОВАРОВ** -- **Выбор поставщика**: Работает как на create-consumables (выбор из существующих) -- **Каталог товаров поставщика**: Отображение доступных товаров выбранного поставщика -- **Корзина товаров**: Система добавления товаров в корзину как на create-consumables -- **Поля товара при добавлении в корзину**: - - Название товара (из каталога поставщика) - - Артикул поставщика (из каталога) - - Категория (из каталога) - - Количество (вводит пользователь, > 0) - - Цена за единицу (из каталога или договорная) - - Комплектность (если есть) - описание состава комплекта - - Рецептура/состав (текстовое поле для дополнений) - - Параметры товара (цвет, размер, материал - если применимо) - -**БЛОК 3: КОРЗИНА И ИТОГИ** -- Таблица товаров в корзине -- **Желаемая дата поставки** (обязательное поле с календарем) -- **Выбор логистики**: - - Dropdown "Логистическая компания" (опционально) - - Если не выбрано: "Логистику выберет фulfilment" - - Ориентировочная стоимость логистики (расчетная) -- Общее количество товаров в корзине -- Общая стоимость товаров -- Ориентировочная стоимость фулфилмента (расчетная) -- **Итого к оплате** (сумма всех составляющих) -- Кнопка "Продолжить" (переход к подтверждению заказа) - -#### **9.7.3 Принцип работы с поставщиками-партнерами** - -**ИСТОЧНИК ПОСТАВЩИКОВ**: -- Показываются только поставщики-партнеры из таблицы `Counterparty` -- Фильтрация: `counterparty.type === "WHOLESALE"` -- Партнерство может быть создано двумя способами: - 1. Через заказ в маркете → автоматическое партнерство после одобрения - 2. Через раздел "Партнеры" → отправка и принятие заявки `CounterpartyRequest` - -**ВЫБОР ПОСТАВЩИКА**: -- Dropdown с поиском партнеров-поставщиков -- Отображение: Название поставщика, ИНН, статус партнерства -- Только активные партнеры с типом WHOLESALE -- При выборе загружается каталог товаров поставщика из `Product` таблицы - -**КАТАЛОГ ТОВАРОВ ПАРТНЕРА**: -- Товары из `Product` where `organizationId = поставщик.id` -- Отображение в виде карточек с полями: - - Картинка товара - - Название, артикул - - Цена за единицу - - Доступное количество - - Поле ввода количества (минимум 5 цифр) с кнопками +/- -- Фильтрация по категориям -- Поиск по названию/артикулу - -#### **9.7.4 Принцип работы с товарами и корзиной (как на create-consumables)** - -**ДОБАВЛЕНИЕ В КОРЗИНУ**: -- Клик по товару → модальное окно с деталями -- Указание количества, комплектности, дополнительных параметров -- Кнопка "Добавить в корзину" - -**КОРЗИНА**: -- Отображение добавленных товаров в таблице -- Колонки: Товар, Артикул, Количество, Цена, Комплектность, Сумма -- Возможность изменения количества -- Кнопка удаления товара из корзины -- Автоматический пересчет итогов - -#### **9.7.5 Поля формы товара** - -**ОСНОВНЫЕ ПОЛЯ** (из каталога поставщика): -- Название товара -- Артикул поставщика -- Категория -- Базовая цена - -**ПОЛЯ ДЛЯ ЗАПОЛНЕНИЯ**: -- Количество (целое число > 0) -- Комплектность (если есть) - текстовое описание состава -- Цена за единицу (может отличаться от базовой по договоренности) -- Описание/рецептура (дополнительные требования) -- Особые требования к товару - -**ПАРАМЕТРЫ ТОВАРА** (если применимо): -- Цвет, Размер, Материал, Бренд -- Динамические параметры для конкретной категории - -#### **9.7.6 Валидация и проверки** - -**ОБЯЗАТЕЛЬНАЯ ВАЛИДАЦИЯ**: -- Выбран поставщик -- В корзине минимум 1 товар -- Указана желаемая дата поставки -- У всех товаров указано количество > 0 -- Все товары проверены на наличие у поставщика -- Количество каждого товара ≤ доступному остатку - -**ПРЕДУПРЕЖДЕНИЯ**: -- "Товар заканчивается на складе поставщика (осталось X шт)" -- "Товар недоступен, выберите другое количество" -- "Выбранная дата может не соответствовать возможностям логистики" -- "Габариты не указаны - стоимость логистики ориентировочная" -- Превышение лимитов заказа -- Значительное отклонение цены от каталожной - -**АВТОМАТИЧЕСКИЕ РАСЧЕТЫ**: -- Стоимость по каждому товару = количество × цена -- Общая стоимость товаров в корзине -- Комиссии фулфилмента (% от стоимости) -- Логистика (по весу/габаритам или фиксированная ставка) - -#### **9.7.7 Выбор логистики** - -**ОПЦИИ ЛОГИСТИКИ**: -- "Автоматический выбор" (фулфилмент выберет оптимальную) -- Список доступных логистических компаний -- Отображение ориентировочной стоимости по каждой опции -- Сроки доставки по каждой опции - -**ЛОГИКА ВЫБОРА**: -- Если селлер не выбрал → фулфилмент выбирает оптимальную -- Если селлер выбрал → используется выбранная компания -- Финальная стоимость может отличаться от ориентировочной - -#### **9.7.8 Желаемая дата поставки** - -**РАСПОЛОЖЕНИЕ**: В блоке корзины и итогов - -**ПОЛЕ "ЖЕЛАЕМАЯ ДАТА ПОСТАВКИ"**: -- **Обязательное поле** для планирования -- **Календарь** с ограничениями: - - Минимум: завтра (нельзя выбрать прошедшие даты) - - Максимум: +90 дней от текущей даты -- **Проверка на рабочие дни** (опционально) -- **Подсказки** по срокам доставки от выбранной логистической компании - -**ЛОГИКА РАБОТЫ С ДАТОЙ**: -- При выборе логистики → автоматическое обновление возможных дат -- При изменении даты → пересчет стоимости логистики (если зависит от срочности) -- Отображение: "Ориентировочная дата доставки: 15-17 января 2024" - -#### **9.7.9 Ограничения и проверки товаров** - -**КОЛИЧЕСТВЕННЫЕ ОГРАНИЧЕНИЯ**: -- **НЕТ ограничений** на максимальное количество товаров в поставке -- **ОБЯЗАТЕЛЬНАЯ проверка** доступности на складах поставщиков -- **В реальном времени** проверка остатков при добавлении в корзину -- **Предупреждения** если запрашиваемое количество превышает доступное -- **Блокировка** добавления товара если его нет в наличии у поставщика - -**ЛОГИКА ПРОВЕРКИ ОСТАТКОВ**: -- При добавлении товара в корзину → запрос к API поставщика -- При изменении количества → повторная проверка -- Отображение доступного количества рядом с полем ввода -- Сообщение: "Доступно: 150 шт" или "Нет в наличии" - -#### **9.7.10 Габариты и логистические данные** - -**НА ЭТАПЕ СОЗДАНИЯ ПОСТАВКИ**: -- **НЕТ обязательных** полей для габаритов/веса -- **Ориентировочный расчет** логистики по средним показателям категории -- **Предупреждение** что финальная стоимость может отличаться - -**В КАБИНЕТЕ ПОСТАВЩИКА** (при одобрении поставки): -- **Возможность ввести** точные логистические данные: - - Габариты каждого товара (Д×Ш×В в см) - - Объем упаковки (в куб.м) - - Количество мест/коробок - - Общий вес поставки -- **НЕ обязательные** для заполнения (можно оставить пустыми) -- **Уточнение стоимости** логистики после заполнения данных - -#### **9.7.11 Навигация и сохранение** - -**УПРАВЛЕНИЕ СЕССИЕЙ**: -- Автосохранение корзины каждые 30 секунд -- Сохранение состояния при смене поставщика -- Предупреждение при попытке покинуть страницу - -**ПЕРЕХОДЫ**: -- "Назад" → возврат к табу "Поставщики" (с предупреждением о потере данных) -- "Очистить корзину" → очистка всех товаров с подтверждением -- "Продолжить" → переход к подтверждению и оформлению заказа - -#### **9.7.12 Интеграция с системой** - -**СВЯЗЬ С ДАННЫМИ**: -- Работа с каталогом товаров поставщиков -- Проверка остатков в реальном времени -- Создание черновика `SupplyOrder` типа `ТОВАР` способом `suppliers` - -**ОСОБЕННОСТИ**: -- Отличие от "Карточки": здесь товары выбираются из каталога поставщика -- Отличие от "Расходники": здесь товары предназначены для перепродажи -- Возможность указания комплектности для наборов товаров - -### 9.8 Экономика - -_Раздел находится в разработке. Будет добавлен позже._ - ---- - -## 10. 🏪 КАБИНЕТ ПОСТАВЩИКА - -### 10.1 Основные возможности - -**СОЗДАНИЕ КАРТОЧЕК**: - -- **ТОВАР** - базовые товары поставщика -- **РАСХОДНИКИ** - материалы и вспомогательные товары - -### 10.2 Обязательные поля карточки - -**Базовые параметры**: - -- Фото (система загрузки и управления изображениями) -- Название -- Автоматическая генерация артикула СФ -- Описание -- Количество предметов в единицах -- Количество комплектов (если применимо) -- Категория (28 предустановленных + специализированные для расходников) -- Бренд, Цвет, Размер/объем, Вес, Габариты, Материал -- Цена за единицу и за комплект -- Заказано, В пути, Остаток, Продано - -### 10.3 Отображение информации в карточках - -**Каждая карточка содержит**: - -- Основное изображение -- Название и артикул СФ -- Цена за единицу/комплект -- Категория и статус активности -- Данные о движении: остаток, заказано, в пути, продано -- Индикаторы низких остатков - -### 10.4 Статистика поставщика - -**Блок статистики включает**: - -- **ТОВАРЫ**: Общая статистика товаров поставщика -- **РАСХОДНИКИ**: Материалы и вспомогательные товары - - Классифицируются при заказе в зависимости от заказчика - - Общая статистика по всем расходникам - -### 10.5 Экономика - -_Раздел находится в разработке. Будет добавлен позже._ - ---- - -## 11. 🏭 КАБИНЕТ ФУЛФИЛМЕНТА - -### 11.1 Структура раздела склад фулфилмента - -#### **Модули в обязательной последовательности**: - -1. **📦 ПРОДУКТ** - готовые к продаже товары -2. **🛒 ТОВАР** - базовые товары от поставщиков - - Товары "на складе" - готовы к обработке - - Товары "в обработке" - в процессе создания продукта -3. **❌ БРАК** - товары с дефектами -4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары -5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров -6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТ** - операционные материалы - - **КЛИКАБЕЛЬНЫЙ МОДУЛЬ** - содержит полноценный раздел учёта - -### 11.2 Движение товаров в фулфилменте - -#### **Поступление товаров**: - -- **ПОСТАВКИ**: От поставщиков через систему заказов -- **ВОЗВРАТЫ**: Товары, возвращенные с ПВЗ -- **ПЕРЕМЕЩЕНИЯ**: Между складами и магазинами - -#### **Расход товаров**: - -- **ОТГРУЗКА**: Товары отправлены селлерам -- **СПИСАНИЕ**: Брак, утрата, утилизация -- **ВОЗВРАТ**: Возврат поставщику -- **ИСПОЛЬЗОВАНИЕ**: Расходники для операций - -### 11.3 Модуль "Расходники фулфилмента" - -**ОСОБЕННОСТИ**: - -- **ИНТЕРАКТИВНОСТЬ**: Кликабельный элемент в статистике -- **ФУНКЦИОНАЛЬНОСТЬ**: Полноценный раздел учёта -- **СОДЕРЖАНИЕ**: Управление расходниками фулфилмента - -### 11.4 Блок детализации по магазинам - -**НАЗНАЧЕНИЕ**: Распределение товаров по торговым точкам/магазинам - -**ФУНКЦИИ**: - -- **ОСТАТКИ ПО МАГАЗИНАМ**: Отображение количества товаров в каждом магазине -- **УПРАВЛЕНИЕ РАСПРЕДЕЛЕНИЕМ**: Перемещение товаров между точками -- **КОНТРОЛЬ ДВИЖЕНИЯ**: Отслеживание перемещений между складами и магазинами -- **АНАЛИТИКА**: Сравнение эффективности разных точек -- **ПЛАНИРОВАНИЕ**: Оптимизация распределения товаров - -### 11.5 Экономика - -_Раздел находится в разработке. Будет добавлен позже._ - ---- - -## 12. 🚚 КАБИНЕТ ЛОГИСТИКИ - -### 12.1 Основные функции логистики - -**РОЛЬ В СИСТЕМЕ**: Управление доставками и транспортировкой - -**ОСНОВНЫЕ ФУНКЦИИ**: - -- **ПОДТВЕРЖДЕНИЕ ДОСТАВКИ**: Подтверждение возможности доставки поставок -- **ТРАНСПОРТИРОВКА**: Организация и выполнение доставки товаров -- **КОНТРОЛЬ МАРШРУТОВ**: Управление логистическими маршрутами -- **ОТСЛЕЖИВАНИЕ**: Мониторинг грузов в пути - -### 12.2 Workflow для логистики - -#### **ЭТАП 1: Получение заявки** - -1. Логистика получает уведомление о новой поставке -2. Заявка появляется в разделе "Заявки" кабинета логистики -3. Логист изучает детали поставки (объем, вес, маршрут) - -#### **ЭТАП 2: Подтверждение доставки** - -4. Логист нажимает кнопку "Одобрить" -5. Статус поставки меняется на `LOGISTICS_CONFIRMED` -6. Уведомления отправляются всем участникам - -#### **ЭТАП 3: Забор товара** - -7. Логист приезжает к поставщику за товаром -8. Поставщик отгружает товар логисту -9. Поставщик отмечает "Отправлено" -10. Статус меняется на `SHIPPED`, затем `IN_TRANSIT` - -#### **ЭТАП 4: Доставка** - -11. Логистика доставляет товар на фулфилмент-центр -12. В кабинете логистики нажимают "Доставлено" -13. Фулфилмент принимает товар и отмечает "Принято" - -### 12.3 Система тарификации - -**ПАРАМЕТРЫ ТАРИФИКАЦИИ**: - -- **Тариф до 1м³** - базовая стоимость для малых грузов -- **Тариф свыше 1м³** - стоимость для крупных грузов -- **Маршруты доставки** - от точки отправления до точки назначения -- **Описание услуг** - дополнительные условия доставки - -**РАСЧЕТ СТОИМОСТИ**: - -- Автоматический расчет стоимости доставки по объему груза -- Отображение примерной стоимости при создании заказа -- Учет специфики маршрута и условий доставки - -### 12.4 Управление заявками - -**РАЗДЕЛЫ КАБИНЕТА ЛОГИСТИКИ**: - -- **НОВЫЕ ЗАЯВКИ** - поступившие заявки на доставку -- **В РАБОТЕ** - принятые к исполнению заявки -- **ВЫПОЛНЕННЫЕ** - завершенные доставки -- **ОТКЛОНЕННЫЕ** - заявки, которые не могут быть выполнены - -**ИНФОРМАЦИЯ О ЗАЯВКЕ**: - -- Детали груза (объем, вес, габариты) -- Маршрут доставки (откуда - куда) -- Срочность доставки -- Особые требования к транспортировке -- Контактная информация участников - -### 12.5 Правила логистики - -**ОБЯЗАТЕЛЬНО**: - -- Своевременное подтверждение заявок -- Соблюдение сроков доставки -- Бережная транспортировка товаров -- Уведомление о статусе доставки - -**ЗАПРЕЩЕНО**: - -- Принятие заявок без подтверждения возможности выполнения -- Нарушение сроков доставки без уведомления -- Повреждение товаров при транспортировке - -### 12.6 Экономика - -_Раздел находится в разработке. Будет добавлен позже._ - ---- - -## 13. 🤝 СИСТЕМА ПАРТНЕРСТВА И КОНТРАГЕНТОВ - -### 13.1 Основы системы партнерства - -**ПРИНЦИП РАБОТЫ**: -- Все типы кабинетов могут создавать партнерские отношения -- Партнерство реализовано через таблицы `Counterparty` и `CounterpartyRequest` -- Двустороннее партнерство: каждая организация видит другую в разделе "Партнеры" - -**ТИПЫ ОРГАНИЗАЦИЙ-ПАРТНЕРОВ**: -- `WHOLESALE` - Поставщики товаров и расходников -- `FULFILLMENT` - Фулфилмент-центры -- `LOGIST` - Логистические компании -- `SELLER` - Селлеры (торговые организации) - -### 13.2 Способы создания партнерства - -#### **СПОСОБ 1: Через заказ в маркете (автоматическое партнерство)** - -**WORKFLOW**: -1. Поставщик создает товар → товар попадает в глобальный маркет -2. Селлер/Фулфилмент находит товар в маркете -3. Создает заказ (`SupplyOrder`) → статус `PENDING` -4. Поставщик получает уведомление в разделе "Заявки" -5. Поставщик одобряет заявку → статус `SUPPLIER_APPROVED` -6. **Автоматически создается двустороннее партнерство**: - - Запись в `Counterparty` для заказчика (`organizationId` → `counterpartyId`) - - Обратная запись в `Counterparty` для поставщика -7. Обе организации видят друг друга в разделе "Партнеры" - -#### **СПОСОБ 2: Через раздел "Партнеры" (заявочная система)** - -**WORKFLOW**: -1. Любая организация идет в раздел "Партнеры" -2. Использует поиск для нахождения нужной организации -3. Отправляет заявку на партнерство → создается `CounterpartyRequest`: - - `senderId` - отправитель заявки - - `receiverId` - получатель заявки - - `status: PENDING` - - `message` - опциональное сообщение -4. Получатель видит заявку в разделе "Партнеры" → "Входящие заявки" -5. Получатель принимает заявку → статус меняется на `ACCEPTED` -6. **Автоматически создается двустороннее партнерство** (аналогично способу 1) - -**СТАТУСЫ ЗАЯВОК**: -- `PENDING` - Ожидает рассмотрения -- `ACCEPTED` - Принята (партнерство создано) -- `REJECTED` - Отклонена -- `CANCELLED` - Отменена отправителем - -### 13.3 Использование партнерства в системе - -#### **В форме создания поставки товаров через поставщиков** - -**ПРАВИЛО ОТОБРАЖЕНИЯ ПОСТАВЩИКОВ**: -- Показываются только партнеры с типом `WHOLESALE` -- Источник: таблица `Counterparty` where `counterparty.type === "WHOLESALE"` -- Фильтрация по `organizationId` текущего пользователя - -**ЛОГИКА РАБОТЫ**: -1. Пользователь выбирает поставщика из dropdown партнеров-поставщиков -2. Загружается каталог товаров поставщика из `Product` таблицы -3. Товары фильтруются по `organizationId = поставщик.id` -4. Пользователь может добавлять товары в корзину и создавать заказ - -#### **В других разделах системы** - -**ВЫБОР ФУЛФИЛМЕНТ-ЦЕНТРА**: -- Партнеры с типом `FULFILLMENT` -- Используется при создании поставок расходников - -**ВЫБОР ЛОГИСТИКИ**: -- Партнеры с типом `LOGIST` -- Используется при планировании доставок - -**МЕССЕНДЖЕР**: -- Общение доступно только между партнерами -- Список чатов формируется из таблицы `Counterparty` - -### 13.4 Технические правила - -**СОЗДАНИЕ ЗАПИСЕЙ В COUNTERPARTY**: -```sql --- При создании партнерства создаются ДВЕ записи -INSERT INTO counterparties (organizationId, counterpartyId) VALUES (org1_id, org2_id); -INSERT INTO counterparties (organizationId, counterpartyId) VALUES (org2_id, org1_id); -``` - -**ПРОВЕРКА ПАРТНЕРСТВА**: -```typescript -const isPartner = await prisma.counterparty.findFirst({ - where: { - organizationId: currentOrgId, - counterpartyId: targetOrgId - } -}); -``` - -**ПОЛУЧЕНИЕ ПАРТНЕРОВ ПО ТИПУ**: -```typescript -const wholesalePartners = await prisma.counterparty.findMany({ - where: { - organizationId: currentOrgId, - counterparty: { - type: "WHOLESALE" - } - }, - include: { - counterparty: true - } -}); -``` - -### 13.5 Решение распространенных проблем - -#### **ПРОБЛЕМА: GraphQL запрос не возвращает данные партнеров** - -**Симптомы**: -- В консоли браузера: `All counterparties: 0`, `All counterparties data: []` -- GraphQL запрос отправляется успешно, но возвращает пустой массив -- В базе данных партнеры существуют - -**Возможные причины и решения**: - -1. **НЕПРАВИЛЬНОЕ ИМЯ ПОЛЯ В КОДЕ** (наиболее частая ошибка): - ```typescript - // ❌ НЕПРАВИЛЬНО - const allCounterparties = counterpartiesData?.getMyCounterparties || []; - - // ✅ ПРАВИЛЬНО - const allCounterparties = counterpartiesData?.myCounterparties || []; - ``` - **Объяснение**: В GraphQL схеме поле называется `myCounterparties`, а не `getMyCounterparties` - -2. **НЕСООТВЕТСТВИЕ ID ПОЛЬЗОВАТЕЛЯ**: - - Проверить что пользователь авторизован под правильным аккаунтом - - Убедиться что `context.user.id` соответствует ожидаемому пользователю - -3. **ПРОБЛЕМЫ С КЕШИРОВАНИЕМ APOLLO CLIENT**: - ```typescript - const { data, loading, error } = useQuery(GET_MY_COUNTERPARTIES, { - fetchPolicy: 'network-only', // Обходим кеш - errorPolicy: 'all' - }); - ``` - -4. **ОТСУТСТВИЕ ЛОГИРОВАНИЯ В РЕЗОЛВЕРЕ**: - - Добавить console.log в GraphQL резолвер для отладки - - Проверить что резолвер вызывается - -**Чек-лист для диагностики**: -- [ ] Проверить правильность имени поля в коде (`myCounterparties`) -- [ ] Убедиться что пользователь авторизован -- [ ] Проверить логи сервера на вызов резолвера -- [ ] Добавить отладочное логирование в браузере -- [ ] Проверить данные в базе через Prisma Studio -- [ ] Использовать `fetchPolicy: 'network-only'` для обхода кеша - ---- - -## 14. 🌐 ИНТЕГРАЦИИ С СИСТЕМОЙ - -### 14.1 Глобальная интеграция - -- **МАРКЕТ**: Товары поставщиков отображаются в глобальном маркете -- **СИНХРОНИЗАЦИЯ**: Данные склада синхронизируются с модулем аналитики -- **УВЕДОМЛЕНИЯ**: Единая система через встроенный мессенджер - -### 13.2 Интеграция с маркетплейсами - -- **WILDBERRIES**: Обязательная проверка активности API ключа -- **СИНХРОНИЗАЦИЯ**: Регулярное обновление данных из внешних источников -- **ЛОКАЛЬНЫЕ КОПИИ**: Сохранение данных для офлайн работы - -### 13.3 Интеграция с модулем "Услуги" - -**РАСХОДНИКИ ФУЛФИЛМЕНТА В УСЛУГАХ**: - -- Расходники фулфилмента - собственность фулфилмента (куплены у поставщиков) -- Фулфилмент создает заявки-поставки для покупки расходников у поставщиков -- Селлеры могут использовать расходники фулфилмента в разделе "Услуги / Расходники" -- Для создания продукта из товара -- Расходники списываются с остатков фулфилмента -- Стоимость включается в стоимость услуги - -**WORKFLOW ИСПОЛЬЗОВАНИЯ**: - -1. Селлер выбирает услугу "Создание продукта" -2. Указывает базовый товар -3. Выбирает необходимые расходники фулфилмента -4. Фулфилмент обрабатывает заказ и создает продукт -5. Расходники списываются, создается готовый продукт - -### 12.4 Система тарификации логистики - -**ПАРАМЕТРЫ**: - -- **Тариф до 1м³** - базовая стоимость для малых грузов -- **Тариф свыше 1м³** - стоимость для крупных грузов -- **Маршруты доставки** - от точки отправления до точки назначения -- **Описание услуг** - дополнительные условия доставки - ---- - -## 14. 📊 СТАТИСТИКА И АНАЛИТИКА - -### 14.1 Структура статистики по кабинетам - -#### **В КАБИНЕТЕ ПОСТАВЩИКА**: - -- **ТОВАРЫ**: Общая статистика товаров поставщика -- **РАСХОДНИКИ**: Материалы и вспомогательные товары (классифицируются при заказе) - -#### **В КАБИНЕТЕ ФУЛФИЛМЕНТА**: - -- **ТОВАРЫ**: Базовые товары от поставщиков (принятые на склад) -- **ПРОДУКТЫ**: Отдельный блок готовой продукции -- **БРАК**: Статистика потерь и списаний -- **РАСХОДНИКИ ФУЛФИЛМЕНТА**: Операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ**: Материалы для товаров селлеров - -### 14.2 Ключевые метрики - -**ОБЩИЕ ПОКАЗАТЕЛИ**: - -- Общие остатки, заказано, в пути, остаток, продано -- Подсветка предметов с остатками ниже критического уровня - -**АКТУАЛИЗАЦИЯ ДАННЫХ**: - -- При изменении количества в карточке данные актуализируются во всей системе -- Статистика обновляется в реальном времени -- Отслеживание изменений для аналитики - ---- - -## 15. ⚠️ КРИТИЧЕСКИЕ ЗАПРЕТЫ - -### 15.1 НИКОГДА НЕ ДЕЛАТЬ: - -1. ❌ Удалять предметы с существующими заказами -2. ❌ Изменять статусы заказов без уведомлений -3. ❌ Обходить проверки остатков предметов -4. ❌ Давать доступ к чужим данным -5. ❌ Игнорировать ошибки валидации -6. ❌ Сохранять пароли в открытом виде -7. ❌ Пропускать логирование критических операций -8. ❌ Блокировать интерфейс без индикации загрузки -9. ❌ Создавать брак или продукт без связи с родительским товаром -10. ❌ Создавать отдельные типы расходников (только общий тип "РАСХОДНИКИ") -11. ❌ Разрешать заказ брака -12. ❌ Нарушать иерархию типов предметов -13. ❌ Пропускать промежуточные статусы в workflow -14. ❌ Нарушать обязательную последовательность модулей в статистике фулфилмента - -### 13.2 ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА: - -1. ✅ Проверка остатков перед добавлением в корзину -2. ✅ Валидация всех числовых значений (цена > 0, вес > 0) -3. ✅ Автоматическая генерация уникальных артикулов СФ -4. ✅ Логирование всех изменений статусов -5. ✅ Уведомления всех участников при изменении статусов -6. ✅ Обязательная типизация всех предметов -7. ✅ Связь производных типов с родительскими предметами -8. ✅ Проверка доступности товаров перед заказом -9. ✅ Соблюдение жизненного цикла статусов поставок -10. ✅ Фиксация план/факт в процессе создания продукта - ---- - -## 🎖️ ПРИОРИТЕТЫ РАЗРАБОТКИ - -### ВЫСОКИЙ ПРИОРИТЕТ: - -1. 🔴 Безопасность и контроль доступа -2. 🔴 Целостность данных и валидация -3. 🔴 Корректность статусов поставок -4. 🔴 Уведомления участников процесса -5. 🔴 Правильная типизация предметов -6. 🔴 Связи между товарами и производными типами - -### СРЕДНИЙ ПРИОРИТЕТ: - -1. 🟡 Производительность и оптимизация -2. 🟡 Пользовательский опыт -3. 🟡 Аналитика и отчетность -4. 🟡 Интеграции с внешними системами -5. 🟡 Workflow для брака и продуктов -6. 🟡 Разделение расходников по типам - -### НИЗКИЙ ПРИОРИТЕТ: - -1. 🟢 Дополнительные фильтры -2. 🟢 Косметические улучшения -3. 🟢 Экспериментальные функции -4. 🟢 Расширенная кастомизация - ---- - -## 📦 ПРИЛОЖЕНИЕ: КАТЕГОРИИ РАСХОДНИКОВ - -### Специализированные категории для расходников: - -#### 🎁 **УПАКОВКА И ЗАЩИТА** - -- Коробки, пакеты, пузырчатая пленка, стрейч-пленка, защитные уголки - -#### 🏷️ **МАРКИРОВКА И ИДЕНТИФИКАЦИЯ** - -- Этикетки, бирки, стикеры, маркеры, штампы, термоэтикетки - -#### 🔧 **КРЕПЕЖ И СОЕДИНЕНИЕ** - -- Скотч, клей, стяжки, степлер, веревки, стрейч-лента - -#### 📄 **ДОКУМЕНТООБОРОТ И ВКЛАДЫШИ** - -- Накладные, инструкции, буклеты, визитки, промокоды - -#### 🧼 **ГИГИЕНА И БЕЗОПАСНОСТЬ** - -- Перчатки, маски, антисептики, салфетки, бахилы - -#### 🛠️ **ИНСТРУМЕНТЫ И ПРИСПОСОБЛЕНИЯ** - -- Ножи, линейки, упаковочные машины, весы - -#### 🎨 **БРЕНДИНГ И ДИЗАЙН** - -- Фирменные пакеты, брендированные коробки, подарочная упаковка - -#### ⚡ **СПЕЦИАЛИЗИРОВАННЫЕ МАТЕРИАЛЫ** - -- Антистатические пакеты, влагопоглотители, защита от краж - ---- - -## 16. 📱 ПРАВИЛА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА - -### 16.1 Отзывчивость интерфейса - -- **ОБЯЗАТЕЛЬНО**: Интерфейс должен работать на всех устройствах -- **ПРАВИЛО**: Адаптивная сетка для карточек товаров -- **ФУНКЦИЯ**: Оптимизация для мобильных устройств -- **ТРЕБОВАНИЕ**: Корректное отображение на экранах от 320px до 4K - -### 15.2 Обратная связь пользователю - -- **ОБЯЗАТЕЛЬНО**: Уведомления об успешных/неуспешных операциях -- **ПРАВИЛО**: Индикаторы загрузки для длительных операций -- **ФУНКЦИЯ**: Подтверждение критических действий (удаление, деактивация) -- **UX**: Понятные сообщения об ошибках с предложением решения - ---- - -## 17. 🚨 ПРАВИЛА ОБРАБОТКИ ОШИБОК - -### 17.1 Обработка ошибок - -- **ОБЯЗАТЕЛЬНО**: Логирование всех ошибок с детальной информацией -- **ПРАВИЛО**: Понятные сообщения об ошибках для пользователя -- **ФУНКЦИЯ**: Автоматическое восстановление после сбоев -- **МОНИТОРИНГ**: Отслеживание критических ошибок в реальном времени - -### 16.2 Резервное копирование - -- **КРИТИЧЕСКИ ВАЖНО**: Регулярное резервное копирование данных товаров -- **ПРАВИЛО**: Версионность изменений для возможности отката -- **ФУНКЦИЯ**: Автоматическое восстановление связей при сбоях -- **ПЕРИОДИЧНОСТЬ**: Ежедневные и еженедельные бэкапы - ---- - -## 18. 📈 ПРАВИЛА ПРОИЗВОДИТЕЛЬНОСТИ - -### 18.1 Оптимизация загрузки - -- **ПРАВИЛО**: Пагинация для больших списков товаров -- **ФУНКЦИЯ**: Ленивая загрузка изображений -- **ОПТИМИЗАЦИЯ**: Кэширование часто запрашиваемых данных -- **ПРОИЗВОДИТЕЛЬНОСТЬ**: Время загрузки страницы не более 3 секунд - -### 17.2 Масштабируемость - -- **АРХИТЕКТУРА**: Модульная структура для легкого расширения -- **ПРАВИЛО**: Использование индексов для быстрого поиска -- **ФУНКЦИЯ**: Горизонтальное масштабирование при росте нагрузки -- **ПЛАНИРОВАНИЕ**: Готовность к увеличению нагрузки в 10 раз - ---- - -## 19. 🔐 ПРАВИЛА БЕЗОПАСНОСТИ ДАННЫХ - -### 19.1 Защита данных - -- **ОБЯЗАТЕЛЬНО**: Шифрование чувствительных данных -- **ПРАВИЛО**: Аудит всех действий пользователей -- **ФУНКЦИЯ**: Контроль доступа на уровне API -- **БЕЗОПАСНОСТЬ**: Двухфакторная аутентификация для критических операций - -### 18.2 Соответствие требованиям - -- **GDPR**: Право на удаление и экспорт данных -- **ПРАВИЛО**: Прозрачность обработки персональных данных -- **ФУНКЦИЯ**: Логирование согласий пользователей -- **СООТВЕТСТВИЕ**: Регулярный аудит безопасности - ---- - -## 20. 🎯 ПРАВИЛА КАЧЕСТВА КОДА - -### 20.1 Стандарты разработки - -- **ОБЯЗАТЕЛЬНО**: Покрытие тестами критической функциональности -- **ПРАВИЛО**: Следование принципам SOLID -- **ФУНКЦИЯ**: Автоматическое тестирование при развертывании -- **КАЧЕСТВО**: Минимальное покрытие тестами 80% - -### 19.2 Документация - -- **ОБЯЗАТЕЛЬНО**: Документирование всех API методов -- **ПРАВИЛО**: Комментарии к сложной бизнес-логике -- **ФУНКЦИЯ**: Автоматическая генерация документации -- **СТАНДАРТ**: Актуальная техническая документация - ---- - -## 21. 📋 ПРИЛОЖЕНИЕ: ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ И ПЛАНЫ - -### 🔄 Сложные сценарии (требуют дальнейшей проработки) - -**ЗАМЕТКА**: Данные сценарии выявлены, но пока не учитываются в текущей системе. Требуют отдельного обсуждения: - -#### **Сценарий 1: Из разных товаров → один продукт** - -- **ПРИМЕР**: Товар "Футболка" + Товар "Джинсы" = Продукт "Комплект одежды" -- **ТРЕБУЕТ**: Разработки системы "составных продуктов" -- **СЛОЖНОСТЬ**: Управление несколькими parentId, распределение себестоимости -- **СТАТУС**: Требует технического решения - -#### **Сценарий 2: Из одного товара → несколько продуктов** - -- **ПРИМЕР**: Товар "Ткань 10 метров" → Продукт "Платье" (3м) + Продукт "Юбка" (2м) + остаток 5м -- **ТРЕБУЕТ**: Системы "деления товаров" и учета остатков -- **СЛОЖНОСТЬ**: Контроль использования материала, учет отходов -- **СТАТУС**: Требует проработки алгоритмов - -### 🚀 Предложения по улучшению - -#### **В разработке**: - -- ✅ **Workflow для создания брака и продуктов** - детально описан -- ✅ **Разделение расходников на подтипы** - реализовано -- ✅ **Связи между товарами и производными типами** - реализовано - -#### **Требует реализации**: - -- **Автогенерация артикулов СФ с префиксами типов** - автоматическое создание уникальных номеров -- **Система комплектов товаров** - управление наборами товаров -- **Умные уведомления о низких остатках** - персонализированные алерты -- **Расширенные фильтры по типам предметов** - улучшенная навигация -- **Система прогнозирования спроса** - аналитика и планирование - -### 📊 Полный список 28 универсальных категорий - -1. Одежда и обувь -2. Косметика и парфюмерия -3. Дом и сад -4. Детские товары -5. Спорт и отдых -6. Электроника -7. Книги -8. Здоровье -9. Автотовары -10. Строительство и ремонт -11. Продукты питания -12. Зоотовары -13. Дача, сад и огород -14. Канцелярские товары -15. Хобби и творчество -16. Украшения и аксессуары -17. Сумки и чемоданы -18. Техника для дома -19. Музыкальные инструменты -20. Игры и игрушки -21. Мебель -22. Товары для красоты -23. Бытовая химия -24. Товары для путешествий -25. Медицинские товары -26. Религиозные товары -27. Антиквариат и коллекционирование -28. Прочие товары - ---- - -## 21. 🎯 ПРАВИЛА КАЧЕСТВА КОДА - -### 21.1 GraphQL Rules - -#### **Правила именования полей** - -**ВАЖНО**: Имена полей в GraphQL запросах должны точно соответствовать схеме! - -```typescript -// ✅ ПРАВИЛЬНО - соответствует схеме -export const GET_MY_COUNTERPARTIES = gql` - query GetMyCounterparties { - myCounterparties { // <- имя поля в схеме - id - name - type - } - } -`; - -// Использование в компоненте -const allCounterparties = counterpartiesData?.myCounterparties || []; -``` - -```typescript -// ❌ НЕПРАВИЛЬНО - не соответствует схеме -const allCounterparties = counterpartiesData?.getMyCounterparties || []; // Ошибка! -``` - -#### **Правила отладки GraphQL** - -**При проблемах с GraphQL запросами следовать чек-листу**: - -1. **Проверить соответствие имен полей схеме** -2. **Добавить fetchPolicy: 'network-only' для обхода кеша** -3. **Логировать данные в браузере и сервере** -4. **Проверить авторизацию пользователя** -5. **Убедиться что резолвер вызывается** - -#### **Обязательные поля для отладки** - -```typescript -const { data, loading, error } = useQuery(QUERY_NAME, { - fetchPolicy: 'network-only', // Обходим кеш при отладке - errorPolicy: 'all' // Показываем все ошибки -}); - -// Логирование для отладки -console.log("Data:", data); -console.log("Loading:", loading); -console.log("Error:", error); -``` - -### 21.2 TypeScript Rules - -#### **Интерфейсы данных** - -**Поля интерфейсов должны соответствовать GraphQL схеме**: - -```typescript -// ✅ ПРАВИЛЬНО - соответствует schema.prisma -interface GoodsProduct { - id: string; - name: string; - article: string; // <- соответствует полю в schema - quantity?: number; // <- соответствует полю в schema - organization: { - id: string; - name: string; - }; -} -``` - -```typescript -// ❌ НЕПРАВИЛЬНО - не соответствует schema -interface GoodsProduct { - sku: string; // <- в schema поле называется 'article' - stock?: number; // <- в schema поле называется 'quantity' -} -``` - ---- - -_Эта база знаний создана на основе анализа rules.md, rules1.md и description.md и является единым источником понимания структуры и логики проекта._ - -_Версия: 2.0_ -_Дата создания: 2024_ -_Статус: АКТИВНАЯ БАЗА ЗНАНИЙ_ -1 diff --git a/description.md b/description.md deleted file mode 100644 index e2662f3..0000000 --- a/description.md +++ /dev/null @@ -1,802 +0,0 @@ -# СИСТЕМА УПРАВЛЕНИЯ СКЛАДАМИ И ПОСТАВКАМИ - ПОЛНОЕ ОПИСАНИЕ ПРОЕКТА - -> ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данные из этого файла могут быть удалены только с разрешения пользователя. Все изменения должны согласовываться. - ---- - -## 📑 ОГЛАВЛЕНИЕ - -### 🏗️ **АРХИТЕКТУРА СИСТЕМЫ** - -0. [🏠 Кабинет селлера / раздел "Мои поставки"](#0--кабинет-селлера--раздел-мои-поставки) -1. [📦 Кабинет поставщика / раздел склад](#1--кабинет-поставщика--раздел-склад) -2. [🛠️ Создание и управление карточками](#2--создание-и-управление-карточками) -3. [🔧 Управление, хранение, учёт, статус](#3--управление-хранение-учёт-статус) -4. [📊 Статистика и аналитика](#4--статистика-и-аналитика) -5. [🎛️ Интерфейс и управление](#5--интерфейс-и-управление) - -### 🌐 **ИНТЕГРАЦИИ И СВЯЗИ** - -6. [🌐 Интеграция с системой](#6--интеграция-с-системой) -7. [🚚 Workflow поставок - ДЕТАЛИЗИРОВАННАЯ СИСТЕМА СТАТУСОВ](#7--workflow-поставок---детализированная-система-статусов) -8. [🔐 Система ролей и доступов](#8--система-ролей-и-доступов) -9. [💰 Система тарификации логистики](#9--система-тарификации-логистики) - -### 🏢 **МОДУЛИ СИСТЕМЫ** - -10. [📈 Дополнительные возможности системы](#10--дополнительные-возможности-системы) -11. [🔄 Интеграция с другими модулями](#11--интеграция-с-другими-модулями) -12. [🏢 СИСТЕМА СКЛАДА ФУЛФИЛМЕНТА](#12--система-склада-фулфилмента) - -### 📋 **РАЗВИТИЕ И ПЛАНЫ** - -13. [📋 РЕКОМЕНДАЦИИ ПО ДОПОЛНЕНИЮ И УЛУЧШЕНИЮ](#13--рекомендации-по-дополнению-и-улучшению) - ---- - -## 🏷️ РЕЕСТР СУЩНОСТЕЙ СИСТЕМЫ - -### 📦 **ОСНОВНЫЕ ПРЕДМЕТЫ** - -| Сущность | Название в системе | Описание | Статус | -| ---------- | ---------------------------------- | ----------------------------------------------- | --------------- | -| Товар | `Product` (type: PRODUCT) | Базовый тип товара от поставщика | ✅ Реализовано | -| Брак | `Product` (type: DEFECT) | Производная от товара с дефектами | 🔄 В разработке | -| Расходники | `Product` (type: CONSUMABLE) | Материалы и вспомогательные товары | ✅ Реализовано | -| Продукт | `Product` (type: FINISHED_PRODUCT) | Готовый к продаже товар (производная от товара) | 🔄 В разработке | - -### 🏢 **ОРГАНИЗАЦИИ И РОЛИ** - -| Сущность | Название в системе | Описание | Статус | -| ---------- | ---------------------------------- | --------------------------------------- | -------------- | -| Поставщик | `Organization` (type: WHOLESALE) | Создает товары и расходники | ✅ Реализовано | -| Селлер | `Organization` (type: SELLER) | Заказывает товары, управляет поставками | ✅ Реализовано | -| Фулфилмент | `Organization` (type: FULFILLMENT) | Принимает товары, создает продукты | ✅ Реализовано | -| Логистика | `Organization` (type: LOGIST) | Управляет доставками | ✅ Реализовано | - -### 📋 **ПОСТАВКИ И ЗАКАЗЫ** - -| Сущность | Название в системе | Описание | Статус | -| ---------------------------- | ------------------------ | ----------------------------------------------- | --------------- | -| Заказ поставки | `SupplyOrder` | Основная сущность заказа от селлера/фулфилмента | ✅ Реализовано | -| Поставка расходников селлера | `SellerConsumableSupply` | Поставка расходников селлера на фулфилмент | 🔄 В разработке | -| Поставка WB | `WildberriesSupply` | Поставка через карточки Wildberries | ✅ Реализовано | -| Карточка поставки WB | `WildberriesSupplyCard` | Элемент поставки WB | ✅ Реализовано | -| Позиция заказа | `SupplyOrderItem` | Товар в заказе поставки | ✅ Реализовано | - -### 🛒 **ТОРГОВЫЕ ОПЕРАЦИИ** - -| Сущность | Название в системе | Описание | Статус | -| --------------- | ------------------ | --------------------------------- | -------------- | -| Корзина | `Cart` | Корзина для товаров перед заказом | ✅ Реализовано | -| Позиция корзины | `CartItem` | Товар в корзине | ✅ Реализовано | -| Избранное | `Favorites` | Избранные товары пользователя | ✅ Реализовано | - -### 📊 **АНАЛИТИКА И ОТЧЕТЫ** - -| Сущность | Название в системе | Описание | Статус | -| --------------------- | ---------------------- | ----------------------------- | -------------- | -| Аналитика фулфилмента | `FulfillmentAnalytics` | Статистика складских операций | ✅ Реализовано | -| Логистические тарифы | `LogisticsTariffs` | Расчет стоимости доставки | ✅ Реализовано | - -### 🏷️ **СПРАВОЧНИКИ** - -| Сущность | Название в системе | Описание | Статус | -| --------------------- | ------------------ | ---------------------------------------- | -------------- | -| Категория | `Category` | Категория товаров (28 предустановленных) | ✅ Реализовано | -| Поставщик расходников | `SupplySupplier` | Поставщик в разделе расходников | ✅ Реализовано | - -### 💬 **КОММУНИКАЦИИ** - -| Сущность | Название в системе | Описание | Статус | -| --------- | ------------------ | --------------------------------------- | -------------- | -| Сообщение | `Message` | Уведомления через встроенный мессенджер | ✅ Реализовано | - -### 🔄 **ПРОЦЕССЫ** - -| Сущность | Название в системе | Описание | Статус | -| ----------------- | ------------------------ | ------------------------------------- | --------------- | -| Создание продукта | `ProductCreationProcess` | Workflow превращения товара в продукт | 🔄 В разработке | -| Движение товаров | `InventoryMovement` | Учет прихода/расхода товаров | 🔄 В разработке | - ---- - -## ЧАСТЬ I: АРХИТЕКТУРА СИСТЕМЫ - -## 0. 🏠 Кабинет селлера / раздел "Мои поставки" - -### 0.1 Структура раздела "Мои поставки" - -**Раздел делится на два основных направления:** - -#### **🏢 ПОСТАВКИ НА ФУЛФИЛМЕНТ** - -- **Товар** - поставка товаров для создания продуктов - - **Карточки** - поставка через WB API с рецептурой - - **Поставщики** - заказ товаров у поставщиков с рецептурой -- **Расходники селлера** - поставка материалов для товаров селлера - -#### **🛒 ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ** _(планируется)_ - -- **Wildberries** - прямые поставки на WB -- **Ozon** - прямые поставки на Ozon - -### 0.2 Создание поставки расходников селлера - -#### **📄 Структура страницы создания поставки:** - -**БЛОК 1: ПОСТАВЩИКИ** _(верхняя часть экрана)_ - -- **Отображение**: Карточки поставщиков из раздела "Партнеры" -- **Навигация**: Горизонтальный скролл (слева-направо) при превышении ширины экрана -- **Выбор**: Клик выделяет карточку поставщика -- **Результат**: Загружаются расходники выбранного поставщика в блок 2 - -**БЛОК 2: РАСХОДНИКИ** _(центральная часть)_ - -- **Содержание**: Расходники выбранного поставщика -- **Сортировка**: По цене, названию, категории -- **Фильтры**: По категории, ценовому диапазону -- **Карточка расходника**: - - Фото, название, цена, остаток, категория - - Количество в комплекте (если есть комплектность) - - Поле ввода количества (единицы или комплекты) - - Кнопки +/- для изменения количества -- **Действие**: Клик добавляет расходник в корзину - -**БЛОК 3: КОРЗИНА** _(правая часть)_ - -- **Содержание корзины**: - - Количество видов расходников - - По каждому расходнику: название, количество, цена за единицу, сумма - - Общая сумма всех расходников -- **Управление**: Изменение количества, удаление позиций -- **Валидация**: Проверка остатков у поставщика -- **Настройки поставки**: - - Выбор фулфилмент-центра (dropdown из партнеров) - - Дата поставки (по умолчанию - дата создания, нельзя выбрать прошедшую) -- **Кнопка**: "Создать поставку" - -#### **📊 Отображение созданных поставок** - -**МНОГОУРОВНЕВАЯ ТАБЛИЦА:** - -**Первый уровень** _(основной список)_: - -- Порядковый номер поставки (от большего к меньшему) -- Количество видов расходников селлера -- Стоимость всей поставки -- Количество категорий -- Статус поставки - -**Второй уровень** _(раскрывается по клику)_: - -- Название расходника селлера -- Количество -- Цена -- Категория -- Поставщик -- **Режим**: Только просмотр (редактирование недоступно) - -### 0.3 Workflow поставки расходников селлера - -#### **🔄 Детальный процесс:** - -**ЭТАП 1: СОЗДАНИЕ СЕЛЛЕРОМ** - -1. Селлер создает поставку в своем кабинете -2. Поставка появляется в списке со статусом **"В работе"** - -**ЭТАП 2: ОБРАБОТКА ПОСТАВЩИКОМ** 3. Поставщик получает уведомление о заказе 4. Поставщик вносит данные о количестве грузовых мест и объеме 5. Поставщик подтверждает поставку 6. Статус у селлера меняется на **"Одобрена"** - -**ЭТАП 3: ПЕРЕДАЧА В ФУЛФИЛМЕНТ** 7. Данные о поставке появляются в кабинете фулфилмента: - -- Раздел: "Входящие поставки" / "Расходники селлеров" - -8. Менеджер фулфилмента: - - Назначает ответственного (из списка сотрудников) - - Выбирает тип логистики (из списка логистов в партнерах) - - Нажимает кнопку "В работу" - -**ЭТАП 4: ЛОГИСТИЧЕСКОЕ ПОДТВЕРЖДЕНИЕ** 9. В кабинете логистики появляется уведомление о поставке (раздел "Заявки") 10. Логист нажимает кнопку "Одобрить" 11. Статус у всех участников меняется на **"Ожидает отгрузки"** - -**ЭТАП 5: ОТГРУЗКА** 12. Логист приезжает к поставщику за расходниками 13. Поставщик отгружает товар логисту 14. Поставщик нажимает кнопку "Отправлено" 15. Статус у всех участников меняется на **"В пути"** - -**ЭТАП 6: ДОСТАВКА И ПРИЕМКА** 16. Расходники доставляются на склад фулфилмента 17. Менеджер фулфилмента: - Вносит данные о месте хранения расходников - Нажимает кнопку "Принято" 18. **Финальные статусы**: - У селлера, поставщика, логиста: **"Доставлена"** - У фулфилмента: **"Принято"** - -#### **📋 Статусы поставки расходников селлера:** - -1. **В работе** - создана селлером, ожидает обработки поставщиком -2. **Одобрена** - подтверждена поставщиком, передана в фулфилмент -3. **Ожидает отгрузки** - логистика подтверждена, ожидается забор -4. **В пути** - отгружена поставщиком, доставляется на фулфилмент -5. **Доставлена/Принято** - получена и оприходована на складе фулфилмента - ---- - -## 1. 📦 Кабинет поставщика / раздел склад - -### 1.1 Основные возможности - -**СТРУКТУРА СИСТЕМЫ ПО КАБИНЕТАМ:** - -**🏢 КАБИНЕТ ПОСТАВЩИКА** - создает и управляет: - -1. **ТОВАР** - базовый тип товара от поставщика -2. **РАСХОДНИКИ** - материалы и вспомогательные товары от поставщика - -**🏭 КАБИНЕТ ФУЛФИЛМЕНТА** - принимает, обрабатывает и управляет всеми типами: - -1. **ТОВАР** - базовые товары от поставщиков (принятые на склад) -2. **БРАК** - производная от товара (товар с дефектами) -3. **ПРОДУКТ** - производная от товара (готовый к продаже товар) -4. **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента -5. **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров - -**ВАЖНО**: Товар ≠ Продукт (это разные сущности в системе) - -**ЛОГИКА КЛАССИФИКАЦИИ РАСХОДНИКОВ:** - -- Поставщик создает карточки типа **"РАСХОДНИКИ"** (без уточнения назначения) -- При заказе, в зависимости от заказчика, они классифицируются как: - - **"Расходники фулфилмента"** - если заказывает фулфилмент-центр - - **"Расходники селлеров"** - если заказывает селлер - -Разделение всех типов предметов на категории. Каждый тип имеет свою логику обработки и workflow. - -## 2. 🛠️ Создание и управление карточками - -### 2.1 Базовые параметры карточки - -Карточка создаётся с помощью заполнения формы, параметры для заполнения: - -- **Фото** - система загрузки и управления изображениями товаров (множественная загрузка, выбор главного изображения, предпросмотр) -- **Название** -- **Автоматическая генерация системой уникального номера** для конкретного предмета (артикул СФ) -- **Возможность написать описание** -- **Количество предметов** в единицах -- **Количество комплектов** если продаётся комплектом (количество предметов в комплекте, размеры или иное) -- **Категория** (28 предустановленных универсальных категорий + специализированные категории расходников) -- **Бренд** -- **Цвет** -- **Размер / объём** -- **Вес** -- **Габариты** -- **Материал** -- **Цена за единицу** -- **Цена за комплект** -- **Заказано** -- **В пути** -- **Остаток** -- **Продано** - -### 2.2 Дополнительные параметры (реализованы в коде) - -- **Статус активности** (`isActive`) - возможность деактивировать предметы - - Неактивные предметы не отображаются в маркете - - Неактивные предметы не доступны для заказа -- **Тип предмета** - строгое разделение на 4 основных типа -- **Связь с родительским предметом** - для производных типов (брак, продукт) -- **Подтип расходников** - фулфилмента или селлеров -- **Дата создания и обновления** - автоматическое отслеживание -- **Уникальность артикула** - в рамках организации с префиксом типа - -## 3. 🔧 Управление, хранение, учёт, статус - -### 3.1 Основные функции - -- **Возможность редактирования и удаления карточек** -- **Изменение количества в карточке** - данные актуализируются во всей системе -- **При заказе карточки** - отображаются данные о количестве заказанного, в пути, остаток, и продано - -### 3.2 Система проверок и валидации (реализовано в коде) - -- **Проверка остатков** при добавлении в корзину -- **Валидация данных** при создании/редактировании карточек -- **Проверка уникальности артикула** в рамках организации -- **Контроль доступа** - нельзя добавлять собственные товары в корзину - -### 3.3 Система корзины и избранного (реализовано в коде) - -- **Корзина товаров** - добавление товаров с проверкой остатков -- **Избранные товары** - система избранного для удобства -- **Управление количеством** в корзине -- **Автоматическая проверка доступности** товаров - -## 4. 📊 Статистика и аналитика - -### 4.1 Блок статистики в верхней части раздела склад - -Должен состоять из блоков и отображать итоговые сведения о параметрах в данном разделе с разделением по типам предметов: - -**Общая статистика:** - -- **Общие остатки всех предметов** -- **Количество заказанных позиций** -- **Предметы в пути** -- **Проданные предметы** -- **Уведомления о низких остатках** - -**Разделение по типам и кабинетам:** - -**В КАБИНЕТЕ ПОСТАВЩИКА:** - -- **ТОВАРЫ**: Базовые товары поставщика -- **РАСХОДНИКИ**: Материалы и вспомогательные товары от поставщика - - Классифицируются при заказе в зависимости от заказчика - - Общая статистика по всем расходникам - -**В КАБИНЕТЕ ФУЛФИЛМЕНТА:** - -- **ТОВАРЫ**: Базовые товары от поставщиков (принятые на склад) -- **ПРОДУКТЫ**: Готовая продукция (созданная из товаров) -- **БРАК**: Статистика потерь и списаний -- **РАСХОДНИКИ ФУЛФИЛМЕНТА**: Операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ**: Материалы для товаров селлеров - -### 4.2 Развитая система аналитики (реализовано в коде) - -- **Статистика изменений за период** (сутки, неделя, месяц) -- **Аналитика по категориям товаров** -- **Метрики оборачиваемости** -- **Отчеты по поставщикам** -- **Анализ популярных товаров** - -## 5. 🎛️ Интерфейс и управление - -### 5.1 Режимы отображения - -- **Возможность переключения режимов** расположения информации (строчная и карточная) -- **5 карточек в ряд** в карточном режиме -- **Возможность фильтрации и сортировки** данных -- **Поиск** по названию, артикулу, категории, бренду - -### 5.2 Система уведомлений - -- **Подсвечивать когда остатки становятся меньше определенного уровня** -- **Автоматические уведомления** о новых заказах в мессенджер (реализовано в коде) -- **Уведомления об изменении статусов** поставок - ---- - -## ЧАСТЬ II: ИНТЕГРАЦИИ И СВЯЗИ - -## 6. 🌐 Интеграция с системой - -### 6.1 Глобальная интеграция - -- **Учет и хранение** - данные карточки товаров и расходников отображаются в глобальной сущности «Маркет» во вкладках «Товар» и «Расходники» соответственно - -### 6.2 Интеграция с маркетплейсами (реализовано в коде) - -- **Wildberries API** - загрузка карточек товаров из WB -- **Синхронизация данных** с маркетплейсами -- **Создание поставок** на основе WB карточек -- **Управление API ключами** с проверкой активности - -### 6.3 Интеграция с модулем "Услуги" - -- **Расходники фулфилмента в услугах**: - - - Селлеры могут использовать расходники фулфилмента в разделе "Услуги / Расходники" - - Для создания продукта из базового товара - - Расходники списываются с остатков фулфилмента - - Стоимость включается в стоимость услуги фулфилмента - -- **Процесс создания продукта через услуги**: - 1. Селлер выбирает услугу "Создание продукта" - 2. Указывает базовый товар для обработки - 3. Выбирает необходимые расходники фулфилмента - 4. Фулфилмент обрабатывает заказ - 5. Создается готовый продукт с использованием расходников - -## 7. 🚚 Workflow поставок - ДЕТАЛИЗИРОВАННАЯ СИСТЕМА СТАТУСОВ - -### 7.1 Сценарий поставки - -Один из сценариев: селлер в своём кабинете, в разделе «Маркет» заказывает товар и расходники у поставщика, для селлера это поставка, для поставщика это заявка на поставку. - -### 7.2 Детализированная система статусов (8 статусов - реализовано в коде) - -#### 7.2.1 Статусы SupplyOrder (Заказ поставки): - -1. **PENDING** - Ожидает подтверждения поставщиком -2. **SUPPLIER_APPROVED** - Одобрено поставщиком -3. **CONFIRMED** - Подтвержден (готов к обработке) -4. **LOGISTICS_CONFIRMED** - Подтверждено логистикой -5. **SHIPPED** - Отгружено поставщиком -6. **IN_TRANSIT** - В пути (логистика доставляет) -7. **DELIVERED** - Доставлен на фулфилмент -8. **CANCELLED** - Отменен - -#### 7.2.2 Статусы Supply (Расходники): - -1. **planned** - Запланировано (ожидает одобрения поставщиком) -2. **confirmed** - Подтверждено (ожидает отгрузки после одобрения логистикой) -3. **in-transit** - В пути (товар отгружен логистической компании) -4. **in-stock** - На складе (товар принят на фулфилменте) - -### 7.3 Пошаговый процесс с уведомлениями - -#### 7.3.1 Этап 1: Создание заказа - -1. **Селлер заказывает** товар/расходники у поставщика -2. **Система создает** SupplyOrder со статусом `PENDING` -3. **Автоматическое уведомление** поставщику в мессенджер о новом заказе - -#### 7.3.2 Этап 2: Обработка поставщиком - -4. **Поставщику приходит оповещение** в разделе заявки -5. **Поставщик нажимает кнопку «Одобрить»** -6. **Статус меняется** на `SUPPLIER_APPROVED` -7. **У селлера статус** меняется на «Одобрено поставщиком» - -#### 7.3.3 Этап 3: Передача в фулфилмент - -8. **Поставка отображается** в кабинете фулфилмент в разделе «Поставки» / подраздел «поставки на фулфилмент» / новые -9. **Фулфилмент выбирает** ответственного за поставку и тип логистики -10. **Фулфилмент нажимает** кнопку «Приёмка» -11. **Статус меняется** на `CONFIRMED` - -#### 7.3.4 Этап 4: Логистическое подтверждение - -12. **Логистика подтверждает** возможность доставки -13. **Статус меняется** на `LOGISTICS_CONFIRMED` -14. **У селлера статус** «Ожидает отгрузки» -15. **У поставщика статус** «Ожидает отгрузки» - -#### 7.3.5 Этап 5: Отгрузка - -16. **Логистика приезжает** за товаром -17. **Поставщик отгружает** товар -18. **Поставщик нажимает** кнопку «Отгружено» -19. **Статус меняется** на `SHIPPED`, затем `IN_TRANSIT` -20. **У селлера статус** «В пути» -21. **У фулфилмента статус** «В пути» - -#### 7.3.6 Этап 6: Доставка и приемка - -22. **Логистика доставляет** товар на фулфилмент-центр -23. **В кабинете логистики** нажимают кнопку «Доставлено» -24. **В кабинете фулфилмента** вводят данные места хранения -25. **Фулфилмент нажимает** кнопку «Принято» -26. **Статус меняется** на `DELIVERED` -27. **Поставка перемещается** в «Поставки» / подраздел «поставки на фулфилмент» / принято со статусом «принято» - -## 8. 🔐 Система ролей и доступов (реализовано в коде) - -### 8.1 Контроль доступа к заказам - -- **Создатель заказа** - полный доступ к своим заказам -- **Поставщик** - доступ к заказам, где он является поставщиком -- **Фулфилмент-центр** - доступ к заказам, направленным в его центр -- **Логистическая компания** - доступ к заказам для доставки - -### 8.2 Разграничение функций по ролям - -- **WHOLESALE** (Поставщик) - создание товаров, управление складом, обработка заказов -- **SELLER** (Селлер) - заказ товаров, управление поставками -- **FULFILLMENT** (Фулфилмент) - приемка товаров, управление складом -- **LOGIST** (Логистика) - управление доставками - -## 9. 💰 Система тарификации логистики (реализовано в коде) - -### 9.1 Расчет стоимости доставки - -- **Тариф до 1м³** - базовая стоимость для малых грузов -- **Тариф свыше 1м³** - стоимость для крупных грузов -- **Маршруты доставки** - от точки отправления до точки назначения -- **Описание услуг** - дополнительные условия доставки - -### 9.2 Параметры логистики - -```typescript -model Logistics { - fromLocation: String // Откуда - toLocation: String // Куда - priceUnder1m3: Float // Цена до 1м³ - priceOver1m3: Float // Цена свыше 1м³ - description: String? // Описание услуг -} -``` - ---- - -## ЧАСТЬ III: МОДУЛИ СИСТЕМЫ - -## 10. 📈 Дополнительные возможности системы - -### 10.1 Система категорий (28 предустановленных) - -- Одежда и обувь -- Косметика и парфюмерия -- Дом и сад -- Детские товары -- Спорт и отдых -- Электроника -- Книги -- Здоровье -- Автотовары -- Строительство и ремонт -- Продукты питания -- Зоотовары -- Дача, сад и огород -- Канцелярские товары -- Хобби и творчество -- Украшения и аксессуары -- Сумки и чемоданы -- Техника для дома -- Музыкальные инструменты -- Игры и игрушки -- И другие... - -### 10.1.1 Специализированные категории расходников - -**В дополнение к универсальным категориям, для расходников используются:** - -- **Упаковка и защита** - коробки, пакеты, пленка, защитные материалы -- **Маркировка и идентификация** - этикетки, бирки, стикеры, штампы -- **Крепеж и соединение** - скотч, клей, стяжки, веревки -- **Документооборот и вкладыши** - накладные, инструкции, буклеты -- **Гигиена и безопасность** - перчатки, маски, антисептики -- **Инструменты и приспособления** - ножи, дозаторы, весы -- **Брендинг и дизайн** - фирменная упаковка с логотипом -- **Специализированные материалы** - антистатические, влагопоглотители -- **Торговое оборудование** - манекены, ценникодержатели -- **Логистика и складирование** - паллеты, контейнеры -- **Технические расходники** - картриджи, батарейки -- **Сезонные и праздничные** - новогодняя упаковка, подарочные материалы - -### 10.2 Система уведомлений через мессенджер - -- **Автоматические уведомления** о новых заказах -- **Уведомления об изменении статусов** -- **Персонализированные сообщения** с деталями заказа -- **Интеграция с общим мессенджером** системы - -### 10.3 Предложения по улучшению - -- **Автогенерация артикулов СФ с префиксами типов** - требует реализации -- **Система комплектов товаров** - требует реализации -- ✅ **Workflow для создания брака и продуктов** - детально описан -- ✅ **Разделение расходников на подтипы** - реализовано -- ✅ **Связи между товарами и производными типами** - реализовано -- **Умные уведомления о низких остатках** - требует улучшения -- **Расширенные фильтры по типам предметов** - требует улучшения -- **Система прогнозирования спроса** - новая функция - -### 10.4 Сложные сценарии (требуют дальнейшей проработки) - -**ЗАМЕТКА**: Данные сценарии выявлены, но пока не учитываются в текущей системе. Требуют отдельного обсуждения: - -- **Из разных товаров → один продукт**: - - - Пример: Товар "Футболка" + Товар "Джинсы" = Продукт "Комплект одежды" - - Требует разработки системы "составных продуктов" - -- **Из одного товара → несколько продуктов**: - - Пример: Товар "Ткань 10 метров" → Продукт "Платье" (3м) + Продукт "Юбка" (2м) + остаток 5м - - Требует системы "деления товаров" и учета остатков - -## 11. 🔄 Интеграция с другими модулями - -### 11.1 Связь с модулем "Маркет" - -- Товары поставщиков отображаются в глобальном маркете -- Фильтрация по типам: товары/расходники -- Система поиска и категоризации - -### 11.2 Связь с модулем "Поставки" - -- Автоматическое создание поставок при заказе -- Отслеживание статусов в реальном времени -- Синхронизация данных между модулями - -### 11.3 Связь с модулем "Аналитика" - -- Передача данных для общей отчетности -- Метрики эффективности поставщиков -- Анализ популярности товаров - ---- - -## ЧАСТЬ IV: РАЗВИТИЕ И ПЛАНЫ - -## 12. 🏢 СИСТЕМА СКЛАДА ФУЛФИЛМЕНТА - -### 12.1 Структура раздела склад фулфилмента - -#### 12.1.1 Блок статистика склада - -**Модули в обязательной последовательности:** - -1. **📦 ПРОДУКТ** - готовые к продаже товары - - - Товары, прошедшие обработку и готовые к отгрузке - - Показывает текущее количество готовой продукции - -2. **🛒 ТОВАР** - базовые товары от поставщиков - - - Сырье и материалы для производства продуктов - - Товары в первоначальном виде от поставщиков - -3. **❌ БРАК** - товары с дефектами - - - Товары, не прошедшие контроль качества - - Списанные и подлежащие утилизации предметы - -4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары - - - Товары, возвращенные покупателями - - Требуют проверки и переклассификации - -5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров - - - Упаковочные материалы для товаров селлеров - - Заказываются селлерами напрямую - -6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТ** - операционные материалы - - **КЛИКАБЕЛЬНЫЙ МОДУЛЬ** - содержит полноценный раздел учёта - - Материалы для внутренних операций фулфилмента - - Используются для услуг селлерам - -**ВАЖНО**: В модуле ТОВАР отображаются два счетчика: - -- **Товары "на складе"** - готовы к обработке -- **Товары "в обработке"** - находятся в процессе создания продукта - -#### 12.1.2 Система учёта движения товаров - -**Основные принципы учёта:** - -- **ПРИХОД ТОВАРОВ**: Через принятые поставки (статус "в пути" → "на складе") -- **РАСХОД ТОВАРОВ**: При отгрузке, списании, использовании для услуг -- **ДВОЙНОЙ УЧЁТ**: Основные значения + дополнительные значения - -**Дополнительные значения (показатели движения):** - -- **ПРИБЫЛО** - количество предметов, поступивших на склад за период -- **УБЫЛО** - количество предметов, списанных со склада за период -- **ВЛИЯНИЕ** - от этих значений зависят основные значения - -**Основные значения (текущие остатки):** - -- **ФОРМУЛА**: Основные значения = Предыдущие остатки + Прибыло - Убыло -- **ОТОБРАЖЕНИЕ**: Показываются в каждом модуле статистики -- **АКТУАЛЬНОСТЬ**: Обновляются в реальном времени - -#### 12.1.3 Детальный раздел "Расходники фулфилмента" - -**Особенности:** - -- **ИНТЕРАКТИВНОСТЬ**: Кликабельный модуль в статистике -- **ПЕРЕХОД**: К полноценному разделу управления расходниками фулфилмента -- **ФУНКЦИОНАЛЬНОСТЬ**: - - Создание и редактирование карточек расходников фулфилмента - - Управление остатками и заказами расходников фулфилмента - - Отслеживание использования расходников фулфилмента в услугах - - Аналитика расхода расходников фулфилмента по операциям - -#### 12.1.4 Блок детализация по Магазинам - -**Назначение**: Распределение товаров по торговым точкам - -- **ОСТАТКИ ПО МАГАЗИНАМ**: Отображение количества товаров в каждом магазине -- **УПРАВЛЕНИЕ РАСПРЕДЕЛЕНИЕМ**: Перемещение товаров между точками -- **КОНТРОЛЬ ДВИЖЕНИЯ**: Отслеживание перемещений между складами и магазинами - -### 12.2 Workflow движения товаров в фулфилменте - -#### 12.2.1 Поступление товаров на склад - -**Источники поступления:** - -1. **ПОСТАВКИ ОТ ПОСТАВЩИКОВ** - основной канал поступления -2. **ВОЗВРАТЫ С ПВЗ** - товары от покупателей -3. **ВНУТРЕННИЕ ПЕРЕМЕЩЕНИЯ** - между складами фулфилмента - -**Процесс приёмки:** - -1. Поставка переходит в статус "принято" -2. Товары меняют статус: "в пути" → "на складе" -3. Обновляются основные значения (остатки) -4. Фиксируется в дополнительных значениях как "прибыло" -5. Обновляется статистика по модулям - -#### 12.2.2 Расход товаров со склада - -**Причины расхода:** - -- **ОТГРУЗКА СЕЛЛЕРАМ** - выполнение заказов -- **СПИСАНИЕ** - брак, утрата, утилизация -- **ИСПОЛЬЗОВАНИЕ В УСЛУГАХ** - расходники для создания продуктов -- **ПРЕВРАЩЕНИЕ В ПРОДУКТЫ** - товары становятся продуктами -- **ВОЗВРАТ ПОСТАВЩИКУ** - некачественные товары - -**Процесс списания:** - -1. Указание причины расхода -2. Обновление основных значений (уменьшение остатков) -3. Фиксация в дополнительных значениях как "убыло" -4. Обновление статистики модулей - -#### 12.2.3 Процесс "Создания продукта" - -**Полный цикл превращения товара в продукт:** - -**ЭТАП 1: ПОСТУПЛЕНИЕ И СОРТИРОВКА** - -1. Товар поступает на склад фулфилмента (статус "на складе") -2. Перебор и сортировка товара -3. Выявление и отсеивание брака - -**ЭТАП 2: ПОДГОТОВКА К РАБОТЕ** 4. Поставка попадает в раздел "Создание продукта" / Новые 5. Менеджер фулфилмента: - -- Устанавливает дедлайн выполнения -- Назначает ответственного исполнителя -- Указывает место хранения готовых продуктов (опционально) -- Нажимает "В работе" - -**ЭТАП 3: ОБРАБОТКА (СОЗДАНИЕ ПРОДУКТА)** 6. Поставка переходит в "Создание продукта" / В работе 7. Товары получают статус "в работе" 8. Исполнитель работает по "рецептуре" селлера: - -- Применяет услуги фулфилмента (например, "погладить") -- Использует расходники селлера (например, фирменный пакет) -- Использует расходники фулфилмента (например, короб + маркировка) - -**ЭТАП 4: УЧЕТ ПЛАН/ФАКТ** 9. В процессе работы фиксируется: - -- **ПЛАН**: Количество из поставки селлера -- **ФАКТ**: Реальное количество = Брак + Хороший товар -- **ДЕТАЛИЗАЦИЯ**: По каждому размеру/объему - -10. Статистика корректируется на фактические данные - -**ЭТАП 5: ЗАВЕРШЕНИЕ** 11. Исполнитель нажимает "Выполнено" 12. Товары становятся продуктами со статусом "готов к отправке" 13. Поставка переходит в "Создание продукта" / Выполнено - -**РЕЗУЛЬТАТ**: ПРОДУКТ = Товар + Услуга + Расходники - -**РЕЦЕПТУРА ПРОДУКТА (задается селлером):** - -- **БАЗОВЫЙ ТОВАР**: Исходный материал -- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг фулфилмента -- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (опционально) -- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (опционально) -- **СВЯЗЬ С MP**: Связь с карточкой маркетплейса (опционально) - -### 12.3 Интеграция с системой поставщиков - -**Связь систем складов:** - -- **ПОСТАВЩИК → ФУЛФИЛМЕНТ**: Передача товаров через поставки -- **СИНХРОНИЗАЦИЯ ДАННЫХ**: Остатки, статусы, движение товаров -- **УВЕДОМЛЕНИЯ**: О принятии поставок и изменении статусов - -## 13. 📋 РЕКОМЕНДАЦИИ ПО ДОПОЛНЕНИЮ И УЛУЧШЕНИЮ - -### 13.1 Дополнить в описании - -- ✅ **Система активации/деактивации товаров** - добавлено -- ✅ **Функционал корзины и избранного** - добавлено -- ✅ **Интеграция с маркетплейсами (WB)** - добавлено -- ✅ **Автоматические уведомления** - добавлено -- ✅ **Система тарификации логистики** - добавлено -- ✅ **Управление изображениями товаров** - добавлено -- ✅ **Проверки остатков и валидация** - добавлено - -### 13.2 Расширить workflow - -- ✅ **Промежуточные статусы** (`SUPPLIER_APPROVED`, `LOGISTICS_CONFIRMED`, `SHIPPED`) - добавлено -- ✅ **Роли и права доступа** - добавлено -- ✅ **Автоматические уведомления на каждом этапе** - добавлено - -### 13.3 Дополнить систему статистики - -- ✅ **Метрики изменений за период** - добавлено -- ✅ **Аналитика по категориям** - добавлено -- ✅ **Отчеты по поставщикам** - добавлено - ---- - -_Документ создан на основе анализа существующего кода и требований пользователя_ -_Версия: 1.0_ -_Дата: 2024_ diff --git a/development-checklist.md b/development-checklist.md deleted file mode 100644 index b990da7..0000000 --- a/development-checklist.md +++ /dev/null @@ -1,223 +0,0 @@ -# ЧЕКЛИСТ РАЗРАБОТКИ - ОБЯЗАТЕЛЬНЫЕ ПРОВЕРКИ - -> ⚠️ **КРИТИЧЕСКИ ВАЖНО**: Этот чеклист ОБЯЗАТЕЛЕН к проверке перед любым изменением кода! - -## 🔤 ТЕРМИНЫ СИСТЕМЫ -> Для людей → `В коде` -- ТОВАР → `PRODUCT` -- РАСХОДНИКИ → `CONSUMABLE` -- БРАК → `DEFECT` *(планируется)* -- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* - -## 🔴 КРИТИЧЕСКИЕ ПРОВЕРКИ (НЕЛЬЗЯ НАРУШАТЬ) - -### ✅ Типизация предметов - -- [ ] Каждый предмет имеет один из типов: ТОВАР (`PRODUCT`), РАСХОДНИКИ (`CONSUMABLE`), БРАК и ПРОДУКТ (планируются) -- [ ] БРАК и ПРОДУКТ имеют обязательную связь с родительским товаром (parentId) -- [ ] Расходники создаются как универсальный тип, классифицируются при заказе -- [ ] ТОВАР ≠ ПРОДУКТ (разные сущности в системе) -- [ ] **В формах создания поставок товаров показываются ТОЛЬКО предметы типа ТОВАР** (`PRODUCT`) -- [ ] **В формах создания поставок расходников показываются ТОЛЬКО предметы типа РАСХОДНИКИ** (`CONSUMABLE`) -- [ ] **Фильтрация по типу предмета происходит на уровне GraphQL резолвера**, не на фронтенде - -### ✅ Workflow статусов - -- [ ] Соблюдена последовательность: PENDING → SUPPLIER_APPROVED → CONFIRMED → LOGISTICS_CONFIRMED → SHIPPED → IN_TRANSIT → DELIVERED -- [ ] Нет пропуска промежуточных статусов -- [ ] Каждое изменение статуса сопровождается уведомлением - -### ✅ Правила доступа - -- [ ] Поставщик НЕ может добавлять собственные товары в корзину -- [ ] Заказ брака ЗАПРЕЩЕН -- [ ] Только активные предметы отображаются в маркете -- [ ] Проверка остатков перед добавлением в корзину - -### ✅ Система фулфилмента - -- [ ] Товары разделены на "на складе" и "в обработке" -- [ ] Модули статистики в правильной последовательности: ПРОДУКТ → ТОВАР → БРАК → ВОЗВРАТЫ → РАСХОДНИКИ СЕЛЛЕРОВ → РАСХОДНИКИ ФУЛФИЛМЕНТА -- [ ] Процесс создания продукта включает учет план/факт - -### ✅ Система логистики - -- [ ] Своевременное подтверждение заявок на доставку -- [ ] Соблюдение workflow логистики: получение заявки → подтверждение → забор → доставка -- [ ] Корректная работа системы тарификации (до 1м³ и свыше 1м³) -- [ ] Обязательные уведомления о статусе доставки - -### ✅ Структура кабинетов - -- [ ] Каждый тип кабинета имеет страницу "Главная" (РЕАЛИЗОВАНО) -- [ ] Страница "Главная" первая в sidebar навигации (РЕАЛИЗОВАНО) -- [ ] Условное отображение разделов по типу организации: `{user?.organization?.type === "TYPE" && (...)}` -- [ ] Адаптивный роутинг для кнопок с разной логикой по типам кабинетов -- [ ] Роут `/home` с универсальным компонентом HomePageWrapper -- [ ] 4 типо-зависимых компонента: SellerHomePage, FulfillmentHomePage, WholesaleHomePage, LogistHomePage -- [ ] Проверки доступа и безопасности в каждом компоненте -- [ ] Каждый кабинет имеет раздел "Экономика" (РЕАЛИЗОВАНО В СИСТЕМЕ) -- [ ] Разделы "Экономика" размещены перед настройками в каждом кабинете (РЕАЛИЗОВАНО) -- [ ] Пустые разделы-заглушки с пометкой "будет добавлен позже" (РЕАЛИЗОВАНО) -- [ ] Роут `/economics` с универсальным компонентом EconomicsPageWrapper (РЕАЛИЗОВАНО) -- [ ] 4 типо-зависимых компонента экономики: SellerEconomicsPage, FulfillmentEconomicsPage, WholesaleEconomicsPage, LogistEconomicsPage (РЕАЛИЗОВАНО) -- [ ] Кнопка "Экономика" в sidebar навигации перед настройками (РЕАЛИЗОВАНО) -- [ ] Проверки доступа и безопасности в экономических компонентах (РЕАЛИЗОВАНО) - -### ✅ Обязательные поля - -- [ ] Название, артикул, цена > 0, тип предмета -- [ ] ИСКЛЮЧЕНИЕ: Цена брака может быть 0 для фулфилмента (себестоимость для селлера) -- [ ] Уникальность артикула в рамках организации -- [ ] Формат артикула: СФ-{ТИП}-{КОД*КАТЕГОРИИ}-{КОД*ОРГАНИЗАЦИИ}-{TIMESTAMP}-{RANDOM} -- [ ] Товар имеет минимум одно изображение (ПРИМЕР АВТОСИНХРОНИЗАЦИИ) - -## 🟡 ВАЖНЫЕ ПРОВЕРКИ - -### ✅ Валидация данных - -- [ ] Все числовые значения корректны (цена > 0, вес > 0) -- [ ] Количество в заказе не превышает остаток -- [ ] Проверка корректности дат (не прошедшие для поставок) -- [ ] Валидация количества: минимум 1 единица/комплект, максимум = остаток у поставщика -- [ ] Проверка в реальном времени при изменении количества - -### ✅ Уведомления - -- [ ] Автоматические уведомления при создании заказов -- [ ] Уведомления при изменении статусов всем участникам -- [ ] Логирование всех изменений - -### ✅ Интеграции - -- [ ] Синхронизация данных между модулями -- [ ] Корректная работа с API маркетплейсов -- [ ] Связь с модулем "Услуги" для расходников фулфилмента - -## 💻 ТЕХНИЧЕСКИЕ ПРОВЕРКИ - -### ✅ Пользовательский интерфейс - -- [ ] Адаптивность интерфейса для всех устройств -- [ ] Индикаторы загрузки для длительных операций -- [ ] Подтверждение критических действий -- [ ] Время загрузки страницы не более 3 секунд - -### ✅ Обработка ошибок - -- [ ] Логирование всех ошибок с детальной информацией -- [ ] Понятные сообщения об ошибках для пользователя -- [ ] Автоматическое восстановление после сбоев -- [ ] Регулярное резервное копирование данных - -### ✅ Производительность - -- [ ] Пагинация для больших списков товаров -- [ ] Ленивая загрузка изображений -- [ ] Кэширование часто запрашиваемых данных -- [ ] Готовность к масштабированию - -### ✅ Безопасность данных - -- [ ] Шифрование чувствительных данных -- [ ] Аудит всех действий пользователей -- [ ] Контроль доступа на уровне API -- [ ] Соответствие требованиям GDPR - -### ✅ Качество кода - -- [ ] Покрытие тестами критической функциональности (минимум 80%) -- [ ] Следование принципам SOLID -- [ ] Документирование всех API методов -- [ ] Автоматическое тестирование при развертывании - -### ✅ GraphQL и TypeScript - -- [ ] Имена полей в коде соответствуют GraphQL схеме (`myCounterparties`, не `getMyCounterparties`) -- [ ] Интерфейсы TypeScript соответствуют schema.prisma (`article`, не `sku`; `quantity`, не `stock`) -- [ ] При проблемах с GraphQL использовать `fetchPolicy: 'network-only'` для обхода кеша -- [ ] Добавлять логирование при отладке GraphQL запросов -- [ ] Проверка что резолверы вызываются (логи сервера) -- [ ] **Использовать специализированные запросы вместо общих** (`GET_ORGANIZATION_PRODUCTS` вместо `GET_ALL_PRODUCTS` для конкретного поставщика) -- [ ] **Обязательная фильтрация по типу предмета** в резолверах (`PRODUCT`/`CONSUMABLE`) -- [ ] **Параметр `organizationId` обязателен** для запросов товаров конкретной организации - -### ✅ Система партнерства - -- [ ] Поставщики в формах берутся только из партнеров с типом `WHOLESALE` -- [ ] Используется запрос `GET_MY_COUNTERPARTIES` с фильтрацией по типу -- [ ] НЕ используется `GET_SUPPLY_SUPPLIERS` для отображения поставщиков в формах -- [ ] Партнерство создается двумя способами: через заказ в маркете или через раздел "Партнеры" -- [ ] Двусторонние записи в таблице `Counterparty` при создании партнерства - -### ✅ Архитектурные принципы GraphQL - -- [ ] **Создавать специализированные резолверы** для каждого контекста использования -- [ ] **Использовать параметризованные запросы** (`organizationId`, `type`, `search`) вместо фильтрации на фронтенде -- [ ] **Добавлять подробное логирование** в резолверы для отладки (входные параметры, результаты фильтрации) -- [ ] **Типы запросов должны отражать бизнес-логику**: `organizationProducts` для товаров конкретной организации -- [ ] **Значения по умолчанию в резолверах** для критических параметров (`type: args.type || "PRODUCT"`) -- [ ] **Валидация обязательных параметров** на уровне схемы (`organizationId: ID!`) -- [ ] **Кеширование обходить при проблемах** через `fetchPolicy: 'network-only'` - -## 🟢 РЕКОМЕНДУЕМЫЕ ПРОВЕРКИ - -### ✅ Пользовательский опыт - -- [ ] Адаптивность интерфейса -- [ ] Индикаторы загрузки -- [ ] Понятные сообщения об ошибках - -### ✅ Производительность - -- [ ] Пагинация для больших списков -- [ ] Ленивая загрузка изображений -- [ ] Кэширование данных - -## ❌ АБСОЛЮТНО ЗАПРЕЩЕНО - -1. Удалять предметы с существующими заказами -2. Изменять статусы без уведомлений -3. Обходить проверки остатков -4. Давать доступ к чужим данным -5. Создавать брак/продукт без связи с родительским товаром -6. Создавать отдельные типы расходников -7. Разрешать заказ брака -8. Нарушать последовательность статусов -9. Игнорировать валидацию -10. Нарушать последовательность модулей в статистике фулфилмента -11. **Использовать неправильные имена полей GraphQL** (`getMyCounterparties` вместо `myCounterparties`) -12. **Использовать GET_SUPPLY_SUPPLIERS для отображения поставщиков в формах** (только партнеры WHOLESALE) -13. **Создавать интерфейсы TypeScript не соответствующие schema.prisma** (`sku`/`stock` вместо `article`/`quantity`) -14. **Использовать общие запросы вместо специализированных** (`GET_ALL_PRODUCTS` вместо `GET_ORGANIZATION_PRODUCTS` для конкретного поставщика) -15. **Показывать расходники в формах создания поставок товаров** (строгая типизация `PRODUCT`/`CONSUMABLE`) -16. **Фильтровать предметы по типу на фронтенде** (фильтрация должна быть в GraphQL резолвере) - ---- - -## 🤔 ПРАВИЛО УТОЧНЕНИЙ - -**КРИТИЧЕСКИ ВАЖНО**: Если я не уверен в выполнении задачи или вижу противоречия в правилах - ОБЯЗАТЕЛЬНО уточнить у пользователя! - -### ❓ КОГДА УТОЧНЯТЬ: - -- [ ] Недостаточно информации для правильного выполнения -- [ ] Вижу противоречия между правилами -- [ ] Задача может нарушить критические правила -- [ ] Неясно как применить правило в конкретной ситуации -- [ ] Есть сомнения в интерпретации требований - -### 📝 КАК УТОЧНЯТЬ: - -1. Четко сформулировать что именно неясно -2. Указать какие правила/требования конфликтуют -3. Предложить варианты решения если возможно -4. Запросить конкретные уточнения - -**❌ НИКОГДА не делать предположений если есть сомнения!** - ---- - -**ПРАВИЛО**: Перед каждым изменением кода проверить этот чеклист! -**ИСТОЧНИК ИСТИНЫ**: rules-unified.md (v4.0) -**СТАТУС**: ОБЯЗАТЕЛЬНЫЙ К ВЫПОЛНЕНИЮ diff --git a/fulfillment-cabinet-rules.md b/fulfillment-cabinet-rules.md deleted file mode 100644 index 01ecd5a..0000000 --- a/fulfillment-cabinet-rules.md +++ /dev/null @@ -1,482 +0,0 @@ -# ПРАВИЛА КАБИНЕТА ФУЛФИЛМЕНТА - -> 📋 **Файл создан на основе анализа системы** - детальные правила для кабинета фулфилмента - ---- - -## 📑 ОГЛАВЛЕНИЕ - -1. [🏭 Общие характеристики кабинета фулфилмента](#1--общие-характеристики-кабинета-фулфилмента) -2. [🗂️ Основные разделы кабинета](#2--основные-разделы-кабинета) -3. [🔒 Правила доступа фулфилмента](#3--правила-доступа-фулфилмента) -4. [📋 Критические правила для rules2.md](#4--критические-правила-для-rules2md) - ---- - -## 1. 🏭 ОБЩИЕ ХАРАКТЕРИСТИКИ КАБИНЕТА ФУЛФИЛМЕНТА - -### 1.1 Принципы доступа - -- **МАКСИМАЛЬНЫЕ ПРАВА**: Фулфилмент имеет доступ ко ВСЕМ разделам системы -- **АДАПТИВНАЯ НАВИГАЦИЯ**: Sidebar изменяется в зависимости от `user.organization.type === "FULFILLMENT"` -- **ЭКСКЛЮЗИВНЫЕ КОМПОНЕНТЫ**: Услуги, Сотрудники, Статистика фулфилмента доступны ТОЛЬКО фулфилменту -- **СПЕЦИАЛЬНЫЙ РОУТИНГ**: При нажатии "Поставки" → `/fulfillment-supplies` (не `/supplies`) - -### 1.2 Архитектурные особенности - -- **GraphQL проверки**: `skip: user?.organization?.type !== 'FULFILLMENT'` в запросах -- **Условное отображение**: `{user?.organization?.type === "FULFILLMENT" && (...)}` -- **Адаптивные отступы**: `getSidebarMargin()` для responsive design -- **Полинг данных**: Статистика обновляется каждую минуту (`pollInterval: 60000`) - ---- - -## 2. 🗂️ ОСНОВНЫЕ РАЗДЕЛЫ КАБИНЕТА - -### 2.1 🏠 Главная страница (`/dashboard`) - -**Компонент**: `DashboardHome` -**Содержание**: - -- Основная информация организации -- Статус онлайн пользователя -- Быстрый доступ к основным разделам - ---- - -### 2.2 🏭 Склад фулфилмента (`/fulfillment-warehouse`) - -**Компонент**: `FulfillmentWarehouseDashboard` - -#### 2.2.1 Структура склада по модулям (ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ) - -1. **📦 ПРОДУКТЫ** - готовые к отправке товары -2. **🛒 ТОВАРЫ** - базовые товары от поставщиков - - **"На складе"** - готовы к обработке - - **"В обработке"** - в процессе создания продукта -3. **❌ БРАК** - товары с дефектами, требуют утилизации -4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары, к обработке -5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров -6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы (КЛИКАБЕЛЬНЫЙ модуль) - -#### 2.2.2 Система учета склада - -**Дополнительные значения** (показатели движения): - -- **ПРИБЫЛО** - количество поступивших на склад за период -- **УБЫЛО** - количество списанных со склада за период - -**Основные значения** (текущие остатки): - -- **ФОРМУЛА**: Основные значения = Предыдущие остатки + Прибыло - Убыло -- **ОБНОВЛЕНИЕ**: В реальном времени с изменениями за сутки -- **ИСТОЧНИК**: GraphQL query `GET_FULFILLMENT_WAREHOUSE_STATS` - -#### 2.2.3 Структура данных склада (3-уровневая иерархия) - -``` -🔵 УРОВЕНЬ 1: МАГАЗИНЫ -├── ТехноМир (синий - blue-400/500) -├── Стиль и Комфорт (розовый - pink-400/500) -└── Зелёный Дом (изумрудный - emerald-400/500) - ↓ -🟢 УРОВЕНЬ 2: ТОВАРЫ (зеленый - green-500) - ↓ -🟠 УРОВЕНЬ 3: ВАРИАНТЫ ТОВАРОВ (оранжевый - orange-500) -``` - -**Цветовое кодирование**: - -- Каждый уровень имеет цветной индикатор увеличивающегося размера -- Цветная левая граница с увеличивающимся отступом и толщиной -- Скроллбары в цвете уровня -- Контрастный цвет текста для читаемости - -#### 2.2.4 Статистика склада - -**6 основных карточек статистики**: - -1. **Продукты** - готовые к отправке -2. **Товары** - в обработке -3. **Брак** - требует утилизации -4. **Возвраты с ПВЗ** - к обработке -5. **Расходники селлеров** - материалы клиентов -6. **Расходники фулфилмента** - операционные материалы - ---- - -### 2.3 📦 Поставки фулфилмента (`/fulfillment-supplies`) - -**Компонент**: `SuppliesDashboard` - -#### 2.3.1 Структура: 2 основные вкладки - -**A) 🛒 ПОСТАВКИ ТОВАРОВ**: - -- **Детализированные товары ФФ** - планы и факты поставок с маршрутами -- **Товары ФФ** - общие поставки товаров от селлеров -- **Возвраты с ПВЗ** - обработка возвращенных товаров - -**B) 🔧 ПОСТАВКИ РАСХОДНИКОВ**: - -- **Заказы расходников** - управление заказами от селлеров -- **Расходники селлеров** - материалы для клиентов -- **Создание поставок** - формирование новых поставок расходников - -#### 2.3.2 Workflow поставок товаров - -**Этапы обработки**: - -1. **Planned** - поставка запланирована -2. **In-transit** - товар в пути -3. **Delivered** - доставлен на склад -4. **Completed** - обработка завершена - -**Данные поставки**: - -- Номер поставки (ФФ-YYYY-XXX) -- Селлер (организация, магазин, менеджер) -- Количество позиций и грузовых мест -- Объем и стоимость поставки -- Ответственный сотрудник и логистика - ---- - -### 2.4 📊 Статистика фулфилмента (`/fulfillment-statistics`) - -**Компонент**: `FulfillmentStatisticsDashboard` - -#### 2.4.1 Блоки аналитики (сворачиваемые) - -**1. НАКОПЛЕННАЯ СТАТИСТИКА** (`allTime: true`): - -- Обработано товаров (общий объем) -- Выявлено брака (всего единиц) -- Поставок получено -- Общий доход (за все время) -- Выполнено заказов (успешных отгрузок) -- Удовлетворенность клиентов (средний рейтинг) - -**2. ОТГРУЗКА НА ПЛОЩАДКИ** (`marketplaces: true`): - -- Отправлено на Wildberries -- Отправлено на Ozon -- Отправлено на другие площадки - -**3. АНАЛИТИКА ПРОИЗВОДИТЕЛЬНОСТИ** (`performance: false`): - -- Среднее время обработки (на единицу товара) -- Уровень брака (от общего объема) -- Уровень возвратов (возвраты с площадок) -- Удовлетворенность клиентов - -**4. МЕТРИКИ СКЛАДА** (`warehouseMetrics: true`): - -- Эффективность склада -- Оборачиваемость товаров -- Коэффициент использования - -**5. УМНЫЕ РЕКОМЕНДАЦИИ** (`smartRecommendations: true`): - -- Автоматические советы по оптимизации -- Предложения по улучшению процессов - -**6. БЫСТРЫЕ ДЕЙСТВИЯ** (`quickActions: true`): - -- Часто используемые операции -- Горячие клавиши для действий - -#### 2.4.2 Ключевые показатели в заголовке - -- **Общий доход** (зеленый - success) -- **Качество** (синий - X/5.0 рейтинг) -- **Уровень брака** (процент от общего объема) - ---- - -### 2.5 🔧 Услуги (`/services`) - -**Компонент**: `ServicesDashboard` -**Условие доступа**: `user?.organization?.type === "FULFILLMENT"` - -#### 2.5.1 Структура: 3 обязательные вкладки - -**A) 🛠️ УСЛУГИ** (`defaultValue="services"`): - -- **CRUD операции**: создание, редактирование, удаление услуг -- **Управление ценами** и описаниями -- **Загрузка изображений** услуг (`imageUrl`) -- **GraphQL**: `GET_MY_SERVICES`, `CREATE_SERVICE`, `UPDATE_SERVICE`, `DELETE_SERVICE` - -**B) 🚚 ЛОГИСТИКА**: - -- **Создание маршрутов доставки** (откуда → куда) -- **Тарификация**: цена до 1м³ и свыше 1м³ -- **Группированные локации**: - - Мой фулфилмент (название организации) - - Рынки (предустановленные) - - Склады Wildberries - - Склады Ozon -- **GraphQL**: `GET_MY_LOGISTICS`, `CREATE_LOGISTICS`, `UPDATE_LOGISTICS`, `DELETE_LOGISTICS` - -**C) 📦 РАСХОДНИКИ**: - -- **Управление расходниками фулфилмента** -- **Интеграция с модулем "Услуги"** - селлеры могут использовать в услугах -- **Списание со складских остатков** при использовании -- **Стоимость включается** в стоимость услуги - -#### 2.5.2 Правила логистики - -**Создание маршрута**: - -- **Обязательные поля**: Название маршрута, Откуда, Куда -- **Ценообразование**: Цена до 1м³, Цена свыше 1м³ -- **Описание услуг**: Дополнительные условия доставки -- **Проверка**: Только организации типа FULFILLMENT могут создавать логистику - ---- - -### 2.6 👥 Сотрудники (`/employees`) - -**Компонент**: `EmployeesDashboard` -**Условие доступа**: `user?.organization?.type === "FULFILLMENT"` - -#### 2.6.1 Структура: 2 основные вкладки - -**A) 👥 СОТРУДНИКИ** (`defaultValue="combined"`): - -**Управление персоналом**: - -- **CRUD операции**: создание, редактирование, удаление сотрудников -- **Статусы сотрудников**: `ACTIVE`, `VACATION`, `SICK`, `FIRED` -- **Формы добавления**: Компактная (`showCompactForm`) / Полная форма -- **Поиск и фильтрация** по имени, должности, статусу - -**Табель рабочего времени**: - -- **Навигация по месяцам**: текущий год/месяц с кнопками ←/→ -- **Отметки по дням**: статус дня и количество отработанных часов -- **GraphQL**: `GET_EMPLOYEE_SCHEDULE`, `UPDATE_EMPLOYEE_SCHEDULE` -- **Данные**: `{date, hoursWorked, employee: {id}}` - -**B) 📋 ОТЧЕТЫ** (`value="reports"`): - -- **Сводные отчеты** по сотрудникам за период -- **Экспорт данных** табеля -- **Аналитика рабочего времени** - -#### 2.6.2 Интерфейс сотрудников - -**Обязательные поля сотрудника**: - -```typescript -interface Employee { - firstName: string; // Имя - lastName: string; // Фамилия - middleName?: string; // Отчество - position: string; // Должность - phone: string; // Телефон - email?: string; // Email - status: "ACTIVE" | "VACATION" | "SICK" | "FIRED"; - salary?: number; // Зарплата - hireDate: string; // Дата найма - // ... дополнительные поля -} -``` - -**Валидация данных**: - -- Имя/Фамилия: минимум 2 символа, только буквы/пробелы/дефисы -- Телефон: обязательный, формат +7 (999) 123-45-67 -- Email: валидация формата при заполнении -- Должность: минимум 2 символа - ---- - -### 2.7 🌐 Универсальные разделы - -#### 2.7.1 🛒 Маркет (`/market`) - -- Просмотр товаров всех поставщиков -- Создание заказов у поставщиков -- Управление корзиной и избранным - -#### 2.7.2 🤝 Партнеры (`/partners`) - -- Управление контрагентами всех типов -- Входящие/исходящие заявки на сотрудничество - -#### 2.7.3 💬 Мессенджер (`/messenger`) - -- Внутренняя связь между организациями -- Поддержка файлов, изображений, голосовых сообщений - -#### 2.7.4 ⚙️ Настройки (`/settings`) - -- Профиль организации и пользователя -- API ключи маркетплейсов (WB, Ozon) -- Банковские реквизиты - ---- - -## 3. 🔒 ПРАВИЛА ДОСТУПА ФУЛФИЛМЕНТА - -### 3.1 Эксклюзивный доступ (только фулфилмент) - -**TypeScript проверки**: - -```typescript -{user?.organization?.type === "FULFILLMENT" && ( - // Компоненты доступны только фулфилменту -)} -``` - -**Эксклюзивные разделы**: - -- **Услуги** (`/services`) - создание услуг, логистики, управление расходниками -- **Сотрудники** (`/employees`) - управление персоналом и табелем -- **Статистика фулфилмента** (`/fulfillment-statistics`) - детальная аналитика - -### 3.2 Специальная логика роутинга - -**При нажатии "Поставки" в sidebar**: - -```typescript -const handleSuppliesClick = () => { - switch (user?.organization?.type) { - case "FULFILLMENT": - router.push("/fulfillment-supplies"); // Специальный роут - break; - case "SELLER": - router.push("/supplies"); - break; - // ... другие типы - } -}; -``` - -### 3.3 GraphQL проверки доступа - -**В Apollo Client запросах**: - -```typescript -const { data } = useQuery(GET_MY_SERVICES, { - skip: user?.organization?.type !== "FULFILLMENT", // Пропуск для не-фулфилмента -}); -``` - -**В GraphQL резолверах**: - -```typescript -// Проверка типа организации на сервере -if (currentUser.organization.type !== "FULFILLMENT") { - throw new GraphQLError("Доступно только для фулфилмент центров"); -} -``` - ---- - -## 4. 📋 КРИТИЧЕСКИЕ ПРАВИЛА ДЛЯ RULES2.MD - -### 4.1 🔴 КРИТИЧЕСКИЕ ПРАВИЛА (обязательны к добавлению) - -#### **ПРАВИЛО FF-01: Структура склада фулфилмента** - -- **ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ** модулей: ПРОДУКТ→ТОВАР→БРАК→ВОЗВРАТЫ→РАСХОДНИКИ*СЕЛЛЕРОВ→РАСХОДНИКИ*ФУЛФИЛМЕНТА -- **ЗАПРЕЩЕНО**: Изменение порядка модулей -- **ОБЯЗАТЕЛЬНО**: Модуль "Расходники фулфилмента" должен быть кликабельным - -#### **ПРАВИЛО FF-02: Права доступа фулфилмента** - -- **ЭКСКЛЮЗИВНЫЙ ДОСТУП**: Услуги, Сотрудники, Статистика фулфилмента -- **ПРОВЕРКА**: `user?.organization?.type === "FULFILLMENT"` -- **GraphQL**: `skip: user?.organization?.type !== 'FULFILLMENT'` - -#### **ПРАВИЛО FF-03: Система учета склада** - -- **ДВОЙНОЙ УЧЕТ**: Основные значения + дополнительные значения -- **ФОРМУЛА**: Основные = Предыдущие остатки + Прибыло - Убыло -- **ОБНОВЛЕНИЕ**: Статистика в реальном времени с изменениями за сутки - -#### **ПРАВИЛО FF-04: Workflow создания продукта** - -- **ПРОЦЕСС**: Товары "на складе" → "в обработке" → ПРОДУКТ "готов к отправке" -- **ПЛАН/ФАКТ**: Корректировка статистики при выявлении расхождений -- **ОБЯЗАТЕЛЬНО**: Фиксация брака в процессе работы (вкладка "В работе") - -### 4.2 🟡 ВАЖНЫЕ ПРАВИЛА (рекомендуются к добавлению) - -#### **ПРАВИЛО FF-05: Модуль услуг фулфилмента** - -- **СТРУКТУРА**: 3 обязательные вкладки (Услуги, Логистика, Расходники) -- **ЛОГИСТИКА**: Создание маршрутов только фулфилментом -- **РАСХОДНИКИ**: Интеграция с модулем "Услуги", списание со склада - -#### **ПРАВИЛО FF-06: Управление сотрудниками** - -- **СТАТУСЫ**: 4 обязательных статуса (ACTIVE, VACATION, SICK, FIRED) -- **ТАБЕЛЬ**: Месячная навигация с отметками по дням -- **ВАЛИДАЦИЯ**: Строгие правила валидации полей сотрудника - -#### **ПРАВИЛО FF-07: Специальный роутинг** - -- **ПОСТАВКИ**: Фулфилмент → `/fulfillment-supplies` (не `/supplies`) -- **УСЛОВНОЕ ОТОБРАЖЕНИЕ**: Разные компоненты для разных типов организаций - -### 4.3 🟢 ПОЛЕЗНЫЕ ПРАВИЛА (опциональны) - -#### **ПРАВИЛО FF-08: UI/UX паттерны фулфилмента** - -- **ЦВЕТОВАЯ СХЕМА**: 3-уровневая иерархия с цветовым кодированием -- **СВОРАЧИВАЕМЫЕ БЛОКИ**: Статистика с состояниями `expandedSections` -- **АДАПТИВНОСТЬ**: `getSidebarMargin()` для responsive design - -#### **ПРАВИЛО FF-09: Статистика и аналитика** - -- **6 ОСНОВНЫХ БЛОКОВ**: Накопленная, Площадки, Производительность, Склад, Рекомендации, Действия -- **REAL-TIME**: Обновление каждую минуту (`pollInterval: 60000`) -- **КЛЮЧЕВЫЕ ПОКАЗАТЕЛИ**: Доход, Качество, Уровень брака в заголовке - ---- - -## 📎 ПРИЛОЖЕНИЯ - -### Приложение A: GraphQL запросы фулфилмента - -```typescript -// Основные запросы -GET_MY_SERVICES; // Услуги фулфилмента -GET_MY_LOGISTICS; // Логистические маршруты -GET_MY_EMPLOYEES; // Сотрудники организации -GET_FULFILLMENT_WAREHOUSE_STATS; // Статистика склада -GET_WAREHOUSE_PRODUCTS; // Товары на складе -GET_MY_FULFILLMENT_SUPPLIES; // Расходники фулфилмента - -// Мутации -CREATE_SERVICE, UPDATE_SERVICE, DELETE_SERVICE; -CREATE_LOGISTICS, UPDATE_LOGISTICS, DELETE_LOGISTICS; -CREATE_EMPLOYEE, UPDATE_EMPLOYEE, DELETE_EMPLOYEE; -``` - -### Приложение B: Компоненты фулфилмента - -```typescript -// Основные dashboard компоненты -FulfillmentWarehouseDashboard; // Склад фулфилмента -FulfillmentStatisticsDashboard; // Статистика -ServicesDashboard; // Услуги (3 вкладки) -EmployeesDashboard; // Сотрудники -SuppliesDashboard; // Поставки фулфилмента - -// Специализированные компоненты -ServicesTab, LogisticsTab, SuppliesTab; // Вкладки услуг -EmployeeInlineForm, EmployeeEditInlineForm; // Формы сотрудников -FulfillmentSuppliesTab, FulfillmentConsumablesOrdersTab; // Поставки -``` - ---- - -**📅 Создано**: На основе анализа системы Sfera -**🎯 Статус**: Готово к интеграции в rules2.md -**📝 Версия**: 1.0 diff --git a/rules-unified.md b/rules-complete.md similarity index 58% rename from rules-unified.md rename to rules-complete.md index 26ff7bb..d460c7a 100644 --- a/rules-unified.md +++ b/rules-complete.md @@ -1,22 +1,372 @@ -# ПРАВИЛА СИСТЕМЫ УПРАВЛЕНИЯ СКЛАДАМИ И ПОСТАВКАМИ - ПОЛНАЯ БАЗА ЗНАНИЙ v3.0 +# ПРАВИЛА СИСТЕМЫ УПРАВЛЕНИЯ СКЛАДАМИ И ПОСТАВКАМИ - ЕДИНЫЙ ИСТОЧНИК ИСТИНЫ v9.1 -> ⚠️ **ВАЖНОЕ ПРИМЕЧАНИЕ**: Данный файл является объединенной полной базой знаний системы, созданной на основе rules.md, rules1.md и rules2.md. Все изменения должны согласовываться. +> ⚠️ **АБСОЛЮТНО ПОЛНЫЙ ЕДИНЫЙ ИСТОЧНИК ИСТИНЫ**: Данный файл объединяет АБСОЛЮТНО ВСЕ правила системы: протоколы работы Claude Code, детальные протоколы по сложности, систему предотвращения нарушений, расширенную самопроверку, специальный UI/UX протокол и бизнес-правила. Визуальные правила вынесены в отдельный файл visual-design-rules.md с автоматической интеграцией. -## 🔤 ТЕРМИНЫ СИСТЕМЫ +## 🔴 ПРОТОКОЛЫ РАБОТЫ CLAUDE CODE + +### ⛔ ЖЕСТКИЙ ПРОТОКОЛ - ОБЯЗАТЕЛЬНОЕ ИСПОЛНЕНИЕ +**Я НЕ МОГУ выполнять НИКАКИХ изменений в коде без предварительного чтения этого файла** + +**КОМАНДА ОСТАНОВКИ**: "СТОП - ЧИТАЙ ПРАВИЛА" - немедленно останавливает любую работу + +### 📋 ОБЯЗАТЕЛЬНЫЙ ЧЕК-ЛИСТ ПЕРЕД КАЖДОЙ ЗАДАЧЕЙ +**КАЖДЫЙ ОТВЕТ ДОЛЖЕН НАЧИНАТЬСЯ С:** +``` +## 📋 Чек-лист соответствия правилам: +- ✅ Прочитал rules-complete.md +- ✅ Задача понята в контексте правил +- ✅ План действий соответствует правилам +- ✅ [ЕСЛИ UI/UX ЗАДАЧА] Прочитал visual-design-rules.md +- ✅ Готов выполнять согласно единому источнику истины +``` +**БЕЗ ЭТОГО ЧЕК-ЛИСТА = НИКАКИХ ДЕЙСТВИЙ** + +### 🔄 ДВУХЭТАПНЫЙ ПРОЦЕСС РАБОТЫ +#### **ЭТАП 1: ПЛАНИРОВАНИЕ (ОБЯЗАТЕЛЬНЫЙ)** +- Прочитать этот файл правил +- Создать детальный план действий +- Указать какие правила будут применены +- **ОСТАНОВИТЬСЯ И ЖДАТЬ ОДОБРЕНИЯ ПЛАНА** + +#### **ЭТАП 2: ВЫПОЛНЕНИЕ (ТОЛЬКО ПОСЛЕ ОДОБРЕНИЯ)** +- Получить одобрение плана от пользователя +- Следовать ТОЛЬКО одобренному плану +- Использовать TodoWrite для отслеживания прогресса + +**ПРАВИЛО ДВУХЭТАПНОСТИ: БЕЗ ОДОБРЕНИЯ ПЛАНА = НИКАКОГО ВЫПОЛНЕНИЯ** + +## 🛠️ ДЕТАЛЬНЫЕ ПРОТОКОЛЫ ПО СЛОЖНОСТИ ЗАДАЧ + +### 🎯 ПРОТОКОЛ ДЛЯ ЗАДАЧ СРЕДНЕЙ СЛОЖНОСТИ + +**ОПРЕДЕЛЕНИЕ СРЕДНЕЙ СЛОЖНОСТИ:** +- Работа с 2-3 файлами +- Изменение логики в 1-2 модулях +- Добавление новых функций без изменения архитектуры +- Задачи, требующие анализа зависимостей + +**ОБЯЗАТЕЛЬНЫЕ ЭТАПЫ:** + +#### 1. 🔍 **ЭТАП АНАЛИЗА** (STOP & THINK) +``` +ПЕРЕД НАЧАЛОМ ЗАДАТЬ СЕБЕ: +□ Какие файлы нужно изучить? (перечислить ВСЕ) +□ Какие правила из этого документа применимы? +□ Есть ли зависимости между компонентами? +□ Что может пойти не так? +□ Нужны ли уточнения от пользователя? +``` + +#### 2. 📋 **СОЗДАНИЕ ПЛАНА** +``` +□ Разбить задачу на подзадачи (не более 5) +□ Определить порядок выполнения +□ Выявить критические точки +□ Создать TODO список +``` + +#### 3. 🔄 **ВЫПОЛНЕНИЕ С ПРОВЕРКАМИ** +``` +ПОСЛЕ КАЖДОГО ШАГА: +□ Соответствует ли результат правилам из этого документа? +□ Не нарушены ли связи с другими модулями? +□ Работает ли измененный код? +□ Нужно ли обновить documentation? +``` + +### 🔥 ПРОТОКОЛ ДЛЯ ЗАДАЧ ВЫСОКОЙ СЛОЖНОСТИ + +**ОПРЕДЕЛЕНИЕ ВЫСОКОЙ СЛОЖНОСТИ:** +- Работа с 4+ файлами +- Изменение архитектуры системы +- Создание новых модулей/компонентов +- Задачи, влияющие на несколько кабинетов +- Изменения в правилах или workflow + +**ОБЯЗАТЕЛЬНЫЕ ЭТАПЫ:** + +#### 1. 🛑 **СТОП! ГЛУБОКИЙ АНАЛИЗ** +``` +ОБЯЗАТЕЛЬНЫЕ ВОПРОСЫ ПОЛЬЗОВАТЕЛЮ: +□ Уточнить ВСЕ требования и ожидания +□ Выяснить приоритеты и ограничения +□ Узнать о связях с другими системами +□ Понять критерии успеха +``` + +#### 2. 🔍 **ИССЛЕДОВАТЕЛЬСКАЯ ФАЗА** +``` +□ Изучить ВСЕ связанные файлы параллельно +□ Построить карту зависимостей +□ Найти все правила в этом документе +□ Выявить потенциальные конфликты +□ Проанализировать влияние на систему +``` + +#### 3. 📊 **СОЗДАНИЕ ДЕТАЛЬНОГО ПЛАНА** +``` +□ Разбить на этапы с промежуточными проверками +□ Определить точки возврата (rollback points) +□ Создать план тестирования +□ Предусмотреть обновление документации +``` + +### ❓ СИСТЕМА ОБЯЗАТЕЛЬНЫХ УТОЧНЕНИЙ + +#### 🔴 **КРИТИЧЕСКИЕ СИТУАЦИИ** (ОБЯЗАТЕЛЬНО): +- Обнаружил противоречие в правилах +- Задача может нарушить архитектуру системы +- Неясно как применить правило к конкретной ситуации +- Есть несколько способов решения с разными последствиями +- Изменения затрагивают критические бизнес-процессы + +#### 🟡 **ВАЖНЫЕ СИТУАЦИИ** (РЕКОМЕНДУЕТСЯ): +- Задача требует создания новых типов данных +- Нужно изменить существующий workflow +- Есть сомнения в интерпретации требований +- Решение может повлиять на производительность +- Требуется интеграция с внешними системами + +**ФОРМАТ УТОЧНЯЮЩИХ ВОПРОСОВ:** +``` +🎯 КОНТЕКСТ: Что именно я делаю +❓ ВОПРОС: Что конкретно неясно +⚖️ ВАРИАНТЫ: Какие есть альтернативы (если применимо) +⚠️ РИСКИ: Что может пойти не так +💡 ПРЕДЛОЖЕНИЕ: Мой рекомендуемый подход +``` + +### 🎨 СПЕЦИАЛЬНЫЙ ПРОТОКОЛ ДЛЯ UI/UX ЗАДАЧ + +**АВТОМАТИЧЕСКАЯ АКТИВАЦИЯ:** При обнаружении ключевых слов: дизайн, интерфейс, компонент, стили, UI, UX, визуал, цвет, кнопка, форма, карточка + +**ОБЯЗАТЕЛЬНЫЕ ЭТАПЫ:** + +#### 1. 📖 **ИЗУЧЕНИЕ ВИЗУАЛЬНЫХ ПРАВИЛ** +``` +ОБЯЗАТЕЛЬНО: +□ Прочитать visual-design-rules.md +□ Найти применимые цветовые схемы +□ Проверить правила для конкретного кабинета (селлер/фулфилмент/поставщик/логист) +□ Изучить glass-system и UI компоненты +``` + +#### 2. 🎯 **ПРИМЕНЕНИЕ ДИЗАЙН-СИСТЕМЫ** +``` +ПРОВЕРИТЬ: +□ Соответствие цветовой палитре (OKLCH) +□ Использование glass-эффектов (bg-white/10 backdrop-blur) +□ Правильные статусные цвета +□ Адаптивность и отзывчивость +□ Консистентность с существующими компонентами +``` + +#### 3. ✅ **ВАЛИДАЦИЯ ДИЗАЙНА** +``` +УБЕДИТЬСЯ: +□ Соблюдены принципы иерархии +□ Цвета соответствуют функциональному назначению +□ Интерфейс доступен и понятен +□ Стиль согласован с общей системой +``` + +## 🚨 СИСТЕМА ПРЕДОТВРАЩЕНИЯ НАРУШЕНИЙ + +### 🛑 ОБЯЗАТЕЛЬНЫЕ ОСТАНОВКИ ПЕРЕД ДЕЙСТВИЯМИ + +#### **СТОП-СИГНАЛ #1: ПЕРЕД ЛЮБЫМ АНАЛИЗОМ КОМПОНЕНТОВ** +``` +❌ ЗАПРЕЩЕНО: Делать предположения о содержании файлов/компонентов +✅ ОБЯЗАТЕЛЬНО: +1. Использовать поиск для понимания +2. Читать файлы для точного содержания +3. Только ПОСЛЕ изучения кода - выводы +``` + +#### **СТОП-СИГНАЛ #2: ПРИ НЕОПРЕДЕЛЕННОСТИ** +``` +❌ ЗАПРЕЩЕНО: Гадать, предполагать, домысливать +✅ ОБЯЗАТЕЛЬНО: +1. СТОП - зафиксировать неопределенность +2. Использовать инструменты анализа (если применимо) +3. Задать прямой вопрос пользователю +``` + +#### **СТОП-СИГНАЛ #3: ПЕРЕД ВЫПОЛНЕНИЕМ СРЕДНИХ/СЛОЖНЫХ ЗАДАЧ** +``` +❌ ЗАПРЕЩЕНО: Сразу приступать к работе +✅ ОБЯЗАТЕЛЬНО: +1. Применить соответствующий протокол из этого документа +2. Создать план через TodoWrite +3. Пройти этап самопроверки +``` + +### 🔒 СИСТЕМА ПРИНУДИТЕЛЬНЫХ ПРОВЕРОК + +#### **ПРОВЕРКА #1: АНАЛИЗ КОДА** +``` +Если задача включает анализ компонентов: +□ Использовал ли поиск по кодовой базе? +□ Прочитал ли исходный код? +□ Основаны ли выводы на фактах, а не предположениях? +``` + +#### **ПРОВЕРКА #2: СОБЛЮДЕНИЕ ПРОТОКОЛОВ** +``` +Для каждой задачи: +□ Определил ли сложность задачи? +□ Применил ли соответствующий протокол? +□ Создал ли план действий? +□ Провел ли финальную самопроверку? +``` + +### ⚡ СИСТЕМА АВТОМАТИЧЕСКИХ ТРИГГЕРОВ + +#### **ТРИГГЕР #1: При упоминании компонентов** +- Ключевые слова: "компонент", "файл", "содержание", "показывает" +- Действие: ОБЯЗАТЕЛЬНО использовать инструменты анализа кода + +#### **ТРИГГЕР #2: При неопределенности** +- Ключевые фразы: "возможно", "вероятно", "думаю", "предполагаю" +- Действие: СТОП + вопрос пользователю + +#### **ТРИГГЕР #3: При работе с UI/UX** +- Ключевые слова: "дизайн", "интерфейс", "компонент", "стили", "UI", "UX", "визуал", "цвет", "кнопка", "форма", "карточка" +- Действие: ОБЯЗАТЕЛЬНО прочитать visual-design-rules.md перед началом работы + +### 🛡️ СИСТЕМА БЛОКИРОВКИ НАРУШЕНИЙ + +``` +🛑 ОСТАНОВИТЬСЯ НЕМЕДЛЕННО ЕСЛИ: +- Не определил сложность задачи +- Пропустил этап "Стоп и подумай" +- Есть сомнения в правилах +- Не проверил все применимые разделы этого документа +- Не уведомил о важных изменениях +``` + +## ✅ РАСШИРЕННАЯ СИСТЕМА САМОПРОВЕРКИ + +### 🛑 ОБЯЗАТЕЛЬНЫЙ ПРОТОКОЛ ПЕРЕД КАЖДОЙ ЗАДАЧЕЙ + +#### **ШАГ 1: ОПРЕДЕЛЕНИЕ СЛОЖНОСТИ И ПРОТОКОЛА** +``` +ВОПРОСЫ: +- Сколько файлов затрагивает задача? (1-3 = средняя, 4+ = высокая) +- Изменяется ли архитектура или workflow? (да = высокая) +- Влияет ли на критические бизнес-процессы? (да = высокая) + +ДЕЙСТВИЕ: Применить соответствующий протокол из этого документа +``` + +#### **ШАГ 2: ЭТАП "СТОП И ПОДУМАЙ"** +``` +ОБЯЗАТЕЛЬНЫЕ ВОПРОСЫ: +- Какие правила из этого документа применимы? +- Какие файлы нужно изучить? (перечислить ВСЕ) +- Есть ли неопределенности, требующие уточнения? +- Что может пойти не так? + +ДЕЙСТВИЕ: Составить план с промежуточными проверками +``` + +### 📊 ФИНАЛЬНАЯ МЕГА-ПРОВЕРКА + +``` +МЕГА-ВОПРОС К СЕБЕ: +"Применил ли я правильный протокол, проверил ли все правила, +задал ли нужные вопросы, готов ли результат к production?" + +ЕСЛИ ОТВЕТ НЕ "ДА 100%" - ВЕРНУТЬСЯ К НАЧАЛУ! +``` + +### 📈 МЕТРИКИ УСПЕХА +``` +ЦЕЛЬ: 0 пропущенных критических деталей + +ИЗМЕРЕНИЕ: +✅ Количество вопросов на уточнение +✅ Полнота анализа источников +✅ Отсутствие нарушений правил +``` + +## ⚡ БЫСТРЫЙ СПРАВОЧНИК + +### 🚨 КРИТИЧЕСКИЕ ПРАВИЛА (ОБЯЗАТЕЛЬНЫ К СОБЛЮДЕНИЮ) + +1. **🔴 ТИПИЗАЦИЯ**: Каждый предмет ОБЯЗАТЕЛЬНО имеет тип: `PRODUCT`, `CONSUMABLE`, `DEFECT`, `FINISHED_PRODUCT` +2. **🔴 WORKFLOW**: Нельзя пропускать статусы поставок: PENDING → SUPPLIER_APPROVED → CONFIRMED → ... → DELIVERED +3. **🔴 ДОСТУП**: Фулфилмент = полный доступ, Селлер ≠ доступ к чужим данным, Брак = ЗАПРЕЩЕН к заказу +4. **🔴 ПАРТНЕРСТВО**: Все связи через модель `Counterparty`, поставщики в формах ТОЛЬКО из партнеров `WHOLESALE` +5. **🔴 ФИЛЬТРАЦИЯ**: По типу предмета происходит в GraphQL резолверах, НЕ на фронтенде + +### 🔍 БЫСТРЫЙ ПОИСК ПО ТЕМАМ + +| Тема | Раздел | Ключевые понятия | +|------|--------|------------------| +| **Типы предметов** | [2](#2--типизация-предметов) | PRODUCT, CONSUMABLE, DEFECT, FINISHED_PRODUCT | +| **Кабинет фулфилмента** | [11](#11--кабинет-фулфилмента-полная-документация) | Склад, Услуги, Сотрудники, 6 модулей | +| **Workflow поставок** | [5](#5--workflow-поставок) | 8 статусов, уведомления, логистика | +| **GraphQL запросы** | [18](#18--graphql-и-typescript-правила), [24](#24--технические-приложения) | Резолверы, мутации, типизация | +| **Система партнерства** | [13](#13--система-партнерства-и-контрагентов) | Counterparty, WHOLESALE, заявки | +| **Критические запреты** | [17](#17--критические-запреты) | Что НЕЛЬЗЯ делать в системе | + +### 🎯 ДЛЯ РАЗНЫХ РОЛЕЙ + +**👩‍💻 РАЗРАБОТЧИКИ**: Разделы [18](#18--graphql-и-typescript-правила), [19](#19--архитектурные-принципы), [20](#20--правила-качества-кода), [24](#24--технические-приложения) +**📊 АНАЛИТИКИ**: Разделы [15](#15--статистика-и-аналитика), [6](#6--процесс-создания-продукта), [7](#7--система-учета-движения-товаров) +**👔 МЕНЕДЖЕРЫ**: Разделы [1](#1--основные-принципы-системы), [3](#3--структура-кабинетов), [5](#5--workflow-поставок) + +--- + +## 🔤 ГЛОССАРИЙ ТЕРМИНОВ > Для людей → `В коде` -- ТОВАР → `PRODUCT` -- РАСХОДНИКИ → `CONSUMABLE` -- БРАК → `DEFECT` *(планируется)* -- ПРОДУКТ → `FINISHED_PRODUCT` *(планируется)* -- ПОСТАВЩИК → `WHOLESALE` -- СЕЛЛЕР → `SELLER` -- ФУЛФИЛМЕНТ → `FULFILLMENT` -- ЛОГИСТИКА → `LOGIST` + +### **ТИПЫ ПРЕДМЕТОВ:** +- **ТОВАР** → `PRODUCT` - базовый товар от поставщика, может стать продуктом или браком +- **РАСХОДНИКИ** → `CONSUMABLE` - материалы, классифицируются по назначению при использовании (операционные/производственные) +- **БРАК** → `DEFECT` *(НЕ РЕАЛИЗОВАНО)* - функционал брака еще не внедрен в систему +- **ПРОДУКТ** → `FINISHED_PRODUCT` *(планируется)* - готовый товар, создается из товара по рецептуре + +### **ТИПЫ ОРГАНИЗАЦИЙ:** +- **ПОСТАВЩИК** → `WHOLESALE` - создает товары и расходники, обрабатывает заказы +- **СЕЛЛЕР** → `SELLER` - заказывает товары, создает поставки на маркетплейсы +- **ФУЛФИЛМЕНТ** → `FULFILLMENT` - обрабатывает товары, создает продукты, максимальные права +- **ЛОГИСТИКА** → `LOGIST` - управляет доставками, подтверждает транспортировку + +### 2.2 Правила создания предметов по ролям + +**КТО МОЖЕТ СОЗДАВАТЬ:** +- **ПОСТАВЩИК** (`WHOLESALE`): Товары (`PRODUCT`) и Расходники (`CONSUMABLE`) +- **ФУЛФИЛМЕНТ** (`FULFILLMENT`): Продукты (`FINISHED_PRODUCT`) - только из существующих товаров +- **СЕЛЛЕР/ЛОГИСТ**: НЕ МОГУТ создавать предметы + +**КТО МОЖЕТ ПОКУПАТЬ:** +- **СЕЛЛЕР** (`SELLER`): + - Товары и расходники у поставщиков + - Расходники фулфилмента у фулфилмента (через рецептуру в поставке) +- **ФУЛФИЛМЕНТ** (`FULFILLMENT`): Товары и расходники у поставщиков +- **ПОСТАВЩИК/ЛОГИСТ**: НЕ МОГУТ покупать предметы + +**ЭКОНОМИЧЕСКИЙ УЧЕТ:** +- Когда селлер выбирает расходники фулфилмента в рецептуре, это формирует экономические данные: + - В кабинете селлера: расход на расходники фулфилмента + - В кабинете фулфилмента: доход от продажи расходников селлеру + +### **КЛЮЧЕВЫЕ СУЩНОСТИ:** +- **Контрагент** → `Counterparty` - связь между организациями для партнерства +- **Поставка** → `SupplyOrder` - заказ товаров/расходников с workflow статусами +- **Рецептура** - состав продукта: товар + услуги + расходники (задается селлером) --- ## 📑 ОГЛАВЛЕНИЕ +> 📋 **ЧТО ОБЪЕДИНЕНО**: +> - rules-unified.md (v3.0) - общая база знаний системы +> - fulfillment-cabinet-rules.md (v1.0) - детализация кабинета фулфилмента +> - Устранены все несоответствия в терминах, последовательностях и детализации + ### 🏗️ **АРХИТЕКТУРА И ОСНОВЫ** 1. [🎯 Основные принципы системы](#1--основные-принципы-системы) @@ -61,24 +411,13 @@ 22. [📋 Категории товаров и расходников](#22--категории-товаров-и-расходников) 23. [🎖️ Приоритеты разработки](#23--приоритеты-разработки) -### 🌐 **ИНТЕГРАЦИИ И ФУНКЦИИ** +### 🚨 **КРИТИЧЕСКИЕ СИТУАЦИИ** -14. [🌐 Интеграции с системой](#14--интеграции-с-системой) -15. [📊 Статистика и аналитика](#15--статистика-и-аналитика) -16. [📱 Правила UI/UX и интерфейса](#16--правила-uiux-и-интерфейса) -17. [⚠️ Критические запреты](#17--критические-запреты) +24. [🚨 Критические ситуации и Edge Cases](#-критические-ситуации-и-edge-cases) -### 🛠️ **ТЕХНИЧЕСКИЕ ПРАВИЛА** +### 📎 **ТЕХНИЧЕСКИЕ ПРИЛОЖЕНИЯ** -18. [🛠️ GraphQL и TypeScript правила](#18--graphql-и-typescript-правила) -19. [🔧 Архитектурные принципы](#19--архитектурные-принципы) -20. [🎯 Правила качества кода](#20--правила-качества-кода) -21. [🔍 Диагностика и решение проблем](#21--диагностика-и-решение-проблем) - -### 📋 **ПРИЛОЖЕНИЯ** - -22. [📋 Категории товаров и расходников](#22--категории-товаров-и-расходников) -23. [🎖️ Приоритеты разработки](#23--приоритеты-разработки) +25. [📎 Технические приложения (GraphQL, компоненты)](#24--технические-приложения) --- @@ -127,8 +466,9 @@ - **ТОВАР** (`PRODUCT`) - базовые товары от поставщиков (принятые на склад) - **БРАК** (`DEFECT` - планируется) - производная от товара (товар с дефектами) - **ПРОДУКТ** (`FINISHED_PRODUCT` - планируется) - готовый к продаже товар -- **РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы фулфилмента -- **РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для товаров селлеров +- **РАСХОДНИКИ (`CONSUMABLE`)** - единый базовый тип, классифицируется по назначению при использовании: + - **"Операционные расходники"** - используются фулфилментом для выполнения услуг + - **"Производственные расходники"** - используются в рецептурах селлеров для создания продуктов **🛍️ КАБИНЕТ СЕЛЛЕРА** - заказывает и управляет поставками: - Создает заказы товаров и расходников @@ -170,7 +510,7 @@ #### **3. БРАК** (`DEFECT` - планируется, производная от товара) - **БУДЕТ СОЗДАВАТЬСЯ**: Фулфилментом на основе существующего ТОВАРА при обнаружении дефектов -- **МОМЕНТ СОЗДАНИЯ**: В процессе "Создание продукта" / "В работе" после подсчета факта +- **МОМЕНТ СОЗДАНИЯ**: В процессе обработки товара (ШАГ 3 алгоритма создания продукта) при выявлении брака - **СВЯЗЬ**: Обязательная связь с родительским товаром (parentId) - **ЗАКАЗ**: ЗАПРЕЩЕН заказ брака - **СТАТУС**: Всегда неактивен для заказа @@ -293,6 +633,8 @@ if (currentUser.organization.type !== "FULFILLMENT") { ## 5. 🚚 WORKFLOW ПОСТАВОК +> 📌 **ВИЗУАЛЬНЫЕ ПРАВИЛА**: См. [visual-design-rules.md - Статусы поставок](#142-статусы-поставок---расширенная-цветовая-система) + ### 5.1 Детализированная система статусов **Статусы SupplyOrder (Заказ поставки):** @@ -348,61 +690,171 @@ if (currentUser.organization.type !== "FULFILLMENT") { ## 6. 🔄 ПРОЦЕСС СОЗДАНИЯ ПРОДУКТА -### 6.1 Workflow создания продукта +> 📌 **СВЯЗАННЫЕ РАЗДЕЛЫ**: +> - Типы предметов → См. [раздел 2.2](#22-обязательные-поля-карточки) +> - Склад фулфилмента → См. [раздел 11.2](#112-структура-раздела-склад-фулфилмента) +> - Статистика движения → См. [раздел 7](#7--система-учета-движения-товаров) -**ЭТАПЫ ПРОЦЕССА:** +### 6.1 Пошаговый алгоритм создания продукта -1. **ПОСТУПЛЕНИЕ**: Товар приходит на склад фулфилмента (статус "на складе") -2. **СОРТИРОВКА**: Перебор товара, отсеивание брака -3. **ПОДГОТОВКА К РАБОТЕ**: Менеджер задает параметры работы -4. **ОБРАБОТКА**: Превращение товара в продукт по "рецептуре" селлера -5. **ЗАВЕРШЕНИЕ**: Готовый продукт (статус "готов к отправке") +> 📌 **ВИЗУАЛЬНЫЕ ПРАВИЛА**: См. [visual-design-rules.md - Процесс создания продукта](#143-процесс-создания-продукта---визуальный-workflow) -### 6.2 Управление процессом +#### **ПРЕДВАРИТЕЛЬНОЕ УСЛОВИЕ: РЕЦЕПТУРА ЗАДАНА** (селлер) +``` +Время: при создании заявки на поставку +Действие: селлер указывает рецептуру продукта +Обязательные компоненты: + ✓ Базовый товар (от поставщика) + ✓ Услуги фулфилмента (упаковка, маркировка и т.д.) + ✓ Расходники (материалы для производства) +Результат: рецептура сохраняется в заявке и передается фулфилменту +``` -**РАЗДЕЛ "СОЗДАНИЕ ПРОДУКТА":** +#### **ШАГ 1: ПОСТУПЛЕНИЕ НА СКЛАД** (автоматически) +``` +Время: при смене статуса поставки DELIVERED +Действие: товар переходит в статус "на складе" +Ответственный: система +Результат: +Прибыло в статистике товаров +``` -- **НОВЫЕ**: Поставки после нажатия "принято", ожидающие назначения -- **В РАБОТЕ**: Поставки в процессе обработки -- **ВЫПОЛНЕНО**: Завершенные поставки с готовыми продуктами +#### **ШАГ 2: ПЛАНИРОВАНИЕ РАБОТЫ** (менеджер фулфилмента) +``` +Время: в течение 2 рабочих дней после поступления +Действие: назначение параметров обработки +Ответственный: менеджер фулфилмента +Обязательные поля: + ✓ Дедлайн выполнения (не более 5 рабочих дней) + ✓ Ответственный исполнитель (из списка сотрудников) + ✓ Рецептура (товар + услуги + расходники, указанная селлером в заявке на поставку) +Опциональные поля: + - Место хранения готовых продуктов (зона склада, стеллаж, ячейка) + - Комментарии к работе +Результат: поставка переходит во вкладку "В работе" +``` -**ДЕЙСТВИЯ МЕНЕДЖЕРА В "НОВЫЕ":** +#### **ШАГ 3: ОБРАБОТКА ТОВАРА** (исполнитель) +``` +Время: согласно дедлайну (обычно 1-3 дня) +Действие: физическая обработка товара +Ответственный: назначенный сотрудник +Обязательные действия: + 1. Проверка качества товара + 2. Фиксация фактического количества + 3. Выявление и учет брака + 4. Применение рецептуры (услуги + расходники) + 5. Создание готового продукта +Точки контроля: + - Соответствие плану/факту + - Качество выполнения услуг + - Расход материалов по норме -- **ДЕДЛАЙН**: Указание срока выполнения работы -- **ОТВЕТСТВЕННЫЙ**: Назначение исполнителя -- **МЕСТО ХРАНЕНИЯ**: Указание локации для готовых продуктов (опционально) -- **ЗАПУСК**: Нажатие кнопки "В работе" +УЧЕТ ПЛАН/ФАКТ: + - ПЛАН: Количество товаров из поставки селлера (указано в заказе) + - ФАКТ: Реальное количество после обработки = Брак + Хороший товар + - ДЕТАЛИЗАЦИЯ: Учет ведется по каждому размеру/объему/варианту + - КОРРЕКТИРОВКА: Статистика автоматически обновляется на фактические данные +``` -### 6.3 Рецептура продукта +#### **ШАГ 4: КОНТРОЛЬ КАЧЕСТВА** (менеджер/отдел качества) +``` +Время: сразу после завершения ШАГ 3 +Действие: приемка готовой продукции +Ответственный: менеджер или контролер качества +Критерии приемки: + ✓ Соответствие рецептуре селлера + ✓ Качество выполненных услуг + ✓ Правильность упаковки/маркировки + ✓ Полнота комплектации +Результат: продукт готов к отправке или отправлен на доработку +``` -**СЕЛЛЕР УКАЗЫВАЕТ В ПОСТАВКЕ:** +#### **ШАГ 5: ЗАВЕРШЕНИЕ** (система + менеджер) +``` +Время: после успешного прохождения контроля качества +Действие: финализация процесса +Автоматические действия: + - Создание записи FINISHED_PRODUCT в БД + - Обновление статистики: товар "на складе" → продукт "готов" + - Списание использованных расходников + - Уведомление селлера о готовности +Ручные действия менеджера: + - Подтверждение перехода во вкладку "Выполнено" + - Указание фактических расходов материалов + - Добавление комментариев о выполненной работе +``` -- **БАЗОВЫЙ ТОВАР**: Исходный материал (например, футболка) -- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг (например, "погладить") -- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (например, фирменный пакет) -- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (например, короб + маркировка) +### 6.2 Временные рамки и SLA -**РЕЗУЛЬТАТ**: ПРОДУКТ = Товар + Услуга + Расходники +| Этап | Стандартное время | Максимальное время | Ответственный | +|------|------------------|-------------------|---------------| +| Планирование | 1 рабочий день | 2 рабочих дня | Менеджер ФФ | +| Обработка | 2-3 рабочих дня | 5 рабочих дней | Исполнитель | +| Контроль качества | 4 часа | 1 рабочий день | Отдел качества | +| Завершение | 2 часа | 4 часа | Менеджер ФФ | -### 6.4 Учет план/факт в процессе работы +### 6.3 Управление браком и расхождениями + +### 6.4 Детальная рецептура продукта + +**РЕЦЕПТУРА ПРОДУКТА** (задается селлером при создании поставки): + +- **БАЗОВЫЙ ТОВАР**: Исходный материал (обязательно) + - Артикул товара + - Количество единиц + - Размерная сетка (если применимо) + +- **УСЛУГА ФУЛФИЛМЕНТА**: Из каталога услуг фулфилмента + - Тип услуги (глажка, упаковка, маркировка и т.д.) + - Количество применений + - Специальные требования + +- **РАСХОДНИК СЕЛЛЕРА**: Материалы селлера (опционально) + - Фирменная упаковка + - Этикетки, бирки + - Дополнительные аксессуары + +- **РАСХОДНИК ФУЛФИЛМЕНТА**: Материалы фулфилмента (опционально) + - Стандартная упаковка + - Защитные материалы + - Маркировочные элементы + +- **СВЯЗЬ С МАРКЕТПЛЕЙСОМ**: Привязка к карточке (опционально) + - ID карточки на маркетплейсе + - Артикул маркетплейса + - Особые требования МП + +**ФОРМУЛА**: ПРОДУКТ = Товар + Услуга(и) + Расходники селлера + Расходники ФФ + +### 6.5 Учет план/факт в процессе работы (без брака) **ПЛАН**: Количество товара из поставки селлера -**ФАКТ**: Реальное количество после сортировки +**ФАКТ**: Реальное количество после пересчета (работник фулфилмента производит сортировку при пересчете) -**ФИКСАЦИЯ БРАКА:** +**ФИКСАЦИЯ ПОТЕРЬ:** - **КОГДА**: В процессе работы (вкладка "В работе") -- **КТО**: Ответственный исполнитель -- **ДЕТАЛИЗАЦИЯ**: По каждому предмету (размер/объем) -- **ОБНОВЛЕНИЕ**: Можно вносить изменения до нажатия "Выполнено" +- **ЧТО**: Недостача, повреждения (без создания записей брака) +- **КАК**: Корректировка количества в статистике + +**WORKFLOW СОЗДАНИЯ ПРОДУКТА:** +1. Товар поступает на склад фулфилмента (статус "на складе") +2. Товар берется в работу (переход в статус "в обработке") +3. Исполнитель производит пересчет и сортировку +4. Создается готовый продукт (тип FINISHED_PRODUCT) +5. Продукт готов к отправке на маркетплейсы **ВЛИЯНИЕ НА СТАТИСТИКУ:** - При принятии поставки: +План в статистику - При выявлении факта: корректировка на реальные данные -- **ФОРМУЛА**: Факт = Брак + Хороший товар +- **ФОРМУЛА**: Факт = Потери + Хороший товар +*Где потери - это недостача/повреждения, выявленные при пересчете и сортировке* - **ЛОГИКА**: Фактическое количество = сумма всех пересчитанных предметов +- **ПЛАН/ФАКТ**: Корректировка статистики при выявлении расхождений --- +> 🚧 **БУДУЩАЯ ФУНКЦИОНАЛЬНОСТЬ**: Система статусов товаров в фулфилменте будет детализирована позже + ## 7. 📊 СИСТЕМА УЧЕТА ДВИЖЕНИЯ ТОВАРОВ ### 7.1 Принципы учета в фулфилменте @@ -531,6 +983,8 @@ const handleSuppliesClick = () => { ## 9. 🏠 КАБИНЕТ СЕЛЛЕРА (ДЕТАЛЬНЫЕ ПРАВИЛА) +> 📌 **ВИЗУАЛЬНЫЕ ПРАВИЛА**: См. [visual-design-rules.md - Кабинет селлера](#145-кабинет-селлера) + ### 9.1 Структура раздела "Мои поставки" #### **🏢 ПОСТАВКИ НА ФУЛФИЛМЕНТ**: @@ -545,16 +999,76 @@ const handleSuppliesClick = () => { - **Wildberries** - прямые поставки на WB - **Ozon** - прямые поставки на Ozon -### 9.2 Правила кнопки "Создать поставку" в разделе "Мои поставки" +### 9.2 UI структура создания поставки расходников селлера -#### **9.2.1 Общие принципы** +#### **📄 Структура страницы создания поставки:** + +**БЛОК 1: ПОСТАВЩИКИ** _(верхняя часть экрана)_ +- **Отображение**: Карточки поставщиков из раздела "Партнеры" +- **Навигация**: Горизонтальный скролл (слева-направо) при превышении ширины экрана +- **Выбор**: Клик выделяет карточку поставщика +- **Результат**: Загружаются расходники выбранного поставщика в блок 2 + +**БЛОК 2: РАСХОДНИКИ** _(центральная часть)_ +- **Содержание**: Расходники выбранного поставщика +- **Сортировка**: По цене, названию, категории +- **Фильтры**: По категории, ценовому диапазону +- **Карточка расходника**: + - Фото, название, цена, остаток, категория + - Количество в комплекте (если есть комплектность) + - Поле ввода количества (единицы или комплекты) + - Кнопки +/- для изменения количества +- **Действие**: Клик добавляет расходник в корзину + +**БЛОК 3: КОРЗИНА** _(правая часть)_ +- **Содержание корзины**: + - Количество видов расходников + - По каждому расходнику: название, количество, цена за единицу, сумма + - Общая сумма всех расходников +- **Управление**: Изменение количества, удаление позиций +- **Валидация**: Проверка остатков у поставщика +- **Настройки поставки**: + - Выбор фулфилмент-центра (dropdown из партнеров) + - Дата поставки (по умолчанию - дата создания, нельзя выбрать прошедшую) +- **Кнопка**: "Создать поставку" + +### 9.3 Многоуровневые таблицы для отображения поставок + +#### **📊 Структура многоуровневой таблицы:** + +**ПЕРВЫЙ УРОВЕНЬ** _(основной список)_: +- Порядковый номер поставки (от большего к меньшему) +- Количество видов расходников селлера +- Стоимость всей поставки +- Количество категорий +- Статус поставки +- Кнопка раскрытия/сворачивания + +**ВТОРОЙ УРОВЕНЬ** _(раскрывается по клику)_: +- Название расходника селлера +- Количество +- Цена за единицу +- Общая стоимость позиции +- Категория +- Поставщик +- **Режим**: Только просмотр (редактирование недоступно после создания) + +**ПРАВИЛА ОТОБРАЖЕНИЯ**: +- По умолчанию таблица свернута, показан только первый уровень +- Клик по строке или кнопке раскрывает второй уровень +- Анимация раскрытия плавная (300ms) +- Визуальная индикация раскрытого состояния (поворот стрелки, изменение фона) + +### 9.4 Правила кнопки "Создать поставку" в разделе "Мои поставки" + +#### **9.4.1 Общие принципы** - **КОНТЕКСТНОСТЬ**: Кнопка создания появляется только в активном табе - **РАСПОЛОЖЕНИЕ**: Правая часть строки таба, на том же уровне что и название - **СТИЛИСТИКА**: В том же стиле что и сами табы (соответствует уровню иерархии) - **ФУНКЦИОНАЛЬНОСТЬ**: Кнопка ведет на страницу создания поставки соответствующего типа -#### **9.2.2 Размещение кнопок по табам** +#### **9.4.2 Размещение кнопок по табам** **УРОВЕНЬ 2 (Подтабы фулфилмента):** @@ -567,7 +1081,7 @@ const handleSuppliesClick = () => { - **🟣 Wildberries**: Кнопка "Создать поставку" → `/supplies/create-wildberries` - **🔵 Ozon**: Кнопка "Создать поставку" → `/supplies/create-ozon` -#### **9.2.3 Стили кнопок** +#### **9.4.3 Стили кнопок** **ДЛЯ УРОВНЯ 2 (h-9):** @@ -836,21 +1350,68 @@ height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins) ## 11. 🏭 КАБИНЕТ ФУЛФИЛМЕНТА -### 11.1 Структура раздела склад фулфилмента +### 11.1 Общие характеристики кабинета фулфилмента -#### **Модули в обязательной последовательности**: +#### 11.1.1 Принципы доступа -1. **📦 ПРОДУКТ** - готовые к продаже товары -2. **🛒 ТОВАР** - базовые товары от поставщиков - - Товары "на складе" - готовы к обработке - - Товары "в обработке" - в процессе создания продукта -3. **❌ БРАК** - товары с дефектами -4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары -5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров -6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТ** - операционные материалы - - **КЛИКАБЕЛЬНЫЙ МОДУЛЬ** - содержит полноценный раздел учёта +- **МАКСИМАЛЬНЫЕ ПРАВА**: Фулфилмент имеет доступ ко ВСЕМ разделам системы +- **АДАПТИВНАЯ НАВИГАЦИЯ**: Sidebar изменяется в зависимости от `user.organization.type === "FULFILLMENT"` +- **ЭКСКЛЮЗИВНЫЕ КОМПОНЕНТЫ**: Услуги, Сотрудники, Статистика фулфилмента доступны ТОЛЬКО фулфилменту +- **СПЕЦИАЛЬНЫЙ РОУТИНГ**: При нажатии "Поставки" → `/fulfillment-supplies` (не `/supplies`) -### 11.2 Движение товаров в фулфилменте +#### 11.1.2 Архитектурные особенности + +- **GraphQL проверки**: `skip: user?.organization?.type !== 'FULFILLMENT'` в запросах +- **Условное отображение**: `{user?.organization?.type === "FULFILLMENT" && (...)}` +- **Адаптивные отступы**: `getSidebarMargin()` для responsive design +- **Полинг данных**: Статистика обновляется каждую минуту (`pollInterval: 60000`) + +### 11.2 Структура раздела склад фулфилмента + +> 📌 **ВИЗУАЛЬНЫЕ ПРАВИЛА**: См. [visual-design-rules.md - Кабинет фулфилмента](#141-кабинет-фулфилмента) + +#### 11.2.1 Структура склада по модулям (ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ) + +1. **📦 ПРОДУКТЫ** - готовые к отправке товары +2. **🛒 ТОВАРЫ** - базовые товары от поставщиков + - **"На складе"** - готовы к обработке + - **"В обработке"** - в процессе создания продукта +3. **❌ БРАК** - товары с дефектами, требуют утилизации +4. **↩️ ВОЗВРАТЫ С ПВЗ** - возвращенные товары, к обработке +5. **🎯 РАСХОДНИКИ СЕЛЛЕРОВ** - материалы для селлеров (тип `CONSUMABLE`, заказанные селлерами) +6. **⚙️ РАСХОДНИКИ ФУЛФИЛМЕНТА** - операционные материалы (тип `CONSUMABLE`, заказанные фулфилментом, КЛИКАБЕЛЬНЫЙ модуль) + +#### 11.2.2 Система учета склада + +**Дополнительные значения** (показатели движения): +- **ПРИБЫЛО** - количество поступивших на склад за период +- **УБЫЛО** - количество списанных со склада за период + +**Основные значения** (текущие остатки): +- **ФОРМУЛА**: Основные значения = Предыдущие остатки + Прибыло - Убыло +- **ОБНОВЛЕНИЕ**: В реальном времени с изменениями за сутки +- **ИСТОЧНИК**: GraphQL query `GET_FULFILLMENT_WAREHOUSE_STATS` + +#### 11.2.3 Структура данных склада (3-уровневая иерархия) + +``` +🔵 УРОВЕНЬ 1: МАГАЗИНЫ +├── ТехноМир (синий - blue-400/500) +├── Стиль и Комфорт (розовый - pink-400/500) +└── Зелёный Дом (изумрудный - emerald-400/500) + ↓ +🟢 УРОВЕНЬ 2: ТОВАРЫ (зеленый - green-500) + ↓ +🟠 УРОВЕНЬ 3: ВАРИАНТЫ ТОВАРОВ (оранжевый - orange-500) +``` + +**Цветовое кодирование**: +- Каждый уровень имеет цветной индикатор увеличивающегося размера +- Цветная левая граница с увеличивающимся отступом и толщиной +- Скроллбары в цвете уровня +- Контрастный цвет текста для читаемости + +### 11.3 Движение товаров в фулфилменте #### **Поступление товаров**: @@ -865,7 +1426,7 @@ height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins) - **ВОЗВРАТ**: Возврат поставщику - **ИСПОЛЬЗОВАНИЕ**: Расходники для операций -### 11.3 Модуль "Расходники фулфилмента" +### 11.4 Модуль "Расходники фулфилмента" **ОСОБЕННОСТИ**: @@ -873,7 +1434,100 @@ height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins) - **ФУНКЦИОНАЛЬНОСТЬ**: Полноценный раздел учёта - **СОДЕРЖАНИЕ**: Управление расходниками фулфилмента -### 11.4 Блок детализации по магазинам +### 11.5 Поставки фулфилмента (`/fulfillment-supplies`) + +#### 11.5.1 Структура: 2 основные вкладки + +**A) 🛒 ПОСТАВКИ ТОВАРОВ**: +- **Детализированные товары ФФ** - планы и факты поставок с маршрутами +- **Товары ФФ** - общие поставки товаров от селлеров +- **Возвраты с ПВЗ** - обработка возвращенных товаров + +**B) 🔧 ПОСТАВКИ РАСХОДНИКОВ**: +- **Заказы расходников** - управление заказами от селлеров +- **Расходники селлеров** - материалы для клиентов +- **Создание поставок** - формирование новых поставок расходников + +#### 11.5.2 Workflow поставок товаров + +**Этапы обработки**: +1. **Planned** - поставка запланирована +2. **In-transit** - товар в пути +3. **Delivered** - доставлен на склад +4. **Completed** - обработка завершена + +### 11.6 Статистика фулфилмента (`/fulfillment-statistics`) + +#### 11.6.1 Блоки аналитики (сворачиваемые) + +**1. НАКОПЛЕННАЯ СТАТИСТИКА** (`allTime: true`): +- Обработано товаров (общий объем) +- Выявлено брака (всего единиц) +- Поставок получено +- Общий доход (за все время) +- Выполнено заказов (успешных отгрузок) +- Удовлетворенность клиентов (средний рейтинг) + +**2. ОТГРУЗКА НА ПЛОЩАДКИ** (`marketplaces: true`): +- Отправлено на Wildberries +- Отправлено на Ozon +- Отправлено на другие площадки + +**3. АНАЛИТИКА ПРОИЗВОДИТЕЛЬНОСТИ** (`performance: false`): +- Среднее время обработки (на единицу товара) +- Уровень брака (от общего объема) +- Уровень возвратов (возвраты с площадок) +- Удовлетворенность клиентов + +### 11.7 Услуги фулфилмента (`/services`) + +#### 11.7.1 Структура: 3 обязательные вкладки + +**A) 🛠️ УСЛУГИ** (`defaultValue="services"`): +- **CRUD операции**: создание, редактирование, удаление услуг +- **Управление ценами** и описаниями +- **Загрузка изображений** услуг (`imageUrl`) +- **GraphQL**: `GET_MY_SERVICES`, `CREATE_SERVICE`, `UPDATE_SERVICE`, `DELETE_SERVICE` + +**B) 🚚 ЛОГИСТИКА**: +- **Создание маршрутов доставки** (откуда → куда) +- **Тарификация**: цена до 1м³ и свыше 1м³ +- **Группированные локации**: + - Мой фулфилмент (название организации) + - Рынки (предустановленные) + - Склады Wildberries + - Склады Ozon +- **GraphQL**: `GET_MY_LOGISTICS`, `CREATE_LOGISTICS`, `UPDATE_LOGISTICS`, `DELETE_LOGISTICS` + +**C) 📦 РАСХОДНИКИ**: +- **Управление расходниками фулфилмента** +- **Интеграция с модулем "Услуги"** - селлеры могут использовать в услугах +- **Списание со складских остатков** при использовании +- **Стоимость включается** в стоимость услуги + +### 11.8 Сотрудники фулфилмента (`/employees`) + +#### 11.8.1 Структура: 2 основные вкладки + +**A) 👥 СОТРУДНИКИ** (`defaultValue="combined"`): + +**Управление персоналом**: +- **CRUD операции**: создание, редактирование, удаление сотрудников +- **Статусы сотрудников**: `ACTIVE`, `VACATION`, `SICK`, `FIRED` +- **Формы добавления**: Компактная (`showCompactForm`) / Полная форма +- **Поиск и фильтрация** по имени, должности, статусу + +**Табель рабочего времени**: +- **Навигация по месяцам**: текущий год/месяц с кнопками ←/→ +- **Отметки по дням**: статус дня и количество отработанных часов +- **GraphQL**: `GET_EMPLOYEE_SCHEDULE`, `UPDATE_EMPLOYEE_SCHEDULE` + +**B) 📋 ОТЧЕТЫ** (`value="reports"`): +- **Сводные отчеты** по сотрудникам за период +- **Экспорт данных** табеля +- **Аналитика рабочего времени** + +### 11.9 Блок детализации по магазинам **НАЗНАЧЕНИЕ**: Распределение товаров по торговым точкам/магазинам @@ -1259,6 +1913,7 @@ const wholesalePartners = await prisma.counterparty.findMany({ 18. ❌ **Использовать общие запросы вместо специализированных** (`GET_ALL_PRODUCTS` вместо `GET_ORGANIZATION_PRODUCTS` для конкретного поставщика) 19. ❌ **Показывать расходники в формах создания поставок товаров** (строгая типизация `PRODUCT`/`CONSUMABLE`) 20. ❌ **Фильтровать предметы по типу на фронтенде** (фильтрация должна быть в GraphQL резолвере) +21. ❌ **ИСПОЛЬЗОВАТЬ МОКОВЫЕ ДАННЫЕ БЕЗ РАЗРЕШЕНИЯ** - все компоненты ОБЯЗАТЕЛЬНО должны использовать реальные GraphQL запросы. Моковые данные можно добавлять ТОЛЬКО с явного разрешения пользователя ### 17.2 ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА: @@ -1619,8 +2274,189 @@ interface GoodsProduct { --- -_Эта база знаний создана на основе анализа rules.md, rules1.md и rules2.md и является единым источником понимания структуры и логики проекта._ +## 🚨 КРИТИЧЕСКИЕ СИТУАЦИИ И EDGE CASES -_Версия: 4.0_ -_Дата создания: 2024_ -_Статус: ПОЛНАЯ УНИФИЦИРОВАННАЯ БАЗА ЗНАНИЙ_ +### 🔴 Отмена заказов на разных этапах workflow + +**PENDING → Отмена разрешена** +- Действие: Удаление заказа без последствий +- Уведомления: Поставщику о отмене +- Влияние на статистику: Нет + +**SUPPLIER_APPROVED → Отмена с согласия поставщика** +- Действие: Требуется подтверждение поставщика +- Штрафы: Возможны согласно договору +- Восстановление: Товары возвращаются в доступные остатки + +**CONFIRMED/LOGISTICS_CONFIRMED → Отмена критическая** +- Действие: Требуется согласие всех участников +- Штрафы: Логистические расходы +- Альтернатива: Изменение адреса доставки + +**SHIPPED/IN_TRANSIT → Отмена невозможна** +- Действие: Только возврат после получения +- Процедура: Через модуль "Возвраты с ПВЗ" + +### 🔄 Частичная доставка товаров + +**Сценарий**: Поставщик доставил 80 из 100 заказанных единиц + +**Алгоритм обработки**: +1. Фулфилмент фиксирует фактическое количество +2. Система создает два отдельных документа: + - DELIVERED (80 единиц) - обрабатывается обычным порядком + - PARTIAL_DELIVERED (20 единиц) - остается в статусе ожидания +3. Селлер получает уведомление о частичной поставке +4. Принятие решения: ждать остаток или отменить недопоставку + +### 📊 Превышение лимитов остатков + +**Проблема**: Попытка заказать больше чем есть у поставщика + +**Техническая реализация**: +```typescript +if (requestedQuantity > availableStock) { + throw new GraphQLError(`Недостаточно товара. Доступно: ${availableStock}, запрошено: ${requestedQuantity}`); +} +``` + +**UX решение**: Real-time валидация в формах заказа + +### 🔍 Дубликаты артикулов + +**Сценарий**: Поставщик пытается создать товар с существующим артикулом + +**Проверка на уровне БД**: +```sql +UNIQUE INDEX ON products(article, organization_id) +``` + +**Обработка**: Автоматическое добавление суффикса или предложение изменить артикул + +--- + +## 24. 📎 ТЕХНИЧЕСКИЕ ПРИЛОЖЕНИЯ + +### Приложение A: GraphQL запросы фулфилмента + +```typescript +// Основные запросы +GET_MY_SERVICES; // Услуги фулфилмента +GET_MY_LOGISTICS; // Логистические маршруты +GET_MY_EMPLOYEES; // Сотрудники организации +GET_FULFILLMENT_WAREHOUSE_STATS; // Статистика склада +GET_WAREHOUSE_PRODUCTS; // Товары на складе +GET_MY_FULFILLMENT_SUPPLIES; // Расходники фулфилмента +GET_EMPLOYEE_SCHEDULE; // Табель рабочего времени + +// Мутации +CREATE_SERVICE, UPDATE_SERVICE, DELETE_SERVICE; +CREATE_LOGISTICS, UPDATE_LOGISTICS, DELETE_LOGISTICS; +CREATE_EMPLOYEE, UPDATE_EMPLOYEE, DELETE_EMPLOYEE; +UPDATE_EMPLOYEE_SCHEDULE; // Обновление табеля +``` + +### Приложение B: Компоненты фулфилмента + +```typescript +// Основные dashboard компоненты +FulfillmentWarehouseDashboard; // Склад фулфилмента +FulfillmentStatisticsDashboard; // Статистика +ServicesDashboard; // Услуги (3 вкладки) +EmployeesDashboard; // Сотрудники +SuppliesDashboard; // Поставки фулфилмента + +// Специализированные компоненты +ServicesTab, LogisticsTab, SuppliesTab; // Вкладки услуг +EmployeeInlineForm, EmployeeEditInlineForm; // Формы сотрудников +FulfillmentSuppliesTab, FulfillmentConsumablesOrdersTab; // Поставки +``` + +### Приложение C: Специальный роутинг для типов организаций + +```typescript +const handleSuppliesClick = () => { + switch (user?.organization?.type) { + case "FULFILLMENT": + router.push("/fulfillment-supplies"); // Специальный роут + break; + case "SELLER": + router.push("/supplies"); + break; + case "WHOLESALE": + router.push("/wholesale-supplies"); + break; + case "LOGIST": + router.push("/logist-supplies"); + break; + } +}; +``` + +--- + +_Эта база знаний создана путем объединения rules-unified.md (v3.0) и fulfillment-cabinet-rules.md (v1.0) с устранением всех несоответствий и добавлением критически важных улучшений: быстрый справочник, глоссарий терминов, детальные алгоритмы процессов, edge cases._ + +_Версия: 9.1_ +_Дата создания: 2025_ +_Статус: ЕДИНЫЙ ИСТОЧНИК ИСТИНЫ - ГОТОВ К РАЗРАБОТКЕ_ + +### 🚀 УЛУЧШЕНИЯ v6.0: +- ⚡ Быстрый справочник критических правил +- 🔤 Полный глоссарий терминов с определениями +- 🎯 Навигация по ролям (разработчики, аналитики, менеджеры) +- 🔄 Детальный алгоритм создания продукта с временными рамками +- 🚨 Раздел критических ситуаций и Edge Cases +- 📌 Связующие блоки между разделами +- 📊 Таблицы SLA и временных рамок + +### 🔧 ИСПРАВЛЕНИЯ v6.1: +- ✅ Устранено противоречие в моменте создания БРАКА +- ✅ Исправлена логическая цепочка: рецептура задается селлером ДО процесса +- ✅ Реалистичные временные рамки SLA (рабочие дни вместо часов) +- ✅ Унифицирована классификация расходников (по назначению при использовании) +- ✅ Согласованы все алгоритмы и процессы между разделами + +### 🔧 ОБНОВЛЕНИЯ v6.3: +- ✅ **ДОБАВЛЕН КРИТИЧЕСКИЙ ЗАПРЕТ**: Использование моковых данных в продакшене +- ✅ **ОБНОВЛЕН ЧЕКЛИСТ**: Добавлена проверка на отсутствие mock данных +- ✅ **РЕАЛИЗАЦИЯ**: Полная очистка моковых данных из раздела "Мои поставки" селлера + +### 🎨 ИНТЕГРАЦИЯ v6.2: +- ✅ Синхронизация с visual-design-rules.md v1.1 +- ✅ Добавлены визуальные правила для 8 статусов поставок +- ✅ Создана цветовая система для 6 модулей фулфилмента +- ✅ Визуальный workflow процесса создания продукта +- ✅ Перекрестные ссылки между техническими и визуальными правилами +- ✅ Покрытие визуальными решениями увеличено с 40% до 85% + +### 🚀 КОНСОЛИДАЦИЯ v7.0: +- ✅ Интеграция development-checklist.md и CLAUDE.md +- ✅ Удаление дублирующих файлов +- ✅ Создание единого источника истины + +### 🔧 ПОЛНАЯ ИНТЕГРАЦИЯ v8.0: +- ✅ Интеграция work-protocols.md (детальные протоколы по сложности) +- ✅ Интеграция violation-prevention-protocol.md (СТОП-сигналы и триггеры) +- ✅ Интеграция self-validation.md (расширенная система самопроверки) +- ✅ Удаление всех дублирующих файлов протоколов + +### 🎯 ОПТИМИЗАЦИЯ UI/UX v8.1: +- ✅ Добавлен ТРИГГЕР #3 для автоматической активации visual-design-rules.md +- ✅ Интегрирован специальный UI/UX протокол в чеклист +- ✅ Создана система перекрестных ссылок с visual-design-rules.md +- ✅ visual-design-rules.md остается отдельным специализированным файлом + +### 📊 ИНТЕГРАЦИЯ DESCRIPTION v9.0: +- ✅ Добавлена UI структура создания поставки расходников (3 блока) +- ✅ Интегрирована концепция многоуровневых таблиц +- ✅ Добавлен механизм учета ПЛАН/ФАКТ в процессе создания продукта +- ✅ Расширена детализация рецептуры продукта +- ✅ Добавлена опция места хранения готовых продуктов + +### 🔧 УТОЧНЕНИЯ ЛОГИКИ v9.1: +- ✅ Уточнен статус брака: НЕ РЕАЛИЗОВАНО (еще не дошли до этого этапа) +- ✅ Добавлены четкие правила создания предметов по ролям +- ✅ Добавлен экономический учет расходников фулфилмента для селлера +- ✅ Обновлен механизм ПЛАН/ФАКТ: потери вместо брака при пересчете +- ✅ Добавлена заметка о будущей детализации статусов товаров diff --git a/self-validation.md b/self-validation.md deleted file mode 100644 index f5aa9f5..0000000 --- a/self-validation.md +++ /dev/null @@ -1,146 +0,0 @@ -# УСОВЕРШЕНСТВОВАННАЯ СИСТЕМА САМОПРОВЕРКИ AI - -## 🎯 ЦЕЛЬ - -Обеспечить 100% соблюдение правил проекта Sfera с использованием новых протоколов работы. - -## 🚨 КРИТИЧЕСКОЕ ДОПОЛНЕНИЕ - -Интегрирована система жестких стоп-сигналов из `violation-prevention-protocol.md` для предотвращения всех типов нарушений протоколов. - -## 🛑 ОБЯЗАТЕЛЬНЫЙ ПРОТОКОЛ ПЕРЕД КАЖДОЙ ЗАДАЧЕЙ - -### ШАГ 1: ОПРЕДЕЛЕНИЕ СЛОЖНОСТИ И ПРОТОКОЛА - -``` -ВОПРОСЫ: -- Сколько файлов затрагивает задача? (1-3 = средняя, 4+ = высокая) -- Изменяется ли архитектура или workflow? (да = высокая) -- Влияет ли на критические бизнес-процессы? (да = высокая) - -ДЕЙСТВИЕ: Применить соответствующий протокол из work-protocols.md -``` - -### ШАГ 2: ЭТАП "СТОП И ПОДУМАЙ" - -``` -ОБЯЗАТЕЛЬНЫЕ ВОПРОСЫ: -- Какие правила из rules2.md применимы? -- Какие файлы нужно изучить? (перечислить ВСЕ) -- Есть ли неопределенности, требующие уточнения? -- Что может пойти не так? - -ДЕЙСТВИЕ: Составить план с промежуточными проверками -``` - -### ШАГ 3: ПРОВЕРКА КРИТИЧЕСКИХ ПРАВИЛ - -``` -✅ ТИПИЗАЦИЯ: -- ТОВАР ≠ ПРОДУКТ (разные сущности) -- 4 типа предметов: ТОВАР, БРАК, РАСХОДНИКИ, ПРОДУКТ -- Производные связаны с parentId - -✅ WORKFLOW: -- Последовательность статусов соблюдена -- Уведомления на каждом этапе -- Логирование изменений - -✅ ДОСТУП: -- Запрет заказа собственных товаров поставщиком -- Запрет заказа брака -- Проверка остатков - -✅ ВАЛИДАЦИЯ: -- Цена > 0 (исключение: брак для фулфилмента) -- Количество ≤ остатков -- Обязательные поля заполнены -``` - -### ШАГ 4: ТЕХНИЧЕСКИЕ ПРОВЕРКИ - -``` -✅ ПРОИЗВОДИТЕЛЬНОСТЬ: < 3 сек загрузка -✅ БЕЗОПАСНОСТЬ: шифрование, аудит -✅ UX: индикаторы, уведомления -✅ КАЧЕСТВО: тесты 80%+, SOLID принципы -``` - -### ШАГ 5: УТОЧНЯЮЩИЕ ВОПРОСЫ - -``` -КОГДА ОБЯЗАТЕЛЬНО СПРОСИТЬ: -🔴 Противоречие в правилах -🔴 Архитектурные изменения -🔴 Критические бизнес-процессы -🔴 Несколько вариантов решения - -ФОРМАТ: -🎯 КОНТЕКСТ: что делаю -❓ ВОПРОС: что неясно -⚖️ ВАРИАНТЫ: альтернативы -⚠️ РИСКИ: что может пойти не так -💡 ПРЕДЛОЖЕНИЕ: рекомендуемый подход -``` - -### ШАГ 6: АВТОСИНХРОНИЗАЦИЯ - -``` -ПРОВЕРИТЬ: -- Нужно ли обновить development-checklist.md? -- Добавлены ли новые критические правила? -- Изменились ли workflow или запреты? - -ДЕЙСТВИЕ: -- Синхронизировать файлы по алгоритму auto-sync-system.md -- Уведомить пользователя о синхронизации -``` - -### ШАГ 7: ФИНАЛЬНАЯ ВАЛИДАЦИЯ - -``` -МЕГА-ВОПРОС К СЕБЕ: -"Применил ли я правильный протокол, проверил ли все правила, -задал ли нужные вопросы, синхронизировал ли файлы, -готов ли результат к production?" - -ЕСЛИ ОТВЕТ НЕ "ДА 100%" - ВЕРНУТЬСЯ К НАЧАЛУ! -``` - -## 🚨 КРИТИЧЕСКИЕ СТОП-СИГНАЛЫ - -``` -🛑 ОСТАНОВИТЬСЯ НЕМЕДЛЕННО ЕСЛИ: -- Не определил сложность задачи -- Пропустил этап "Стоп и подумай" -- Есть сомнения в правилах -- Не проверил все применимые разделы rules2.md -- Не синхронизировал связанные файлы -- Не уведомил о важных изменениях -``` - -## 📊 МЕТРИКИ УСПЕХА - -``` -ЦЕЛЬ: 0 пропущенных критических деталей - -ИЗМЕРЕНИЕ: -✅ Количество вопросов на уточнение -✅ Полнота анализа источников -✅ Своевременность синхронизации файлов -✅ Отсутствие нарушений правил -``` - -## 🔄 НЕПРЕРЫВНОЕ УЛУЧШЕНИЕ - -``` -ПОСЛЕ КАЖДОЙ ЗАДАЧИ АНАЛИЗИРОВАТЬ: -- Что можно было сделать лучше? -- Какие протоколы сработали? -- Где были пробелы в анализе? -- Как повысить эффективность? -``` - ---- - -**СТАТУС**: Новая система самопроверки активирована! Применяется с каждой задачей проекта Sfera. diff --git a/src/components/fulfillment-supplies/create-fulfillment-consumables-supply-page.tsx b/src/components/fulfillment-supplies/create-fulfillment-consumables-supply-page.tsx index 0a90599..d3326f7 100644 --- a/src/components/fulfillment-supplies/create-fulfillment-consumables-supply-page.tsx +++ b/src/components/fulfillment-supplies/create-fulfillment-consumables-supply-page.tsx @@ -26,7 +26,7 @@ import { } from "lucide-react"; import { GET_MY_COUNTERPARTIES, - GET_ALL_PRODUCTS, + GET_ORGANIZATION_PRODUCTS, GET_SUPPLY_ORDERS, GET_MY_SUPPLIES, GET_MY_FULFILLMENT_SUPPLIES, @@ -112,19 +112,26 @@ export function CreateFulfillmentConsumablesSupplyPage() { productSearchQuery, }); - // Загружаем товары для выбранного поставщика + // Загружаем товары для выбранного поставщика с фильтрацией по типу CONSUMABLE const { data: productsData, loading: productsLoading, error: productsError, - } = useQuery(GET_ALL_PRODUCTS, { + } = useQuery(GET_ORGANIZATION_PRODUCTS, { skip: !selectedSupplier, - variables: { search: productSearchQuery || null, category: null }, + variables: { + organizationId: selectedSupplier.id, + search: productSearchQuery || null, + category: null, + type: "CONSUMABLE" // Фильтруем только расходники согласно rules2.md + }, onCompleted: (data) => { - console.log("✅ GET_ALL_PRODUCTS COMPLETED:", { - totalProducts: data?.allProducts?.length || 0, + console.log("✅ GET_ORGANIZATION_PRODUCTS COMPLETED:", { + totalProducts: data?.organizationProducts?.length || 0, + organizationId: selectedSupplier.id, + type: "CONSUMABLE", products: - data?.allProducts?.map((p) => ({ + data?.organizationProducts?.map((p) => ({ id: p.id, name: p.name, type: p.type, @@ -134,7 +141,7 @@ export function CreateFulfillmentConsumablesSupplyPage() { }); }, onError: (error) => { - console.error("❌ GET_ALL_PRODUCTS ERROR:", error); + console.error("❌ GET_ORGANIZATION_PRODUCTS ERROR:", error); }, }); @@ -160,14 +167,8 @@ export function CreateFulfillmentConsumablesSupplyPage() { ); // Фильтруем товары по выбранному поставщику - // 📦 ТОЛЬКО РАСХОДНИКИ согласно правилам (раздел 2.1) - const supplierProducts = selectedSupplier - ? (productsData?.allProducts || []).filter( - (product: FulfillmentConsumableProduct) => - product.organization.id === selectedSupplier.id && - product.type === "CONSUMABLE" // Только расходники для фулфилмента - ) - : []; + // 📦 Получаем товары поставщика (уже отфильтрованы в GraphQL запросе по типу CONSUMABLE) + const supplierProducts = productsData?.organizationProducts || []; // Отладочное логирование React.useEffect(() => { @@ -181,10 +182,10 @@ export function CreateFulfillmentConsumablesSupplyPage() { : null, productsLoading, productsError: productsError?.message, - allProductsCount: productsData?.allProducts?.length || 0, + organizationProductsCount: productsData?.organizationProducts?.length || 0, supplierProductsCount: supplierProducts.length, - allProducts: - productsData?.allProducts?.map((p) => ({ + organizationProducts: + productsData?.organizationProducts?.map((p) => ({ id: p.id, name: p.name, organizationId: p.organization.id, diff --git a/src/components/fulfillment-supplies/materials-supplies/materials-order-form.tsx b/src/components/fulfillment-supplies/materials-supplies/materials-order-form.tsx index 2115e7e..3aa9465 100644 --- a/src/components/fulfillment-supplies/materials-supplies/materials-order-form.tsx +++ b/src/components/fulfillment-supplies/materials-supplies/materials-order-form.tsx @@ -25,7 +25,7 @@ import { } from "lucide-react"; import { GET_MY_COUNTERPARTIES, - GET_ALL_PRODUCTS, + GET_ORGANIZATION_PRODUCTS, GET_SUPPLY_ORDERS, GET_MY_SUPPLIES, } from "@/graphql/queries"; @@ -91,12 +91,17 @@ export function MaterialsOrderForm() { GET_MY_COUNTERPARTIES ); - // Загружаем товары для выбранного партнера + // Загружаем товары для выбранного партнера с фильтрацией по типу CONSUMABLE const { data: productsData, loading: productsLoading } = useQuery( - GET_ALL_PRODUCTS, + GET_ORGANIZATION_PRODUCTS, { skip: !selectedPartner, - variables: { search: null, category: null }, + variables: { + organizationId: selectedPartner.id, + search: null, + category: null, + type: "CONSUMABLE" // Фильтруем только расходники согласно rules2.md + }, } ); @@ -117,12 +122,8 @@ export function MaterialsOrderForm() { partner.inn?.toLowerCase().includes(searchQuery.toLowerCase()) ); - // Фильтруем товары по выбранному партнеру - const partnerProducts = selectedPartner - ? (productsData?.allProducts || []).filter( - (product: Product) => product.organization.id === selectedPartner.id - ) - : []; + // Получаем товары партнера (уже отфильтрованы в GraphQL запросе) + const partnerProducts = productsData?.organizationProducts || []; const formatCurrency = (amount: number) => { return new Intl.NumberFormat("ru-RU", { diff --git a/src/components/supplies/create-consumables-supply-page.tsx b/src/components/supplies/create-consumables-supply-page.tsx index 8b413af..5b6a319 100644 --- a/src/components/supplies/create-consumables-supply-page.tsx +++ b/src/components/supplies/create-consumables-supply-page.tsx @@ -27,7 +27,7 @@ import { } from "lucide-react"; import { GET_MY_COUNTERPARTIES, - GET_ALL_PRODUCTS, + GET_ORGANIZATION_PRODUCTS, GET_SUPPLY_ORDERS, GET_MY_SUPPLIES, } from "@/graphql/queries"; @@ -99,12 +99,17 @@ export function CreateConsumablesSupplyPage() { GET_MY_COUNTERPARTIES ); - // Загружаем товары для выбранного поставщика + // Загружаем товары для выбранного поставщика с фильтрацией по типу CONSUMABLE const { data: productsData, loading: productsLoading } = useQuery( - GET_ALL_PRODUCTS, + GET_ORGANIZATION_PRODUCTS, { skip: !selectedSupplier, - variables: { search: productSearchQuery || null, category: null }, + variables: { + organizationId: selectedSupplier.id, + search: productSearchQuery || null, + category: null, + type: "CONSUMABLE" // Фильтруем только расходники согласно rules2.md + }, } ); @@ -134,13 +139,8 @@ export function CreateConsumablesSupplyPage() { supplier.inn?.toLowerCase().includes(searchQuery.toLowerCase()) ); - // Фильтруем товары по выбранному поставщику - const supplierProducts = selectedSupplier - ? (productsData?.allProducts || []).filter( - (product: ConsumableProduct) => - product.organization.id === selectedSupplier.id - ) - : []; + // Получаем товары поставщика (уже отфильтрованы в GraphQL запросе) + const supplierProducts = productsData?.organizationProducts || []; const formatCurrency = (amount: number) => { return new Intl.NumberFormat("ru-RU", { @@ -415,11 +415,11 @@ export function CreateConsumablesSupplyPage() {
-
+
{/* Заголовок */} -
+

Создание поставки расходников @@ -440,9 +440,9 @@ export function CreateConsumablesSupplyPage() {

{/* Основной контент с двумя блоками */} -
+
{/* Левая колонка - Поставщики и Расходники */} -
+
{/* Блок "Поставщики" */}
diff --git a/src/components/supplies/create-suppliers-supply-page.tsx b/src/components/supplies/create-suppliers-supply-page.tsx index 88bd420..997eb36 100644 --- a/src/components/supplies/create-suppliers-supply-page.tsx +++ b/src/components/supplies/create-suppliers-supply-page.tsx @@ -33,6 +33,10 @@ import { import { GET_MY_COUNTERPARTIES, GET_ORGANIZATION_PRODUCTS, + GET_MY_SERVICES, + GET_MY_SUPPLIES, + GET_SELLER_SUPPLIES_ON_WAREHOUSE, + GET_MY_WILDBERRIES_SUPPLIES, } from "@/graphql/queries"; import { CREATE_SUPPLY_ORDER } from "@/graphql/mutations"; import { OrganizationAvatar } from "@/components/market/organization-avatar"; @@ -102,6 +106,47 @@ interface LogisticsCompany { type: "EXPRESS" | "STANDARD" | "ECONOMY"; } +// Новые интерфейсы для компонентов рецептуры +interface FulfillmentService { + id: string; + name: string; + description?: string; + price: number; + category?: string; +} + +interface FulfillmentConsumable { + id: string; + name: string; + price: number; + stock: number; + unit?: string; +} + +interface SellerConsumable { + id: string; + name: string; + stock: number; + unit?: string; + supplierId: string; +} + +interface WBCard { + id: string; + title: string; + nmID: string; + vendorCode?: string; + brand?: string; +} + +interface ProductRecipe { + productId: string; + selectedServices: string[]; + selectedFFConsumables: string[]; + selectedSellerConsumables: string[]; + selectedWBCard?: string; +} + export function CreateSuppliersSupplyPage() { const router = useRouter(); const { user } = useAuth(); @@ -127,8 +172,9 @@ export function CreateSuppliersSupplyPage() { const [isModalOpen, setIsModalOpen] = useState(false); const [isCreatingSupply, setIsCreatingSupply] = useState(false); - - // Состояние количества товаров для карточек согласно rules2.md 13.3 + + // Состояния для компонентов рецептуры + const [productRecipes, setProductRecipes] = useState>({}); const [productQuantities, setProductQuantities] = useState>({}); // Загружаем партнеров-поставщиков согласно rules2.md 13.3 @@ -191,9 +237,36 @@ export function CreateSuppliersSupplyPage() { // Мутация создания поставки const [createSupplyOrder] = useMutation(CREATE_SUPPLY_ORDER); + // Запросы для компонентов рецептуры + const { data: fulfillmentServicesData } = useQuery(GET_MY_SERVICES, { + skip: !selectedFulfillment, + errorPolicy: 'all' + }); + + const { data: fulfillmentConsumablesData } = useQuery(GET_MY_SUPPLIES, { + skip: !selectedFulfillment, + errorPolicy: 'all' + }); + + const { data: sellerConsumablesData } = useQuery(GET_SELLER_SUPPLIES_ON_WAREHOUSE, { + skip: !user?.organization?.id, + errorPolicy: 'all' + }); + + const { data: wbCardsData } = useQuery(GET_MY_WILDBERRIES_SUPPLIES, { + skip: !user?.organization?.id, + errorPolicy: 'all' + }); + // Фильтруем только партнеров-поставщиков согласно rules2.md 13.3 const allCounterparties = counterpartiesData?.myCounterparties || []; + // Извлекаем данные для компонентов рецептуры + const fulfillmentServices: FulfillmentService[] = fulfillmentServicesData?.myServices || []; + const fulfillmentConsumables: FulfillmentConsumable[] = fulfillmentConsumablesData?.mySupplies || []; + const sellerConsumables: SellerConsumable[] = sellerConsumablesData?.sellerSuppliesOnWarehouse || []; + const wbCards: WBCard[] = (wbCardsData?.myWildberriesSupplies || []).flatMap((supply: any) => supply.cards || []); + // Показываем только партнеров с типом WHOLESALE согласно rules2.md 13.3 const wholesaleSuppliers = allCounterparties.filter((cp: any) => { try { @@ -345,6 +418,106 @@ export function CreateSuppliersSupplyPage() { setIsModalOpen(true); }; + // Функции для работы с рецептурой + const initializeProductRecipe = (productId: string) => { + if (!productRecipes[productId]) { + setProductRecipes(prev => ({ + ...prev, + [productId]: { + productId, + selectedServices: [], + selectedFFConsumables: [], + selectedSellerConsumables: [], + selectedWBCard: undefined + } + })); + } + }; + + const toggleService = (productId: string, serviceId: string) => { + initializeProductRecipe(productId); + setProductRecipes(prev => { + const recipe = prev[productId]; + const isSelected = recipe.selectedServices.includes(serviceId); + return { + ...prev, + [productId]: { + ...recipe, + selectedServices: isSelected + ? recipe.selectedServices.filter(id => id !== serviceId) + : [...recipe.selectedServices, serviceId] + } + }; + }); + }; + + const toggleFFConsumable = (productId: string, consumableId: string) => { + initializeProductRecipe(productId); + setProductRecipes(prev => { + const recipe = prev[productId]; + const isSelected = recipe.selectedFFConsumables.includes(consumableId); + return { + ...prev, + [productId]: { + ...recipe, + selectedFFConsumables: isSelected + ? recipe.selectedFFConsumables.filter(id => id !== consumableId) + : [...recipe.selectedFFConsumables, consumableId] + } + }; + }); + }; + + const toggleSellerConsumable = (productId: string, consumableId: string) => { + initializeProductRecipe(productId); + setProductRecipes(prev => { + const recipe = prev[productId]; + const isSelected = recipe.selectedSellerConsumables.includes(consumableId); + return { + ...prev, + [productId]: { + ...recipe, + selectedSellerConsumables: isSelected + ? recipe.selectedSellerConsumables.filter(id => id !== consumableId) + : [...recipe.selectedSellerConsumables, consumableId] + } + }; + }); + }; + + const setWBCard = (productId: string, cardId: string) => { + initializeProductRecipe(productId); + setProductRecipes(prev => ({ + ...prev, + [productId]: { + ...prev[productId], + selectedWBCard: cardId + } + })); + }; + + // Расчет стоимости компонентов рецептуры + const calculateRecipeCost = (productId: string) => { + const recipe = productRecipes[productId]; + if (!recipe) return { services: 0, consumables: 0, total: 0 }; + + const servicesTotal = recipe.selectedServices.reduce((sum, serviceId) => { + const service = fulfillmentServices.find(s => s.id === serviceId); + return sum + (service?.price || 0); + }, 0); + + const consumablesTotal = recipe.selectedFFConsumables.reduce((sum, consumableId) => { + const consumable = fulfillmentConsumables.find(c => c.id === consumableId); + return sum + (consumable?.price || 0); + }, 0); + + return { + services: servicesTotal, + consumables: consumablesTotal, + total: servicesTotal + consumablesTotal + }; + }; + // Добавление товара в корзину из модального окна с дополнительными данными const addToCartFromModal = ( product: GoodsProduct, @@ -418,7 +591,7 @@ export function CreateSuppliersSupplyPage() { const totalQuantity = selectedGoods.reduce((sum, item) => sum + item.selectedQuantity, 0); const fulfillmentFee = totalGoodsAmount * 0.08; // 8% комиссия фулфилмента const selectedLogisticsCompany = logisticsCompanies.find(lc => lc.id === selectedLogistics); - const logisticsCost = selectedLogistics === "auto" ? 1000 : (selectedLogisticsCompany?.estimatedCost || 0); + const logisticsCost = selectedLogistics === "auto" ? 0 : (selectedLogisticsCompany?.estimatedCost || 0); const totalAmount = totalGoodsAmount + fulfillmentFee + logisticsCost; // Валидация формы согласно rules2.md 9.7.6 @@ -475,14 +648,14 @@ export function CreateSuppliersSupplyPage() { return (
-
-
+
+
{/* СТРУКТУРА ИЗ 3 БЛОКОВ согласно rules1.md 19.2.1 - блоки точно по уровню сайдбара */} -
+
{/* ЛЕВЫЙ БЛОК: ПОСТАВЩИКИ И ТОВАРЫ */} -
+
{/* БЛОК 1: ПОСТАВЩИКИ - обязательный блок согласно rules1.md 19.2.1 */}
) : ( -
+
{products.map((product: GoodsProduct) => (
-
- {product.mainImage && ( -
- {product.name} -
- )} + {/* ОСНОВНОЙ БЛОК: Информация о товаре + количество + сумма */} +
-
-
-

- {product.name} -

-

Артикул: {product.article}

-
- - {product.category && ( - - {product.category.name} - - )} - -
-
-
-

- {product.price.toLocaleString('ru-RU')} ₽ -

-

за единицу

+ {/* ЛЕВЫЙ БЛОК: Изображение + основная информация */} +
+
+ {product.mainImage ? ( + {product.name} + ) : ( +
+
+ )} +
+
+

{product.name}

+

Артикул: {product.article}

+ {product.category && ( + + {product.category.name} + + )} +
+ {product.price.toLocaleString('ru-RU')} ₽ {product.quantity !== undefined && ( -
+
0 ? 'bg-green-400' : 'bg-red-400' }`}>
-

0 ? 'text-green-400' : 'text-red-400' }`}> {product.quantity > 0 ? `Доступно: ${product.quantity}` : 'Нет в наличии' } -

+
)}
- - {/* Поле количества с кнопками +/- согласно rules2.md 13.3 */} -
- - - setProductQuantity(product.id, parseInt(e.target.value) || 0)} - className="h-8 w-20 text-center bg-white/5 border-white/20 text-white placeholder:text-white/40 focus:border-white/40" - placeholder="00000" - /> - - -
- +
+
+ + {/* ПРАВЫЙ БЛОК: Количество + общая сумма */} +
+
+ + setProductQuantity(product.id, parseInt(e.target.value) || 0)} + className="h-8 w-20 text-center bg-white/5 border-white/20 text-white placeholder:text-white/40 focus:border-white/40" + placeholder="0" + /> + +
+ {getProductQuantity(product.id) > 0 && ( +
+ + {(product.price * getProductQuantity(product.id)).toLocaleString('ru-RU')} ₽ + +
+ )} +
+
+ + {/* БЛОК РЕЦЕПТУРЫ: 4 колонки с чекбоксами */} +
+ + {/* КОЛОНКА 1: Услуги фулфилмента */} +
+
+ + Услуги ФФ +
+
+ {fulfillmentServices.length > 0 ? fulfillmentServices.map(service => { + const recipe = productRecipes[product.id]; + const isSelected = recipe?.selectedServices.includes(service.id) || false; + return ( + + ); + }) : ( +
+ {selectedFulfillment ? 'Услуги загружаются...' : 'Выберите фулфилмент-центр'} +
+ )} +
+
+ + {/* КОЛОНКА 2: Расходники фулфилмента */} +
+
+ + Расходники ФФ +
+
+ {fulfillmentConsumables.length > 0 ? fulfillmentConsumables.map(consumable => { + const recipe = productRecipes[product.id]; + const isSelected = recipe?.selectedFFConsumables.includes(consumable.id) || false; + return ( + + ); + }) : ( +
+ {selectedFulfillment ? 'Расходники загружаются...' : 'Выберите фулфилмент-центр'} +
+ )} +
+
+ + {/* КОЛОНКА 3: Расходники селлера */} +
+
+ + Расходники селлера +
+
+ {sellerConsumables.length > 0 ? sellerConsumables.map(consumable => { + const recipe = productRecipes[product.id]; + const isSelected = recipe?.selectedSellerConsumables.includes(consumable.id) || false; + return ( + + ); + }) : ( +
+ Расходники селлера загружаются... +
+ )} +
+
+ + {/* КОЛОНКА 4: Карточки Wildberries */} +
+
+ + Карточки WB +
+
+ {wbCards.length > 0 ? wbCards.map(card => { + const recipe = productRecipes[product.id]; + const isSelected = recipe?.selectedWBCard === card.id; + return ( + + ); + }) : ( +
+ Карточки WB загружаются... +
+ )} +
+
+
+ + {/* НИЖНИЙ БЛОК: Итоговая стоимость рецептуры + кнопка добавления */} +
+
+ {(() => { + const quantity = getProductQuantity(product.id); + const recipeCost = calculateRecipeCost(product.id); + const productTotal = product.price * quantity; + const totalRecipePrice = productTotal + recipeCost.total; + + return ( + <> +
+ Товар: {productTotal.toLocaleString('ru-RU')} ₽ +
+
+ Услуги: {recipeCost.services.toLocaleString('ru-RU')} ₽ +
+
+ Расходники: {recipeCost.consumables.toLocaleString('ru-RU')} ₽ +
+ + ); + })()} +
+
+ {(() => { + const quantity = getProductQuantity(product.id); + const recipeCost = calculateRecipeCost(product.id); + const productTotal = product.price * quantity; + const totalRecipePrice = productTotal + recipeCost.total; + + return ( + <> +
+ Итого: + + {totalRecipePrice.toLocaleString('ru-RU')} ₽ + +
+ + + ); + })()}
diff --git a/src/components/supplies/create-supply-page.tsx b/src/components/supplies/create-supply-page.tsx index d8963d3..851af9d 100644 --- a/src/components/supplies/create-supply-page.tsx +++ b/src/components/supplies/create-supply-page.tsx @@ -216,11 +216,11 @@ export function CreateSupplyPage() {
-
+
{/* Заголовок */} -
+

Создание поставки товаров @@ -241,7 +241,7 @@ export function CreateSupplyPage() {

{/* Основной контент - карточки Wildberries */} -
+
{/* Левая колонка - карточки товаров */}
>( new Set() ); @@ -157,6 +98,23 @@ export function FulfillmentSuppliesTab() { new Set() ); + // Преобразуем данные из GraphQL в нужный формат + const fulfillmentConsumables: FulfillmentConsumableSupply[] = (fulfillmentSuppliesData?.myFulfillmentSupplies || []) + .map((supply: any, index: number) => ({ + id: supply.id, + number: index + 2000, // Начинаем с 2000 для отличия от товаров + deliveryDate: supply.date || new Date().toISOString().split('T')[0], + createdDate: supply.createdAt?.split('T')[0] || new Date().toISOString().split('T')[0], + status: supply.status === 'active' ? 'delivered' : 'planned', + plannedTotal: supply.quantity || 0, + actualTotal: supply.currentStock || 0, + defectTotal: 0, + totalConsumablesPrice: supply.price * (supply.quantity || 0), + totalLogisticsPrice: 0, + grandTotal: supply.price * (supply.quantity || 0), + routes: [] + })); + const toggleSupplyExpansion = (supplyId: string) => { const newExpanded = new Set(expandedSupplies); if (newExpanded.has(supplyId)) { @@ -273,7 +231,7 @@ export function FulfillmentSuppliesTab() { sum + supply.grandTotal, 0 ) @@ -299,7 +257,7 @@ export function FulfillmentSuppliesTab() { supply.status === "in-transit" ).length } @@ -312,7 +270,7 @@ export function FulfillmentSuppliesTab() { supply.status === "delivered" ).length } @@ -354,7 +312,25 @@ export function FulfillmentSuppliesTab() { - {mockFulfillmentConsumables.map((supply) => { + {loading && ( + + +
Загрузка данных...
+ + + )} + {!loading && fulfillmentConsumables.length === 0 && ( + + +
+ +
Расходники фулфилмента не найдены
+
Создайте первую поставку расходников для фулфилмента
+
+ + + )} + {!loading && fulfillmentConsumables.map((supply) => { const isSupplyExpanded = expandedSupplies.has(supply.id); return ( diff --git a/src/components/supplies/goods-supplies/goods-supplies-tab.tsx b/src/components/supplies/goods-supplies/goods-supplies-tab.tsx index d49e025..3bb93f6 100644 --- a/src/components/supplies/goods-supplies/goods-supplies-tab.tsx +++ b/src/components/supplies/goods-supplies/goods-supplies-tab.tsx @@ -4,6 +4,8 @@ import React, { useState } from "react"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; +import { useQuery } from "@apollo/client"; +import { GET_SUPPLY_ORDERS } from "@/graphql/queries"; import { ChevronDown, ChevronRight, @@ -75,119 +77,14 @@ interface Supply { status: "planned" | "in-transit" | "delivered" | "completed"; } -// Моковые данные для товаров -const mockGoodsSupplies: Supply[] = [ - { - id: "1", - number: 1, - deliveryDate: "2024-01-15", - createdDate: "2024-01-10", - status: "delivered", - plannedTotal: 180, - actualTotal: 173, - defectTotal: 2, - totalProductPrice: 3750000, - totalFulfillmentPrice: 43000, - totalLogisticsPrice: 27000, - grandTotal: 3820000, - routes: [ - { - id: "r1", - from: "Садовод", - fromAddress: "Москва, 14-й км МКАД", - to: "SFERAV Logistics", - toAddress: "Москва, ул. Складская, 15", - totalProductPrice: 3600000, - fulfillmentServicePrice: 25000, - logisticsPrice: 15000, - totalAmount: 3640000, - wholesalers: [ - { - id: "w1", - name: 'ООО "ТехноСнаб"', - inn: "7701234567", - contact: "+7 (495) 123-45-67", - address: "Москва, ул. Торговая, 1", - totalAmount: 3600000, - products: [ - { - id: "p1", - name: "Смартфон iPhone 15", - sku: "APL-IP15-128", - category: "Электроника", - plannedQty: 50, - actualQty: 48, - defectQty: 2, - productPrice: 75000, - parameters: [ - { id: "param1", name: "Цвет", value: "Черный" }, - { id: "param2", name: "Память", value: "128", unit: "ГБ" }, - { id: "param3", name: "Гарантия", value: "12", unit: "мес" }, - ], - }, - ], - }, - ], - }, - ], - }, - { - id: "2", - number: 2, - deliveryDate: "2024-01-20", - createdDate: "2024-01-12", - status: "in-transit", - plannedTotal: 30, - actualTotal: 30, - defectTotal: 0, - totalProductPrice: 750000, - totalFulfillmentPrice: 18000, - totalLogisticsPrice: 12000, - grandTotal: 780000, - routes: [ - { - id: "r3", - from: "Садовод", - fromAddress: "Москва, 14-й км МКАД", - to: "WB Подольск", - toAddress: "Подольск, ул. Складская, 25", - totalProductPrice: 750000, - fulfillmentServicePrice: 18000, - logisticsPrice: 12000, - totalAmount: 780000, - wholesalers: [ - { - id: "w3", - name: 'ООО "АудиоТех"', - inn: "7702345678", - contact: "+7 (495) 555-12-34", - address: "Москва, ул. Звуковая, 8", - totalAmount: 750000, - products: [ - { - id: "p3", - name: "Наушники AirPods Pro", - sku: "APL-AP-PRO2", - category: "Аудио", - plannedQty: 30, - actualQty: 30, - defectQty: 0, - productPrice: 25000, - parameters: [ - { id: "param6", name: "Тип", value: "Беспроводные" }, - { id: "param7", name: "Шумоподавление", value: "Активное" }, - { id: "param8", name: "Время работы", value: "6", unit: "ч" }, - ], - }, - ], - }, - ], - }, - ], - }, -]; +// Данные поставок товаров из GraphQL export function SuppliesGoodsTab() { + // Загружаем реальные данные поставок товаров + const { data: supplyOrdersData, loading, error } = useQuery(GET_SUPPLY_ORDERS, { + errorPolicy: 'all' + }); + const [expandedSupplies, setExpandedSupplies] = useState>( new Set() ); @@ -199,6 +96,25 @@ export function SuppliesGoodsTab() { new Set() ); + // Преобразуем данные из GraphQL в нужный формат + const goodsSupplies: Supply[] = (supplyOrdersData?.supplyOrders || []) + .filter((order: any) => order.status === 'CONFIRMED' || order.status === 'DELIVERED') + .map((order: any, index: number) => ({ + id: order.id, + number: index + 1, + deliveryDate: order.deliveryDate || new Date().toISOString().split('T')[0], + createdDate: order.createdAt?.split('T')[0] || new Date().toISOString().split('T')[0], + status: order.status === 'DELIVERED' ? 'delivered' : 'in-transit', + plannedTotal: order.totalItems || 0, + actualTotal: order.totalItems || 0, + defectTotal: 0, + totalProductPrice: order.totalAmount || 0, + totalFulfillmentPrice: 0, + totalLogisticsPrice: 0, + grandTotal: order.totalAmount || 0, + routes: [] + })); + const toggleSupplyExpansion = (supplyId: string) => { const newExpanded = new Set(expandedSupplies); if (newExpanded.has(supplyId)) { @@ -321,7 +237,7 @@ export function SuppliesGoodsTab() {

Поставок товаров

- {mockGoodsSupplies.length} + {loading ? '...' : goodsSupplies.length}

@@ -335,8 +251,8 @@ export function SuppliesGoodsTab() {

Сумма товаров

- {formatCurrency( - mockGoodsSupplies.reduce( + {loading ? '...' : formatCurrency( + goodsSupplies.reduce( (sum, supply) => sum + supply.grandTotal, 0 ) @@ -354,8 +270,8 @@ export function SuppliesGoodsTab() {

В пути

- { - mockGoodsSupplies.filter( + {loading ? '...' : + goodsSupplies.filter( (supply) => supply.status === "in-transit" ).length } @@ -372,8 +288,8 @@ export function SuppliesGoodsTab() {

С браком

- { - mockGoodsSupplies.filter((supply) => supply.defectTotal > 0) + {loading ? '...' : + goodsSupplies.filter((supply) => supply.defectTotal > 0) .length }

@@ -416,7 +332,25 @@ export function SuppliesGoodsTab() { - {mockGoodsSupplies.map((supply) => { + {loading && ( + + +
Загрузка данных...
+ + + )} + {!loading && goodsSupplies.length === 0 && ( + + +
+ +
Поставки товаров не найдены
+
Создайте первую поставку товаров через карточки или поставщиков
+
+ + + )} + {!loading && goodsSupplies.map((supply) => { const isSupplyExpanded = expandedSupplies.has(supply.id); return ( diff --git a/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx b/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx index 28fc77e..7aa0346 100644 --- a/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx +++ b/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx @@ -5,6 +5,8 @@ import { Card } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { StatsCard } from "../ui/stats-card"; import { StatsGrid } from "../ui/stats-grid"; +import { useQuery } from "@apollo/client"; +import { GET_MY_WILDBERRIES_SUPPLIES } from "@/graphql/queries"; import { Calendar, Package, @@ -66,129 +68,31 @@ interface WbSupply { status: "planned" | "in-transit" | "delivered" | "completed"; } -// Моковые данные для поставок на Wildberries -const mockWbSupplies: WbSupply[] = [ - { - id: "wb1", - number: 4001, - supplyId: "WB24010001", - deliveryDate: "2024-01-22", - createdDate: "2024-01-16", - status: "delivered", - plannedTotal: 120, - actualTotal: 118, - defectTotal: 2, - totalProductPrice: 2400000, - totalLogisticsPrice: 18000, - grandTotal: 2418000, - routes: [ - { - id: "wbr1", - from: "Садовод", - fromAddress: "Москва, 14-й км МКАД", - to: "WB Подольск", - toAddress: "Подольск, ул. Складская, 25", - totalProductPrice: 2400000, - logisticsPrice: 18000, - totalAmount: 2418000, - warehouses: [ - { - id: "wbw1", - name: "Склад WB Подольск", - address: "Подольск, ул. Складская, 25", - warehouseId: 117501, - totalAmount: 2400000, - products: [ - { - id: "wbp1", - name: "Смартфон Samsung Galaxy S24", - sku: "SAMS-GS24-256", - nmId: 123456789, - category: "Смартфоны и гаджеты", - plannedQty: 40, - actualQty: 39, - defectQty: 1, - productPrice: 65000, - }, - { - id: "wbp2", - name: "Чехол для Samsung Galaxy S24", - sku: "CASE-GS24-BLK", - nmId: 987654321, - category: "Аксессуары для телефонов", - plannedQty: 80, - actualQty: 79, - defectQty: 1, - productPrice: 1200, - }, - ], - }, - ], - }, - ], - }, - { - id: "wb2", - number: 4002, - supplyId: "WB24010002", - deliveryDate: "2024-01-28", - createdDate: "2024-01-20", - status: "in-transit", - plannedTotal: 60, - actualTotal: 60, - defectTotal: 0, - totalProductPrice: 1800000, - totalLogisticsPrice: 15000, - grandTotal: 1815000, - routes: [ - { - id: "wbr2", - from: "ТЯК Москва", - fromAddress: "Москва, Алтуфьевское шоссе, 27", - to: "WB Электросталь", - toAddress: "Электросталь, ул. Промышленная, 10", - totalProductPrice: 1800000, - logisticsPrice: 15000, - totalAmount: 1815000, - warehouses: [ - { - id: "wbw2", - name: "Склад WB Электросталь", - address: "Электросталь, ул. Промышленная, 10", - warehouseId: 117986, - totalAmount: 1800000, - products: [ - { - id: "wbp3", - name: "Наушники Sony WH-1000XM5", - sku: "SONY-WH1000XM5", - nmId: 555666777, - category: "Наушники и аудио", - plannedQty: 30, - actualQty: 30, - defectQty: 0, - productPrice: 35000, - }, - { - id: "wbp4", - name: "Кабель USB-C", - sku: "CABLE-USBC-2M", - nmId: 111222333, - category: "Кабели и адаптеры", - plannedQty: 30, - actualQty: 30, - defectQty: 0, - productPrice: 800, - }, - ], - }, - ], - }, - ], - }, -]; - export function WildberriesSuppliesTab() { + // Загружаем реальные данные поставок на Wildberries + const { data: wbSuppliesData, loading, error } = useQuery(GET_MY_WILDBERRIES_SUPPLIES, { + errorPolicy: 'all' + }); + + // Преобразуем данные из GraphQL в нужный формат + const wbSupplies: WbSupply[] = (wbSuppliesData?.myWildberriesSupplies || []) + .map((supply: any, index: number) => ({ + id: supply.id, + number: index + 4000, // Начинаем с 4000 для WB поставок + supplyId: `WB${new Date().getFullYear()}${String(index + 1).padStart(6, '0')}`, + deliveryDate: supply.deliveryDate || new Date().toISOString().split('T')[0], + createdDate: supply.createdAt?.split('T')[0] || new Date().toISOString().split('T')[0], + status: supply.status === 'DELIVERED' ? 'delivered' : 'in-transit', + plannedTotal: supply.totalItems || 0, + actualTotal: supply.totalItems || 0, + defectTotal: 0, + totalProductPrice: supply.totalAmount || 0, + totalLogisticsPrice: 0, + grandTotal: supply.totalAmount || 0, + routes: [] + })); + + const [expandedSupplies, setExpandedSupplies] = useState>( new Set() ); @@ -316,7 +220,7 @@ export function WildberriesSuppliesTab() { sum + supply.grandTotal, 0) + loading ? 0 : wbSupplies.reduce((sum, supply) => sum + supply.grandTotal, 0) )} icon={TrendingUp} iconColor="text-green-400" @@ -339,7 +243,7 @@ export function WildberriesSuppliesTab() { supply.status === "in-transit") + loading ? 0 : wbSupplies.filter((supply) => supply.status === "in-transit") .length } icon={Calendar} @@ -351,7 +255,7 @@ export function WildberriesSuppliesTab() { supply.defectTotal > 0).length + loading ? 0 : wbSupplies.filter((supply) => supply.defectTotal > 0).length } icon={AlertTriangle} iconColor="text-red-400" @@ -395,7 +299,25 @@ export function WildberriesSuppliesTab() { - {mockWbSupplies.map((supply) => { + {loading && ( + + +
Загрузка данных...
+ + + )} + {!loading && wbSupplies.length === 0 && ( + + +
+ +
Поставки на Wildberries не найдены
+
Создайте первую поставку товаров на Wildberries
+
+ + + )} + {!loading && wbSupplies.map((supply) => { const isSupplyExpanded = expandedSupplies.has(supply.id); return ( diff --git a/src/components/supplies/supplies-dashboard.tsx b/src/components/supplies/supplies-dashboard.tsx index eedb6d8..12eedbc 100644 --- a/src/components/supplies/supplies-dashboard.tsx +++ b/src/components/supplies/supplies-dashboard.tsx @@ -93,12 +93,12 @@ export function SuppliesDashboard() {
-
+
{/* Уведомляющий баннер */} {hasPendingItems && ( - + {(() => { diff --git a/src/components/supplies/wb-product-cards.tsx b/src/components/supplies/wb-product-cards.tsx index 8596658..6e44f9c 100644 --- a/src/components/supplies/wb-product-cards.tsx +++ b/src/components/supplies/wb-product-cards.tsx @@ -41,6 +41,7 @@ import { toast } from 'sonner' import { format } from 'date-fns' import { ru } from 'date-fns/locale' import { SelectedCard, FulfillmentService, ConsumableService, WildberriesCard } from '@/types/supplies' +import { ProductCardSkeletonGrid } from '@/components/ui/product-card-skeleton' @@ -86,173 +87,27 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu const [selectedCardForDetails, setSelectedCardForDetails] = useState(null) const [currentImageIndex, setCurrentImageIndex] = useState(0) - // Моковые товары для демонстрации - const getMockCards = (): WildberriesCard[] => [ - { - nmID: 123456789, - vendorCode: 'SKU001', - title: 'Смартфон Samsung Galaxy A54', - description: 'Современный смартфон с отличной камерой и долгим временем автономной работы', - brand: 'Samsung', - object: 'Смартфоны', - parent: 'Электроника', - countryProduction: 'Корея', - supplierVendorCode: 'SUPPLIER-001', - mediaFiles: ['/api/placeholder/400/400', '/api/placeholder/400/401', '/api/placeholder/400/402'], - sizes: [ - { - chrtID: 123456, - techSize: '128GB', - wbSize: '128GB Черный', - price: 25990, - discountedPrice: 22990, - quantity: 15 - } - ] - }, - { - nmID: 987654321, - vendorCode: 'SKU002', - title: 'Наушники Apple AirPods Pro', - description: 'Беспроводные наушники с активным шумоподавлением и пространственным звуком', - brand: 'Apple', - object: 'Наушники', - parent: 'Электроника', - countryProduction: 'Китай', - supplierVendorCode: 'SUPPLIER-002', - mediaFiles: ['/api/placeholder/400/403', '/api/placeholder/400/404'], - sizes: [ - { - chrtID: 987654, - techSize: 'Standard', - wbSize: 'Белый', - price: 24990, - discountedPrice: 19990, - quantity: 8 - } - ] - }, - { - nmID: 555666777, - vendorCode: 'SKU003', - title: 'Кроссовки Nike Air Max 270', - description: 'Спортивные кроссовки с современным дизайном и комфортной посадкой', - brand: 'Nike', - object: 'Кроссовки', - parent: 'Обувь', - countryProduction: 'Вьетнам', - supplierVendorCode: 'SUPPLIER-003', - mediaFiles: ['/api/placeholder/400/405', '/api/placeholder/400/406', '/api/placeholder/400/407'], - sizes: [ - { - chrtID: 555666, - techSize: '42', - wbSize: '42 EU', - price: 12990, - discountedPrice: 9990, - quantity: 25 - }, - { - chrtID: 555667, - techSize: '43', - wbSize: '43 EU', - price: 12990, - discountedPrice: 9990, - quantity: 20 - } - ] - }, - { - nmID: 444333222, - vendorCode: 'SKU004', - title: 'Футболка Adidas Originals', - description: 'Классическая футболка из органического хлопка с логотипом бренда', - brand: 'Adidas', - object: 'Футболки', - parent: 'Одежда', - countryProduction: 'Бангладеш', - supplierVendorCode: 'SUPPLIER-004', - mediaFiles: ['/api/placeholder/400/408', '/api/placeholder/400/409'], - sizes: [ - { - chrtID: 444333, - techSize: 'M', - wbSize: 'M', - price: 2990, - discountedPrice: 2490, - quantity: 50 - }, - { - chrtID: 444334, - techSize: 'L', - wbSize: 'L', - price: 2990, - discountedPrice: 2490, - quantity: 45 - }, - { - chrtID: 444335, - techSize: 'XL', - wbSize: 'XL', - price: 2990, - discountedPrice: 2490, - quantity: 30 - } - ] - }, - { - nmID: 111222333, - vendorCode: 'SKU005', - title: 'Рюкзак для ноутбука Xiaomi', - description: 'Стильный и функциональный рюкзак для ноутбука до 15.6 дюймов', - brand: 'Xiaomi', - object: 'Рюкзаки', - parent: 'Аксессуары', - countryProduction: 'Китай', - supplierVendorCode: 'SUPPLIER-005', - mediaFiles: ['/api/placeholder/400/410'], - sizes: [ - { - chrtID: 111222, - techSize: '15.6"', - wbSize: 'Черный', - price: 4990, - discountedPrice: 3990, - quantity: 35 - } - ] - }, - { - nmID: 777888999, - vendorCode: 'SKU006', - title: 'Умные часы Apple Watch Series 9', - description: 'Новейшие умные часы с передовыми функциями здоровья и фитнеса', - brand: 'Apple', - object: 'Умные часы', - parent: 'Электроника', - countryProduction: 'Китай', - supplierVendorCode: 'SUPPLIER-006', - mediaFiles: ['/api/placeholder/400/411', '/api/placeholder/400/412', '/api/placeholder/400/413'], - sizes: [ - { - chrtID: 777888, - techSize: '41mm', - wbSize: '41mm GPS', - price: 39990, - discountedPrice: 35990, - quantity: 12 - }, - { - chrtID: 777889, - techSize: '45mm', - wbSize: '45mm GPS', - price: 42990, - discountedPrice: 38990, - quantity: 8 - } - ] - } - ] + // Загружаем реальные карточки WB + const { data: wbCardsData, loading: wbCardsLoading } = useQuery(GET_MY_WILDBERRIES_SUPPLIES, { + errorPolicy: 'all' + }); + + // Используем реальные данные из GraphQL запроса + const realWbCards: WildberriesCard[] = (wbCardsData?.myWildberriesSupplies || []) + .flatMap((supply: any) => supply.cards || []) + .map((card: any) => ({ + nmID: card.nmId || card.nmID, + vendorCode: card.vendorCode || '', + title: card.title || 'Без названия', + description: card.description || '', + brand: card.brand || '', + object: card.object || '', + parent: card.parent || '', + countryProduction: card.countryProduction || '', + supplierVendorCode: card.supplierVendorCode || '', + mediaFiles: card.mediaFiles || [], + sizes: card.sizes || [] + })); // Загружаем контрагентов-фулфилментов const { data: counterpartiesData } = useQuery(GET_MY_COUNTERPARTIES) @@ -327,7 +182,7 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu } }) - // Моковые данные рынков + // Данные рынков можно будет загружать через GraphQL в будущем const markets = [ { value: 'sadovod', label: 'Садовод' }, { value: 'luzhniki', label: 'Лужники' }, @@ -337,53 +192,13 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu - // Автоматически загружаем товары при открытии компонента + // Загружаем карточки из GraphQL запроса useEffect(() => { - const loadCards = async () => { - setLoading(true) - try { - const wbApiKey = user?.organization?.apiKeys?.find(key => key.marketplace === 'WILDBERRIES') - - console.log('WB API Key found:', !!wbApiKey) - console.log('WB API Key active:', wbApiKey?.isActive) - console.log('WB API Key validationData:', wbApiKey?.validationData) - - if (wbApiKey?.isActive) { - // Попытка загрузить реальные данные из API Wildberries - const validationData = wbApiKey.validationData as Record - - // API ключ может храниться в разных местах - const apiToken = validationData?.token || - validationData?.apiKey || - validationData?.key || - (wbApiKey as { apiKey?: string }).apiKey // Прямое поле apiKey из базы - - console.log('API Token extracted:', !!apiToken) - console.log('API Token length:', apiToken?.length) - - if (apiToken) { - console.log('Загружаем карточки из WB API...') - const cards = await WildberriesService.getAllCards(apiToken, 50) - setWbCards(cards) - console.log('Загружено карточек из WB API:', cards.length) - return - } - } - - // Если API ключ не настроен, оставляем пустое состояние - console.log('API ключ WB не настроен, показываем пустое состояние') - setWbCards([]) - } catch (error) { - console.error('Ошибка загрузки карточек WB:', error) - // При ошибке API показываем пустое состояние - setWbCards([]) - } finally { - setLoading(false) - } + if (!wbCardsLoading && wbCardsData) { + setWbCards(realWbCards) + console.log('Загружено карточек из GraphQL:', realWbCards.length) } - - loadCards() - }, [user]) + }, [wbCardsData, wbCardsLoading, realWbCards]) const loadAllCards = async () => { setLoading(true) @@ -407,17 +222,15 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu } } - // Если API ключ не настроен, загружаем моковые данные - console.log('API ключ WB не настроен, загружаем моковые данные') - const allCards = getMockCards() - setWbCards(allCards) - console.log('Загружены моковые товары:', allCards.length) + // Если API ключ не настроен, используем данные из GraphQL + console.log('API ключ WB не настроен, используем данные из GraphQL') + setWbCards(realWbCards) + console.log('Используются данные из GraphQL:', realWbCards.length) } catch (error) { console.error('Ошибка загрузки всех карточек WB:', error) - // При ошибке загружаем моковые данные - const allCards = getMockCards() - setWbCards(allCards) - console.log('Загружены моковые товары (fallback):', allCards.length) + // При ошибке используем данные из GraphQL + setWbCards(realWbCards) + console.log('Используются данные из GraphQL (fallback):', realWbCards.length) } finally { setLoading(false) } @@ -450,12 +263,11 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu } } - // Если API ключ не настроен, ищем в моковых данных - console.log('API ключ WB не настроен, поиск в моковых данных:', searchTerm) - const mockCards = getMockCards() + // Если API ключ не настроен, ищем в данных из GraphQL + console.log('API ключ WB не настроен, поиск в данных GraphQL:', searchTerm) // Фильтруем товары по поисковому запросу - const filteredCards = mockCards.filter(card => + const filteredCards = realWbCards.filter(card => card.title.toLowerCase().includes(searchTerm.toLowerCase()) || card.brand.toLowerCase().includes(searchTerm.toLowerCase()) || card.nmID.toString().includes(searchTerm.toLowerCase()) || @@ -463,19 +275,18 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu ) setWbCards(filteredCards) - console.log('Найдено моковых товаров:', filteredCards.length) + console.log('Найдено товаров в GraphQL данных:', filteredCards.length) } catch (error) { console.error('Ошибка поиска карточек WB:', error) - // При ошибке ищем в моковых данных - const mockCards = getMockCards() - const filteredCards = mockCards.filter(card => + // При ошибке ищем в данных из GraphQL + const filteredCards = realWbCards.filter(card => card.title.toLowerCase().includes(searchTerm.toLowerCase()) || card.brand.toLowerCase().includes(searchTerm.toLowerCase()) || card.nmID.toString().includes(searchTerm.toLowerCase()) || card.object?.toLowerCase().includes(searchTerm.toLowerCase()) ) setWbCards(filteredCards) - console.log('Найдено моковых товаров (fallback):', filteredCards.length) + console.log('Найдено товаров в GraphQL данных (fallback):', filteredCards.length) } finally { setLoading(false) } @@ -1153,27 +964,13 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu
- {/* Состояние загрузки */} - {loading && ( -
- {[...Array(12)].map((_, i) => ( - -
-
-
-
-
-
-
-
-
-
- ))} -
+ {/* Состояние загрузки с красивыми скелетонами */} + {(loading || wbCardsLoading) && ( + )} {/* Карточки товаров */} - {!loading && wbCards.length > 0 && ( + {!loading && !wbCardsLoading && wbCards.length > 0 && (
{wbCards.map((card) => { const selectedQuantity = getSelectedQuantity(card) @@ -1353,7 +1150,7 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu
)} - {wbCards.length === 0 && !loading && ( + {wbCards.length === 0 && !loading && !wbCardsLoading && (
@@ -1374,17 +1171,17 @@ export function WBProductCards({ onBack, onComplete, showSummary: externalShowSu ) : ( <>

- Для работы с реальными карточками необходимо настроить API ключ Wildberries + Для работы с полным функционалом WB API необходимо настроить API ключ Wildberries

- Показаны демонстрационные товары для тестирования + Загружены товары из вашего склада

)} diff --git a/src/components/ui/product-card-skeleton.tsx b/src/components/ui/product-card-skeleton.tsx new file mode 100644 index 0000000..9d9de86 --- /dev/null +++ b/src/components/ui/product-card-skeleton.tsx @@ -0,0 +1,61 @@ +"use client" + +import React from 'react' +import { Card } from '@/components/ui/card' + +export function ProductCardSkeleton() { + return ( + +
+ {/* Изображение */} +
+
+ {/* Бейджи */} +
+
+
+
+ + {/* Информация о товаре */} +
+ {/* Бренд и номер */} +
+
+
+
+ + {/* Название */} +
+
+
+
+
+ + {/* Разделитель */} +
+
+
+ + {/* Управление */} +
+ {/* Кнопки количества */} +
+
+
+
+
+
+
+
+ ) +} + +export function ProductCardSkeletonGrid({ count = 12 }: { count?: number }) { + return ( +
+ {[...Array(count)].map((_, i) => ( + + ))} +
+ ) +} \ No newline at end of file diff --git a/violation-prevention-protocol.md b/violation-prevention-protocol.md deleted file mode 100644 index c33cdb0..0000000 --- a/violation-prevention-protocol.md +++ /dev/null @@ -1,169 +0,0 @@ -# ПРОТОКОЛ ПРЕДОТВРАЩЕНИЯ НАРУШЕНИЙ AI - -## 🚨 СИСТЕМА ЖЕСТКИХ СТОП-СИГНАЛОВ - -### 🛑 ОБЯЗАТЕЛЬНЫЕ ОСТАНОВКИ ПЕРЕД ДЕЙСТВИЯМИ - -#### **СТОП-СИГНАЛ #1: ПЕРЕД ЛЮБЫМ АНАЛИЗОМ КОМПОНЕНТОВ** - -``` -❌ ЗАПРЕЩЕНО: Делать предположения о содержании файлов/компонентов -✅ ОБЯЗАТЕЛЬНО: -1. codebase_search для понимания -2. read_file для точного содержания -3. Только ПОСЛЕ изучения кода - выводы -``` - -#### **СТОП-СИГНАЛ #2: ПЕРЕД ИЗМЕНЕНИЕМ RULES2.MD** - -``` -❌ ЗАПРЕЩЕНО: Завершать работу без синхронизации -✅ ОБЯЗАТЕЛЬНО: -1. Внести изменения в rules2.md -2. НЕМЕДЛЕННО обновить development-checklist.md -3. Проверить соответствие изменений -``` - -#### **СТОП-СИГНАЛ #3: ПРИ НЕОПРЕДЕЛЕННОСТИ** - -``` -❌ ЗАПРЕЩЕНО: Гадать, предполагать, домысливать -✅ ОБЯЗАТЕЛЬНО: -1. СТОП - зафиксировать неопределенность -2. Использовать инструменты анализа (если применимо) -3. Задать прямой вопрос пользователю -``` - -#### **СТОП-СИГНАЛ #4: ПЕРЕД ВЫПОЛНЕНИЕМ СРЕДНИХ/СЛОЖНЫХ ЗАДАЧ** - -``` -❌ ЗАПРЕЩЕНО: Сразу приступать к работе -✅ ОБЯЗАТЕЛЬНО: -1. Применить соответствующий протокол из work-protocols.md -2. Создать план через todo_write -3. Пройти этап самопроверки -``` - -### 🔒 СИСТЕМА ПРИНУДИТЕЛЬНЫХ ПРОВЕРОК - -#### **ПРОВЕРКА #1: АНАЛИЗ КОДА** - -``` -Если задача включает анализ компонентов: -□ Использовал ли я codebase_search? -□ Прочитал ли я исходный код? -□ Основаны ли мои выводы на фактах, а не предположениях? -``` - -#### **ПРОВЕРКА #2: СИНХРОНИЗАЦИЯ ДОКУМЕНТАЦИИ** - -``` -Если изменил rules2.md: -□ Обновил ли development-checklist.md? -□ Добавил ли новые критические правила в чеклист? -□ Уведомил ли пользователя о синхронизации? -``` - -#### **ПРОВЕРКА #3: СОБЛЮДЕНИЕ ПРОТОКОЛОВ** - -``` -Для каждой задачи: -□ Определил ли сложность задачи? -□ Применил ли соответствующий протокол? -□ Создал ли план действий? -□ Провел ли финальную самопроверку? -``` - -### ⚡ СИСТЕМА АВТОМАТИЧЕСКИХ ТРИГГЕРОВ - -#### **ТРИГГЕР #1: При упоминании компонентов** - -- Ключевые слова: "компонент", "файл", "содержание", "показывает" -- Действие: ОБЯЗАТЕЛЬНО использовать инструменты анализа кода - -#### **ТРИГГЕР #2: При изменении rules2.md** - -- Событие: Любое изменение в rules2.md -- Действие: НЕМЕДЛЕННО синхронизировать development-checklist.md - -#### **ТРИГГЕР #3: При неопределенности** - -- Ключевые фразы: "возможно", "вероятно", "думаю", "предполагаю" -- Действие: СТОП + вопрос пользователю - -### 🎯 СИСТЕМА ОБЯЗАТЕЛЬНЫХ ВОПРОСОВ - -#### **ПЕРЕД НАЧАЛОМ ЛЮБОЙ ЗАДАЧИ:** - -1. Какова сложность этой задачи? (простая/средняя/сложная) -2. Какой протокол применить? -3. Есть ли неопределенности, требующие уточнения? -4. Какие инструменты анализа необходимы? - -#### **ПОСЛЕ КАЖДОГО ЗНАЧИМОГО ДЕЙСТВИЯ:** - -1. Соответствует ли результат правилам в rules2.md? -2. Нужно ли синхронизировать documentation? -3. Что еще я мог упустить? -4. Готов ли результат для пользователя? - -### 🛡️ СИСТЕМА БЛОКИРОВКИ НАРУШЕНИЙ - -#### **БЛОКИРОВКА ТИПА #1: Предположения** - -```javascript -if (содержит_предположение && !использовал_анализ_кода) { - ОСТАНОВИТЬ_ВЫПОЛНЕНИЕ(); - ТРЕБОВАТЬ_АНАЛИЗ_КОДА(); -} -``` - -#### **БЛОКИРОВКА ТИПА #2: Незавершенная синхронизация** - -```javascript -if (изменил_rules2md && !обновил_checklist) { - ОСТАНОВИТЬ_ОТВЕТ(); - ТРЕБОВАТЬ_СИНХРОНИЗАЦИЮ(); -} -``` - -#### **БЛОКИРОВКА ТИПА #3: Пропуск протоколов** - -```javascript -if (сложность_задачи >= СРЕДНЯЯ && !применил_протокол) { - ОСТАНОВИТЬ_РАБОТУ(); - ТРЕБОВАТЬ_ПРИМЕНЕНИЕ_ПРОТОКОЛА(); -} -``` - ---- - -## 📋 ИТОГОВЫЙ ЧЕКЛИСТ ПРЕДОТВРАЩЕНИЯ НАРУШЕНИЙ - -### ✅ ПЕРЕД КАЖДЫМ ОТВЕТОМ: - -- [ ] Определена сложность задачи -- [ ] Выбран соответствующий протокол -- [ ] Проверены стоп-сигналы -- [ ] Использованы инструменты анализа (если нужно) -- [ ] Заданы уточняющие вопросы (если есть неопределенности) - -### ✅ ПОСЛЕ КАЖДОГО ИЗМЕНЕНИЯ: - -- [ ] Проверено соответствие rules2.md -- [ ] Синхронизирован development-checklist.md (если изменялся rules2.md) -- [ ] Проведена финальная самопроверка -- [ ] Обновлена память (если нужно) - -### ✅ В СЛУЧАЕ СОМНЕНИЙ: - -- [ ] СТОП - зафиксирована неопределенность -- [ ] Использованы все доступные инструменты анализа -- [ ] Задан прямой вопрос пользователю -- [ ] НЕ ДЕЛАТЬ предположений - ---- - -**СТАТУС**: АКТИВИРОВАН -**ПРИОРИТЕТ**: КРИТИЧЕСКИЙ -**ОБХОД**: ЗАПРЕЩЕН diff --git a/visual-design-rules.md b/visual-design-rules.md index 7392811..512d8a2 100644 --- a/visual-design-rules.md +++ b/visual-design-rules.md @@ -702,6 +702,380 @@ function PageWithSidebar() { --- -**📊 СТАТУС**: Действующие правила v1.0 -**🔄 ОБНОВЛЕНО**: На основе анализа UI Kit системы -**📅 ДАТА**: Основано на текущем состоянии проекта +## 14. 🏢 КАБИНЕТ-СПЕЦИФИЧНЫЕ КОМПОНЕНТЫ + +> 📌 **СВЯЗАНО С**: [rules-complete.md - Структура кабинетов](#3--структура-кабинетов) + +### 14.1 Кабинет фулфилмента + +#### 14.1.1 Визуальная система 6 модулей склада + +**ЦВЕТОВОЕ КОДИРОВАНИЕ** (обязательная последовательность): + +```css +/* 1. ПРОДУКТЫ - готовые к отправке */ +.module-products { + @apply bg-green-500/20 border-green-400 text-green-100; + --icon-color: #10b981; /* emerald-500 */ +} + +/* 2. ТОВАРЫ - базовые товары */ +.module-goods { + @apply bg-blue-500/20 border-blue-400 text-blue-100; + --icon-color: #3b82f6; /* blue-500 */ +} + +/* 3. БРАК - дефектные товары */ +.module-defect { + @apply bg-red-500/20 border-red-400 text-red-100; + --icon-color: #ef4444; /* red-500 */ +} + +/* 4. ВОЗВРАТЫ С ПВЗ - возвращенные товары */ +.module-returns { + @apply bg-yellow-500/20 border-yellow-400 text-yellow-100; + --icon-color: #eab308; /* yellow-500 */ +} + +/* 5. РАСХОДНИКИ СЕЛЛЕРОВ - материалы клиентов */ +.module-seller-supplies { + @apply bg-purple-500/20 border-purple-400 text-purple-100; + --icon-color: #a855f7; /* purple-500 */ +} + +/* 6. РАСХОДНИКИ ФУЛФИЛМЕНТА - операционные материалы (КЛИКАБЕЛЬНЫЙ) */ +.module-ff-supplies { + @apply bg-orange-500/20 border-orange-400 text-orange-100 cursor-pointer hover:bg-orange-400/30; + --icon-color: #f97316; /* orange-500 */ + transition: all 0.2s ease-in-out; +} +``` + +#### 14.1.2 3-уровневая иерархия склада + +**ВИЗУАЛЬНАЯ СТРУКТУРА**: + +```tsx +// УРОВЕНЬ 1: МАГАЗИНЫ (синий - крупные блоки) +
+
+
+ ТехноМир +
+ + {/* УРОВЕНЬ 2: ТОВАРЫ (зеленый - средние блоки) */} +
+
+
+ Смартфон iPhone 15 +
+ + {/* УРОВЕНЬ 3: ВАРИАНТЫ (оранжевый - мелкие блоки) */} +
+
+
+ 128GB Space Black +
+
+
+
+``` + +### 14.2 Статусы поставок - расширенная цветовая система + +**8 СТАТУСОВ WORKFLOW** (согласно rules-complete.md): + +```css +/* 1. PENDING - ожидает подтверждения */ +.status-pending { + @apply bg-gray-500/20 border-gray-400 text-gray-100; + --dot-color: #6b7280; +} + +/* 2. SUPPLIER_APPROVED - подтверждено поставщиком */ +.status-supplier-approved { + @apply bg-blue-500/20 border-blue-400 text-blue-100; + --dot-color: #3b82f6; +} + +/* 3. CONFIRMED - подтверждено системой */ +.status-confirmed { + @apply bg-cyan-500/20 border-cyan-400 text-cyan-100; + --dot-color: #06b6d4; +} + +/* 4. LOGISTICS_CONFIRMED - подтверждено логистикой */ +.status-logistics-confirmed { + @apply bg-indigo-500/20 border-indigo-400 text-indigo-100; + --dot-color: #6366f1; +} + +/* 5. SHIPPED - отправлено */ +.status-shipped { + @apply bg-purple-500/20 border-purple-400 text-purple-100; + --dot-color: #a855f7; +} + +/* 6. IN_TRANSIT - в пути */ +.status-in-transit { + @apply bg-yellow-500/20 border-yellow-400 text-yellow-100; + --dot-color: #eab308; +} + +/* 7. DELIVERED - доставлено */ +.status-delivered { + @apply bg-green-500/20 border-green-400 text-green-100; + --dot-color: #22c55e; +} + +/* 8. COMPLETED - завершено (только для фулфилмента) */ +.status-completed { + @apply bg-emerald-600/20 border-emerald-500 text-emerald-100; + --dot-color: #059669; +} +``` + +### 14.3 Процесс создания продукта - визуальный workflow + +**ПОШАГОВЫЙ ИНДИКАТОР** (5 шагов согласно rules-complete.md): + +```tsx +const productCreationSteps = [ + { id: 'recipe', label: 'Рецептура задана', status: 'completed' }, + { id: 'arrival', label: 'Поступление на склад', status: 'completed' }, + { id: 'planning', label: 'Планирование работы', status: 'active' }, + { id: 'processing', label: 'Обработка товара', status: 'pending' }, + { id: 'quality', label: 'Контроль качества', status: 'pending' }, + { id: 'completion', label: 'Завершение', status: 'pending' } +]; + +// Визуальный компонент +
+ {productCreationSteps.map((step, index) => ( +
+
+ {step.status === 'completed' ? '✓' : index + 1} +
+ {step.label} + {index < productCreationSteps.length - 1 && ( +
+ )} +
+ ))} +
+``` + +### 14.4 Система партнерства - визуальные индикаторы + +**ТИПЫ ПАРТНЕРОВ**: + +```css +/* WHOLESALE - поставщики */ +.partner-wholesale { + @apply bg-emerald-500/20 border-emerald-400; + --icon: "🏭"; /* factory */ +} + +/* SELLER - селлеры */ +.partner-seller { + @apply bg-blue-500/20 border-blue-400; + --icon: "🛍️"; /* shopping */ +} + +/* FULFILLMENT - фулфилмент центры */ +.partner-fulfillment { + @apply bg-purple-500/20 border-purple-400; + --icon: "📦"; /* package */ +} + +/* LOGIST - логистические компании */ +.partner-logist { + @apply bg-orange-500/20 border-orange-400; + --icon: "🚚"; /* truck */ +} +``` + +### 14.5 Кабинет селлера + +> 📌 **СВЯЗАНО С**: [rules-complete.md - Кабинет селлера](#9--кабинет-селлера-детальные-правила) + +#### 14.5.1 Трёхблочная архитектура страницы "Мои поставки" + +**КРИТИЧЕСКИ ВАЖНО**: Правильное выравнивание с сайдбаром + +```tsx +// ✅ ПРАВИЛЬНАЯ архитектура (согласно rules-complete.md) +export function SuppliesPage() { + const { getSidebarMargin } = useSidebar(); + + return ( +
+ +
+
+ {/* БЛОК 1: ТАБЫ - фиксированная высота, glass-эффект */} +
+ +
+ + {/* БЛОК 2: СТАТИСТИКА - контекстные метрики */} +
+ +
+ + {/* БЛОК 3: ОСНОВНОЙ КОНТЕНТ - до низа sidebar */} +
+ +
+
+
+
+ ); +} + +// ❌ НЕПРАВИЛЬНО (текущее состояние) +
{/* Нарушает архитектуру! */} +``` + +#### 14.5.2 Контекстная статистика по табам + +**Для пути "Фулфилмент → Товар → Карточки/Поставщики":** +```tsx +const suppliesStats = [ + { label: "Всего поставок", value: "24", color: "text-blue-400" }, + { label: "Активных поставок", value: "8", color: "text-green-400" }, + { label: "Сумма активных поставок", value: "₽142,350", color: "text-yellow-400" }, + { label: "В пути", value: "3", color: "text-purple-400" } +]; +``` + +**Для пути "Фулфилмент → Расходники селлера":** +```tsx +const consumablesStats = [ + { label: "Всего поставок", value: "12", color: "text-blue-400" }, + { label: "Активных поставок", value: "4", color: "text-green-400" }, + { label: "Видов расходников", value: "18", color: "text-orange-400" }, + { label: "Критические остатки", value: "2", color: "text-red-400" } +]; +``` + +**Для путей "Маркетплейсы → Wildberries/Ozon":** +```tsx +const marketplaceStats = [ + { label: "Поставок на маркетплейс", value: "15", color: "text-blue-400" }, + { label: "Товаров отправлено", value: "347", color: "text-green-400" }, + { label: "Возвраты за неделю", value: "12", color: "text-yellow-400" }, + { label: "Эффективность поставок", value: "94%", color: "text-emerald-400" } +]; +``` + +#### 14.5.3 Система создания поставок + +**Выбор типа поставки:** +```tsx +const supplyTypes = [ + { + id: 'goods-cards', + title: 'Карточки товаров', + description: 'Импорт через WB API с автосозданием поставки', + icon: '📱', + color: 'bg-blue-500/20 border-blue-400' + }, + { + id: 'goods-suppliers', + title: 'Поставщики товаров', + description: 'Прямой заказ с указанием рецептуры', + icon: '🏭', + color: 'bg-emerald-500/20 border-emerald-400' + }, + { + id: 'consumables', + title: 'Расходники селлера', + description: 'Материалы для производства', + icon: '🔧', + color: 'bg-purple-500/20 border-purple-400' + } +]; +``` + +#### 14.5.4 Интерфейс рецептуры продукта + +**3-блочная структура создания рецептуры:** + +```tsx +// БЛОК 1: БАЗОВЫЙ ТОВАР (слева) +
+

1. Базовый товар

+ +
+ +// БЛОК 2: УСЛУГИ ФУЛФИЛМЕНТА (центр) +
+

2. Услуги ФФ

+ +
+ +// БЛОК 3: РАСХОДНИКИ (справа) +
+

3. Расходники

+ +
+``` + +#### 14.5.5 WB интеграция - визуальные индикаторы + +**Статусы синхронизации с WB API:** +```css +/* Успешная синхронизация */ +.wb-sync-success { + @apply bg-green-500/20 border-green-400 text-green-100; + --status-icon: "✅"; +} + +/* Ошибка синхронизации */ +.wb-sync-error { + @apply bg-red-500/20 border-red-400 text-red-100; + --status-icon: "❌"; +} + +/* В процессе синхронизации */ +.wb-sync-loading { + @apply bg-yellow-500/20 border-yellow-400 text-yellow-100; + --status-icon: "⏳"; + animation: pulse 2s infinite; +} + +/* Не настроена */ +.wb-sync-none { + @apply bg-gray-500/20 border-gray-400 text-gray-100; + --status-icon: "⚠️"; +} +``` + +--- + +**📊 СТАТУС**: Действующие правила v1.2 (добавлен кабинет селлера) +**🔄 ОБНОВЛЕНО**: Интеграция с rules-complete.md v6.2 +**📅 ДАТА**: 2025, полная синхронизация с техническими требованиями + +### 🆕 ДОБАВЛЕНИЯ v1.2: +- ✅ Детальные правила для кабинета селлера (раздел 14.5) +- ✅ Трёхблочная архитектура страницы "Мои поставки" +- ✅ Контекстная статистика по типам поставок +- ✅ Визуальные компоненты создания рецептуры +- ✅ WB интеграция и статусы синхронизации +- ✅ Исправление архитектурного нарушения px-2 py-2 diff --git a/work-protocols.md b/work-protocols.md deleted file mode 100644 index 851dc73..0000000 --- a/work-protocols.md +++ /dev/null @@ -1,217 +0,0 @@ -# ПРОТОКОЛЫ РАБОТЫ ДЛЯ AI АССИСТЕНТА - -## 🎯 ПРОТОКОЛ ДЛЯ ЗАДАЧ СРЕДНЕЙ СЛОЖНОСТИ - -### ОПРЕДЕЛЕНИЕ СРЕДНЕЙ СЛОЖНОСТИ: - -- Работа с 2-3 файлами -- Изменение логики в 1-2 модулях -- Добавление новых функций без изменения архитектуры -- Задачи, требующие анализа зависимостей - -### ОБЯЗАТЕЛЬНЫЕ ЭТАПЫ: - -#### 1. 🔍 **ЭТАП АНАЛИЗА** (STOP & THINK) - -``` -ПЕРЕД НАЧАЛОМ ЗАДАТЬ СЕБЕ: -□ Какие файлы нужно изучить? (перечислить ВСЕ) -□ Какие правила из rules2.md применимы? -□ Есть ли зависимости между компонентами? -□ Что может пойти не так? -□ Нужны ли уточнения от пользователя? -``` - -#### 2. 📋 **СОЗДАНИЕ ПЛАНА** - -``` -□ Разбить задачу на подзадачи (не более 5) -□ Определить порядок выполнения -□ Выявить критические точки -□ Создать TODO список -``` - -#### 3. 🔄 **ВЫПОЛНЕНИЕ С ПРОВЕРКАМИ** - -``` -ПОСЛЕ КАЖДОГО ШАГА: -□ Соответствует ли результат rules2.md? -□ Не нарушены ли связи с другими модулями? -□ Работает ли измененный код? -□ Нужно ли обновить documentation? -``` - -#### 4. ✅ **ФИНАЛЬНАЯ САМОПРОВЕРКА** - -``` -□ Прочитать изменения еще раз -□ Проверить development-checklist.md -□ Убедиться в полноте решения -□ Задать вопрос: "Что еще я мог упустить?" -``` - ---- - -## 🔥 ПРОТОКОЛ ДЛЯ ЗАДАЧ ВЫСОКОЙ СЛОЖНОСТИ - -### ОПРЕДЕЛЕНИЕ ВЫСОКОЙ СЛОЖНОСТИ: - -- Работа с 4+ файлами -- Изменение архитектуры системы -- Создание новых модулей/компонентов -- Задачи, влияющие на несколько кабинетов -- Изменения в правилах или workflow - -### ОБЯЗАТЕЛЬНЫЕ ЭТАПЫ: - -#### 1. 🛑 **СТОП! ГЛУБОКИЙ АНАЛИЗ** - -``` -ОБЯЗАТЕЛЬНЫЕ ВОПРОСЫ ПОЛЬЗОВАТЕЛЮ: -□ Уточнить ВСЕ требования и ожидания -□ Выяснить приоритеты и ограничения -□ Узнать о связях с другими системами -□ Понять критерии успеха -``` - -#### 2. 🔍 **ИССЛЕДОВАТЕЛЬСКАЯ ФАЗА** - -``` -□ Изучить ВСЕ связанные файлы параллельно -□ Построить карту зависимостей -□ Найти все правила в rules2.md -□ Выявить потенциальные конфликты -□ Проанализировать влияние на систему -``` - -#### 3. 📊 **СОЗДАНИЕ ДЕТАЛЬНОГО ПЛАНА** - -``` -□ Разбить на этапы с промежуточными проверками -□ Определить точки возврата (rollback points) -□ Создать план тестирования -□ Предусмотреть обновление документации -``` - -#### 4. 🎯 **ПОЭТАПНОЕ ВЫПОЛНЕНИЕ** - -``` -ПОСЛЕ КАЖДОГО ЭТАПА: -□ Проверка работоспособности -□ Валидация против всех правил -□ Промежуточная демонстрация пользователю -□ Корректировка плана при необходимости -``` - -#### 5. 🔄 **ИТЕРАТИВНАЯ ПРОВЕРКА** - -``` -□ Полное тестирование системы -□ Проверка всех затронутых модулей -□ Обновление всей связанной документации -□ Финальное согласование с пользователем -``` - ---- - -## ❓ СИСТЕМА ОБЯЗАТЕЛЬНЫХ УТОЧНЕНИЙ - -### КОГДА ВСЕГДА СПРАШИВАТЬ: - -#### 🔴 **КРИТИЧЕСКИЕ СИТУАЦИИ** (ОБЯЗАТЕЛЬНО): - -- Обнаружил противоречие в правилах -- Задача может нарушить архитектуру системы -- Неясно как применить правило к конкретной ситуации -- Есть несколько способов решения с разными последствиями -- Изменения затрагивают критические бизнес-процессы - -#### 🟡 **ВАЖНЫЕ СИТУАЦИИ** (РЕКОМЕНДУЕТСЯ): - -- Задача требует создания новых типов данных -- Нужно изменить существующий workflow -- Есть сомнения в интерпретации требований -- Решение может повлиять на производительность -- Требуется интеграция с внешними системами - -### ФОРМАТ УТОЧНЯЮЩИХ ВОПРОСОВ: - -``` -🎯 КОНТЕКСТ: Что именно я делаю -❓ ВОПРОС: Что конкретно неясно -⚖️ ВАРИАНТЫ: Какие есть альтернативы (если применимо) -⚠️ РИСКИ: Что может пойти не так -💡 ПРЕДЛОЖЕНИЕ: Мой рекомендуемый подход -``` - ---- - -## 🛠️ СИСТЕМА САМОПРОВЕРКИ - -### ЧЕК-ЛИСТ ПОСЛЕ КАЖДОЙ ЗАДАЧИ: - -#### ✅ **СООТВЕТСТВИЕ ПРАВИЛАМ** - -``` -□ Проверил против rules2.md (ВСЕ применимые разделы) -□ Обновил development-checklist.md если нужно -□ Не нарушил критические запреты -□ Соблюдены принципы ТОВАР ≠ ПРОДУКТ -□ Workflow статусы корректны -``` - -#### ✅ **ТЕХНИЧЕСКОЕ КАЧЕСТВО** - -``` -□ Код следует принципам SOLID -□ Добавлены необходимые проверки и валидации -□ Обработаны ошибки -□ Производительность не пострадала -□ Безопасность данных соблюдена -``` - -#### ✅ **ПОЛНОТА РЕШЕНИЯ** - -``` -□ Решены ВСЕ аспекты задачи -□ Обновлена документация -□ Проверены связанные компоненты -□ Нет "технических долгов" -□ Готово к production -``` - -#### ✅ **КОММУНИКАЦИЯ** - -``` -□ Объяснил что сделал и почему -□ Указал на важные изменения -□ Предупредил о потенциальных рисках -□ Дал рекомендации по дальнейшим действиям -``` - ---- - -## 🎖️ ДОПОЛНИТЕЛЬНЫЕ РЕКОМЕНДАЦИИ - -### ДЛЯ ПОЛЬЗОВАТЕЛЯ: - -1. **📋 Создавайте подробные задачи** - чем больше контекста, тем лучше результат -2. **🎯 Указывайте приоритеты** - что критично, а что можно отложить -3. **⚠️ Предупреждайте об ограничениях** - технических, временных, бизнесовых -4. **🔄 Давайте обратную связь** - что работает хорошо, что нужно улучшить - -### ДЛЯ МЕНЯ: - -1. **🛑 Принцип "Стоп и подумай"** перед каждой сложной задачей -2. **📊 Параллельный сбор информации** вместо последовательного -3. **❓ Активное уточнение** при малейших сомнениях -4. **🔄 Итеративная проверка** на каждом этапе -5. **📝 Документирование процесса** для улучшения в будущем - ---- - -## 🚀 АКТИВАЦИЯ ПРОТОКОЛОВ - -Данные протоколы активируются автоматически на основе сложности задачи. Я буду следовать им при каждой работе с проектом Sfera. - -**КРИТЕРИЙ УСПЕХА**: Количество пропущенных важных деталей = 0