From 12fd8ddf610678a4dc15b06256a956e11eafa9c0 Mon Sep 17 00:00:00 2001 From: Veronika Smirnova Date: Sat, 23 Aug 2025 18:47:23 +0300 Subject: [PATCH] =?UTF-8?q?feat(supplier-orders):=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D1=8B=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=83=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлены колонки Объём и Грузовые места между Цена товаров и Статус - Реализованы инпуты для ввода volume и packagesCount в статусе PENDING для роли WHOLESALE - Добавлена мутация UPDATE_SUPPLY_PARAMETERS с проверками безопасности - Скрыта строка Поставщик для роли WHOLESALE (поставщик знает свои данные) - Исправлено выравнивание таблицы при скрытии уровня поставщика - Реорганизованы документы: legacy-rules/, docs/, docs-and-reports/ ВНИМАНИЕ: Компонент multilevel-supplies-table.tsx (1697 строк) нарушает правило модульной архитектуры (>800 строк требует рефакторинга) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- CLAUDE.md | 39 ++ .../AUDIT_REPORT_DOCUMENTATION.md | 0 .../MODULARIZATION_LOG.md | 0 .../PLAN_MISSING_DOCUMENTATION.md | 0 docs/api-layer/GRAPHQL_SCHEMA_RULES.md | 18 +- .../EXCHANGE_MODULE_RULES.md | 0 .../SUPPLY_DATA_SECURITY_RULES.md | 4 +- .../SUPPLY_PARAMETERS_RULES.md | 302 ++++++++++++ docs/data-layer/PRISMA_MODEL_RULES.md | 6 +- .../MODULAR_ARCHITECTURE_PATTERN.md | 0 .../LOGIST_STATISTICS_RULES.md | 0 docs/presentation-layer/UI_COMPONENT_RULES.md | 28 +- src/app/api/graphql/route.ts | 49 +- .../supplier-orders/supplier-orders-tabs.tsx | 111 ++++- .../supplies/multilevel-supplies-table.tsx | 439 ++++++++++++++---- src/graphql/mutations.ts | 15 + src/graphql/queries.ts | 6 +- src/graphql/resolvers.ts | 138 +++++- src/graphql/resolvers/secure-integration.ts | 29 +- src/graphql/security/INTEGRATION_GUIDE.md | 4 +- .../__tests__/logist-security-tests.ts | 2 +- .../__tests__/wholesale-security-tests.ts | 10 +- src/graphql/security/index.ts | 46 +- src/graphql/security/participant-isolation.ts | 14 +- src/graphql/security/supply-data-filter.ts | 135 +++++- src/graphql/security/types.ts | 62 ++- src/graphql/typedefs.ts | 1 + 27 files changed, 1250 insertions(+), 208 deletions(-) rename AUDIT_REPORT_DOCUMENTATION.md => docs-and-reports/AUDIT_REPORT_DOCUMENTATION.md (100%) rename MODULARIZATION_LOG.md => docs-and-reports/MODULARIZATION_LOG.md (100%) rename PLAN_MISSING_DOCUMENTATION.md => docs-and-reports/PLAN_MISSING_DOCUMENTATION.md (100%) rename EXCHANGE_MODULE_IMPLEMENTATION_RULES.md => docs/business-processes/EXCHANGE_MODULE_RULES.md (100%) create mode 100644 docs/business-processes/SUPPLY_PARAMETERS_RULES.md rename MODULAR_ARCHITECTURE_PATTERN.md => docs/development/MODULAR_ARCHITECTURE_PATTERN.md (100%) rename logistics-statistics-warehouse-rules.md => docs/organization-types/LOGIST_STATISTICS_RULES.md (100%) diff --git a/CLAUDE.md b/CLAUDE.md index bd1695f..2600aee 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,6 +34,45 @@ - Упоминание "дизайн", "UI", "компонент", "стиль" → legacy-rules/visual-design-rules.md - Упоминание "компонент", "создание", "dashboard", ">500 строк", "архитектура" → MODULAR_ARCHITECTURE_PATTERN.md +## 🛑 ЗАПРЕТ ПРЕДПОЛОЖЕНИЙ + +**КРИТИЧЕСКИ ВАЖНО:** При любой неоднозначности в запросе - ОСТАНОВИТЬСЯ немедленно и уточнить. + +### ОБЯЗАТЕЛЬНЫЙ АЛГОРИТМ ПРИ НЕОДНОЗНАЧНОСТИ: + +1. **СТОП-СИГНАЛ**: Если можно понять запрос двумя или более способами +2. **НЕМЕДЛЕННАЯ ОСТАНОВКА**: Прекратить любые действия +3. **ОБЯЗАТЕЛЬНЫЙ ВОПРОС**: "Не уверен. Уточните, пожалуйста:" +4. **ПЕРЕЧИСЛИТЬ ВАРИАНТЫ**: Показать все возможные понимания +5. **ДОЖДАТЬСЯ ОТВЕТА**: Не предпринимать действий до получения четкого указания + +### ПРИМЕРЫ СТОП-СИГНАЛОВ: + +- Упоминание "таблица поставщика" - КАКАЯ именно таблица? В каком файле? +- "Удали колонку" - ИЗ КАКОЙ таблицы? Какой компонент? +- "Исправь ошибку" - КАКУЮ ошибку? В каком файле? +- "Добавь функцию" - В КАКОЙ файл? Какая именно функция? + +### ЗАПРЕЩЕННЫЕ ФРАЗЫ: + +❌ "Возможно, вы имеете в виду..." +❌ "Скорее всего, нужно..." +❌ "Попробую в этом файле..." +❌ "Наверное, это..." + +### ОБЯЗАТЕЛЬНЫЕ ФРАЗЫ: + +✅ "Не уверен. Уточните, пожалуйста:" +✅ "Какой именно файл/компонент?" +✅ "Вы имеете в виду X или Y?" +✅ "Правильно ли я понимаю, что..." + +### НАКАЗАНИЕ ЗА НАРУШЕНИЕ: + +- Откат ВСЕХ изменений через комментарии +- Полная остановка работы до получения уточнений +- Начало заново с правильных вопросов + ## 🚨 ПЕРЕХОД К НОВОЙ АРХИТЕКТУРЕ ПРАВИЛ **ВАЖНО:** Система правил реорганизована для соответствия архитектуре кода: diff --git a/AUDIT_REPORT_DOCUMENTATION.md b/docs-and-reports/AUDIT_REPORT_DOCUMENTATION.md similarity index 100% rename from AUDIT_REPORT_DOCUMENTATION.md rename to docs-and-reports/AUDIT_REPORT_DOCUMENTATION.md diff --git a/MODULARIZATION_LOG.md b/docs-and-reports/MODULARIZATION_LOG.md similarity index 100% rename from MODULARIZATION_LOG.md rename to docs-and-reports/MODULARIZATION_LOG.md diff --git a/PLAN_MISSING_DOCUMENTATION.md b/docs-and-reports/PLAN_MISSING_DOCUMENTATION.md similarity index 100% rename from PLAN_MISSING_DOCUMENTATION.md rename to docs-and-reports/PLAN_MISSING_DOCUMENTATION.md diff --git a/docs/api-layer/GRAPHQL_SCHEMA_RULES.md b/docs/api-layer/GRAPHQL_SCHEMA_RULES.md index 0433324..adb8046 100644 --- a/docs/api-layer/GRAPHQL_SCHEMA_RULES.md +++ b/docs/api-layer/GRAPHQL_SCHEMA_RULES.md @@ -625,7 +625,7 @@ query GetMyCounterparties($type: OrganizationType) { ### МУТАЦИИ ПОСТАВЩИКОВ: ```graphql -# Одобрение заказа поставщиком с опциональными полями упаковки +# Одобрение заказа поставщиком с дополнительными параметрами поставки mutation SupplierApproveOrder( $orderId: ID! $packagesCount: Int @@ -635,23 +635,25 @@ mutation SupplierApproveOrder( ) { supplierApproveOrder( id: $orderId - packagesCount: $packagesCount # Опционально: для логистических расчетов - volume: $volume # Опционально: для планирования логистики - readyDate: $readyDate # Опционально: дата готовности к отгрузке - notes: $notes # Опционально: комментарии + packagesCount: $packagesCount # Параметр поставки: количество грузовых мест + volume: $volume # Параметр поставки: объем груза + readyDate: $readyDate # Параметр поставки: дата готовности к отгрузке + notes: $notes # Параметр поставки: дополнительная информация ) { success message order { id status # PENDING → SUPPLIER_APPROVED + deliveryDate # Основной параметр поставки + totalAmount # Ключевой параметр поставки - общая стоимость + totalItems # Параметр поставки - количество товаров organization { id name } - totalAmount - packagesCount # null если не указано - volume # null если не указано + packagesCount # Параметр поставки (опционально) + volume # Параметр поставки (опционально) readyDate # null если не указано notes # null если не указано } diff --git a/EXCHANGE_MODULE_IMPLEMENTATION_RULES.md b/docs/business-processes/EXCHANGE_MODULE_RULES.md similarity index 100% rename from EXCHANGE_MODULE_IMPLEMENTATION_RULES.md rename to docs/business-processes/EXCHANGE_MODULE_RULES.md diff --git a/docs/business-processes/SUPPLY_DATA_SECURITY_RULES.md b/docs/business-processes/SUPPLY_DATA_SECURITY_RULES.md index 266bf9f..a90d0d9 100644 --- a/docs/business-processes/SUPPLY_DATA_SECURITY_RULES.md +++ b/docs/business-processes/SUPPLY_DATA_SECURITY_RULES.md @@ -36,7 +36,7 @@ interface SupplyOrder { sellerConsumables: Supply[] // Расходники селлера } - // Упаковочная информация (опциональная) + // Параметры поставки (опциональные) packagesCount?: number // Количество грузовых мест volume?: number // Объем груза в м³ readyDate?: Date // Дата готовности к отгрузке @@ -567,7 +567,7 @@ export class CommercialDataAudit { "quantity": 10 // ❌ НЕ видит recipe }], - "packagesCount": 2, // ✅ Видит упаковочную информацию + "packagesCount": 2, // ✅ Видит параметры поставки "volume": 0.5, // ❌ НЕ видит totalAmount, услуги ФФ, логистику } diff --git a/docs/business-processes/SUPPLY_PARAMETERS_RULES.md b/docs/business-processes/SUPPLY_PARAMETERS_RULES.md new file mode 100644 index 0000000..4968767 --- /dev/null +++ b/docs/business-processes/SUPPLY_PARAMETERS_RULES.md @@ -0,0 +1,302 @@ +# ПРАВИЛА ПАРАМЕТРОВ ПОСТАВКИ + +## 📋 **ОПРЕДЕЛЕНИЕ ПАРАМЕТРОВ ПОСТАВКИ** + +**Параметры поставки** - это все характеристики и данные, которые описывают конкретную поставку товаров в системе SFERA. + +## 🎯 **КЛАССИФИКАЦИЯ ПАРАМЕТРОВ ПОСТАВКИ** + +### **1. ОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ:** +- **`id`** - Уникальный идентификатор поставки +- **`deliveryDate`** - Дата поставки (когда товары должны быть доставлены) +- **`totalAmount`** - Общая стоимость поставки +- **`totalItems`** - Количество товаров в поставке +- **`organizationId`** - Идентификатор заказчика +- **`partnerId`** - Идентификатор поставщика +- **`status`** - Статус поставки (PENDING, APPROVED, SHIPPED и т.д.) + +### **2. ЦЕНОВЫЕ ПАРАМЕТРЫ:** +- **`totalAmount`** - Общая сумма поставки +- **`goodsPrice`** - Стоимость товаров (расчетное поле) +- **`servicesPrice`** - Стоимость услуг фулфилмента (расчетное поле) +- **`logisticsPrice`** - Стоимость логистических услуг (расчетное поле) +- **`sellerConsumablesPrice`** - Стоимость расходников селлера (расчетное поле) +- **`ffConsumablesPrice`** - Стоимость расходников фулфилмента (расчетное поле) + +### **3. ТОВАРНЫЕ ПАРАМЕТРЫ:** +- **`items[]`** - Массив товаров с количествами и ценами +- **`productId`** - ID товара в позиции +- **`quantity`** - Количество каждого товара +- **`price`** - Цена за единицу товара +- **`totalPrice`** - Общая стоимость позиции +- **`services[]`** - Массив услуг для товара +- **`fulfillmentConsumables[]`** - Расходники фулфилмента для товара +- **`sellerConsumables[]`** - Расходники селлера для товара +- **`marketplaceCardId`** - ID карточки маркетплейса + +### **4. ЛОГИСТИЧЕСКИЕ ПАРАМЕТРЫ:** +- **`packagesCount`** - Количество грузовых мест +- **`volume`** - Объём груза в м³ +- **`routes[]`** - Маршруты доставки +- **`fromLocation`** - Точка забора груза +- **`toLocation`** - Точка доставки +- **`fromAddress`** - Полный адрес забора +- **`toAddress`** - Полный адрес доставки +- **`distance`** - Расстояние маршрута в км +- **`estimatedTime`** - Время доставки в часах +- **`logisticsPartnerId`** - ID логистического партнера + +### **5. УПРАВЛЕНЧЕСКИЕ ПАРАМЕТРЫ:** +- **`responsibleEmployee`** - Ответственный сотрудник +- **`notes`** - Комментарии и дополнительная информация +- **`createdAt`** - Дата создания поставки +- **`updatedAt`** - Дата последнего обновления +- **`fulfillmentCenterId`** - ID фулфилмент центра +- **`consumableType`** - Тип расходников + + + +## 🔄 **ЖИЗНЕННЫЙ ЦИКЛ ПАРАМЕТРОВ ПОСТАВКИ** + +### **Этап 1: Создание поставки (SELLER)** +```typescript +// Селлер указывает базовые параметры поставки +{ + deliveryDate: "2025-08-25", + totalItems: 100, + items: [...products], + partnerId: "supplier-123", + organizationId: "seller-456" +} +``` + +### **Этап 2: Одобрение поставщиком (WHOLESALE)** +```typescript +// Поставщик может дополнить параметры поставки +{ + status: "SUPPLIER_APPROVED", + packagesCount: 3, // Новый параметр + volume: 1.2, // Новый параметр + readyDate: "2025-08-24", // Новый параметр + notes: "Хрупкий груз" // Новый параметр +} +``` + +### **Этап 3: Логистическое планирование (LOGIST)** +```typescript +// Логистика использует параметры для расчетов +{ + logisticsPrice: calculateByVolume(volume, distance), + routes: [ + { + from: "Садовод", + to: "ФФ Центр", + packagesCount: 3, + volume: 1.2 + } + ] +} +``` + +## 🛡️ **ПРАВИЛА БЕЗОПАСНОСТИ ПАРАМЕТРОВ** + +### **Видимость по ролям:** + +| Параметр поставки | SELLER | WHOLESALE | FULFILLMENT | LOGIST | +|------------------|--------|-----------|-------------|---------| +| deliveryDate | ✅ | ✅ | ✅ | ✅ | +| totalAmount | ✅ | ❌ | ❌ | ❌ | +| productPrice | ✅ | ✅ | ❌ | ❌ | +| packagesCount | ✅ | ✅ | ✅ | ✅ | +| volume | ✅ | ✅ | ✅ | ✅ | +| recipe | ✅ | ❌ | ✅ | ❌ | +| logisticsPrice | ✅ | ❌ | ✅ | ✅ | + +### **Права на изменение:** + +- **SELLER**: Может изменять до одобрения поставщиком +- **WHOLESALE**: Может добавлять логистические параметры при одобрении +- **FULFILLMENT**: Не может изменять, только просматривать +- **LOGIST**: Может добавлять маршруты и логистические расчеты + +## 🎛️ **UI КОМПОНЕНТЫ ДЛЯ ПАРАМЕТРОВ ПОСТАВКИ** + +### **Форма ввода параметров поставщиком:** + +```jsx +
+

Параметры поставки

+ + {/* Основные параметры */} + + + + {/* Логистические параметры (опционально) */} + + + + {/* Дополнительные параметры */} + +