Решение владельца: у самовывоза дата живёт в 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.
Проверка цепочки «варианты в меню → цифра → дата в заказе» нашла два дефекта:
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.
Канал call-файла строится из настройки autocall_trunk (sms_campaign_settings):
'gsm' — PJSIP/1<номер с 8>@goip5 (линия 1 модуля), 'mmedia' — прежний SIP-транк.
По умолчанию gsm.
У модуля одна SIM → один одновременный звонок: перед постановкой в спул сверяем
занятость каналов транка на АТС и ставим не больше, чем есть свободных линий.
Не успевшие звонки просто ждут следующего тика таймера — иначе они падали бы
«занято» и уезжали в «не ответил». То же для ручных звонков из очереди.
Цифра дня у робота (dtmf_day) — это не «завтра», а первый рабочий день окна:
звонок в пятницу предлагает понедельник, а суббота выходная. Карточка писала
«завтра, вторая половина дня» при согласованном 28.09 — менеджер видел день,
которого в окне нет.
Слот собирает общая функция components/orders/autocallSlot.js: дата из строки
лога (chosen_date), для старых строк — дата заказа, если слот согласовал этот
звонок. Если даты нет — показываем только половину дня, ничего не выдумывая.
Подключено в карточке заказа, вкладке «Автодозвон» и панели тест-звонка.
Есть юнит-тесты (5 кейсов).
Причина «кучи ошибок 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) — там тот же баг.