Этап 3 «Время и цена», Task 3. Строки листа 3.4 и 3.5.
Ждущая рассылка перестала быть тупиком. Раз в четверть часа команда обходит рассылки,
висящие «ждёт утра», и заново кладёт в очередь те, у которых что-то созрело. Человек не
нажимает ничего: заказал в московский полдень — камчатские номера уйдут в своё утро сами.
Условие «есть что дослать» намеренно строгое: номер созрел И его ещё нет в журнале. Без
второй половины команда дёргала бы одну и ту же рассылку каждые 15 минут до самого конца
ожидания — работы ноль, а журнал шумит.
Команда работает вне запроса пользователя, то есть без tenant-контекста: рассылки
перечисляются служебным соединением (BYPASSRLS), а tenant_id уходит джобу явным аргументом.
Забыть это — получить на бою тихий ноль, тот самый класс поломки «srv_bypass».
Экран под статусом рассылки говорит человеческой фразой: «Отправлено 1 из 7, 1 ждут утра в
своих регионах, ещё 5 — уточняем регион». Два ожидания названы ПО ОТДЕЛЬНОСТИ: утро пройдёт
само, а регион сам не пройдёт, и написать про вторых «ждут утра» значило бы заставить
человека ждать зря.
Счёт ждущих живёт в одном месте — у читателя снимка (один запрос сразу про все рассылки
списка, иначе 50 запросов на открытие страницы). Прежний счёт по одной рассылке зовёт его же:
разъехавшись, экран и джоб рассказали бы про одну рассылку разное.
Прогоны: СМС 195/195 (было 191, 4 новых теста), приём лидов 17/17, фронт 1661 зелёный,
phpstan 0, pint чисто. Вырезанием проверено трижды: убрал «есть что дослать» — покраснел
контрольный тест «пока утро не наступило, не трогаем»; убрал «этого номера ещё нет в журнале»
— он же; убрал из подписи фразу про регион — покраснел фронтовый тест.
Живьём на локальной базе: заказал через браузер рассылку на 7 номеров, ушёл один москвич,
камчатскому проставлено ожидание до 22:00 UTC, пятеро без региона ждут уточнения. Команда
руками до утра — «Дослать: 0 рассылок», после сдвига срока — «1 рассылок» и номер ушёл,
повторный запуск снова 0. Экран сам перестал говорить про утро. Стенд возвращён как был.
🪤 Урок В-95: команда находила НОЛЬ при явно ждущей рассылке — служебное соединение в тестах
не видит незакоммиченных данных (лечится трейтом SharesSupplierPdo). Ловушка врёт в обе
стороны: тест «ничего не ушло» был бы зелёным по неправильной причине. Поймал только потому,
что рядом стоял парный тест «а теперь должно уйти».
⚠️ Ветку по-прежнему нельзя выкатывать до Task 5 (В-93).
Этап 3 «Время и цена», Task 2. Строки листа 3.1, 3.2 и первая половина 3.3.
У каждой строки снимка получателей появились две вещи: часовой пояс человека и момент,
раньше которого сообщение отдавать нельзя. Считается это ОДИН раз, при создании рассылки:
снимок сильнее всего (В-39), а на 20 000 номерах пересчёт на каждом витке джоба был бы
20 000 лишних расчётов.
Три состояния строки, и их важно не путать:
— пояс известен, ждать нечего → отдаём прямо сейчас;
— пояс известен, время не пришло → ждёт своего утра;
— пояса нет → ждёт уточнения региона и НЕ уходит вовсе (В-85).
Пустой пояс больше не означает «шлём по Москве». Он означает «мы не знаем, где человек
живёт», и такому номеру СМС не уходит. Про него при этом НЕ пишется в журнал рассылки
«нет маршрута»: мы его даже не пробовали отправить, и врать про него нельзя.
Рассылка, у которой часть номеров ещё ждёт, получает статус «ждёт утра» вместо «готово»,
и заморозка денег с неё не снимается — смета считалась на всех, оставшимся деньги ещё
понадобятся. Счётчик отправленного при этом обновляется: он считается из журнала, то есть
всегда правда, и человеку нужно видеть «отправлено 340 из 900» сразу, а не завтра (В-94).
Регион сделки читается из subject_code, а НЕ из region_code: последний в бою не пишет никто,
а в dev там демо-значения, и мы бы считали половину страны Тюменью — молча (В-82).
Прогоны: СМС 191/191 (было 186, 5 новых тестов), приём лидов 17/17, phpstan 0, pint чисто.
Вырезанием проверено дважды: убрал проверку «пояс известен» — покраснел тест про номер без
региона; убрал проверку «время пришло» — покраснели три теста про окно. Живьём на локальной
базе: две сделки (Москва и Камчатка) плюс пять демо-сделок без региона → ушёл один москвич,
Камчатке проставлено ожидание до 22:00 UTC (10 утра её времени), пятеро ждут региона,
рассылка висит «ждёт утра». Стенд возвращён как был.
В-93: у 19 старых тестов покраснение было закономерным — у их номеров нет региона. Боевой код
не ослаблял: фикстурам проставил регион и зафиксировал время прогона, иначе тесты зависели бы
от часа запуска. ⚠️ Ветку нельзя выкатывать между этой задачей и Task 5: пока ДаДата не начнёт
давать регион всем номерам, рассылка по своей базе и по списку руками отправит ноль.
Запись схемы v9.13.