supersam/docs/superpowers/plans/2026-03-15-role-aware-order...

191 lines
9.1 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.

# Role-Aware Orders Kanban Implementation Plan
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Сделать единый канбан заказов с переключением `по этапам / по статусам`, ролевой видимостью, цветовой индикацией ответственности, подсветкой зависших заказов и едиными правилами изменения статусов.
**Architecture:** Логика канбана и зависаний строится из метаданных статусов в `deliveryWorkflow`, а сервис `orderViews` собирает колонки и вычисляемые поля для обоих режимов отображения. `useOrders` меняет правила видимости на responsibility-based, а UI в `DashboardPage`, `OrderFilters` и `OrderDetailPanel` переиспользует общие transition-правила и новые aging-флаги.
**Tech Stack:** React 18, Vite, existing UI components, Vitest, existing order services/hooks.
---
## Chunk 1: Workflow Metadata And View Builders
### Task 1: Зафиксировать stage/SLA-логику в тестах order views
**Files:**
- Modify: `src/services/orderViews.test.js`
- Reference: `src/constants/deliveryWorkflow.js`
- Reference: `src/data/mockAppData.js`
- [ ] Добавить падающие тесты на:
- построение колонок в режиме `by_stage`
- построение колонок в режиме `by_status`
- вычисление aging state `normal / warning / critical`
- скрытие завершённых заказов по умолчанию
- [ ] Прогнать только тесты order views.
- Run: `npm test -- src/services/orderViews.test.js`
- Expected: FAIL по отсутствующим полям/логике
### Task 2: Расширить метаданные статусов
**Files:**
- Modify: `src/constants/deliveryWorkflow.js`
- [ ] Добавить для каждого статуса:
- `stageKey`
- `stageLabel`
- `warningAfterHours`
- `criticalAfterHours`
- [ ] Экспортировать вспомогательные константы и функции:
- список этапов
- получение stage для статуса
- получение ownerRole/status SLA
- [ ] Сохранить обратную совместимость существующих комментариев, tone и transitions.
- [ ] Не менять набор доступных переходов без прямой необходимости.
### Task 3: Реализовать новый builder для канбана и aging
**Files:**
- Modify: `src/services/orderViews.js`
- Test: `src/services/orderViews.test.js`
- [ ] Добавить helper для вычисления времени в текущем статусе через history.
- [ ] Добавить helper для вычисления aging badge и state.
- [ ] Реализовать общий builder колонок с режимами:
- `by_stage`
- `by_status`
- [ ] Добавить в элементы колонок вычисляемые поля:
- `ownerRole`
- `stageKey`
- `stageLabel`
- `agingState`
- `statusAgeHours`
- `statusAgeLabel`
- [ ] Прогнать тесты order views.
- Run: `npm test -- src/services/orderViews.test.js`
- Expected: PASS
## Chunk 2: Responsibility-Based Visibility And Filters
### Task 4: Зафиксировать новую видимость и поиск в тестах order service
**Files:**
- Modify: `src/services/orderService.test.js`
- Modify: `src/services/orderService.js`
- [ ] Добавить падающие тесты на:
- видимость всех заказов текущей роли по `ownerRole`, а не по assignment
- поиск по телефону клиента
- фильтр по этапу
- фильтр по зоне ответственности
- фильтр по aging state
- [ ] Прогнать только тесты order service.
- Run: `npm test -- src/services/orderService.test.js`
- Expected: FAIL
### Task 5: Реализовать responsibility-based фильтрацию
**Files:**
- Modify: `src/services/orderService.js`
- Modify: `src/hooks/useOrders.js`
- Test: `src/services/orderService.test.js`
- [ ] Расширить `buildSearchBlob` полем телефона клиента и stage/responsibility значениями при необходимости.
- [ ] Изменить фильтрацию видимости:
- manager/admin видят всё
- остальные роли видят заказы по текущему `ownerRole`
- [ ] Добавить в filters новые поля:
- `stage`
- `ownerRole`
- `agingState`
- [ ] Передавать новые filters через `useOrders`.
- [ ] Прогнать тесты order service.
- Run: `npm test -- src/services/orderService.test.js`
- Expected: PASS
## Chunk 3: Kanban And Detail UI
### Task 6: Обновить фильтры заказов
**Files:**
- Modify: `src/components/orders/OrderFilters.jsx`
- Reference: `src/constants/deliveryWorkflow.js`
- Reference: `src/constants/roles.js`
- [ ] Добавить select-поля для:
- этапа
- зоны ответственности
- зависаний
- [ ] Обновить placeholder поиска под номер заявки, имя/фамилию и телефон клиента.
- [ ] Сохранить текущие фильтры менеджера, логиста и канала.
### Task 7: Переделать канбан-вкладку вокруг общего builder
**Files:**
- Modify: `src/pages/DashboardPage.jsx`
- Optionally Create: `src/components/orders/OrdersKanbanBoard.jsx`
- Optionally Create: `src/components/orders/OrdersKanbanCard.jsx`
- [ ] Добавить переключатель режима:
- `По этапам`
- `По статусам`
- [ ] Подключить новый builder колонок с параметрами режима и completed toggle.
- [ ] Показать счётчики warning/critical по колонкам.
- [ ] Обновить карточки:
- роль-ответственный цвет
- точный статус
- aging badge
- явная подсветка зависших заказов
- [ ] Оставить открытие карточки заказа по клику.
### Task 8: Свести drag-and-drop к единым transition-правилам
**Files:**
- Modify: `src/pages/DashboardPage.jsx`
- Modify: `src/components/orders/OrderDetailPanel.jsx`
- Reference: `src/constants/deliveryWorkflow.js`
- [ ] Добавить helper выбора drop-status внутри stage/status колонок.
- [ ] Разрешать перенос только если для роли пользователя есть допустимый target status.
- [ ] Если перенос невозможен, не менять заказ и не маскировать ошибку.
- [ ] Убедиться, что detail panel и kanban используют один и тот же список доступных переходов.
## Chunk 4: Notification Signals And Verification
### Task 9: Добавить in-app сигналы по зависшим заказам
**Files:**
- Modify: `src/hooks/useOrders.js`
- Modify: `src/pages/DashboardPage.jsx`
- [ ] Вычислить warning/critical summary по видимым заказам.
- [ ] Показать краткий блок или баннер с количеством зависающих и просроченных заказов.
- [ ] Добавить быстрый переход/фильтр на зависшие заказы из канбана.
### Task 10: Проверить регрессии и завершить
**Files:**
- Modify: `README.md` if needed
- Reference: `docs/superpowers/specs/2026-03-15-role-aware-orders-kanban-design.md`
- [ ] Прогнать таргетированные тесты.
- Run: `npm test -- src/services/orderViews.test.js src/services/orderService.test.js`
- Expected: PASS
- [ ] Прогнать полный тестовый набор.
- Run: `npm test`
- Expected: PASS
- [ ] Прогнать линтер.
- Run: `npm run lint`
- Expected: PASS
- [ ] Запустить production build.
- Run: `npm run build`
- Expected: PASS
- [ ] Коротко вручную проверить:
- менеджер видит весь поток
- логист/водитель/производство видят только свою текущую зону
- канбан переключается между этапами и статусами
- зависшие карточки подсвечиваются
- статус меняется и drag-and-drop, и из detail panel