Ce que dit GoCardless
| Reason | Type | Texte de GoCardless |
|---|---|---|
total_amount_confirmation_invalid | invalid_state | Total amount refunded does not match the confirmation value. |
number_of_refunds_exceeded | invalid_state | Maximum 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.

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.

Que faire
- 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.
- 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. - 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. - Pour ne pas atteindre la limite, regroupez en un seul remboursement ce qui doit être rendu sur un même encaissement.
- Si vous devez contacter GoCardless, conservez le
request_iddu 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
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
