Files
portal/app/tests/Feature/Deals
Дмитрий bde377a111 feat обзвон: статус обзвона виден в карточке сделки, пометки касаний в списке
Повторная запись той же работы. Первую соседняя смена сняла с ветки откатом
на один шаг назад, сделанным дважды подряд: первый откат убрал их собственный
коммит про кошелёк, второй убрал мой. Содержимое сверено побайтно со снятым
коммитом 015a10070 — все семнадцать файлов совпали до знака.

Менеджер открывал карточку клиента и не знал, звонили ему уже или нет, чем
кончился разговор, есть ли запись. Он набирал человека, которому робот звонил
час назад и которому уже пообещали перезвонить завтра, — человек слышал от
одной компании два несогласованных звонка. Теперь в карточке есть блок
«Обзвон», а в строке списка сделок — пометки о том, что мы этого человека уже
трогали.

Главное в задаче — не показ, а замок. Восемь исходов обзвона живут В ОДНОМ
столбце obzvon_number_results.outcome, и «не дозвонились» там такое же
разрешённое значение, как «переведено». Замок в базе сторожит СПИСОК значений,
а не их смысл, поэтому требование «двенадцать недозвонов после удачного
разговора не затирают удачный разговор» базой не охранялось вовсе: правильное
на вид действие с разрешённым значением давало запрещённый смысл, и ошибка
выглядела бы безупречно. Заведена единственная дверь записи исхода, и правило
спора вынесено в одно место — настройку.

Что появилось:

- config/obzvon.php — одно место раскладки восьми исходов на «про номер» и
  «про попытку», плюс два временных ответа на вопросы, которые владелец ещё не
  закрыл: где кончается «хоть секунда разговора» и сколько прошлых списков
  показывать в карточке. Переиграть каждый — поправить одно число;
- RaskladkaIskhodov — единственный, кто знает разницу между недозвоном и
  семью остальными исходами. Три правила: недозвон не ложится поверх
  разговора никогда; разговор ложится поверх недозвона всегда; два разговора
  спорят временем, и опоздавший отчёт не перепишет свежий;
- ItogPoNomeru — единственная дверь записи, с замком строки против гонки двух
  отчётов робота по одному номеру. В боевом коде её сегодня не зовёт никто:
  робот ещё не звонит. Дверь поставлена ДО первого пишущего — в этом её смысл;
- SvodkaObzvonaVSdelke — читающая сторона. В карточку: одно верхнее значение,
  лента состоявшихся разговоров по каждому номеру, недозвоны свёрнуты в
  счётчик. В список сделок: пометки касаний одним запросом на модуль на всю
  страницу, а не запросом на строку.

Слова для пометок подобраны нарочно другие. На экране сделок «Звонки» и «СМС»
уже означают, ОТКУДА пришёл лид. Назвать пометку теми же словами значило бы
дать человеку прочесть её задом наперёд, поэтому в колонке «Касания» стоят
«Обзвон» и «Рассылка».

Модулей два, а не четыре. Столбца deal_id нет ни у одной таблицы телеграма и
нет у рекламы — связи со сделкой у них не существует, и придумывать её было бы
враньём. Устройство под третий модуль открыто, и сторож числом запросов
обязан его заметить.

Схема базы не тронута: всё нужное было построено раньше.

Сторожа показаны красными шестью вырезаниями: вырезанное правило Т84 роняет
два сторожа сразу, «недозвон считается разговором» даёт девять строк ленты
вместо двух, запрос на строку даёт 61 запрос вместо 16, слияние номеров роняет
четыре сторожа, подмена слов пометок ловится сразу. Возврат каждого доказан
слепком со снятием невидимых знаков конца строки.

Прогоны: полный 5130 проверок, 5126 зелёных, 16099 утверждений, красных ноль.
Обзвон 234 из 234. Статанализ ноль, deptrac ноль.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 20:23:37 +03:00
..