300 lines
18 KiB
Markdown
300 lines
18 KiB
Markdown
# План подготовки приложения к демонстрации заказчику
|
||
|
||
Дата проверки: 2026-04-27
|
||
Цель: привести приложение к виду полноценного рабочего продукта перед показом заказчику, без упоминаний тестового, демо, локального, боевого или служебного режима в пользовательском интерфейсе.
|
||
|
||
## Краткий вывод
|
||
|
||
Приложение частично соответствует последнему продуктовому заданию: есть OTP-вход, роль-ориентированный кабинет, публичная клиентская страница выбора доставки, модель delivery sets, Supabase schema и Edge Functions. Тесты проходят, production build собирается.
|
||
|
||
Главная проблема перед показом: в UI и публичных метаданных остались служебные и демонстрационные следы. Также логистический кабинет сейчас не использует готовую доску `LogisticsReadinessBoard`, хотя она описана в ТЗ и уже реализована как отдельный компонент. Из-за этого сценарий логиста в приложении не совпадает с документированным demo/customer flow.
|
||
|
||
## Что проверено
|
||
|
||
- `docs/product-overview.md`
|
||
- `docs/scenarios.md`
|
||
- `docs/superpowers/specs/2026-04-13-1c-delivery-ui-design.md`
|
||
- `docs/superpowers/plans/2026-04-13-1c-delivery-frontend-supabase.md`
|
||
- `src/pages/LoginPage.jsx`
|
||
- `src/components/auth/OtpLoginForm.jsx`
|
||
- `src/context/AuthContext.jsx`
|
||
- `src/pages/DashboardPage.jsx`
|
||
- `src/hooks/useOrders.js`
|
||
- `src/components/dashboard/RoleWorkspacePanel.jsx`
|
||
- `src/components/logistics/LogisticsReadinessBoard.jsx`
|
||
- `src/components/logistics/DeliverySetDetailPanel.jsx`
|
||
- `src/pages/ClientDeliveryPage.jsx`
|
||
- `src/components/client/DeliveryChoiceFlow.jsx`
|
||
- `src/components/client/DeliverySlotsPicker.jsx`
|
||
- `src/components/driver/DriverDeliveryPlanner.jsx`
|
||
- `src/components/driver/DriverDeliveryDetail.jsx`
|
||
- `public/manifest.webmanifest`
|
||
- `README.md`
|
||
|
||
## Проверка команд
|
||
|
||
```bash
|
||
npm test
|
||
```
|
||
|
||
Результат: проходит, 71 test file, 305 tests.
|
||
|
||
```bash
|
||
npm run build
|
||
```
|
||
|
||
Результат: проходит, Vite production build собран.
|
||
|
||
```bash
|
||
npm run lint
|
||
```
|
||
|
||
Результат: падает. Основные проблемы:
|
||
|
||
- `src/pages/DashboardPage.jsx`: `React.useMemo` вызывается после условного `return`, нарушение `react-hooks/rules-of-hooks`.
|
||
- `src/services/deliveryInvitationApi.js`: неиспользуемые переменные `error` в `catch`.
|
||
- `.worktrees/role-focus-dashboard-slice/...`: ESLint также проверяет рабочие worktree-копии и находит там ошибки. Нужно либо исключить `.worktrees` из lint, либо привести эти worktree в порядок/удалить их, если они не нужны.
|
||
|
||
## Соответствие ТЗ
|
||
|
||
| Блок | Ожидание по ТЗ | Текущее состояние | Статус |
|
||
| --- | --- | --- | --- |
|
||
| Вход оператора | Email + одноразовый код, без служебных подсказок | Есть OTP, но видны служебный/локальный вход, выбор роли, `roles@local`, `000000`, "Рабочий режим" | Не соответствует для показа |
|
||
| Роли | Менеджер, логист, водитель, админ в рабочем контуре | Роли есть, но сохраняются legacy-следы `production_lead` и производственный контур | Частично |
|
||
| Логист | `LogisticsReadinessBoard` с наборами доставки | Компонент есть, но `DashboardPage` показывает старые колонки "Сегодня/Завтра/Послезавтра" по отдельным заказам | Не соответствует |
|
||
| Delivery sets | Набор доставки как основная единица | Хелперы и компоненты есть, но основной логистический экран их не использует | Частично |
|
||
| Клиентская ссылка | `/delivery/:token`, выбор даты и половины дня | Реализовано, flow выглядит близко к ТЗ | В целом соответствует |
|
||
| Водитель | Назначенные доставки, адрес, состав, быстрые статусы | Реализовано | В целом соответствует |
|
||
| Supabase | Live data, invitations, slots, history | Схема и API есть, но UI показывает "Данные загружены из Supabase, живой контур активен" | Технически есть, copy требует полировки |
|
||
| Публичные тексты | Не должно быть "демо", "тест", "локальный", "боевой", "рабочий режим" | Такие тексты найдены в login UI, manifest, README/scenarios | Не соответствует |
|
||
|
||
## Найденные замечания
|
||
|
||
### P0. Убрать служебный вход и режимные надписи из экрана входа
|
||
|
||
Файлы:
|
||
|
||
- `src/components/auth/OtpLoginForm.jsx`
|
||
- `src/pages/LoginPage.jsx`
|
||
- `src/context/AuthContext.jsx`
|
||
- `src/components/auth/OtpLoginForm.test.jsx`
|
||
- `src/context/AuthContext.test.js`
|
||
|
||
Что сейчас видно пользователю:
|
||
|
||
- "Для быстрого доступа к рабочим кабинетам можно использовать служебный адрес и выбрать роль вручную."
|
||
- "Служебный вход"
|
||
- "Локальный вход"
|
||
- "Роль для быстрого входа"
|
||
- "Войти без кода"
|
||
- "Локальный вход использует единый адрес и код 000000."
|
||
- "Локальный режим позволяет открыть интерфейс..."
|
||
- "Рабочий режим: код отправляется на email..."
|
||
|
||
Что нужно сделать:
|
||
|
||
- Оставить только обычный сценарий: email -> отправка кода -> ввод кода -> вход.
|
||
- Убрать из UI выбор роли на входе.
|
||
- Убрать публичное поведение `roles@local`.
|
||
- Убрать публичный текст про `000000`.
|
||
- Сохранить локальный fallback только как dev-only механизм, если он ещё нужен разработке, но не показывать его в интерфейсе.
|
||
- Переписать intro copy: "Введите email, мы отправим одноразовый код для входа."
|
||
- После отправки кода оставить нейтральное сообщение: "Код отправлен на указанную почту. Проверьте входящие и папку Спам."
|
||
- Обновить тесты, чтобы они проверяли отсутствие служебного/локального/рабочего режима.
|
||
|
||
Критерий готовности:
|
||
|
||
- На `/login` нет слов: `служебный`, `локальный`, `рабочий режим`, `демо`, `test`, `roles@local`, `local@local`, `000000`, `без кода`.
|
||
|
||
### P0. Подключить реальный логистический экран delivery sets
|
||
|
||
Файлы:
|
||
|
||
- `src/pages/DashboardPage.jsx`
|
||
- `src/hooks/useOrders.js`
|
||
- `src/components/dashboard/RoleWorkspacePanel.jsx`
|
||
- `src/components/logistics/LogisticsReadinessBoard.jsx`
|
||
- `src/components/logistics/DeliverySetDetailPanel.jsx`
|
||
- `src/pages/DashboardPage.test.jsx`
|
||
|
||
Что сейчас не совпадает:
|
||
|
||
- ТЗ и `docs/scenarios.md` обещают логисту `LogisticsReadinessBoard`.
|
||
- В `DashboardPage.jsx` компонент импортирован не используется.
|
||
- Логист видит старый экран с колонками "Сегодня", "Завтра", "Послезавтра" по отдельным заказам.
|
||
|
||
Что нужно сделать:
|
||
|
||
- Передать `deliverySetBuckets` из `useOrders()` в `RoleWorkspacePanel`.
|
||
- Заменить старый `renderLogisticsWorkspace` на `LogisticsReadinessBoard`.
|
||
- При клике по набору открывать `DeliverySetDetailPanel`.
|
||
- Сохранить понятную карточку заказа там, где она нужна менеджеру.
|
||
- Добавить/обновить тест на то, что логист видит "Наборы доставки", "На подходе", "Готово к запуску", "Ожидает клиента", "Нужна ручная работа", "Согласовано", "Завершено".
|
||
|
||
Критерий готовности:
|
||
|
||
- Логистический сценарий в приложении совпадает с `docs/scenarios.md`.
|
||
- Логист работает с наборами доставки, а не с отдельными заказами как главной единицей.
|
||
|
||
### P1. Убрать технические баннеры Supabase/live contour из UI
|
||
|
||
Файлы:
|
||
|
||
- `src/pages/DashboardPage.jsx`
|
||
- `src/hooks/useOrders.js`
|
||
|
||
Что сейчас видно:
|
||
|
||
- "Загружаем данные из Supabase..."
|
||
- "Данные загружены из Supabase, живой контур активен."
|
||
- Ошибки могут показывать "Supabase" как техническую деталь.
|
||
|
||
Что нужно сделать:
|
||
|
||
- Заменить на пользовательские формулировки:
|
||
- "Загружаем данные..."
|
||
- Баннер успешной загрузки убрать полностью.
|
||
- Ошибки показывать как "Не удалось загрузить данные. Обратитесь к администратору."
|
||
- Технические детали Supabase оставлять только в логах.
|
||
|
||
Критерий готовности:
|
||
|
||
- В рабочем UI нет слова `Supabase`, кроме внутренних логов/документации для команды.
|
||
|
||
### P1. Очистить публичные метаданные и demo wording
|
||
|
||
Файлы:
|
||
|
||
- `public/manifest.webmanifest`
|
||
- `README.md`
|
||
- `docs/scenarios.md`
|
||
- `docs/product-overview.md`
|
||
|
||
Что сейчас найдено:
|
||
|
||
- `public/manifest.webmanifest`: "PWA-демо панели заказов и доставки..."
|
||
- `README.md`: "Служебный вход `roles@local` для демонстрации ролей..."
|
||
- `docs/scenarios.md`: "Demo-скрипт для первого платного milestone"
|
||
|
||
Что нужно сделать:
|
||
|
||
- В manifest заменить описание на рабочее: "Панель управления доставкой заказов с доступом к кабинетам логиста, водителя и менеджера."
|
||
- В README убрать служебный вход из публичного списка "Что уже есть".
|
||
- В `docs/scenarios.md` переименовать demo-скрипт в "Сценарий показа заказчику".
|
||
- Убрать из пользовательской/презентационной документации `roles@local`, `demo`, `тестовый`, `локальный`, если это не инструкция строго для разработчика.
|
||
|
||
Критерий готовности:
|
||
|
||
- Поиск по публичным файлам не находит демонстрационные маркеры в пользовательском контексте.
|
||
|
||
### P1. Привести lint в зелёное состояние
|
||
|
||
Файлы:
|
||
|
||
- `src/pages/DashboardPage.jsx`
|
||
- `src/services/deliveryInvitationApi.js`
|
||
- `eslint.config.js` или `.eslintignore`/аналогичная настройка
|
||
- `.worktrees/`, если они остаются в репозитории/рабочей папке
|
||
|
||
Что нужно сделать:
|
||
|
||
- Перенести `useMemo` в `DashboardPage.jsx` выше раннего `return`, чтобы hooks всегда вызывались в одном порядке.
|
||
- В `deliveryInvitationApi.js` заменить `catch (error)` на `catch` там, где переменная не используется.
|
||
- Исключить `.worktrees/**` из lint, если эти директории не являются частью основного приложения.
|
||
- Повторно запустить `npm run lint`.
|
||
|
||
Критерий готовности:
|
||
|
||
- `npm run lint` проходит без ошибок.
|
||
|
||
### P2. Убрать устаревшие производственные экраны из маршрута показа
|
||
|
||
Файлы:
|
||
|
||
- `src/constants/roles.js`
|
||
- `src/constants/deliveryWorkflow.js`
|
||
- `src/components/dashboard/ProductionQueuePanel.jsx`
|
||
- `src/components/orders/OrderEditorPanel.jsx`
|
||
- `src/services/orderService.js`
|
||
- `src/data/mockAppData.js`
|
||
|
||
Что сейчас может сбивать:
|
||
|
||
- `production_lead`, "Начальник производства", "Очередь производства".
|
||
- `OrderEditorPanel` всё ещё выглядит как форма ручного создания/редактирования заказа.
|
||
- `createOrder` и уведомление "Новый заказ" остаются в hook, хотя ТЗ говорит, что заказы приходят из 1С.
|
||
|
||
Что нужно сделать:
|
||
|
||
- Проверить, доступны ли эти экраны из текущего UI. Если недоступны, оставить как legacy code с задачей на последующую чистку.
|
||
- Если доступны, убрать их из демонстрационного маршрута.
|
||
- Для менеджера оставить только просмотр реестра, поиск и карточку заказа.
|
||
- Не показывать создание заказа как пользовательскую возможность.
|
||
|
||
Критерий готовности:
|
||
|
||
- На показе нет сценария ручного создания заказа в web app.
|
||
- Заказ в интерфейсе воспринимается как импортированный из 1С.
|
||
|
||
### P2. Финальная визуальная проверка всех ролей
|
||
|
||
Файлы:
|
||
|
||
- UI-компоненты по факту найденных визуальных замечаний.
|
||
|
||
Что нужно сделать:
|
||
|
||
- Открыть `/login`.
|
||
- Проверить вход оператора.
|
||
- Проверить кабинет менеджера.
|
||
- Проверить кабинет логиста.
|
||
- Проверить кабинет водителя.
|
||
- Проверить `/delivery/client-flow-1001`.
|
||
- Проверить мобильную ширину для `/login`, `/dashboard`, `/delivery/client-flow-1001`.
|
||
|
||
Чеклист:
|
||
|
||
- Нет служебных/локальных/demo/test/боевых/рабочих режимов.
|
||
- Нет технических баннеров про Supabase/live contour.
|
||
- Тексты звучат как рабочий продукт, а не как стенд.
|
||
- Логист видит delivery sets.
|
||
- Клиентская страница понятна без объяснений команды.
|
||
- Водительский экран показывает только назначенные доставки и действия маршрута.
|
||
|
||
## Рекомендуемый порядок работ
|
||
|
||
1. Исправить экран входа и auth-copy.
|
||
2. Подключить `LogisticsReadinessBoard` в `DashboardPage`.
|
||
3. Убрать технические баннеры и режимные тексты из dashboard.
|
||
4. Очистить manifest/README/scenarios от demo wording.
|
||
5. Починить lint.
|
||
6. Пройти ручной smoke test по ролям.
|
||
7. Подготовить короткий сценарий показа заказчику.
|
||
|
||
## Команды финальной проверки
|
||
|
||
```bash
|
||
npm test
|
||
npm run lint
|
||
npm run build
|
||
rg -n "(demo|демо|test|тест|боев|рабочий режим|локальный|служебный|roles@local|local@local|000000|без кода|живой контур|Supabase)" src public README.md docs/product-overview.md docs/scenarios.md -S
|
||
```
|
||
|
||
Ожидание:
|
||
|
||
- `npm test` проходит.
|
||
- `npm run lint` проходит.
|
||
- `npm run build` проходит.
|
||
- `rg` не находит запрещённые слова в пользовательском UI и публичных материалах. Допустимы только внутренние тесты, dev-only комментарии и техническая документация, не используемая в демонстрации.
|
||
|
||
## Definition of Done
|
||
|
||
- Экран входа выглядит как production-ready вход по email-коду.
|
||
- Все режимные и служебные подсказки убраны из UI.
|
||
- Логистический кабинет работает по delivery sets.
|
||
- Клиентская ссылка работает и не содержит технических пояснений.
|
||
- Водительский кабинет показывает назначенные доставки и статусы маршрута.
|
||
- Публичные метаданные приложения не называют продукт демо.
|
||
- Тесты, lint и build зелёные.
|
||
- Есть отдельный сценарий показа заказчику без внутренних технических деталей.
|