cat > ~/market.metal-asia.pw/next-app/docs/sortament.md << 'EOF'
# План внедрения мульти-тип сортаментов (Чёрный / Нержавейка / Алюминий / Медь) Ключевые направления: Гуанчжоу, Шанхай, Алматы.
## Цель
Заменить текущий статический селект сортамента на интерактивную систему:
- Выбор типа металла (4 кнопки) → плиточный поповер с сортаментами → динамические поля марки/ГОСТ.
---
## Фаза 1: Архитектура данных (src/data/metal/)
### Шаг 1.1 — Создать `types.ts`
- Интерфейс `SortamentItem` (id, name, icon, gost, brands[], params?, weightFormula?)
- Интерфейс `MetalMatrix` (label, items[])
- Тип `MetalType` = 'black' | 'stainless' | 'aluminum' | 'copper'
### Шаг 1.2 — Создать `black-steel.ts`
- 16 позиций сортамента (арматура, балка, швеллер, уголок, трубы, листы, круг, квадрат, шестигранник, полоса, катанка)
- Каждая позиция: id, name, icon (Lucide-название), gost, brands[] (с fobPrice, density)
- Параметры для веса: diameter, thickness, width, height, length
### Шаг 1.3 — Создать `stainless.ts`
- 10 позиций (труба бесшовная, труба сварная, труба профильная, лист матовый, лист зеркальный, лист рифленый, круг, шестигранник, уголок, лента)
- Двойная маркировка: ГОСТ + AISI
- Плотность: 7900-8000 кг/м³
### Шаг 1.4 — Создать `aluminum.ts`
- 9 позиций (лист гладкий, лист рифленый, лист перфорированный, труба круглая, труба профильная, пруток, шина, уголок, швеллер)
- Плотность: 2700 кг/м³
- Марки: А5, АД1, АМг2, АМг3, Д16Т
### Шаг 1.5 — Создать `copper.ts`
- 8 позиций (шина, лист, лента, труба, пруток, проволока, лист латунный, труба латунная)
- Плотность меди: 8960 кг/м³
- Плотность латуни: 8400 кг/м³
- Марки: М1, М2, М3, Л63, ЛС59-1
### Шаг 1.6 — Создать `index.ts`
- Единый экспорт: `METAL_MATRIX` объект
- Функция `getSortamentByType(type)` → SortamentItem[]
- Функция `getSortamentById(id)` → SortamentItem | undefined
---
## Фаза 2: Весовые формулы (src/utils/calculator.ts)
### Шаг 2.1 — Расширить `calculatePhysicalWeight.ts`
- Формулы для алюминия и меди (аналогичные стальным, но с другой плотностью)
- Формула для нержавейки (табличные + расчётные)
### Шаг 2.2 — Создать JSON-веса для цветных металлов
- `aluminum-weights.json` — табличные веса алюминиевого проката
- `copper-weights.json` — табличные веса медного проката
- `stainless-weights.json` — табличные веса нержавейки
### Шаг 2.3 — Загрузить на S3
- `data/aluminum-weights.json`
- `data/copper-weights.json`
- `data/stainless-weights.json`
- Обновить `.env.local` с URL
---
## Фаза 3: UI-компоненты
### Шаг 3.1 — `MetalTypeSelector.tsx`
- 4 кнопки: Чёрный | Нержавейка | Алюминий | Медь
- Активная кнопка: border-[#00FFAA], bg-[#00FFAA]/5
- При клике: `setMetalType(type)` + сброс `selectedSortament=null`, `selectedBrand=''`
### Шаг 3.2 — `SortamentPopover.tsx`
- Кнопка-триггер: "Выберите сортамент..." или активная плитка
- Поповер: grid 2-4 колонки, плитки 80-100px
- Плитка: иконка (Lucide, 24px), название, ГОСТ (мелкий текст)
- Активная плитка: border-[#00FFAA]
- При клике: `setSelectedSortament(tile)` + закрыть поповер
### Шаг 3.3 — `BrandSelect.tsx`
- Нативный `<select>`, стилизованный под тёмную тему
- Опции из `selectedSortament.brands`
- Disabled пока `!selectedSortament`
- Placeholder: "Сначала выберите сортамент"
### Шаг 3.4 — `GostDisplay.tsx`
- Read-only input
- Автозаполнение из `selectedSortament.gost`
- Стилизация: bg-[#141416]/50, text-zinc-400
---
## Фаза 4: Интеграция в MetalCalculator
### Шаг 4.1 — Модифицировать `PositionItem.tsx`
- Добавить `metalType` в `PositionData`
- Вставить `MetalTypeSelector` в шапку позиции
- Заменить текущий селект сортамента на `SortamentPopover`
- Добавить `BrandSelect` под сортамент
- Добавить `GostDisplay` рядом с маркой
### Шаг 4.2 — Обновить `calculateWeight()` в `PositionItem.tsx`
- Подтягивать плотность из `METAL_MATRIX[metalType].density`
- Для цветных металлов — использовать соответствующие формулы/таблицы
- Fallback на локальный файл если API недоступен
### Шаг 4.3 — Обновить `MetalCalculator.tsx`
- Передавать `metalType` в `PositionItem`
- При расчёте: использовать плотность выбранного типа металла
- Обновить отображение веса (тонны/кг)
---
## Фаза 5: S3 и деплой
### Шаг 5.1 — Создать и загрузить JSON-веса
- `aluminum-weights.json` → S3 `data/aluminum-weights.json`
- `copper-weights.json` → S3 `data/copper-weights.json`
- `stainless-weights.json` → S3 `data/stainless-weights.json`
### Шаг 5.2 — Создать API endpoints
- `src/app/api/aluminum-weights/route.ts`
- `src/app/api/copper-weights/route.ts`
- `src/app/api/stainless-weights/route.ts`
- Аналогично `metal-weights/route.ts` (кэш 55 мин)
### Шаг 5.3 — Обновить `.env.local`
- `ALUMINUM_WEIGHTS_S3_URL`
- `COPPER_WEIGHTS_S3_URL`
- `STAINLESS_WEIGHTS_S3_URL`
### Шаг 5.4 — Деплой
- Git commit → push → pull на сервере
- `rm -rf .next && npm run build`
- Перезапуск сервера
- Проверка API
---
## Фаза 6: Тестирование
### Шаг 6.1 — Чёрный металл (контроль)
- Арматура Ø12, 100 шт, 11.7м → вес ~10.39 кг/шт, общий ~1.04 т
- Сравнить с текущими расчётами — должно совпадать
### Шаг 6.2 — Нержавейка
\- Труба 108×4, 50 шт, 6м → вес \~10.26 кг/м × 6м \= 61.56 кг/шт
\- Общий вес: 50 × 61.56 \= 3078 кг \= 3.08 т
\- FOB: \~$2500/т × 3.08 \= $7 700
### Шаг 6.3 — Алюминий
- Лист 2мм, 1000×2000мм, 20 шт
\- Вес: 2 × 2.7 \= 5.4 кг/м² × 2м² \= 10.8 кг/шт
\- Общий: 20 × 10.8 \= 216 кг \= 0.216 т
\- FOB: \~$3500/т × 0.216 \= $756
### Шаг 6.4 — Медь
- Труба М1, 28×1.5мм, 100 шт, 3м
\- Вес: π × (28-1.5) × 1.5 × 8.96 / 1000 \= \~1.12 кг/м × 3м \= 3.36 кг/шт
\- Общий: 100 × 3.36 \= 336 кг \= 0.336 т
\- FOB: \~$9000/т × 0.336 \= $3 024
---
## Чек-лист готовности
- [ ] Фаза 1: Все 6 файлов данных созданы
- [ ] Фаза 2: Весовые формулы для цветных металлов
- [ ] Фаза 3: Все UI-компоненты работают
- [ ] Фаза 4: Интеграция в MetalCalculator
- [ ] Фаза 5: S3 + API + env
- [ ] Фаза 6: Все 4 типа протестированы
---
## Примечания
- **Иконки:** Lucide-React, уже установлен
- **Анимация:** Не нужна, мгновенная смена
- **Select марок:** Нативный, стилизованный
- **Popover:** Кастомный (текущий), без Radix
- **Big.js:** Уже установлен, использовать для всех расчётов
- **Zod:** Не нужен, TypeScript покрывает
---
## Стартовая команда
```bash
mkdir -p ~/market.metal-asia.pw/next-app/src/data/metal
mkdir -p ~/market.metal-asia.pw/next-app/src/components/sortament
