Триггер закрытия без даты больше не пишет «Согласовано» (новый статус closed_without_confirmation + backfill 128 строк). Робот/логист/ссылка считаются по событию одним классификатором (блоки больше не расходятся), тестовые звонки исключены, «Открыли ссылку» — по access_count, «не достали» разделено на «в работе» и «закрыто».
Владелец: «звонить вне окна разрешённого нельзя». Окно (часы и дни из панели
«Автодозвон») проверялось только для ручной очереди «Позвонить сейчас», а
автоматическая кампания его игнорировала: 28.09 робот позвонил клиенту в 19:58
и 21:03 МСК (в логе тик сам писал «Outside work hours», но тут же «Found 1
groups» → «Pushed call file»), после чего заказ ушёл в ручную работу.
Теперь перед выборкой кандидатов стоит та же проверка is_work_time(): вне окна
авто-обзвон не запускается, повтор, чей интервал истёк вечером, ждёт ближайшего
рабочего утра. Проверка: /tmp-check_window.py — 7 случаев (вне окна 19:58 и
21:03, внутри 09:00/10:00/18:59, воскресенье, суббота), все PASS; в логе новая
строка «Outside work hours (09:00-19:00 МСК (...)), auto calls skipped».
Проверка цепочки «варианты в меню → цифра → дата в заказе» нашла два дефекта:
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 → один одновременный звонок: перед постановкой в спул сверяем
занятость каналов транка на АТС и ставим не больше, чем есть свободных линий.
Не успевшие звонки просто ждут следующего тика таймера — иначе они падали бы
«занято» и уезжали в «не ответил». То же для ручных звонков из очереди.