Операционный план → План сбыта (фиксируем)

Актуально на: 2026-02-13

Дата фиксации: 2026-02-09

Обновление 2026-02-13

См. CHANGELOG.md (стабилизация UI‑настроек и оптимизации автосейва; важно для тяжёлых таблиц/графиков).

Этот документ фиксирует, что сделано в блоке Операционный план → План сбыта (Выручка / Объёмы сбыта / Ценообразование) и где это находится в коде.

Ключевые принципы

  • Выручка не хранится в базе как отдельная таблица/поле, т.к. это расчётный показатель.
  • Выручка считается как: выручка = цена × объём.
  • Отключение продукта (снятие галочки слева) вычитает его вклад из “выручки выбранных”, но “выручка общая” остаётся неизменной.
  • Для длинных горизонтов важны:
    • одинаковый “шаг” между датами на графике (с горизонтальной прокруткой при необходимости),
    • возможность посмотреть детали периода,
    • таблица как альтернативное представление.

Выручка (UI)

График

  • Показывает динамику выручки по периодам.
  • Детализация по периоду выводится в правой панели (наведение / закрепление кликом).
  • Ось X: отображаются все даты/периоды (не “прячем” часть дат).
  • Скролл по горизонтали (если не помещается) — как на графиках объёмов/цен.

Таблица

  • Переключение агрегации: помесячно / поквартально / по годам.
  • Единая таблица:
    • колонки: Период, Выручка (общая), Выручка (выбранные), далее колонки по продуктам;
    • по продукту в ячейке: выручка + доля в общей выручке периода; цена/объём — менее заметно.
  • Прокрутка таблицы:
    • горизонтальная и вертикальная — внутри контейнера таблицы;
    • <thead> закреплён сверху (sticky top-0), первый столбец закреплён слева (sticky left-0);
    • колесо мыши по умолчанию = вертикальная прокрутка; горизонтальная — через Shift + wheel.

Продукты: “Канал продаж”

  • В продукт добавлено поле salesChannel (“Канал продаж”).
  • В плане сбыта и выручке оно отображается рядом с unit (например: подписка · Онлайн).
  • Список вариантов канала продаж хранится в пользовательских UI-настройках (JSON) и пополняется при вводе нового значения.

Где смотреть в коде

  • Основной клиентский “legacy workspace UI”: app/workspace-client-legacy.tsx
    • блок План сбыта/Выручка, табличный/графический режимы, логика расчёта выручки, скролл.
  • Нормализация/загрузка/сохранение проектных данных: lib/project-workspace-store.ts
  • UI-настройки пользователя (загрузка/сохранение JSON): app/(app)/settings/actions.ts
  • UI-компонент настроек (синхронизация/сохранение): components/ui-settings.tsx
  • Prisma схема: prisma/schema.prisma
  • Миграция канала продаж: prisma/migrations/20260206190000_project_product_sales_channel/migration.sql

Бэкап

В репозитории создан бэкап ключевых файлов:

  • backups/sales-plan_2026-02-09_15-32/