О платформе Войти
← К списку версий
v0.89.0 01.10.2026 MINOR
Месячный отчёт — за предыдущий месяц, по одному письму на клиента
ТЗ 269 «Месячные письма называют не тот месяц». Генератор будущих писем email:generate-upcoming готовил месячный дайджест с датой отправки как отчётной: письмо, намеченное на 1 октября, называлось «Ваш проект — итоги за Октябрь 2026» ещё до начала октября, и список выполненных задач отбирался за неверный месяц. Сборка месячного письма вынесена в единый сервис MonthlyDigestService, где отчётный период всегда равен месяцу отправки минус один. Месячный отчёт — один на клиента и собирается по его текущему проекту (вместо письма на каждый активный проект), а требование активной подписки снято: получателем является любой клиент со статусом «В работе». Добавлена команда email:rebuild-monthly для пересборки буфера. На тестовом стенде пересобраны месячные письма с октября 2026 по март 2027 — 60 писем для 10 клиентов «в работе», каждое с подписью предыдущего месяца. Версия v0.89.0.
Что сделано
  • Правильный отчётный месяц - Отчётный период месячного письма считается как месяц отправки минус один: письмо на 1 октября подписывается «итоги за Сентябрь 2026» и собирает задачи, завершённые в сентябре. Раньше и генератор будущих писем, и список задач смотрели в месяц отправки.
  • Одно письмо на клиента - Месячный дайджест собирается по текущему проекту клиента (Client::resolveCurrentProject) и отправляется один раз в месяц. Раньше письмо создавалось на каждый активный проект — у клиента с 29 проектами это означало бы 29 писем в месяц.
  • Без требования подписки - Получателем месячного отчёта является любой клиент со статусом «В работе», у которого заполнен адрес и который не отписался от рассылки. Требование активной подписки (client_subscriptions) снято: письмо не должно зависеть от того, как заведён тариф.
  • Отчётный период в данных письма - В письмо пишутся metadata.report_period (тип, границы, подпись, ключ периода) и task_ids — буфер и предпросмотр показывают, за какой месяц и за какие задачи собрано письмо. Раньше это заполняла только команда mail:send-monthly.
  • Пересборка буфера - Добавлена команда email:rebuild-monthly (--from, --months, --dry-run): обновляет уже подготовленные месячные письма, создаёт недостающие, отменяет дубли и письма клиентам вне рассылки. Уже отправленные письма не трогаются.
Что важно знать
  • Пересобрано на TEST - Месячные письма с 01.10.2026 по 01.03.2027 (6 месяцев) пересобраны для 10 клиентов «в работе» (№ 5, 6, 18, 19, 23, 24, 27, 29, 32, 36) — по одному письму на клиента, все с подписью предыдущего месяца. Клиенты в корзине, на проверке и без активного проекта письма не получают.
  • Письма 1 сентября остаются историей - Шесть писем, отправленных 01.09.2026, оставлены без изменений: они уже ушли клиентам, переписывать историю нельзя.
  • Список выполненных зависит от дат задач - В отчёт попадают только задачи с заполненной датой завершения, попадающей в отчётный месяц. Задачи без даты завершения в отчёт не берутся — если у проекта не проставлены даты закрытия, месячный список выполненных будет пустым, и письмо об этом честно сообщает.
Результат
  • Письмо, уходящее 1-го числа, называет и показывает итоги прошедшего месяца, приходит клиенту одним письмом и не зависит от того, заведён ли у него тариф.