Ежемесячная автоматизация с триггером не работает как ожидалось

Привет! Сегодня мы с Мойн обсуждали этот случай, и она предположила, что, возможно, есть ошибка при использовании параметра «ежемесячно», так как длительность месяца варьируется? Конечно, она была права — отчасти… :stuck_out_tongue:

В любом случае, я провёл небольшое расследование :detective:

Мне не удалось найти скрипт автоматизации для schedule pm with data-explorer results в основной папке plugins/automation/lib/discourse_automation/scripts, значит, он скрыт где-то ещё.

Однако я изучил логику здесь для повторяющихся событий (предположительно, этот скрипт использует её) в файле plugins/automation/lib/discourse_automation/triggers/recurring.rb:

Похоже, что базовый код для ежемесячных повторяющихся автоматизаций вычисляет N-й день недели вместо фактической календарной даты, и возникает несоответствие логики с параметром Calendar day — при внедрении BYDAY=#{count}#{byday} в RRule автоматизация принудительно привязывает событие к дню недели, тогда как следовало бы использовать BYMONTHDAY вместо BYDAY.

Таким образом, если вы настроите автоматизацию на запуск 15 апреля (который, кстати, является третьей средой апреля), система интерпретирует правило как: запускать в третью среду каждого месяца.

Когда наступает май, третья среда выпадает на 20 мая, из-за чего расписание смещается на 5 дней.

Более того, если вы установите автоматизацию на 30-е или 31-е число месяца (например, «пятый вторник»), система будет искать пятый вторник в следующем месяце. Если в этом месяце всего 4 вторника, автоматизация полностью не найдёт подходящую дату и тихо пропустит весь месяц.

У меня есть протестированное исправление, и я создаю PR, если команда захочет его проверить. Оно меняет логику с N-го дня недели на точную календарную дату.


Вот несколько скриншотов из моих тестов и отладки:

Два экземпляра: один без исправления, другой с моей логической правкой.

Создайте одну и ту же автоматизацию в обоих случаях (исправленная версия справа):

Обратите внимание на различия в баннерах с сообщением «Следующая автоматизация сработает в:» — наблюдается смещение на 5 дней: неотредактированная версия смещается к третьей среде (20 мая) вместо 15 мая.

Например, месяцы могут полностью пропускаться, если система ищет четвёртый четверг вместо фактической даты.

Тот же результат можно проверить в консоли Rails.

Без исправления:

С исправлением:

PR здесь:

2 лайка