supersam/docs/customer-demo-readiness-aud...

18 KiB
Raw Blame History

План подготовки приложения к демонстрации заказчику

Дата проверки: 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

Проверка команд

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.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. Подготовить короткий сценарий показа заказчику.

Команды финальной проверки

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 зелёные.
  • Есть отдельный сценарий показа заказчику без внутренних технических деталей.