Ce que dit GoCardless
| Événement | Cause | Texte de GoCardless |
|---|---|---|
| mandates · expired | mandate_expired | The mandate is being marked as expired, because no payments have been collected against it for the dormancy period of your service user number. If you have access to the mandate reinstation API endpoint, you can use this to attempt to set this mandate up again. |
| payments · cancelled | mandate_expired | The mandate expired before the payment could be collected. |
La description de l'événement est claire : « No collection attempts were made against the mandate within the dormancy period of your service user number. ». Et la conséquence : « As a result it has expired, and no further collections can be taken against it. ». Le statut du mandat passe à expired, ce que GoCardless définit comme un mandat expiré pour cause d'inactivité.

Quand cela arrive
Cela touche un mandat qui a été signé puis n'a plus été utilisé : un client qui n'achète plus, ou un client qu'on prélève si rarement qu'entre deux prélèvements toute la période d'inactivité s'écoule. C'est le temps sans tentative de prélèvement qui compte, pas la date de signature.
Si un prélèvement attendait d'être présenté au moment de l'expiration, GoCardless l'annule avec la même cause : « The mandate expired before the payment could be collected. ».
Ce que fait Odoo avec le connecteur
- L'événement de mandat expiré le retire. Le connecteur considère un mandat
expiredcomme définitivement perdu : il archive le mode de paiement du client, indique sur sa fiche que le mandat ne peut plus être utilisé et crée l'activité « GoCardless mandate lost ». Il ne le fait qu'une fois ; si un autre événement apporte la même information, il trouve déjà le mode archivé. - Le paiement annulé passe sa transaction en « Erreur », accessible depuis la facture avec le bouton « Transaction de paiement » en haut, avec « GoCardless could not collect this payment (mandate_expired). ». Si la facture avait déjà été réglée avec ce prélèvement, il annule le paiement et la facture redevient à payer. Et comme
mandate_expiredfait partie des causes pour lesquelles le connecteur archive le mandat, cet événement le retire aussi, en tant queexpired. - Sur la fiche du mode de paiement, « Mandate Status » affiche
expired.
Ces textes sont écrits par le connecteur au moment d'appliquer l'événement, sans intervention de quiconque. Le connecteur n'est pas traduit en français : ces textes apparaissent toujours en anglais, même dans un Odoo en français, qu'ils soient déclenchés par un utilisateur ou par une action planifiée : « The GoCardless direct debit mandate of … is no longer usable (mandate_expired). No further collection can be taken against it. Ask the customer to set up a new mandate. », « GoCardless mandate lost » et « GoCardless could not collect this payment (mandate_expired). ».
Si Odoo tente de prélever avec le mandat avant d'en être informé, parce que l'événement s'est perdu en route, GoCardless répond mandate_is_inactive. Le connecteur consulte alors le mandat, l'archive et place dans la transaction son propre message : « The customer's GoCardless mandate is expired, so it cannot be charged. Ask the customer for a new mandate. ». La tâche qui récupère chaque heure les événements manqués finit aussi par ramener l'événement du mandat.

Réactiver ou demander un autre mandat ?
GoCardless propose deux voies. Pour continuer à prélever ce client, indique-t-il, il faut demander son accord et utiliser la réactivation du mandat (« you should request their permission and use the reinstate endpoint »). Mais cet endpoint est restreint : il exige des pages de paiement personnalisées approuvées par GoCardless (« Restricted this endpoint requires approved custom payment pages »).
Le connecteur ne réactive pas les mandats en production : le bouton « Reinstate mandate (sandbox) » de la fiche du mode de paiement n'apparaît qu'avec le fournisseur en test et un mandat annulé, en échec ou expiré. En production, la voie est un nouveau mandat.
Que faire
- Parlez au client : s'il est toujours client, demandez-lui de signer un nouveau mandat. Dans Odoo, ce sera un nouveau mode de paiement.
- Encaissez avec lui les factures en attente. Les prélèvements que GoCardless a annulés à cause de l'expiration ne seront pas présentés automatiquement.
- Si un client n'est prélevé que très rarement, prévoyez que son mandat peut expirer entre deux prélèvements.
Puis-je prélever avec un mandat expiré si le client est d'accord ?
Non, avec ce mandat : GoCardless ne permet pas de créer de prélèvements. Il faut un nouveau mandat ou, là où c'est possible, la réactivation par GoCardless.
Peut-on tester la réactivation ?
Oui, dans le sandbox de GoCardless. Avec le fournisseur en test, la fiche du mode de paiement affiche « Reinstate mandate (sandbox) » lorsque le mandat est expiré.
Avec notre connecteur
Sur Odoo 17, 18, 19 et 20, le connecteur retire le mandat expiré dès que GoCardless le signale, laisse le prélèvement annulé en erreur avec sa cause et prévient sur la fiche du client, afin de demander un nouveau mandat avant la prochaine facture.
À lire aussi
Vérifié dans le code du connecteur (version 17.0, 18.0, 19.0 et 20.0) et dans les sources citées
Sources
- docs.gocardless.com/docs/api-reference/events/mandate
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/mandate
- Code du module : flexigo_payment_gocardless: const.py, ligne 33 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 83 en 17.0 (d203ee6), ligne 83 en 18.0 (e2ab18b), ligne 83 en 19.0 (ce7f5a3) et ligne 82 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 131 en 17.0 (d203ee6), ligne 131 en 18.0 (e2ab18b), ligne 131 en 19.0 (ce7f5a3) et ligne 130 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1148 en 17.0 (d203ee6), ligne 1148 en 18.0 (e2ab18b), ligne 1148 en 19.0 (ce7f5a3) et ligne 1155 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 495 en 17.0 (d203ee6), ligne 495 en 18.0 (e2ab18b), ligne 495 en 19.0 (ce7f5a3) et ligne 497 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 76 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 914 en 17.0 (d203ee6), ligne 914 en 18.0 (e2ab18b), ligne 913 en 19.0 (ce7f5a3) et ligne 937 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 725 en 17.0 (d203ee6), ligne 725 en 18.0 (e2ab18b), ligne 724 en 19.0 (ce7f5a3) et ligne 748 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 754 en 17.0 (d203ee6), ligne 754 en 18.0 (e2ab18b), ligne 753 en 19.0 (ce7f5a3) et ligne 777 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 436 en 17.0 (d203ee6), ligne 436 en 18.0 (e2ab18b), ligne 436 en 19.0 (ce7f5a3) et ligne 438 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 278 en 17.0 (d203ee6), ligne 278 en 18.0 (e2ab18b), ligne 278 en 19.0 (ce7f5a3) et ligne 289 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 321 en 17.0 (d203ee6), ligne 321 en 18.0 (e2ab18b), ligne 321 en 19.0 (ce7f5a3) et ligne 332 en 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1233 en 17.0 (d203ee6), ligne 1233 en 18.0 (e2ab18b), ligne 1233 en 19.0 (ce7f5a3) et ligne 1240 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: views/payment_token_views.xml, ligne 15 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 785 en 17.0 (d203ee6), ligne 785 en 18.0 (e2ab18b), ligne 785 en 19.0 (ce7f5a3) et ligne 800 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: views/payment_token_views.xml, ligne 23 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 998 en 17.0 (d203ee6), ligne 998 en 18.0 (e2ab18b), ligne 998 en 19.0 (ce7f5a3) et ligne 1013 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 162 en 17.0 (d203ee6), ligne 162 en 18.0 (e2ab18b), ligne 162 en 19.0 (ce7f5a3) et ligne 161 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 117 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/fr.po
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- Code du module : flexigo_payment_gocardless: __manifest__.py, ligne 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
