Aller au contenu principal
GoCardless · mandats · replaced

GoCardless mandate_replaced : le mandat a un remplaçant

Parfois GoCardless annule un mandat et le remplace par un nouveau, par exemple lorsque le créancier change d'identifiant de schéma. Il le signale avec l'événement replaced, qui transmet l'id du nouveau mandat, et le connecteur transfère au nouveau mandat le moyen de paiement du client. Si Odoo tente d'encaisser avec l'ancien avant d'en être informé, l'API répond mandate_replaced.

FlexigoTech · Responsable : Víctor Gómez · Mis à jour le 6 novembre 2026

L'essentiel

Versions
Odoo 17, 18, 19 et 20
Vérifié
dans le code du connecteur, version 17.0, 18.0, 19.0 et 20.0 · dans les sources citées à la fin
Lecture
4 min

Ce que dit GoCardless

OùReason ou causeTexte de GoCardless
API, à la création d'un encaissement (invalid_state)mandate_replacedMandate has been replaced. Check links[new_mandate] in the error or on the mandate itself.
mandates · replacedscheme_identifier_changedThe creditor has changed to a different scheme identifier, so this mandate has been cancelled and replaced by a new one.

La documentation des événements l'explique ainsi : « The mandate has been cancelled and replaced by a new mandate (for example, because the creditor has moved to a new Service User Number). ». Et ce que transporte l'événement : « The event will include links[new_mandate] with the ID of the new mandate. ».

mandate_replaced est une erreur invalid_state : l'action n'est pas valable dans l'état actuel de la ressource. Pour ces erreurs, GoCardless demande d'informer l'utilisateur et de ne pas réessayer (« invalid_state → inform the end user, do not allow retry. »).

Carte de l'erreur mandate_replaced de GoCardless
Le reason, son type invalid_state, le champ links.new_mandate et la cause scheme_identifier_changed de l'événement.

Quand cela se produit

Ce changement n'est pas provoqué par le client ni par sa banque : l'événement replaced a pour origine gocardless, et la cause documentée est que le créancier, le compte avec lequel vous encaissez dans GoCardless, est passé à un autre identifiant de schéma. GoCardless annule l'ancien mandat et en crée un nouveau à sa place.

mandate_replaced n'apparaît que si Odoo tente d'encaisser avec l'ancien mandat : l'encaissement d'un abonnement en cours de renouvellement, ou un paiement enregistré avec le moyen de paiement mémorisé du client, avant qu'Odoo n'ait appliqué l'événement.

Ce que fait Odoo avec le connecteur

Avec l'événement replaced :

  1. Il prend le nouveau mandat dans links.new_mandate.
  2. Il transfère au nouveau mandat le moyen de paiement mémorisé du client et le considère valide, au lieu de le considérer perdu. Si le moyen était archivé, il est réactivé ; Odoo 17 ne permet pas de désarchiver un moyen de paiement, et dans ce cas le connecteur en crée un nouveau pour le nouveau mandat.
  3. Il l'écrit sur la fiche du client : « The GoCardless mandate is usable again (replaced). ».

Cette note est rédigée par le connecteur lors de l'application de l'événement, sans intervention humaine. 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 (replaced). ».

Avec mandate_replaced sur un encaissement, le connecteur ne fait rien de particulier : lors de la création d'un encaissement, il ne traite à part que mandate_is_inactive. La transaction passe en « Erreur » avec le message « GoCardless rejected the request. » et, dessous, le message de GoCardless avec mandate_replaced et le request_id entre crochets. Le nouveau mandat est pris dans l'événement, et non dans l'erreur. Ce message reste en anglais, même lorsque l'encaissement est lancé depuis une interface en français.

Schéma : ce qu'envoie GoCardless avec replaced et ce que fait Odoo avec le connecteur
Schéma réalisé à partir du code du connecteur (17.0, 18.0, 19.0 et 20.0) et de la documentation de GoCardless ; ce qui est barré n'est pas nécessaire.

Que faire

  1. Si un encaissement reste en erreur avec mandate_replaced, ouvrez la transaction depuis la facture, avec le bouton « Transaction de paiement » en haut ; le menu des transactions n'apparaît qu'en mode développeur, et il n'existe pas dans Odoo 20.
  2. Vérifiez sur la fiche du client si la note indiquant que le mandat est de nouveau utilisable (replaced) est présente. Si oui, le moyen de paiement pointe déjà vers le nouveau mandat.
  3. Si elle n'est pas là, l'événement n'est pas encore arrivé. La tâche qui récupère chaque heure les événements manqués le fera ; si cela prend plus de temps, vérifiez que les webhooks de GoCardless parviennent bien à Odoo.
  4. Une fois le moyen de paiement à jour, relancez l'encaissement de la facture.

Faut-il demander au client de signer à nouveau ?

Non, pour continuer à encaisser avec le connecteur : le nouveau mandat est créé par GoCardless, et le connecteur transfère à celui-ci le moyen de paiement mémorisé.

Qu'en est-il dans Odoo 17 ?

C'est la même chose, avec une différence : si l'ancien moyen de paiement était archivé, Odoo 17 ne permet pas de le réactiver, donc le connecteur en crée un nouveau pour le nouveau mandat. Dans 18, 19 et 20, il réactive celui qui existait.

Avec notre connecteur

Dans Odoo 17, 18, 19 et 20, le connecteur suit le nouveau mandat dès que GoCardless signale le remplacement : le client conserve son moyen de paiement, et la facture suivante est encaissée avec le mandat que GoCardless a mis en place à sa place.

À lire aussi

Erreur mandate_is_inactive de GoCardless lors de la création d'un encaissement depuis OdooGoCardless répond mandate_is_inactive quand un paiement est créé avec un mandat annulé, échoué ou expiré. Pourquoi et comment le connecteur le gère.GoCardless bank_account_transferred : AMEND, le mandat passe sur un autre compteGoCardless signale transferred avec le code AMEND : le mandat passe sur un autre compte du client. Ce que fait le connecteur Odoo et ce qu'il ne faut pas faire.GoCardless mandate_expired : le mandat a expiré faute d'utilisationGoCardless marque un mandat comme expired après une période sans prélèvement. Ce que fait Odoo et comment continuer à encaisser.
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/events/mandate
  • Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 72 en 17.0 (d203ee6), ligne 72 en 18.0 (e2ab18b), ligne 72 en 19.0 (ce7f5a3) et ligne 71 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: const.py, ligne 150 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 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: models/payment_token.py, ligne 96 en 17.0 (d203ee6), ligne 96 en 18.0 (e2ab18b), ligne 96 en 19.0 (ce7f5a3) et ligne 95 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: 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 281 en 17.0 (d203ee6), ligne 281 en 18.0 (e2ab18b), ligne 281 en 19.0 (ce7f5a3) et ligne 292 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 117 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 247 en 17.0 (d203ee6), ligne 247 en 18.0 (e2ab18b), ligne 247 en 19.0 (ce7f5a3) et ligne 258 en 20.0 (688d86b)
  • 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
  • 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)