62 lines
7.7 KiB
Markdown
62 lines
7.7 KiB
Markdown
# Архитектура фронтенда
|
||
|
||
## Модули
|
||
|
||
- `src/context/AuthContext.jsx` — OTP-аутентификация через Supabase Auth и загрузка профиля пользователя с ролью. Неизвестный email показывает подсказку обратиться к администратору.
|
||
- `src/context/ThemeContext.jsx` — управление светлой и тёмной темой через `data-theme`.
|
||
- `src/hooks/usePwaStatus.js` — клиентское состояние PWA: online/offline, install prompt, standalone и offline readiness.
|
||
- `src/hooks/useOrders.js` — локальный state заказов, истории, чатов, фильтров, действий и **сгруппированных наборов доставки** (deliverySetBuckets).
|
||
- `src/services/deliverySetViews.js` — чистые функции группировки импортированных заказов в наборы доставки с buckets: «На подходе», «Готово к запуску», «Ожидает клиента», «Нужна ручная работа», «Согласовано», «Завершено».
|
||
- `src/services/orderService.js` — чистые функции бизнес-логики заказов, покрытые тестами.
|
||
- `src/services/supabase/orderRepository.js` — адаптер реальных чтений/записей заказов и чатов в Supabase, включая source-поля 1С и delivery-set поля.
|
||
- `src/services/driverDeliveries.js` — фильтрация и группировка доставок для рабочей области водителя.
|
||
- `src/layouts/AppShell.jsx` — общий shell с боковой навигацией, уведомлениями и переключением темы.
|
||
- `src/components/logistics/LogisticsReadinessBoard.jsx` — интерактивная доска с bucket-ами наборов доставки.
|
||
- `src/components/logistics/DeliverySetDetailPanel.jsx` — детальная карточка набора доставки: source-поля 1С, production-шаги, слоты, действия.
|
||
- `src/components/client/DeliverySlotsPicker.jsx` — публичный виджет выбора даты и половины дня доставки.
|
||
- `src/components/client/DeliveryChoiceFlow.jsx` — публичный поток согласования доставки по приглашению.
|
||
- `src/components/client/DeliveryStateNotice.jsx` — информационный экран для clients со статусом ссылки.
|
||
- `src/components/orders/*` — фильтры, список заказов, карточка заказа, история статусов и поиск по чату.
|
||
- `src/components/orders/OrderEditorPanel.jsx` — создание и редактирование заказа менеджером или администратором.
|
||
- `src/components/dashboard/ProductionQueuePanel.jsx` — отдельный блок производственной очереди.
|
||
- `src/components/dashboard/RoleWorkspacePanel.jsx` — рабочая панель с delivery-set bucket-ами для логиста.
|
||
- `src/components/admin/UserDirectoryPanel.jsx` — панель пользователей, ролей и последних входов.
|
||
- `src/components/logistics/BotControlPanel.jsx` — сценарии отправки в чатбот и переноса слотов доставки.
|
||
- `src/components/admin/AuditPanel.jsx` — журнал ошибок, исключений и обзор последних системных событий.
|
||
|
||
## Ролевой доступ
|
||
|
||
- 1С остаётся источником создания и прогресса заказов. Веб-приложение не создаёт заказы.
|
||
- Начальник производства переводит заказ через очередь и производство к готовности.
|
||
- **Логист** видит наборы доставки, слоты, сообщения чатбота и ручную обработку исключений.
|
||
- **Водитель** видит только назначенные доставки и может переводить их через статусы `Загружен`, `В пути`, `Доставлен`, `Проблема доставки`.
|
||
- **Администратор** видит весь массив заказов, доставок и системные логи.
|
||
- Клиент не является авторизованным пользователем приложения. Клиент использует публичную ссылку приглашения.
|
||
|
||
## Ключевые экраны
|
||
|
||
- `/login` — email + OTP flow. При отсутствии `VITE_SUPABASE_*` включается demo-режим. Подсказка проверять входящие и спам. Неизвестный email: «Email не найден в системе. Обратитесь к администратору.»
|
||
- `/dashboard` — role-based control center: для логиста — LogisticsReadinessBoard с наборами доставки, для водителя — план маршрута и быстрые действия.
|
||
- `/delivery/:token` — публичная страница согласования доставки для клиента.
|
||
- `public/manifest.webmanifest` + `public/service-worker.js` — installable PWA-оболочка и базовое кеширование shell для demo offline.
|
||
|
||
## Источник заказов: 1С → Supabase
|
||
|
||
- Заказы импортируются из 1С через XML и сохраняются в `public.orders` с source-полями: `source_order_number`, `source_customer_name`, `source_accept_at`, `source_ship_at` и т.д.
|
||
- Заказы группируются в **наборы доставки** (delivery sets) по `delivery_set_key` из n8n или по нормализованному телефону+имя клиента.
|
||
- Набор доставки считается готовым к запуску, когда все его заказы имеют `source_accept_at` и ни один не имеет `source_ship_at`.
|
||
- Поле `source_sms_legacy_at` сохраняется как историческое и **не должно** запускать новый сценарий доставки.
|
||
|
||
## Дизайн-концепт
|
||
|
||
- Минималистичная сетка с крупными панелями, прозрачными поверхностями и мягкими границами.
|
||
- Светлая тема использует холодно-зелёный акцент на светлом фоне.
|
||
- Тёмная тема построена на глубоких графитовых поверхностях с ярким мятным accent.
|
||
- Мобильная версия складывает layout в вертикальный поток; боковая панель становится верхним блоком.
|
||
|
||
## Интеграционный слой
|
||
|
||
- `src/supabaseClient.js` создаёт клиент Supabase через env-переменные.
|
||
- `src/services/safeSupabaseCall.js` стандартизирует обработку ошибок.
|
||
- Данные UI разложены по сущностям, совпадающим с таблицами Supabase: `orders`, `order_history`, `chat_messages`, `delivery_slots`, `delivery_invitations`.
|
||
- В `orders` синхронизированы поля `status`, `delivery_agreement_status`, `assigned_driver_id`, а также source-поля 1С и delivery-set данные. |