Commit Graph

296 Commits

Author SHA1 Message Date
Hermes cf5bf31008 feat(sms): текст SMS по типу отгрузки — свои шаблоны для доставки и самовывоза
Раньше текст был зашит в кампании и всегда говорил про доставку; настраиваемый
в админке sms_text_template не читался скриптами вообще. Сначала выяснилось,
что всем 909 pickup-группам уходило «Согласуйте дату доставки по ссылке».

- sms_campaign_settings.sms_text_template_pickup (новая колонка) + значения
  sms_text_template = «…дату доставки…», pickup = «…дату самовывоза…»
  (supabase/sms_text_templates_pickup.sql = миграция с фактическими текстами)
- sms_first_campaign / sms_second_campaign / sms_paid_storage_campaign:
  build_sms_text(group, settings) — шаблон выбирается по og.delivery_type,
  {link} подставляется ссылкой; приоритет профиль города (режим «Уведомление»)
  → шаблон кампании → дефолт скрипта
- вторая SMS и платное хранение тоже получили pickup-вариант (кампании были
  выключены, поэтому в текстах жил только «доставка»)
- SmsCampaignPanel: два поля ввода (📦 Доставка / 🏪 Самовывоз) + длины и
  предпросмотр с подставленной ссылкой + пояснение приоритета
- service-worker v117 (обязательный бамп при деплое фронта)
2026-09-28 10:50:32 +02:00
Hermes 21eade5d3f fix(autocall): в истории заказа слот тоже показываем датой
Таймлайн заказа дублировал ту же подпись «завтра/послезавтра»; теперь берёт
дату из общей функции (chosen_date строки лога или дата заказа).
2026-09-25 16:23:13 +02:00
Hermes 004050c0ff fix(autocall): карточка показывает реальный день слота, а не «завтра»
Цифра дня у робота (dtmf_day) — это не «завтра», а первый рабочий день окна:
звонок в пятницу предлагает понедельник, а суббота выходная. Карточка писала
«завтра, вторая половина дня» при согласованном 28.09 — менеджер видел день,
которого в окне нет.

