Projet

Général

Profil

Bug #90074

toulouse-maelis: date de notification à maélis non positionnée

Ajouté par Nicolas Roche il y a 10 jours. Mis à jour il y a 6 jours.

Statut:
En cours
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
26 avril 2024
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Sur une erreur 502 du proxy (la PFS à Toulouse)
https://sentry.entrouvert.org/entrouvert/publik/issues/122809/?referrer=RegressionActivityEmail
le connecteur se mange une SOAPFault et décide d'arrêter là la notification à Maélis (dans les faits il semblerait que la notification soit bien reçue, que ce soit sa réponse qui ne parvienne pas au connecteur).

fails to notify paid invoice <Invoice "102/50996"> (...), stopping.

Pour cela il enregistre une date de notification,

        obj.maelis_notification_date = now()
        obj.maelis_notification_data = result
        obj.save()

afin que le cron qui passe derrière ne renvoie pas la notification.

> con.invoice_set.filter(maelis_notification_date__isnull=True, lingo_notification_date__lt=now() - datetime.timedelta(minutes=15))
<QuerySet [<Invoice "102/50996">]>

Sauf que régulièrement, ces 2 champs ne sont pas renseignés (champs mis à jours depuis, par le cron).

> con.invoice_set.get(regie_id=102, invoice_id=50996).__dict__
...
 'maelis_notification_data': None,
 'lingo_notification_date': datetime.datetime(2024, 4, 26, 8, 19, 9, 250411, tzinfo=<UTC>),
 'maelis_notification_date': None,

On a déjà identifié cette erreur mais sans réussir à l'expliquer.
https://dev.entrouvert.org/issues/85758#note-9

Le comportement n'est pas vraiment problématique, mais il génère de nouvelles erreurs sur le renvoie des notifications (déjà reçues pas Maélis) par cron qui sèment la confusion :
  • soit "E511 : Le montant du paiement ne correspond pas au solde des factures"
    parce que Maélis la sait payée et que de son point de vue il ne reste plus rien à solder.
  • ou, si l'envoi tarde un peu, l'erreur "E500 : Le montant est requis et ne peut être vide"
    parce que le connecteur à entre temps récupéré une mise à jour de la facture (puisque Maélis la sait payée) et tente de payer un montant nul.
      amount=str(Decimal(obj.maelis_data['amountInvoice']) - Decimal(obj.maelis_data['amountPaid'])
    

Ticket Sigec pour tenter de régler le problème en amont : ne pas avoir autant d'erreurs sur les notifications de factures payées.
https://redmine.sigec.fr/issues/4278

Historique

#1

Mis à jour par Robot Gitea il y a 10 jours

  • Statut changé de Nouveau à Solution proposée

Nicolas Roche (nroche) a ouvert une pull request sur Gitea concernant cette demande :

#2

Mis à jour par Nicolas Roche il y a 10 jours

  • Description mis à jour (diff)
#3

Mis à jour par Benjamin Dauvergne il y a 6 jours

À me retourner la tête sur le sujet, vu qu'il est certain que la mise à jour de maelis_notification_date a bien lieu, c'est que l'effacement de ce champ vient d'une autre mise à jour. Invoice.notify() lock bien l'invoice avant de le mettre à jour mais il y a des tas de Invoice.save() ailleurs dans le code (notamment dans get_invoices()) qui ne le font pas.

Plusieurs possibilité pour corriger chacun de ces .save() :
  • remplacer les .save() par des .save(update_fields=...) et vérifier qu'il n'y a pas recouvrement avec d'autres mises à jour qui utiliserait un verrou pour mettre à jour les mêmes champs,
  • utiliser un verrou,
  • utiliser .objects.filter(pk=invoice.pk).update(...)

De forte chance que les coupables soient les 2 invoice.save() dans get_invoices().

#4

Mis à jour par Robot Gitea il y a 6 jours

  • Statut changé de Solution proposée à En cours

Benjamin Dauvergne (bdauvergne) a relu et demandé des modifications sur une pull request sur Gitea concernant cette demande :

Formats disponibles : Atom PDF