83f685bbac
Перекладка, а не правка: поведение прежнее, тесты не тронуты ни в одной строке. Был один файл на 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 ₽»; шаблон заведён кнопкой и убран кнопкой. Стенд возвращён как был. Схему не трогали — записи в журнал схемы не требуется.