Files
portal/app/routes
Дмитрий 83f685bbac refactor(смс-клиент): контроллер рассылки разрезан на три по смыслу (строка Н.1)
Перекладка, а не правка: поведение прежнее, тесты не тронуты ни в одной строке.

Был один файл на 914 строк — в голову и в контекст он уже не помещался. Стало:

- ClientSmsController (333) — сами рассылки: смета, запуск, остановка, журнал;
- ClientSmsBaseController (280) — база номеров, стоп-лист «Не писать этим», шаблоны;
- ClientSmsSenderController (354) — своё имя отправителя, бланк согласия, авто-СМС.

Эффективное имя отправителя нужно двум файлам сразу (рассылке и разделу имени),
поэтому вынесено в трейт ResolvesClientSmsSenderName. Разойтись эти два места
права не имеют: расхождение означало бы, что клиент видит на экране одно имя,
а МТС получает другое.

Адреса маршрутов не изменились ни одним символом — в routes/web.php заменено
только имя класса, иначе сломались бы фронт и старые тесты.

Сверх таблицы плана (журнал В-74): приватные помощники addContacts/addOptouts
уехали вместе со своими публичными методами, сервис цен внедрён в два
контроллера — рассылке для сметы, имени отправителя для цены авто-СМС.

Доказательства (В-75; вырезание защиты здесь неприменимо — новой защиты нет):
ClientSms 169/169 — ровно столько же, сколько до разреза, без правок тестов;
приём лидов 17/17; phpstan 1 ошибка, и та чужая давняя (nullsafe в consentForm),
просто переехала вместе с кодом; pint чисто.

Контрольный вырез: нарочно вернул два маршрута (/optouts и /sender) на старый
класс, где этих методов уже нет — покраснели 5 тестов в двух файлах. Значит
прогон действительно ходит через маршруты и заметил бы ошибку разреза.

Живой прогон: все три области экрана ответили (рассылки, шаблоны, имя
отправителя, база, стоп-лист, авто-СМС); предпросмотр по сделкам — «Уйдёт 5 СМС
— 45.00 ₽»; шаблон заведён кнопкой и убран кнопкой. Стенд возвращён как был.

Схему не трогали — записи в журнал схемы не требуется.
2026-07-28 12:19:49 +03:00
..