Commit Graph

379 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 ece302d512 fix(autocall): самовывоз пишет только pickup_date
Решение владельца: у самовывоза дата живёт в pickup_date + pickup_time_slot,
delivery_date/delivery_time робот не трогает (раньше дублировал в оба поля,
и дата самовывоза всплывала в полях доставки). Маркер «согласовано роботом»
общий — delivery_date_source='autocall': по нему работают карточка, фильтры и
SQL-статус autocall_status(og); отдельного pickup_date_source в схеме нет.

Проверено на боевой функции временными группами с метками в датах:
самовывоз — pickup_date обновился, delivery_date остался нетронутым;
доставка — delivery_date обновился, pickup_date нетронут. Временные группы удалены.
Исторический дубль (единственный: ТП-010747) очищен — дата осталась в pickup_date.
2026-09-25 17:30:29 +02:00
Hermes 7e719e6b43 fix(autocall): день робота → дата без сдвига; окно не считаем при пустом графике
Проверка цепочки «варианты в меню → цифра → дата в заказе» нашла два дефекта:

1. edge-функция: если дата в call-файл не попала (старый файл/сбой), дата считалась
   как «сегодня + цифра − 1» для ОБОИХ типов. Для доставки это сдвигало день на
   сутки назад: абонент нажимает «день 1» (робот говорит «завтра»), а в заказ
   уезжает сегодня. Теперь fallback повторяет ОЗВУЧЕННУЮ семантику: самовывоз
   день 1 = сегодня (сегодня/завтра/послезавтра), доставка день 1 = завтра,
   день 2 = послезавтра. Проверено живыми POST на функцию (5 случаев, включая
   приоритет chosen_date) — временная группа создана и удалена.

2. планировщик: при пустом «Графике работы» окна подменяют пустой список
   дефолтом Пн–Пт, то есть робот предлагал бы дни, когда компания не работает.
   Теперь при пустом графике звонок пропускается с понятным предупреждением.

Цепочка «варианты → цифра → дата» проверена на живых окнах: пятница 17:41 → доставка
пн/вт, самовывоз после отсечки 15:30 — только пн (2 варианта), при готовности сегодня
до 15:30 — 3 варианта (пт/пн/вт), цифры 1/2/3 → PICKUP_DAY1/2/3 и DELIVERY_DAY1/2
уходят в диалог и возвращаются как chosen_date.
2026-09-25 16:56:21 +02:00
Hermes 21eade5d3f fix(autocall): в истории заказа слот тоже показываем датой
Таймлайн заказа дублировал ту же подпись «завтра/послезавтра»; теперь берёт
дату из общей функции (chosen_date строки лога или дата заказа).
2026-09-25 16:23:13 +02:00
Hermes 3a4cceb9a4 feat(autocall-log): пишем дату согласованного слота (chosen_date) в журнал звонков
AGI уже передаёт дату (chosen_date) — теперь она сохраняется в autocall_log,
поэтому карточка и журнал показывают конкретный день, а не «день 1/2».
2026-09-25 16:16:43 +02:00
Hermes 462c2b4892 feat(autocall): основной транк обзвона — GSM-модуль клиента (goip5), Miranda запасной
Канал call-файла строится из настройки autocall_trunk (sms_campaign_settings):
'gsm' — PJSIP/1<номер с 8>@goip5 (линия 1 модуля), 'mmedia' — прежний SIP-транк.
По умолчанию gsm.

У модуля одна SIM → один одновременный звонок: перед постановкой в спул сверяем
занятость каналов транка на АТС и ставим не больше, чем есть свободных линий.
Не успевшие звонки просто ждут следующего тика таймера — иначе они падали бы
«занято» и уезжали в «не ответил». То же для ручных звонков из очереди.
2026-09-25 16:16:43 +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 2067ff7d89 fix(sms): кампании больше не долбят один номер бесконечно (код 107 у сотен SMS)
Причина «кучи ошибок 107»: номер попытки читался из строки лога
(attempts = item.get("attempts", 1)), а каждая повторная отправка вставляла
НОВУЮ строку с attempts=1. Условие attempts < max_attempts выполнялось всегда,
поэтому группа уходила в повтор каждые 5 минут бесконечно: заказ ТП-010543
(9780187307) — 461 отправка за 3,5 суток, ни одна не доставлена, в ручную
работу заказ не ушёл.

