Ce que dit GoCardless
| Reason | Type | Texte de GoCardless |
|---|---|---|
mandate_not_inactive | invalid_state | « Mandate could not be reinstated » et « it is already active or being submitted. » |
GoCardless sépare les deux parties du texte par un tiret. La référence de l'API le précise : « This will fail with a mandate_not_inactive error if the mandate is already being submitted, or is active. ». C'est une erreur invalid_state, et pour ces cas GoCardless demande d'informer l'utilisateur et de ne pas réessayer (« invalid_state → inform the end user, do not allow retry. »).

Quels mandats peuvent être réactivés
La réactivation a davantage de conditions que le seul statut :
- C'est une fonction restreinte : « Restricted this endpoint requires approved custom payment pages ».
- Elle ne vaut que pour un mandat annulé depuis le Dashboard ou l'API : « A mandate can only be reinstated if it has been cancelled through the dashboard or the API. ». Un mandat annulé par la banque ne peut pas l'être : « Any mandate that has been cancelled by the bank cannot be reinstated. ».
- Elle sert pour les mandats annulés ou expirés (« Reinstates a cancelled or expired mandate to the banks. »), et un mandat peut être soumis de nouveau jusqu'à 10 fois (« Mandates can be resubmitted up to 10 times. »).
Après la demande, le processus est celui d'une création : arrive resubmission_requested, puis, comme l'indique GoCardless, « so you will receive a submitted webhook, followed by a reinstated or failed webhook up to two working days later. ».
Ce que fait Odoo avec le connecteur
Sur la fiche du mode de paiement du client, le connecteur affiche le bouton « Reinstate mandate (sandbox) ». Il n'apparaît que si le mandat est GoCardless, si le fournisseur n'est pas en production (dans Odoo 17, 18 et 19, l'état du fournisseur ; dans Odoo 20, la case production) et si « Mandate Status » vaut cancelled, failed ou expired.
Au clic :
- Le connecteur demande à GoCardless la réactivation de ce mandat.
- Si GoCardless l'accepte, l'état passe à
reinstate_requestedet la fiche du client affiche « Reinstatement of the GoCardless mandate requested. It stays unusable until the bank confirms it. ». Le mode de paiement reste archivé. - Quand arrive
reinstated, le connecteur le considère de nouveau valide : il le réactive et écrit « The GoCardless mandate is usable again (reinstated). ».
Si GoCardless répond mandate_not_inactive, le connecteur ne l'intercepte pas : Odoo affiche « GoCardless rejected the request. » avec le message de GoCardless, le reason et le request_id, et le mandat reste dans son état. Cela arrive quand Odoo considère le mandat comme mort alors que, chez GoCardless, il est déjà actif ou en cours de soumission, parce que ses événements ne sont pas encore arrivés dans Odoo. Après une demande acceptée, le bouton disparaît, puisque l'état passe à reinstate_requested.
La note indiquant que le mandat est de nouveau utilisable est écrite par le connecteur lors de l'application de l'événement, sans personne devant l'écran. 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 mandate is usable again (reinstated). ».

Que faire
- Si
mandate_not_inactiveapparaît, cherchez le mandat dans le Dashboard de GoCardless. S'il est actif ou en cours de soumission, il n'y a rien à réactiver : attendez l'arrivée de ses événements. La tâche qui récupère chaque heure les événements manqués les rapatrie. - Si le mandat a été annulé par la banque, n'essayez pas : GoCardless ne réactive pas ces mandats. Demandez au client un nouveau mandat.
- En production, le connecteur ne propose pas la réactivation : la voie est un nouveau mandat signé par le client.
- Pour tester, utilisez le sandbox de GoCardless avec le fournisseur en test.
Pourquoi le bouton n'apparaît-il que hors production ?
Parce que GoCardless restreint la réactivation à ceux qui disposent de pages de paiement personnalisées approuvées, et que le connecteur ne la propose que hors production.
Combien de temps faut-il pour que le mandat redevienne valide ?
Le temps que prennent les banques : selon GoCardless, il signale d'abord que la réactivation a été demandée, puis que le mandat a été soumis et, jusqu'à deux jours ouvrés plus tard, s'il a été réactivé ou s'il a échoué. D'ici là, le connecteur ne l'utilise pas.
Avec notre connecteur
Dans Odoo 17, 18, 19 et 20, le connecteur ne propose de réactiver un mandat annulé, échoué ou expiré que hors production, et ne l'utilise de nouveau qu'une fois que GoCardless a confirmé la réactivation par son événement.
À 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/responses-and-errors
- docs.gocardless.com/docs/api-reference/mandate
- docs.gocardless.com/docs/api-reference/events/mandate
- Code du module : flexigo_payment_gocardless: const.py, ligne 134 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 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: views/payment_token_views.xml, ligne 22 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 176 en 17.0 (d203ee6), ligne 176 en 18.0 (e2ab18b), ligne 176 en 19.0 (ce7f5a3) et ligne 175 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 173 en 17.0 (d203ee6), ligne 173 en 18.0 (e2ab18b), ligne 173 en 19.0 (ce7f5a3) et ligne 172 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1004 en 17.0 (d203ee6), ligne 1004 en 18.0 (e2ab18b), ligne 1004 en 19.0 (ce7f5a3) et ligne 1019 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 170 en 17.0 (d203ee6), ligne 170 en 18.0 (e2ab18b), ligne 170 en 19.0 (ce7f5a3) et ligne 169 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 397 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 462 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 521 en 17.0 (d203ee6), ligne 521 en 18.0 (e2ab18b), ligne 521 en 19.0 (ce7f5a3) et ligne 523 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 158 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 77 en 17.0 (d203ee6), ligne 77 en 18.0 (e2ab18b), ligne 77 en 19.0 (ce7f5a3) et ligne 76 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1157 en 17.0 (d203ee6), ligne 1157 en 18.0 (e2ab18b), ligne 1157 en 19.0 (ce7f5a3) et ligne 1164 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: const.py, ligne 117 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- Code du module : flexigo_payment_gocardless: __manifest__.py, ligne 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
