docs: SMS campaigns architecture + font settings + stale highlight

This commit is contained in:
root 2026-07-02 14:37:58 +00:00
parent 20873bdc5f
commit c1e5f109be
2 changed files with 110 additions and 0 deletions

View File

@ -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)` — 👁 иконка если клиент открывал ссылку.

87
docs/sms-campaigns.md Normal file
View File

@ -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 |
|----------|---------|--------|-------------|
| Часы | 821 | 821 | 821 |
| Дни | Пн–Пт (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`