toulouse-maelis : gérer l'expiration lors du paiement (#76395) #224
No reviewers
Labels
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/passerelle#224
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/76395-parsifal-cancel-invoice"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Déplace plutôt ça dans un autre ticket, qui pourra être validé facilement, plutôt qu'ici où ça revient à compliquer le travail de relecture.
e71f00455f
to0ef473eb91
https://dev.entrouvert.org/issues/76836
Je valide parce que la mécanique est ok mais il faudra revoir plusieurs points.
les nettoyages devront avoir lieu plus souvent possible, sans passer par un cron plus fréquent qu'à l'heure (le faire un peu tout le temps pendant les requêtes par exemple de lecture du panier)
une facture ne doit pas être payée/payable alors qu'elle va bientôt être annulé, coté combo/lingo on a le support au mieux d'une date de paiement, rien de plus précis, mais par contre on est assuré qu'avant de payer lingo fasse un get_invoice() (il vérifie que la facture existe), un paiement peut prendre jusqu'à 20 minutes, il faudrait avoir le timing suivant :
** les factures sont visibles entre le moment de validation du panier T et T + cancel_invoice_delay, en dehors de cette période ni get_invoices() ni get_invoice() ne doivent renvoyer ces factures,
** on ne doit pas annuler une facture en train d'être payé, donc on ne devrait pas les annuler avant T+30+20
Ça pourrait être intéressant d'avoir coté lingo une notification du démarrage d'un paiement, ça permettrait de ficeler tout ça un peu mieux.
@ -287,8 +291,19 @@ class ToulouseMaelis(BaseResource, HTTPResource):
for invoice in invoices:
invoice.notify()
def cancel_basket_invoices(self):
Je mettrai un @atomic et un select_for_update(), pendant qu'on fait ça on a pas trop envie qu'il se passe autre chose.
@ -290,2 +303,4 @@
def hourly(self):
self.notify_invoices_paid()
self.cancel_basket_invoices()
Un léger doute sur le fait d'avoir un délai par défaut de 30 minutes et un cron toutes les heures :)
Je ne vois pas cette partie dans le code, je vois juste le nettoyage quand le délai est expiré et que la facture n'a été payée par ailleurs, alors j'ai ouvert un ticket sur le sujet, #76854 .
Ok vu, tu as changé le résultat de Invoice.status() et invoices() ne retourne que les factures "created", mais ce ne sera pas suffisant il faut aussi qu'elle ne remonte pas par invoice() (sans "s") pour ne plus être payable.
Ajouter un test sur i.status() != 'cancelled" dans invoice().
0ef473eb91
toc45e5ae358
C'est tout bon, j'ai rejeté les tickets que j'avais pu créer où le travail est déjà fait ici.
Ah merci beaucoup !
(du coup je pose les réponses que j'avais préparées en bloc ci-dessous)
---8<---
Il y a effectivement 2 trous dans la raquette, merci :
Sinon, oui et je complète les tests pour que ce soit plus explicite.
(Mais je n'arrive pas à écrire de test qui montre qu'une facture
annulée n'est plus affichée dans l'historique, parce que j'ai tout mis
en oeuvre dans le code pour que l'on ne puisse pas annuler une facture
déjà payée ; c'est le test test_cancel_basket_invoice_cron_keep_paid_invoices)
J'avais mis T+30*2, j'ai changé pour T+30+20.
Oui, à un moment je pensais pouvoir utiliser le Webservice de calcul des frais additionnels pour ça (mais non).
Oui, trou dans la raquette évoqué ci-dessus, merci.
Mais comme j'utilise invoice() dans le endpoint pay_invoice et que ce
dernier doit permettre de payer les factures qui ne sont plus
affichées mais pas encore annulée sur maélis, je préfère corriger sur
les 2 appels à invoice().
(fait)
Oui, j'ai fait ça, c'est malin (et ça m'arrange pour #76398).
Je n'ai pas compris ce que tu n'arrives pas à faire. Ne la paye pas, bouge freezer de 30 minutes, observe que la facture n'est plus visibles ni sur /invoices/ ni sur /invoice/ mais que /pay-invoice/ fonctionne encore.
J'avais raté le *2, ok donc dans #76855 il ne restera plus qu'à remplacer le + 20 par une référence à un nouveau champ.
Ouais bof non, c'est une verrue pour IMIO je préfère qu'on ne lui redonne pas une utilité.
Je crois que tu voulais dire que tu préfère ajouter le check dans invoice() et pay_invoice() plutôt que dans get_invoice(). C'est ok.
c45e5ae358
toc7d33287c5
Oui (c'est ce que j'ai ajouté).
Mais donc que'est-ce que tu n'arrives pas à faire ?
Tu disais que :
Et j'ai interprété qu'il manquait un test pour mettre en évidence que les factures annulées ne seraient pas non plus affichées dans l'historique des factures.
Mais en fait ça n'a aucun sens parce qu'une facture annulée ne peut pas être payée et une facture payée ne peut pas être annulée.
Donc oui, juste ajouter des tests sur les factures en cours, ce que j'ai fait.