Aller au contenu principal
API GoCardless · invalid_state · remboursements

GoCardless total_amount_confirmation_invalid : le total remboursé ne correspond pas

Chaque remboursement demandé à GoCardless porte un chiffre de contrôle : tout ce qui a déjà été remboursé sur ce paiement, y compris le nouveau. S'il ne correspond pas à ce que GoCardless a enregistré, il refuse le remboursement avec total_amount_confirmation_invalid. C'est une protection contre deux systèmes qui remboursent le même encaissement sans savoir l'un de l'autre.

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

ReasonTypeTexte de GoCardless
total_amount_confirmation_invalidinvalid_stateTotal amount refunded does not match the confirmation value.
number_of_refunds_exceededinvalid_stateMaximum of 5 refunds per payment already reached.

La référence des remboursements explique le premier : « total_amount_confirmation_invalid if the confirmation amount doesn't match the total amount refunded for the payment. ». Et voici à quoi il sert : « This safeguard is there to prevent two processes from creating refunds without awareness of each other. ».

Ce champ, selon GoCardless, correspond à la somme des remboursements déjà enregistrés sur le paiement, plus celui qui est créé, en centimes. Dans son exemple, un remboursement de 100 porte un total_amount_confirmation de 150 : 50 avaient déjà été remboursés sur ce paiement.

Carte de l'erreur total_amount_confirmation_invalid de GoCardless
Le reason, son type invalid_state, le champ total_amount_confirmation et la limite de 5 remboursements par paiement.

Comment le connecteur calcule ce chiffre

Pour chaque remboursement, le connecteur additionne les remboursements de cet encaissement qui, dans Odoo, sont en attente, autorisés ou effectués, et y ajoute le nouveau. Ceux en erreur ne comptent pas. Cette somme est envoyée comme total_amount_confirmation.

Le fait de compter aussi les remboursements en attente est important : un remboursement en cours a déjà été demandé à GoCardless. Sans lui dans la somme, le chiffre serait trop bas et GoCardless refuserait le remboursement suivant.

Quand le chiffre ne correspond pas

Le chiffre repose sur ce qu'Odoo sait. Si quelqu'un a remboursé une partie de cet encaissement par un autre moyen qui ne passe pas par Odoo, par exemple avec un autre logiciel connecté au même compte GoCardless, GoCardless l'a enregistré et Odoo non. Le total envoyé par le connecteur est alors trop bas, et GoCardless refuse le remboursement. C'est précisément le cas que vise cette protection : si elle l'acceptait, le client recevrait deux fois le même montant.

number_of_refunds_exceeded est différent : le connecteur permet les remboursements partiels, et GoCardless accepte au maximum 5 remboursements par paiement. Le sixième est refusé même s'il reste un montant à rembourser.

Ce que fait Odoo avec le connecteur

Dans Odoo, un encaissement se rembourse depuis son paiement, avec le bouton de remboursement, et uniquement si sa transaction est confirmée. Le connecteur envoie le remboursement avec sa clé d'idempotence et, si GoCardless le refuse, la transaction du remboursement passe à « Erreur » avec « GoCardless rejected the request. » et, en dessous, le message de GoCardless avec le reason et le request_id entre crochets.

Depuis la version 1.1.5, un remboursement en erreur n'affiche pas le bouton « Retry collection » : un remboursement n'est pas un encaissement.

Schéma : ce que répond GoCardless quand le total ne correspond pas 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.

Que faire

  1. Ouvrez la transaction de l'encaissement 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. Depuis là, le bouton des remboursements mène à la transaction du remboursement et à son message.
  2. Avec total_amount_confirmation_invalid, consultez dans le Dashboard GoCardless les remboursements de ce paiement. Si l'un d'eux a été effectué en dehors d'Odoo, l'argent a déjà été rendu au client : ne le remboursez pas une seconde fois depuis Odoo.
  3. Avec number_of_refunds_exceeded, ce paiement n'accepte plus de remboursement dans GoCardless. S'il reste un montant à rembourser, il faudra passer par une autre voie.
  4. Pour ne pas atteindre la limite, regroupez en un seul remboursement ce qui doit être rendu sur un même encaissement.
  5. Si vous devez contacter GoCardless, conservez le request_id du message : leur documentation demande de l'indiquer au support.

Pourquoi Odoo ne voit-il pas les remboursements effectués par un autre moyen ?

GoCardless signale par webhook chaque remboursement créé, mais le connecteur n'applique ces signalements qu'aux remboursements présents dans Odoo : un remboursement créé ailleurs n'a pas de transaction et n'entre pas dans le chiffre.

Puis-je rembourser seulement une partie d'un encaissement ?

Oui. Le connecteur permet les remboursements partiels, jusqu'à la limite de 5 par paiement fixée par GoCardless ; chacun porte dans son chiffre de contrôle les précédents.

Avec notre connecteur

Dans Odoo 17, 18, 19 et 20, le connecteur envoie pour chaque remboursement le total remboursé sur cet encaissement, en comptant ceux en cours, afin que GoCardless bloque un double remboursement au lieu de le payer, et il consigne le refus dans la transaction avec son request_id.

À lire aussi

GoCardless refund_payment_invalid_state : ce prélèvement ne peut pas encore être rembourséGoCardless répond refund_payment_invalid_state si le paiement n'est ni confirmed ni paid_out. Règles de délai de GoCardless et du connecteur dans Odoo.GoCardless 409 idempotent_creation_conflict : le prélèvement existait déjàGoCardless renvoie 409 si une clé d'idempotence a déjà créé une ressource. Ce n'est pas une erreur : le connecteur évite ainsi un double prélèvement.GoCardless MD06 : le client demande à sa banque de rembourser un encaissementLe client demande à sa banque de rembourser un prélèvement GoCardless : charged_back, refund_requested et MD06. Effets dans Odoo sur la facture et le mandat.
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/refund
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 550 en 17.0 (d203ee6), ligne 550 en 18.0 (e2ab18b), ligne 549 en 19.0 (ce7f5a3) et ligne 568 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 389 en 17.0 (d203ee6), ligne 389 en 18.0 (e2ab18b), ligne 388 en 19.0 (ce7f5a3) et ligne 403 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 383 en 17.0 (d203ee6), ligne 383 en 18.0 (e2ab18b), ligne 382 en 19.0 (ce7f5a3) et ligne 397 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 256 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 397 en 17.0 (d203ee6), ligne 397 en 18.0 (e2ab18b), ligne 396 en 19.0 (ce7f5a3) et ligne 411 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 352 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 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: models/payment_transaction.py, ligne 424 en 17.0 (d203ee6), ligne 424 en 18.0 (e2ab18b), ligne 423 en 19.0 (ce7f5a3) et ligne 438 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 418 en 17.0 (d203ee6), ligne 418 en 18.0 (e2ab18b), ligne 417 en 19.0 (ce7f5a3) et ligne 432 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 63 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/models/payment_transaction.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_payment_views.xml
  • 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)
  • github.com/odoo/odoo/blob/17.0/odoo/http.py