Files
sfera-new/docs/business-processes/SUPPLY_PARAMETERS_RULES.md
Veronika Smirnova 12fd8ddf61 feat(supplier-orders): добавить параметры поставки в таблицу заявок
- Добавлены колонки Объём и Грузовые места между Цена товаров и Статус
- Реализованы инпуты для ввода 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 <noreply@anthropic.com>
2025-08-23 18:47:23 +03:00

302 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ПРАВИЛА ПАРАМЕТРОВ ПОСТАВКИ
## 📋 **ОПРЕДЕЛЕНИЕ ПАРАМЕТРОВ ПОСТАВКИ**
**Параметры поставки** - это все характеристики и данные, которые описывают конкретную поставку товаров в системе 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`** - Тип расходников
<!-- ОТКАТ: Расширенная классификация параметров поставки
### **6. ВРЕМЕННЫЕ ПАРАМЕТРЫ:**
- **`deliveryDate`** - Плановая дата доставки
- **`readyDate`** - Дата готовности к отгрузке
- **`actualDeliveryDate`** - Фактическая дата доставки
- **`createdAt`** - Время создания заявки
- **`approvedAt`** - Время одобрения поставщиком
- **`shippedAt`** - Время отгрузки
### **7. КОНТАКТНЫЕ ПАРАМЕТРЫ:**
- **`supplierContact`** - Контактное лицо поставщика
- **`buyerContact`** - Контактное лицо покупателя
- **`logisticsContact`** - Контактное лицо логистики
- **`fulfillmentContact`** - Контактное лицо фулфилмента
### **8. АДРЕСНЫЕ ПАРАМЕТРЫ:**
- **`pickupAddress`** - Адрес забора груза
- **`deliveryAddress`** - Адрес доставки
- **`warehouseLocation`** - Местоположение склада
- **`marketLocation`** - Адрес торговой точки
### **9. КАЧЕСТВЕННЫЕ ПАРАМЕТРЫ:**
- **`qualityRequirements`** - Требования к качеству товаров
- **`temperatureConditions`** - Температурные условия хранения/транспортировки
- **`handlingInstructions`** - Инструкции по обращению с грузом
- **`packagingType`** - Тип упаковки товаров
- **`fragileGoods`** - Отметка о хрупких товарах
### **10. ФИНАНСОВЫЕ ПАРАМЕТРЫ:**
- **`paymentTerms`** - Условия оплаты
- **`paymentMethod`** - Способ оплаты
- **`currency`** - Валюта расчетов
- **`taxRate`** - Налоговая ставка
- **`invoiceNumber`** - Номер счета
- **`paymentStatus`** - Статус оплаты
### **11. ТЕХНИЧЕСКИЕ ПАРАМЕТРЫ:**
- **`supplyOrderId`** - Уникальный идентификатор поставки
- **`supplierOrderNumber`** - Внутренний номер заказа поставщика
- **`trackingNumber`** - Трек-номер для отслеживания
- **`barcodes`** - Штрих-коды товаров
- **`rfidTags`** - RFID метки для автоматизации
### **12. АНАЛИТИЧЕСКИЕ ПАРАМЕТРЫ:**
- **`profitMargin`** - Маржинальность поставки
- **`supplierRating`** - Рейтинг поставщика
- **`deliveryReliability`** - Надежность доставки
- **`orderPriority`** - Приоритет заказа
- **`seasonalFactor`** - Сезонный коэффициент
-->
## 🔄 **ЖИЗНЕННЫЙ ЦИКЛ ПАРАМЕТРОВ ПОСТАВКИ**
### **Этап 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
<div className="supply-parameters-form">
<h3>Параметры поставки</h3>
{/* Основные параметры */}
<Input name="deliveryDate" label="Дата поставки" type="date" required />
<Input name="totalAmount" label="Общая стоимость" type="number" readOnly />
{/* Логистические параметры (опционально) */}
<Input name="packagesCount" label="Количество грузовых мест" type="number" />
<Input name="volume" label="Объём груза (м³)" type="number" step="0.01" />
{/* Дополнительные параметры */}
<Input name="readyDate" label="Дата готовности" type="date" />
<Textarea name="notes" label="Комментарии к поставке" />
</div>
```
### **Отображение в таблице заявок:**
```jsx
<Table>
<TableHeader>
<TableRow>
<TableHead>Дата поставки</TableHead>
<TableHead>Количество товаров</TableHead>
<TableHead>Стоимость товаров</TableHead>
{userRole !== 'WHOLESALE' && <TableHead>Общая стоимость</TableHead>}
<TableHead>Параметры логистики</TableHead>
<TableHead>Статус</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{supplies.map(supply => (
<TableRow key={supply.id}>
<TableCell>{supply.deliveryDate}</TableCell>
<TableCell>{supply.totalItems}</TableCell>
<TableCell>{formatCurrency(supply.productPrice)}</TableCell>
{userRole !== 'WHOLESALE' && (
<TableCell>{formatCurrency(supply.totalAmount)}</TableCell>
)}
<TableCell>
{supply.packagesCount && `${supply.packagesCount} мест`}
{supply.volume && ` • ${supply.volume} м³`}
</TableCell>
<TableCell><StatusBadge status={supply.status} /></TableCell>
</TableRow>
))}
</TableBody>
</Table>
```
## 📊 **ВАЛИДАЦИЯ ПАРАМЕТРОВ ПОСТАВКИ**
### **Серверная валидация:**
```typescript
function validateSupplyParameters(params: SupplyParameters) {
// Обязательные параметры
if (!params.deliveryDate) throw new Error('Дата поставки обязательна')
if (!params.totalItems || params.totalItems <= 0) {
throw new Error('Количество товаров должно быть больше 0')
}
// Логистические параметры
if (params.packagesCount && params.packagesCount <= 0) {
throw new Error('Количество грузовых мест должно быть положительным')
}
if (params.volume && params.volume <= 0) {
throw new Error('Объём груза должен быть положительным')
}
// Даты
if (params.readyDate && params.deliveryDate) {
if (new Date(params.readyDate) > new Date(params.deliveryDate)) {
throw new Error('Дата готовности не может быть позже даты поставки')
}
}
}
```
## 🔍 **ПОИСК И ФИЛЬТРАЦИЯ ПО ПАРАМЕТРАМ**
### **GraphQL запрос с фильтрами:**
```graphql
query GetSuppliesByParameters(
$deliveryDateFrom: DateTime
$deliveryDateTo: DateTime
$minAmount: Float
$maxAmount: Float
$status: SupplyStatus
$hasLogisticsParams: Boolean
) {
mySupplyOrders(
filters: {
deliveryDate: { gte: $deliveryDateFrom, lte: $deliveryDateTo }
totalAmount: { gte: $minAmount, lte: $maxAmount }
status: $status
packagesCount: { isNull: $hasLogisticsParams }
}
) {
id
deliveryDate
totalAmount
totalItems
packagesCount
volume
status
}
}
```
## 📈 **АНАЛИТИКА ПО ПАРАМЕТРАМ ПОСТАВКИ**
### **Ключевые метрики:**
- Средний объём поставки (в м³)
- Среднее количество грузовых мест
- Распределение по стоимости поставок
- Время цикла от создания до доставки
- Процент поставок с дополнительными параметрами
---
*Все параметры поставки служат для оптимизации логистических процессов и обеспечения прозрачности цепочки поставок в экосистеме SFERA.*