L'automatisation récurrente déclenchée mensuellement ne fonctionne pas comme prévu

Ok, donc Moin et moi avons discuté de ce cas aujourd’hui, et elle a soulevé l’idée qu’il pourrait y avoir un bug lors de l’utilisation de l’option « mensuel », car la durée d’un mois varie ? Bien sûr, elle avait raison – en quelque sorte… :stuck_out_tongue:

Quoi qu’il en soit, j’ai creusé un peu plus :detective:

Je n’ai pas pu trouver le script d’automatisation pour schedule pm with data-explorer results dans le dossier plugins/automation/lib/discourse_automation/scripts du cœur du système, il se cache donc ailleurs.

Cependant, j’ai examiné la logique ici pour les déclencheurs récurrents (ce script l’utilise probablement) dans plugins/automation/lib/discourse_automation/triggers/recurring.rb :

Je pense que le code sous-jacent pour les automatisations récurrentes mensuelles calcule le Nᵉ jour de la semaine au lieu de la date réelle du calendrier, ce qui crée un décalage logique avec « Jour du calendrier ». En injectant BYDAY=#{count}#{byday} dans la règle RRule, l’automatisation impose un alignement sur le jour de la semaine, alors qu’elle devrait utiliser BYMONTHDAY à la place de BYDAY.

Ainsi, si vous configurez une automatisation pour commencer le 15 avril (qui tombe un mercredi, le 3ᵉ du mois), le système interprète la règle comme suit : exécuter le 3ᵉ mercredi de chaque mois.

Lorsque mai arrive, le 3ᵉ mercredi tombe le 20 mai, ce qui provoque un décalage de 5 jours dans le planning.

De plus, si vous configurez une automatisation le 30 ou 31 du mois (par exemple, le « 5ᵉ mardi »), le système cherchera le 5ᵉ mardi du mois suivant. Si ce mois ne compte que 4 mardis, l’automatisation ne trouvera aucune date valide et passera silencieusement le mois entier.

J’ai une correction testée et je prépare une PR si l’équipe souhaite l’examiner. Elle modifie la logique pour passer du Nᵉ jour de la semaine à la date exacte du calendrier.


Voici quelques captures d’écran de mes tests et débogages :

Deux instances, l’une sans correctif et l’autre avec ma correction de logique

Créez la même automatisation exacte dans les deux (la version corrigée est à droite) :

Observez les différences dans les bannières indiquant « La prochaine automatisation se déclenchera à : » avec un décalage de 5 jours – la version non corrigée dérive vers le troisième mercredi (20 mai) au lieu du 15 mai.

Par exemple, des mois pourraient être totalement ignorés si le système cherchait le 4ᵉ jeudi au lieu d’une date réelle.

Vous pouvez également tester le même résultat dans la console Rails.

Sans correctif :

Avec correctif :

PR ici :

2 « J'aime »