191 lines
9.1 KiB
Markdown
191 lines
9.1 KiB
Markdown
# 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
|