http://redmine.ulysses.fr/http://redmine.ulysses.fr/themes/PurpleMine2/favicon/favicon.ico?16318893672022-01-11T08:25:53ZGalette bugs & featuresGalette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210192022-01-11T08:25:53ZGuillaume AGNIERAY
<ul></ul><p>Frederic CROZET a écrit :</p>
<blockquote>
<p>Hello,</p>
</blockquote>
<p>Hello !</p>
<blockquote>
<p>C'est un problème récurent que je rencontre depuis des années pour les courriels de rappel des échéances de cotisation.<br />La liste des rappels d'échéances (« Échéances proches » et « Échéances dépassées ») est toujours correcte (hormis l'anomalie <a class="issue tracker-1 status-5 priority-3 priority-lowest closed" title="Anomalie: Incohérence rappels échéances proches et en retard (Fermé)" href="http://redmine.ulysses.fr/issues/1590">#1590</a>).</p>
</blockquote>
<p>Oui, merci pour les infos que tu fais remonter sur le tracker :)<br />Elles me sont bien utiles pour mieux comprendre le fonctionnement de galette dans le cas de cotisations par durée. <br />Car le problème ne se produit pas a priori dans le cas de cotisations par date de début d'exercice (ou alors dans une bien moindre mesure).</p>
<blockquote>
<p>Par contre, certains rappels ne génèrent pas de courriels. Et j'ai donc des adhérents qui ne sont pas informés de leurs échéances.<br />Et je ne comprends pas pourquoi.</p>
</blockquote>
<p>Il y a peut-être des erreurs dans les tests unitaires des rappels (<a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Anomalie: Mistakes in reminders' unit tests (Fermé)" href="http://redmine.ulysses.fr/issues/1612">#1612</a>). <br />C'est ce qui ressort de <a class="issue tracker-1 status-5 priority-3 priority-lowest closed" title="Anomalie: Incohérence rappels échéances proches et en retard (Fermé)" href="http://redmine.ulysses.fr/issues/1590">#1590</a>.<br />S'assurer que les tests sont corrects devrait nous aider à mieux comprendre ;</p>
<blockquote>
<p>A priori, lors de la première échéance (1ière année) tout fonctionne parfaitement, tout le monde reçoit des courriels.</p>
</blockquote>
<p>Il y a plein de raisons indépendantes de Galette qui peuvent empêcher la <em>réception</em> d'un email. <br />Difficile de confirmer l'existence d'un dysfonctionnement de Galette sur ce simple constat.</p>
<p>À moins d'une erreur d' <em>expédition</em> qui serait alors normalement mentionnée dans les logs, une fois que les emails sont expédiés, la réception n'est plus du ressort de Galette :/</p>
<blockquote>
<p>Par contre pour les échéances suivantes (2nd année, 3ième ...etc.) certains rappels ne fonctionnent pas alors pour que pour certains autres tout fonctionne.</p>
</blockquote>
<p>Rien n'exclue un problème dans le calcul des échéances qui déclenchent les rappels. <br />C'est plus probablement de là que proviendrait le souci.</p>
<blockquote>
<p>Le problème est le même quelque soit le type d'échéance proches et dépassées.<br />Je n'arrive pas à expliquer ce dysfonctionnement.<br />Est-ce une limitation du nombre de courriel envoyé?</p>
</blockquote>
<p>Il existe effectivement des quotas sur les rappels envoyés par Galette.<br />Je sais que tu utilisais les rappels automatiques jusqu'à récemment (<a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Anomalie: Les rappels automatiques ne fonctionnent plus (Fermé)" href="http://redmine.ulysses.fr/issues/1604">#1604</a>).<br />À quelle fréquence déclenches-tu tes rappels ?</p>
À la lecture des sources des rappels, un membre ne peut recevoir que 4 rappels par an max (et au minimum 2 selon la date à laquelle les rappels sont déclenchés) :
<ul>
<li>dans le cas des retards :<br /> - <a href="https://bugs.galette.eu/projects/galette/repository/62/revisions/master/entry/galette/lib/Galette/Repository/Reminders.php#L177" class="external">un premier après 1 mois de retard</a><br /> - <a href="https://bugs.galette.eu/projects/galette/repository/62/revisions/master/entry/galette/lib/Galette/Repository/Reminders.php#L178" class="external">un second après 2 mois de retard</a></li>
<li>dans le cas des échéances proches<br /> - <a href="https://bugs.galette.eu/projects/galette/repository/62/revisions/master/entry/galette/lib/Galette/Repository/Reminders.php#L160" class="external">un premier dans une période d'un mois précédant l'échance</a><br /> - <a href="https://bugs.galette.eu/projects/galette/repository/62/revisions/master/entry/galette/lib/Galette/Repository/Reminders.php#L161" class="external">un second dans les 7 jours précédant l'échéance</a></li>
</ul>
<blockquote>
<p>Les cotisations précédentes ont été régularisées avec + de 60 jours après l'échéance ??<br />Aujourd'hui par exemple, j'ai 4 sur 8 échéances proches qui n'ont pas généré de courriels et 4 sur 6 retardataires également...</p>
</blockquote>
<p>Les dates d'échéances pour les emails non générés entre-elles bien dans les délais dont j'ai fait état ci-dessus ?</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210212022-01-11T08:26:37ZGuillaume AGNIERAY
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/1612">Anomalie #1612</a>: Mistakes in reminders' unit tests</i> ajouté</li></ul> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210232022-01-11T08:26:42ZGuillaume AGNIERAY
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-1 status-5 priority-3 priority-lowest closed" href="/issues/1590">Anomalie #1590</a>: Incohérence rappels échéances proches et en retard</i> ajouté</li></ul> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210242022-01-11T09:06:13ZFrederic CROZET
<ul></ul><p>Hello,</p>
<blockquote>
<p>Car le problème ne se produit pas a priori dans le cas de cotisations par date de début d'exercice (ou alors dans une bien moindre mesure).</p>
</blockquote>
<p>Effectivement, je suis en "durée d’adhésion par défaut" de 12 mois</p>
<blockquote>
<p>Il y a plein de raisons indépendantes de Galette qui peuvent empêcher la <em>réception</em> d'un email. <br />Difficile de confirmer l'existence d'un dysfonctionnement de Galette sur ce simple constat.<br />À moins d'une erreur d' <em>expédition</em> qui serait alors normalement mentionnée dans les logs, une fois que les emails sont expédiés, la réception n'est plus du ressort de Galette :/</p>
</blockquote>
<p>Il n'y a pas de génération de courriel. Et je ne l'avais pas précisé précédemment mais j'ai rien dans les logs.</p>
<blockquote>
<p>Rien n'exclue un problème dans le calcul des échéances qui déclenchent les rappels. <br />C'est plus probablement de là que proviendrait le souci.</p>
</blockquote>
<p>Je pense aussi...<br />Lorsque j'efface la ligne d'un membre, dont les relances ne fonctionnent pas, dans la table "galette_reminders" tout refonctionne pour lui au moins pour cette année.<br />Voir un ancien échange avec Johan a ce sujet : [[<a class="external" href="https://listengine.tuxfamily.org/lists.galette.eu/users/2020/12/msg00010.html">https://listengine.tuxfamily.org/lists.galette.eu/users/2020/12/msg00010.html</a>]]</p>
<blockquote>
<p>Il existe effectivement des quotas sur les rappels envoyés par Galette.<br />Je sais que tu utilisais les rappels automatiques jusqu'à récemment (<a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Anomalie: Les rappels automatiques ne fonctionnent plus (Fermé)" href="http://redmine.ulysses.fr/issues/1604">#1604</a>).<br />À quelle fréquence déclenches-tu tes rappels ?</p>
</blockquote>
<p>Auparavant, j'étais sur un déclenchement par tâche cron hebdomadaire. Puis comme il y avait des loupés, je suis passé à journalière.<br />Bon depuis, les relances par tache "cron" ne sont plus opérationnelles donc je suis sur des relances manuelles (1 à 3 par semaine). Ces derniers temps pour chercher à comprendre, je suis plutôt à un rappel journalier.</p>
<blockquote>
<p>Les dates d'échéances pour les emails non générés entre-elles bien dans les délais dont j'ai fait état ci-dessus ?</p>
</blockquote>
<p>Oui, et ils apparaissent bien dans la liste des échéances. Et j'ai bien compris le principe des deux rappels d'échéance proche et des deux autres pour les retardataires.<br />Notre association est un club canin avec des adhérents qui s'inscrivent tout au long de l'année. C'est un réel confort ces relances automatiques pour la gestion des cotisations de nos 120 adhérents.</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210252022-01-11T10:00:22ZFrederic CROZET
<ul></ul><p>Pour ma culture générale, je ne comprends pas trop le rôle de la table galette_reminders.<br />La colonne "reminder_date" est la date de la dernière relance, a priori.<br />et je n'ai pas compris également la fonction de la colonne "reminder_type" 1 ou 2 ?</p>
<p>Pour info, les relances, qui ne fonctionnent pas, ne mettent pas à jour "reminder_date" qui reste à l'échéance de Janvier 2021 par exemple ;)</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210292022-01-11T10:54:53ZJohan Cwiklinskijohan@x-tnd.be
<ul></ul><p>Frederic CROZET a écrit (<a href="#note-5">#note-5</a>):</p>
<blockquote>
<p>Pour ma culture générale, je ne comprends pas trop le rôle de la table galette_reminders.<br />La colonne "reminder_date" est la date de la dernière relance, a priori.<br />et je n'ai pas compris également la fonction de la colonne "reminder_type" 1 ou 2 ?</p>
<p>Pour info, les relances, qui ne fonctionnent pas, ne mettent pas à jour "reminder_date" qui reste à l'échéance de Janvier 2021 par exemple ;)</p>
</blockquote>
<p>Cette table stocke les relances envoyées. La date est al date d'envoi, ça permet de respecter les "délais" codés en dur dans Galette. <br />Quant aux 1 (échéances proches) et 2 (en retard), c'est défini dans le code : <a class="external" href="https://github.com/galette/galette/blob/develop/galette/lib/Galette/Entity/Reminder.php#L77">https://github.com/galette/galette/blob/develop/galette/lib/Galette/Entity/Reminder.php#L77</a></p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210552022-01-28T17:19:45ZGuillaume AGNIERAY
<ul></ul><p>Donc rien à voir avec <a class="issue tracker-1 status-5 priority-3 priority-lowest closed" title="Anomalie: Incohérence rappels échéances proches et en retard (Fermé)" href="http://redmine.ulysses.fr/issues/1590">#1590</a>.</p>
<p>Le problème viendrait plutôt de là : <a class="source" href="http://redmine.ulysses.fr/projects/galette/repository/62/entry/galette/lib/Galette/Repository/Reminders.php#L143">source:galette/lib/Galette/Repository/Reminders.php#L143</a><br /><pre><code class="php syntaxhl" data-language="php"> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$results</span> <span class="k">as</span> <span class="nv">$r</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$r</span><span class="o">-></span><span class="n">reminder_type</span> <span class="o"><</span> <span class="nv">$type</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// <- ICI</span>
<span class="c1">//sent impending, but is now late. reset last remind.</span>
<span class="nv">$r</span><span class="o">-></span><span class="n">reminder_type</span> <span class="o">=</span> <span class="nv">$type</span><span class="p">;</span>
<span class="nv">$r</span><span class="o">-></span><span class="n">last_reminder</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></p>
<p>Cette condition peut-elle seulement être vérifiée malgré la requête (<a class="source" href="http://redmine.ulysses.fr/projects/galette/repository/62/entry/galette/lib/Galette/Repository/Reminders.php#L100">source:galette/lib/Galette/Repository/Reminders.php#L100</a>) ?<br /><pre><code class="php syntaxhl" data-language="php"> <span class="nv">$select</span><span class="o">-></span><span class="nb">join</span><span class="p">(</span>
<span class="k">array</span><span class="p">(</span><span class="s1">'r'</span> <span class="o">=></span> <span class="no">PREFIX_DB</span> <span class="mf">.</span> <span class="k">self</span><span class="o">::</span><span class="no">TABLE</span><span class="p">),</span>
<span class="s1">'a.'</span> <span class="mf">.</span> <span class="nc">Members</span><span class="o">::</span><span class="no">PK</span> <span class="mf">.</span> <span class="s1">'=r.reminder_dest'</span><span class="p">,</span>
<span class="k">array</span><span class="p">(</span>
<span class="s1">'last_reminder'</span> <span class="o">=></span> <span class="k">new</span> <span class="nc">Expression</span><span class="p">(</span><span class="s1">'MAX(reminder_date)'</span><span class="p">),</span>
<span class="s1">'reminder_type'</span> <span class="o">=></span> <span class="k">new</span> <span class="nc">Expression</span><span class="p">(</span><span class="s1">'MAX(reminder_type)'</span><span class="p">)</span> <span class="c1">// <- ICI</span>
<span class="p">),</span>
<span class="nv">$select</span><span class="o">::</span><span class="no">JOIN_LEFT</span>
</code></pre></p>
Si le reset du dernier rappel n'intervient jamais :
<ul>
<li>un membre pourra recevoir les 2 rappels d'échéance proche pour sa première année d'adhésion, mais il ne pourra plus jamais en recevoir les années suivantes : <a class="source" href="http://redmine.ulysses.fr/projects/galette/repository/62/entry/galette/lib/Galette/Repository/Reminders.php#L163">source:galette/lib/Galette/Repository/Reminders.php#L163</a></li>
<li>un membre pourra recevoir les 2 rappels d'échéance en retard pour sa première année d'adhésion, mais il recevra uniquement le rappel à 60 jours les années suivantes : <a class="source" href="http://redmine.ulysses.fr/projects/galette/repository/62/entry/galette/lib/Galette/Repository/Reminders.php#L180">source:galette/lib/Galette/Repository/Reminders.php#L180</a></li>
</ul> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210572022-01-28T17:20:08ZGuillaume AGNIERAY
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-1 status-5 priority-3 priority-lowest closed" href="/issues/1590">Anomalie #1590</a>: Incohérence rappels échéances proches et en retard</i> supprimé</li></ul> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=210582022-01-29T09:11:10ZJohan Cwiklinskijohan@x-tnd.be
<ul></ul><p>Guillaume Agnieray a écrit (<a href="#note-7">#note-7</a>):</p>
<blockquote>
Si le reset du dernier rappel n'intervient jamais :
<ul>
<li>un membre pourra recevoir les 2 rappels d'échéance proche pour sa première année d'adhésion, mais il ne pourra plus jamais en recevoir les années suivantes : <a class="source" href="http://redmine.ulysses.fr/projects/galette/repository/62/entry/galette/lib/Galette/Repository/Reminders.php#L163">source:galette/lib/Galette/Repository/Reminders.php#L163</a></li>
<li>un membre pourra recevoir les 2 rappels d'échéance en retard pour sa première année d'adhésion, mais il recevra uniquement le rappel à 60 jours les années suivantes : <a class="source" href="http://redmine.ulysses.fr/projects/galette/repository/62/entry/galette/lib/Galette/Repository/Reminders.php#L180">source:galette/lib/Galette/Repository/Reminders.php#L180</a></li>
</ul>
</blockquote>
<p>Hum... OK, il faudra que je voie à ajouter ces cas dans les tests ; pour reproduire dans un premier temps, et m'assurer que ce soit corrigé ensuite. Les pistes que tu donnes semblent cohérentes, merci :)</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=216292023-11-30T21:23:54ZJohan Cwiklinskijohan@x-tnd.be
<ul></ul><p>Hello,</p>
<p>En reprenant le sujet récemment, j'ai pu (je pense, et j'espère !!) reproduire le cas.</p>
<p>J'ai repris les tests qui fonctionnent sur les différents rappels, et j'ai ajouté un set de rappels pour la "période" précédente. Le test échouait, aucun rappel n'était jamais trouvé... Il m'a donc semblé être tombé sur le problème rapporté ici.</p>
<p>J'ai donc modifié le code pour que soit correctement prise en compte la date d'envoi des rappels, qui sera ignorée si l'envoi a été effectué la période précédente (en fonction de la configuration de Galette).</p>
<p>Le correctif est là :<br /><a class="external" href="https://github.com/galette/galette/pull/373">https://github.com/galette/galette/pull/373</a></p>
<p>Les tests portent sur une durée d'adhésion, mais normalement ça devrait fonctionner dans la cas d'une date de fin d'exercice.</p>
<p>Je croise les doigts.</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=216302023-11-30T21:37:49ZJohan Cwiklinskijohan@x-tnd.be
<ul></ul><p>J'aimerai un retour avant d'aller plus loin (peut-être que je me suis totalement fourvoyé :D), mais dans l'absolu, les modifications que je propose peuvent avoir un effet de bord : les anciens adhérents qui n'ont pas contribué depuis plus d'une période se verront envoyer un rappel... <br />Il faudrait donc je pense limiter également les adhérents sélectionnés sur leur date de fin d'adhésion (ça ne va pas spécialement être simple si tel est le cas).</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=216312023-11-30T22:36:42ZGuillaume AGNIERAY
<ul></ul><p>Johan Cwiklinski a écrit (<a href="#note-11">#note-11</a>):</p>
<blockquote>
<p>J'aimerai un retour avant d'aller plus loin (peut-être que je me suis totalement fourvoyé :D)</p>
</blockquote>
<p>OK. J'essaie de tester les modifs dès que possible :)</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=216322023-12-07T12:39:32ZGuillaume AGNIERAY
<ul></ul><p>Suite au récents tests unitaires et corrections tentées : <a class="external" href="https://github.com/galette/galette/pull/376">https://github.com/galette/galette/pull/376</a></p>
<p>En admettant que j'ai 3 membres dans ma base.<br />Dont un qui est exempt de cotisation et donc n'a jamais reçu de rappel depuis son inscription.<br />Les 2 autres sont à jour et ont déjà reçu tous les rappels sur la période précédente ainsi que le premier rappel d'échéance proche pour la période en cours le mois dernier.</p>
<p>Si je ne dis pas de bêtises, voici ce que devrait retourner la requête juste après <a href="https://github.com/galette/galette/blob/f5990c42feb68d2ede90ab3acfbc767cd2c75999/galette/lib/Galette/Repository/Reminders.php#L117-L130" class="external">la jointure</a>, non ? :</p>
<table>
<tr>
<th>id_adh</th>
<th>date_echeance</th>
<th>last_reminder</th>
<th>reminder_type</th>
</tr>
<tr>
<td> 2 </td>
<td> 2023-12-14 </td>
<td> 2023-11-14 00:00:00.000 </td>
<td> 1 </td>
</tr>
<tr>
<td> 3 </td>
<td> 2023-12-14 </td>
<td> 2023-11-14 00:00:00.000 </td>
<td> 1 </td>
</tr>
</table>
Or, voici ce que la requête retourne :
<table>
<tr>
<th>id_adh</th>
<th>date_echeance</th>
<th>last_reminder</th>
<th>reminder_type</th>
</tr>
<tr>
<td> 1 </td>
<td> NULL </td>
<td> 2023-11-14 00:00:00.000 </td>
<td> 2 </td>
</tr>
</table>
<p>Et pour les autres rappels qui devraient normalement y figurer, dans les logs j'ai :<br /><pre>
127.0.0.1 - 2023-12-07 11:38:11 - DEBUG - Reminder does not suits current requested type ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[id_adh] => 2
[date_echeance] => 2023-12-14
[last_reminder] => 2023-11-14 00:00:00
[reminder_type] => 2
)
)
127.0.0.1 - 2023-12-07 11:38:11 - DEBUG - Reminder does not suits current requested type ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[id_adh] => 3
[date_echeance] => 2023-12-14
[last_reminder] => 2023-11-14 00:00:00
[reminder_type] => 2
)
)
</pre></p>
<p>La jointure agrège pour chaque <code>id_adh</code> la valeur maximale des colonnes <code>last_reminder</code> et <code>reminder_type</code> enregistrée dans la table <code>reminders</code> .<br />Je pense que la jointure devrait se faire sur le résultat d'une requête sur la table <code>reminders</code> qui renverrait pour chaque <code>id_adh</code> les valeurs max enregistrées, mais pas directement sur la table elle-même, non ?</p> Galette - Anomalie #1614: due date reminder emailshttp://redmine.ulysses.fr/issues/1614?journal_id=216362023-12-08T21:25:02ZJohan Cwiklinskijohan@x-tnd.be
<ul></ul><p>Hello,</p>
<p>Guillaume AGNIERAY a écrit (<a href="#note-13">#note-13</a>):</p>
<blockquote>
<p>Suite au récents tests unitaires et corrections tentées : <a class="external" href="https://github.com/galette/galette/pull/376">https://github.com/galette/galette/pull/376</a><br />[...]</p>
</blockquote>
<p>Il faut que je me plonge dans le code, et que je mette en place un test qui va reproduire ce que tu décris.</p>
<p>Dans l'absolu, la requête est censée renvoyer tous les adhérents en retard, avec pour chacun d'entre eux la date - et le type - de dernier rappel. Normalement, le type est censé être le bon, sauf bug préalable -- c'est pourquoi on le récupère.</p>