5fd6f81cbe
Владелец нащупал вопросом, замер подтвердил: клиент платит за РАЗМЕР СПИСКА, а МТС берёт с нас за ФАКТИЧЕСКИЕ показы, и сверки между этим нет вообще. Замерено, а не предположено: - списание считается от числа кандидатов (CampaignController.php:212-217); - счёт кампании 2231134 выставлен за 420 показов, а не за размер списка; - в RunTelegramCampaignJob.php:152 прямая запись, что живое списание по факту отложено «на Сессию 6, когда известен источник фактической цены». Итог: у кого нет телеграма — реклама не покажется, а деньги списаны. Разница остаётся у нас, это переплата клиента. Главный вывод промта: одной заморозки МАЛО. Заморозить можно, но чтобы разморозить лишнее, надо знать факт, а портал числа показов не хранит — это ровно тот пункт, который владелец 02.08 велел отложить как косметику. Сделать заморозку раньше факта значит разморозить ту же неправильную сумму. Отсюда порядок из трёх шагов: сперва научиться узнавать факт, потом кошелёк с заморозкой, потом показать клиенту строкой. Записано, чтобы не переоткрывали: кошелёк убрали НАМЕРЕННО 29.07 (коммит6f469fb13, таблицы ad_wallets целы), возврат по сальдо проводок сделан правильно и его надо сохранить, Яндекс живёт на кошельке с заморозкой. Состояние на бою и в ветке — замерами: вершина0b7453afcсодержит обе работы, статанализ 0, экраны 251/2033, телеграм+СМС 714/714. На бою разъехались половинки: сборка из объединённого дерева, серверный код нет, расходятся ровно 5 файлов, и CampaignController.php ломает показ цен. Выкат владелец решил отдать соседней смене. Ловушки собраны из этой ночи: сверять состав экранов ДО и ПОСЛЕ выкладки (при первом выкате проверка была, при втором нет — с боя исчезли экраны СМС, и снаружи всё выглядело здоровым), миграции только под crm_migrator с паролем из Lockbox по ID, старые пароли в liderra-secrets.txt от прежней базы, сведение приносит новые зависимости, цену в текст экрана не вбивать. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>