diff --git a/docs/architecture.md b/docs/architecture.md index 442aab0..30fdc36 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -4,6 +4,7 @@ - `src/context/AuthContext.jsx` — OTP-аутентификация через Supabase Auth и загрузка профиля пользователя с ролью. Неизвестный email показывает подсказку обратиться к администратору. - `src/context/ThemeContext.jsx` — управление светлой и тёмной темой через `data-theme`. +- `src/context/FontSettingsContext.jsx` — настройки размера шрифтов (6 категорий: таблицы, карточки, меню, заголовки, основной текст, мелкий текст). Сохранение в `localStorage` (ключ `supersam-font-settings`). Применяет CSS-переменные `--fs-scale-*` на `:root`. - `src/hooks/usePwaStatus.js` — клиентское состояние PWA: online/offline, install prompt, standalone и offline readiness. - `src/hooks/useOrders.js` — локальный state заказов, истории, чатов, фильтров, действий и **сгруппированных наборов доставки** (deliverySetBuckets). - `src/hooks/useOrderGroups.js` — работа с группами заказов: загрузка, обновление статусов, ручное согласование доставки и самовывоза. Метод `saveManualDeliveryChoice` принимает `deliveryType`, `pickupDate`, `pickupTimeSlot`. @@ -101,3 +102,25 @@ Edge function `confirm-delivery-choice` передаёт `p_delivery_type`, `p_p - Docker-сборка через `docker-compose.app.yml` (multi-stage: Node.js build → Caddy serve). - Автодеплой: Gitea webhook → systemd `supersam-webhook` → `deploy.sh` (git pull + docker build). - Домен: `https://dost.supersamsev.ru/` +- Dev: `https://dev.mkn8n.ru/` +- SW инвалидация: `construction-delivery-static-vNN` → `--no-cache` rebuild. +- **Важно**: `sed` для bump SW версии — только `construction-delivery-static-vNN` и `runtime-vNN`, НЕ `v[0-9]*` (ломает `addEventListener`). + +## SMS-кампании + +См. `docs/sms-campaigns.md` — полная документация. +4 systemd timer+service+Python скрипта, сервер 217.114.5.8. + +## Настройки интерфейса + +- `src/pages/SettingsPage.jsx` — UI настроек (пресеты + слайдеры). +- `src/styles/fontSettings.css` — CSS-зоны `.fs-zone-*` оверрайдят Tailwind `text-*`. +- Порядок CSS: body FIRST, затем table/card/nav/heading/small — специфичные зоны побеждают. +- Arbitrary px sizes (`text-[10px]` — `text-[14px]`) требуют явных оверрайдов. +- `localStorage` ключ: `supersam-font-settings`. + +## Stale подсветка + +- `isStale(group)` — `updatedAt > 24ч` и статус не в AGREED_STATUSES. +- Жёлтый фон `bg-[rgba(191,123,33,0.06)]` на строке таблицы. +- `isLinkOpened(group)` — 👁 иконка если клиент открывал ссылку. diff --git a/docs/sms-campaigns.md b/docs/sms-campaigns.md new file mode 100644 index 0000000..b92b702 --- /dev/null +++ b/docs/sms-campaigns.md @@ -0,0 +1,87 @@ +# SMS Campaigns — Архитектура + +## Обзор + +4 сценария SMS-рассылок, каждый — systemd timer + service + Python скрипт. +Сервер: `217.114.5.8`, скрипты в `/opt/supersam/scripts/`. + +## Сценарии + +| Сценарий | Timer | Скрипт | Триггер | +|----------|-------|--------|---------| +| 1-я SMS | `sms-first-campaign.timer` | `sms_first_campaign.py` | `notification_status=link_ready` + `delivery_status=pending_confirmation` | +| 2-я SMS | `sms-second-campaign.timer` | `sms_second_campaign.py` | `notification_status=first_sms_sent` + время прошло | +| Ручное управление | `sms-manual-campaign.timer` | `sms_manual_campaign.py` | `second_sms_sent` + expired, или `link_ready` без SMS > 3ч, или `sms_sending` > 3ч | +| Платное хранение | `sms-paid-storage-campaign.timer` | `sms_paid_storage_campaign.py` | `notification_status=paid_storage` + `paid_storage_at` | + +## Timer конфигурация + +- `OnUnitActiveSec=600` — каждые 10 минут +- `sms_timer_manager.sh` — управляет `timer_active` + `run_requested` + `needs_check` +- `fcntl.flock` во всех скриптах — защита от параллельного запуска +- `send_telegram` = no-op (pass) + +## Логика retry + +- 2 попытки отправки SMS с интервалом ~90 мин +- Если код SMS.ru не 103 (доставлено) после 2 попыток → `manual_required` +- `effective_attempts = max(sms_attempts, total_failed)` — total_failed из всей истории `sms_campaign_log` +- Код 231 (лимит одинаковых) → `send_failed`, НЕ повторять + +## Рабочие часы + +| Параметр | 1/2 SMS | Manual | Paid Storage | +|----------|---------|--------|-------------| +| Часы | 8–21 | 8–21 | 8–21 | +| Дни | Пн–Пт (1-5) | Пн–Сб (1-6) | Пн–Пт | +| Проверка статусов | 24/7 | 24/7 | 24/7 | + +## Настройки (БД `sms_campaign_settings`) + +- `test_mode` — false (1/2 SMS), true (manual/paid_storage) +- `test_phone` — 79788382260 +- `timer_active` — управляет включением systemd timer +- `send_interval_seconds` — пауза между отправками (15с) +- `work_hours_start/end` — 8/21 +- `work_days` — "1,2,3,4,5" или "1,2,3,4,5,6" +- `last_run_at` — обновляется при каждом запуске скрипта +- `last_balance` — баланс sms.ru после последней отправки + +## SMS.ru + +- Провайдер: sms.ru +- Коды: 100 (в очереди), 102 (в пути), 103 (доставлено), 104-108 (ошибка), 231/232 (лимит) +- API ключ хранится в `sms_campaign_settings` +- Баланс отображается в UI (SmsCampaignPanel) + +## UI (SmsCampaignPanel.jsx) + +- `getRunnerStatus(settings)` — показывает статус последнего запуска: + - 🟢 Работает (Xм назад) — < 10 мин + - 🟡 Xм назад — < 60 мин + - 🔴 Xч назад — < 24ч + - 🔴 Xд назад — > 24ч +- `🔴 Xд назад` = `last_run_at` был более 24 часов назад +- 4 вкладки кампаний, переключатель test/боевой, таймер on/off +- Логи отправок, фильтры (дата, открытие ссылки), bulk delete +- Edge function `check-sms-status` — мгновенная проверка SMS через sms.ru API + +## State Machine + +``` +not_started → link_ready → sms_sending → checking → first_sms_sent + → second_sms_sending → second_sms_sent → manual_required → confirmed + → address_required → agreed → driver_assigned → loaded → on_route → delivered/picked_up +``` + +## Ссылки + +- SMS ссылка содержит `?src=sms` — отличает открытие клиентом от админа +- `opened_at` ставится только при `p_src='sms'` в RPC `get_delivery_invitation_by_token` +- `access_count` растёт при любом открытии + +## Деплой + +- Скрипты: напрямую в `/opt/supersam/scripts/` (не в Docker) +- UI: SCP → `docker compose -f docker-compose.app.yml build --no-cache && up -d` +- SW bump: `sed -i 's/construction-delivery-static-v[0-9]*/vNN/g' public/service-worker.js` \ No newline at end of file