Слот собирает общая функция components/orders/autocallSlot.js: дата из строки
лога (chosen_date), для старых строк — дата заказа, если слот согласовал этот
звонок. Если даты нет — показываем только половину дня, ничего не выдумывая.
Подключено в карточке заказа, вкладке «Автодозвон» и панели тест-звонка.
Есть юнит-тесты (5 кейсов).
2026-09-25 16:16:43 +02:00
Hermes c58f2b0629 fix(ui): закрытый баннер SMS больше не возвращается (отпечаток без суммы), баланс один на всех страницах; feat(autocall): статусы «не выбрал день» / «не выбрал время» / «и то и другое» (БД + бейдж + фильтр) 2026-09-17 12:32:53 +02:00
Hermes 775a72ea29 fix(autocall): «ручное управление» — это НЕ согласованный заказ; кнопку автодозвона по нему больше не блокирует (ошибка из прошлой правки) 2026-09-17 12:04:00 +02:00
Hermes 512aab9ff2 fix(sms): заказы больше не висят в «1-е приглашение отправлено» — в ручную работу переводим от последнего контакта и только по включённым каналам (SMS/автодозвон); заказ, где дата уже выбрана, роботу не звоним 2026-09-16 17:15:43 +02:00
Hermes e35b3d885f fix(autocall): заявку «позвонить сейчас» не закрываем — при закрытом окне звонка блокируем кнопку автодозвона с объяснением (по правилу владельца) 2026-09-16 16:47:49 +02:00
Hermes dacd43165c fix(autocall): заявка «позвонить сейчас» с закрытым окном звонка больше не висит вечно в очереди — планировщик закрывает её, карточка честно говорит «звонить больше не о чем» + кнопка «всё равно позвонить» 2026-09-16 16:39:28 +02:00
Hermes b965216181 feat(sms): в карточке объяснён статус «ручное управление» без ошибок отправки — SMS не отправлялись, согласование шло без SMS 2026-09-16 16:30:02 +02:00
Hermes 4192e44998 feat(sms): понятные причины ошибок в карточке доставки — техстроки планировщика (code=106, not delivered, limit exceeded) переводятся в человеческие 2026-09-16 16:19:17 +02:00
Hermes 5c98a54895 feat(autocall): звонок клиенту, если SMS не ушло (отсчёт от последней попытки) + статусы «не выбрал день/время» вместо «не нажал цифру» 2026-09-16 16:14:34 +02:00
Hermes 7ab3debbb3 fix(logistics): понятные статусы автодозвона в реестре доставок — своя подпись у каждого исхода, «не звонили» только по ожидающим заказам, убраны формулировки удалённых сценариев; единый список подписей для фильтра и бейджа 2026-09-16 11:03:28 +02:00
Hermes 8e9a0f6dab fix(autocall): ручной звонок из карточки звонит клиенту (тестовый режим только для массового обзвона) + видимый процесс звонка в карточке 2026-09-15 15:26:20 +02:00
Hermes 3706f64ca7 feat(orders): блок про SMS смотрит на баланс счёта — гасится после пополнения, закрывается крестиком, предупреждает о низком балансе (эдж-функция sms-balance) 2026-09-14 15:58:30 +02:00
Hermes dc262d2be7 feat(orders): причина неудачной отправки SMS — в карточке заказа и блоком над таблицей наборов (код 201 = кончились средства) 2026-09-14 15:40:15 +02:00
Hermes 1a310e5f5a fix(pickup): окно самовывоза в рабочих днях (пятница → пт, пн, вт) у робота и в ссылке; тесты окна 2026-09-14 13:59:13 +02:00
Hermes 11167516a3 feat(schedule): рабочие часы склада и доставки в админке — открытие/закрытие, границы половин, отсечка «сегодня»; робот и ссылка клиента читают часы 2026-09-14 13:15:49 +02:00
Hermes 794c3ce5e3 fix(autocall,client): рабочие дни из графика админки — самовывоз пн-пт у робота и ссылки, доставка в ссылке читает график; тексты панели «Рабочие дни» 2026-09-11 15:53:03 +02:00
Hermes 270ab39abc fix(autocall): самовывоз только по рабочим дням графика + робот называет реальные дни; страница клиента читает график 2026-09-11 15:40:29 +02:00
Hermes 139c895290 feat(autocall): локации — переключатели звонков по городам в админке (авто-дозвон), гео-правила общие с SMS 2026-09-11 11:59:44 +02:00
Hermes f62a6b525b feat(autocall): окно самовывоза 3 дня (сегодня/завтра/послезавтра), даты из диалога, гео-исключения как у SMS 2026-09-11 11:29:49 +02:00
Hermes c4e2c4a181 feat(autocall): самовывоз — тип звонка pkp/dlv из карточки заказа, выключатель самовывоза, тип в логе и очереди 2026-09-11 10:53:53 +02:00
Hermes 73b9512f15 fix(orders): список не пустеет при возврате — кэш отдаёт обёртку {data,error}, состояние не стирается 2026-09-10 15:04:47 +02:00
Hermes 52dc913fa7 fix(autocall): бейдж в таблице — «Автодозвон ✅ / ❌» вместо «слот от робота» 2026-09-10 14:53:44 +02:00
Hermes 9d1c74eda0 fix(autocall): сводка показывает последний успешный звонок; текст в сводке переносится вместо обрезки 2026-09-10 13:15:47 +02:00
Hermes f378fd05ef fix(autocall): блок «Автодозвон» не появлялся в карточке, если порядок блоков сохранён в localStorage — мердж с дефолтом 2026-09-10 11:32:14 +02:00
Hermes c7a35cdd29 feat(autocall): история звонков в карточке — как у SMS (попытки, слот, сценарий, длительность) 2026-09-10 11:28:39 +02:00
Hermes 04f78f7367 feat(filters): два отдельных фильтра «Статус SMS» и «Статус автодозвона» вместо «Прозвонить» 2026-09-09 14:49:31 +02:00
Hermes 587e12f562 feat(filters): единое поле «Период» без лейблов + упрощённый фильтр «Прозвонить» 2026-09-09 11:59:32 +02:00
Hermes 64bcda8eed feat(autocall): статус автодозвона в карточке (как у SMS) + фильтр «Прозвонить» в таблице + выравнивание переключателя 2026-09-08 13:04:01 +02:00
Hermes 1552c21d99 feat(autocall): автодозвон в карточке доставки — история действий, цепочка этапов, сводка статусов 2026-09-08 12:28:38 +02:00
Hermes 5dbeae84f4 feat(autocall): исключения автодозвона — таблица, UI в настройках, проверка в планировщике, бейдж в реестре/карточке 2026-09-08 11:16:16 +02:00
Hermes 5e4bfc1af0 feat(autocall): показ последних тест-звонков + честный статус задержки планировщика 2026-09-02 11:37:16 +02:00
Hermes 0d8e0f9d40 feat(autocall): тестовый звонок из UI для мегаадмина — autocall_queue nullable + is_test_call, TestCallPanel с окном результата 2026-09-02 11:10:06 +02:00
Hermes 6435679161 feat(autocall): раздел «Коммуникации» с вкладками SMS/Автодозвон/Аналитика, бейджи, карточка заказа, edge fn autocall-result, миграция БД 2026-09-01 21:34:39 +02:00
Hermes 6ca8bd545e fix(call): show & persist 'called' status
- mapOrderGroupRowToDeliveryGroup dropped called/called_at/called_comment
  fields (they were selected but never mapped) so the panel always read
  'not called' and freshly saved calls appeared to vanish.
