docs: SMS campaigns architecture + font settings + stale highlight
This commit is contained in:
parent
20873bdc5f
commit
c1e5f109be
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
- `src/context/AuthContext.jsx` — OTP-аутентификация через Supabase Auth и загрузка профиля пользователя с ролью. Неизвестный email показывает подсказку обратиться к администратору.
|
- `src/context/AuthContext.jsx` — OTP-аутентификация через Supabase Auth и загрузка профиля пользователя с ролью. Неизвестный email показывает подсказку обратиться к администратору.
|
||||||
- `src/context/ThemeContext.jsx` — управление светлой и тёмной темой через `data-theme`.
|
- `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/usePwaStatus.js` — клиентское состояние PWA: online/offline, install prompt, standalone и offline readiness.
|
||||||
- `src/hooks/useOrders.js` — локальный state заказов, истории, чатов, фильтров, действий и **сгруппированных наборов доставки** (deliverySetBuckets).
|
- `src/hooks/useOrders.js` — локальный state заказов, истории, чатов, фильтров, действий и **сгруппированных наборов доставки** (deliverySetBuckets).
|
||||||
- `src/hooks/useOrderGroups.js` — работа с группами заказов: загрузка, обновление статусов, ручное согласование доставки и самовывоза. Метод `saveManualDeliveryChoice` принимает `deliveryType`, `pickupDate`, `pickupTimeSlot`.
|
- `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).
|
- Docker-сборка через `docker-compose.app.yml` (multi-stage: Node.js build → Caddy serve).
|
||||||
- Автодеплой: Gitea webhook → systemd `supersam-webhook` → `deploy.sh` (git pull + docker build).
|
- Автодеплой: Gitea webhook → systemd `supersam-webhook` → `deploy.sh` (git pull + docker build).
|
||||||
- Домен: `https://dost.supersamsev.ru/`
|
- Домен: `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)` — 👁 иконка если клиент открывал ссылку.
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
Loading…
Reference in New Issue