- номер попытки считается по группе (count строк кампании) и пишется в строку
  и в order_groups.sms_attempts;
- в выборке на отправку жёсткий лимит попыток — повтор невозможен даже при
  сбое статуса;
- попытки исчерпаны → manual_required («нужен менеджер»), а не send_failed;
- новый шаг 4: группа с исчерпанными попытками, застрявшая в link_ready,
  сама уходит в manual_required (самолечение);
- то же исправление во второй кампании (second_sms) — там тот же баг.
2026-09-21 17:28:46 +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 aeb4bbf63f fix(autocall): убраны сценарии «0» и «9» из диалога и из презентации; пауза между звонками 1 час; граница половины дня 13:00; в презентации готовность по обмену с 1С, без готовности в субботу 2026-09-16 10:36:01 +02:00
Hermes 833d2dcd44 fix(autocall): в презентации готовность приходит по обмену с 1С, а не отметкой менеджера; PDF и HTML собираются из одного файла содержания 2026-09-15 18:02:22 +02:00
Hermes d9ded99e81 docs(autocall): HTML-версия презентации из общего файла содержания (deck_content.py), проверка совпадения текста с PDF 2026-09-15 15:50:19 +02:00
Hermes ed89222834 docs(autocall): презентация «Автодозвон: как это работает» (PDF, 16 слайдов) + скрипт сборки и проверки вёрстки 2026-09-15 15:38:49 +02:00
Hermes 8e9a0f6dab fix(autocall): ручной звонок из карточки звонит клиенту (тестовый режим только для массового обзвона) + видимый процесс звонка в карточке 2026-09-15 15:26:20 +02:00
Hermes 5a71fbceba docs(ats): образцы звучания собираются из списка файлов AGI-харнесса + скрипт сборки (в ручном образце «в пятницу» вместо «сегодня») 2026-09-15 09:56:37 +02:00
Hermes 47b3ccf28f fix(autocall): убран сценарий «0 — позвать менеджера» — такой цифры в диалоге нет, менеджер подключается только эскалацией 2026-09-15 09:50:26 +02:00
Hermes 44f58ce9e7 fix(autocall): доставка предлагает реальные рабочие дни графика (пт → пн/вт), эскалация по настройкам админки, WAIT FOR DIGIT и «0 — менеджер» 2026-09-15 09:40:43 +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 6ebdc41667 fix(ats): название компании «Супер Сам» (пробел) — выбор владельца, залито на АТС 2026-09-14 14:51:31 +02:00
Hermes f9395d7d05 fix(ats): название компании раздельно в озвучках (Супер, Сам) + инструкция по генерации и проверке озвучек 2026-09-14 14:27:26 +02:00
Hermes 1660cced66 feat(schedule): дни SMS в ЛК реально управляют рассылками — скрипты читают sms_days из графика 2026-09-14 14:14:37 +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 feb3fc1b07 fix(agi): обрыв диалога — отдаём результат в БД (иначе звонок задним числом записывался как «не взял трубку») 2026-09-11 11:05:57 +02:00
Hermes c4e2c4a181 feat(autocall): самовывоз — тип звонка pkp/dlv из карточки заказа, выключатель самовывоза, тип в логе и очереди 2026-09-11 10:53:53 +02:00
Hermes 46a3609233 fix(autocall): исход «не взял трубку» — добор истёкших заявок + детект объявления оператора в AGI 2026-09-10 15:27:59 +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 95af771596 perf(autocall): таймер 60с + fast-path (молча, если очередь пуста и кампания выключена) 2026-09-02 11:42:58 +02:00