- CalledPanel: one-tap 'Звонили' marks called with now; app-styled
  date/time dropdowns (CallDateTime) default to current moment for fast
  entry; comment edit form pre-filled.
- OrderDetailPanel: forward real onRefreshOrder (was a silent no-op) so
  the card refreshes from DB after a save.
2026-08-21 14:09:54 +02:00
Hermes f5a06188a2 fix: align row-2 controls by bottom edge of input fields (SMS + toggle flush with dates) 2026-08-19 13:02:30 +02:00
Hermes ebff56c749 fix: SMS dropdown text fits, align hide toggle on row, no skeleton flash on toggle 2026-08-19 12:52:38 +02:00
Hermes 46fac18e28 ui: restructure filters — search wider on row 1, SMS + hide-completed toggle switch on row 2 2026-08-19 12:36:27 +02:00
Hermes 0cdd9f52a4 ui: move hide-completed toggle into filter bar as checkbox next to SMS filter 2026-08-19 12:16:52 +02:00
Hermes a3cd0838f0 perf: hide-completed server filter + in-memory list cache for fast return-to-list 2026-08-19 11:58:20 +02:00
Hermes 8131e26c77 perf: load single order group by id in detail view instead of all 430 groups
- add fetchOrderGroupById (single .eq(id).single() query)
- useOrderGroups gains groupId mode: fetches one group, not full 2.6MB list
- GroupDetailPage passes groupId — fixes 30-40s card open on slow connections
2026-08-19 11:02:23 +02:00
Hermes 5ca9bd7ebf perf: code-split routes — client delivery page loads 34KB chunk instead of 932KB bundle
- lazy-load all pages via React.lazy + Suspense
- client-facing pages (SMS links) no longer pull DashboardPage (605KB) and admin panels
- fixes 30-40s loads on slow mobile connections (Crimea customers)
2026-08-19 10:58:39 +02:00
Hermes c62606b09d fix(push): remove staff calls to non-existent subscribe-push/unsubscribe-push edge functions (500 InvalidWorkerCreation)
- staff hook called /functions/v1/subscribe-push which does not exist on the
  server (functions are named push-subscribe/push-unsubscribe and are keyed by
  phone_normalized for the CLIENT flow only; push_subscriptions has no user_id)
- keep local browser PushManager subscription; drop broken server round-trips
- client PushSubscriptionBanner flow untouched (uses correct endpoint)
2026-08-18 12:32:26 +02:00
Hermes 7a76c0a6c0 feat(notifications): disable realtime/WebSocket entirely — REST fetch + focus refresh only
- remove postgres_changes .channel().subscribe() from useNotifications
- notifications now load via REST on mount and refresh on tab focus
- eliminates WS retry hangs (30-40s stalls) from dead realtime container;
  web-push (Push API) is unaffected and works independently
2026-08-18 10:58:39 +02:00
Hermes cd72507766 fix(pwa): purge stale caches from app startup — clear construction-delivery-* caches directly in page context, independent of SW update
- new src/utils/pwaCacheCleanup.js: deletes all construction-delivery-* caches
  except current v115 on every app load; runs in page context so it works even
  for users still on old SW
- wire into main.jsx startup
- fixes 3GB cache bloat / 30-40s hangs for users whose SW hasn't updated
2026-08-18 10:52:49 +02:00
Hermes 56cb4b460f fix(analytics): period key '1d' (Сегодня) not in PERIOD_DAYS map — fell back to 30 days; add '1d' to both hooks 2026-08-14 16:00:36 +02:00
Hermes 4a4b088949 fix(timeline): StatusSummary/Stepper show real SMS state from sms_campaign_log (delivered/failed), not just first_sms_sent_at 2026-08-14 15:07:22 +02:00
Hermes 7654413d8b fix(push): test notification targets the device's own subscription (by endpoint), not localStorage phone 2026-08-13 15:02:26 +02:00
Hermes fee800e3fa fix(client): test-notification button on /client sends push directly (url → /client/test-consent), no detour via /client/test 2026-08-13 14:33:32 +02:00