18 KiB
План подготовки приложения к демонстрации заказчику
Дата проверки: 2026-04-27
Цель: привести приложение к виду полноценного рабочего продукта перед показом заказчику, без упоминаний тестового, демо, локального, боевого или служебного режима в пользовательском интерфейсе.
Краткий вывод
Приложение частично соответствует последнему продуктовому заданию: есть OTP-вход, роль-ориентированный кабинет, публичная клиентская страница выбора доставки, модель delivery sets, Supabase schema и Edge Functions. Тесты проходят, production build собирается.
Главная проблема перед показом: в UI и публичных метаданных остались служебные и демонстрационные следы. Также логистический кабинет сейчас не использует готовую доску LogisticsReadinessBoard, хотя она описана в ТЗ и уже реализована как отдельный компонент. Из-за этого сценарий логиста в приложении не совпадает с документированным demo/customer flow.
Что проверено
docs/product-overview.mddocs/scenarios.mddocs/superpowers/specs/2026-04-13-1c-delivery-ui-design.mddocs/superpowers/plans/2026-04-13-1c-delivery-frontend-supabase.mdsrc/pages/LoginPage.jsxsrc/components/auth/OtpLoginForm.jsxsrc/context/AuthContext.jsxsrc/pages/DashboardPage.jsxsrc/hooks/useOrders.jssrc/components/dashboard/RoleWorkspacePanel.jsxsrc/components/logistics/LogisticsReadinessBoard.jsxsrc/components/logistics/DeliverySetDetailPanel.jsxsrc/pages/ClientDeliveryPage.jsxsrc/components/client/DeliveryChoiceFlow.jsxsrc/components/client/DeliverySlotsPicker.jsxsrc/components/driver/DriverDeliveryPlanner.jsxsrc/components/driver/DriverDeliveryDetail.jsxpublic/manifest.webmanifestREADME.md
Проверка команд
npm test
Результат: проходит, 71 test file, 305 tests.
npm run build
Результат: проходит, Vite production build собран.
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.jsxsrc/pages/LoginPage.jsxsrc/context/AuthContext.jsxsrc/components/auth/OtpLoginForm.test.jsxsrc/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.jsxsrc/hooks/useOrders.jssrc/components/dashboard/RoleWorkspacePanel.jsxsrc/components/logistics/LogisticsReadinessBoard.jsxsrc/components/logistics/DeliverySetDetailPanel.jsxsrc/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.jsxsrc/hooks/useOrders.js
Что сейчас видно:
- "Загружаем данные из Supabase..."
- "Данные загружены из Supabase, живой контур активен."
- Ошибки могут показывать "Supabase" как техническую деталь.
Что нужно сделать:
- Заменить на пользовательские формулировки:
- "Загружаем данные..."
- Баннер успешной загрузки убрать полностью.
- Ошибки показывать как "Не удалось загрузить данные. Обратитесь к администратору."
- Технические детали Supabase оставлять только в логах.
Критерий готовности:
- В рабочем UI нет слова
Supabase, кроме внутренних логов/документации для команды.
P1. Очистить публичные метаданные и demo wording
Файлы:
public/manifest.webmanifestREADME.mddocs/scenarios.mddocs/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.jsxsrc/services/deliveryInvitationApi.jseslint.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.jssrc/constants/deliveryWorkflow.jssrc/components/dashboard/ProductionQueuePanel.jsxsrc/components/orders/OrderEditorPanel.jsxsrc/services/orderService.jssrc/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.
- Клиентская страница понятна без объяснений команды.
- Водительский экран показывает только назначенные доставки и действия маршрута.
Рекомендуемый порядок работ
- Исправить экран входа и auth-copy.
- Подключить
LogisticsReadinessBoardвDashboardPage. - Убрать технические баннеры и режимные тексты из dashboard.
- Очистить manifest/README/scenarios от demo wording.
- Починить lint.
- Пройти ручной smoke test по ролям.
- Подготовить короткий сценарий показа заказчику.
Команды финальной проверки
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 зелёные.
- Есть отдельный сценарий показа заказчику без внутренних технических деталей.