# Архитектура фронтенда ## Модули - `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 данные.