Ce que dit GoCardless
| Reason | Tipo | Texte de GoCardless |
|---|---|---|
refund_payment_invalid_state | invalid_state | Payment must be confirmed or paid_out before it can be refunded. |
Dans la référence des remboursements, GoCardless ajoute un délai : « A refund can only be created once it is outside the safer refund period (7 calendar days after the charge date) otherwise an error is returned. ». Cette période peut être désactivée : « The safer refund period can be disabled by contacting GoCardless. ». Et il rappelle pourquoi elle existe : « A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank. ».
Les remboursements par l'API, par ailleurs, sont désactivés par défaut : « This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard. ».

Les règles de délai, en un coup d'œil
| Jours depuis le prélèvement | GoCardless, par défaut | Le connecteur |
|---|---|---|
| Moins de 2 | période sécurisée : renvoie une erreur | n'envoie pas le remboursement |
| 2 ou plus, mais moins de 7 | période sécurisée : renvoie une erreur | l'envoie et laisse un avertissement dans le journal du serveur |
| 7 ou plus | hors période sécurisée | l'envoie |
Les deux ne comptent pas à partir du même point. GoCardless compte à partir de la date de débit du paiement. Le connecteur compte à partir du dernier changement d'état de la transaction du prélèvement dans Odoo. Si GoCardless a retiré la période sécurisée, entre 2 et 7 jours le remboursement peut aboutir.
Quand refund_payment_invalid_state apparaît avec le connecteur
Odoo ne permet de rembourser qu'une transaction confirmée, et le connecteur la confirme lorsque GoCardless indique confirmed ou paid_out. Ce reason signifie donc que le paiement a changé chez GoCardless et qu'Odoo ne le sait pas encore : un échec tardif, que GoCardless peut communiquer alors que le paiement est déjà confirmé, ou un remboursement demandé par le client dont l'événement n'est pas encore arrivé.
Ce que fait le connecteur
- En dessous de 2 jours, il n'envoie rien : Odoo s'arrête avec « GoCardless cannot refund a collection until it has settled. This one was charged … day(s) ago; refunds are possible after 2 days. ».
- Sinon, il envoie le remboursement à GoCardless avec sa clé d'idempotence. Si GoCardless le rejette, pour ce reason, pour la période sécurisée ou pour tout autre motif, la transaction de remboursement passe à « Erreur » avec « GoCardless rejected the request. » et, dessous, le message de GoCardless avec le reason et le
request_id. - S'il l'accepte, la transaction reste « En attente » avec « Refund submitted. GoCardless will deduct it from a future payout. », puis passe à « Confirmé » lorsque GoCardless le paie ou le déduit d'un versement.
Depuis la version 1.1.5, un remboursement en erreur n'affiche pas le bouton « Retry collection » : un remboursement n'est pas un prélèvement, et GoCardless n'a rien à réessayer. Si GoCardless ne parvient pas à rendre l'argent au client, le connecteur passe le remboursement en erreur avec « GoCardless could not pay this refund back (…). ». 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 : « GoCardless could not pay this refund back (…). ».

Que faire
- Ouvrez la transaction du prélèvement 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 de remboursements mène à la transaction du remboursement et à son message.
- Si le reason est
refund_payment_invalid_state, consultez le paiement dans le Dashboard GoCardless. Si l'échec est tardif ou si le client a demandé un remboursement, il n'y a rien à rembourser : l'argent n'est plus chez vous. Odoo le reflétera à l'arrivée de l'événement ; la tâche qui récupère chaque heure les événements manqués le fera. - Si le refus vient de la période sécurisée, attendez 7 jours après la date de débit, ou demandez à GoCardless de la retirer.
- Pour rembourser à nouveau, faites-le depuis le paiement du prélèvement, avec son bouton de remboursement. Le connecteur accepte les remboursements partiels.
Pourquoi le connecteur autorise-t-il le remboursement dès 2 jours alors que GoCardless parle de 7 ?
Les 2 jours sont le minimum du connecteur : en dessous, il n'envoie rien. GoCardless permet de retirer sa période sécurisée, et tant qu'elle est active c'est GoCardless qui rejette le remboursement avant 7 jours. Entre 2 et 7 jours, le connecteur signale l'opération dans le journal, car un échec SEPA peut encore arriver.
Un prélèvement remboursé peut-il encore échouer ?
Oui. GoCardless le signale : un paiement remboursé, totalement ou partiellement, peut encore recevoir un échec tardif ou un rejet de la banque du client. Dans ce cas, vous auriez rendu de l'argent que vous n'avez finalement pas gardé.
Avec notre connecteur
Dans Odoo 17, 18, 19 et 20, le connecteur n'envoie pas de remboursements de prélèvements de moins de 2 jours, consigne en erreur, avec leur request_id, ceux que GoCardless rejette, et ne propose pas de réessayer un remboursement, qui n'est pas un prélèvement.
À 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
- support.gocardless.com/hc/en-gb/articles/360001467265
- Code du module : flexigo_payment_gocardless: const.py, ligne 41 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
- 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: const.py, ligne 106 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 361 en 17.0 (d203ee6), ligne 361 en 18.0 (e2ab18b), ligne 360 en 19.0 (ce7f5a3) et ligne 375 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 365 en 17.0 (d203ee6), ligne 365 en 18.0 (e2ab18b), ligne 364 en 19.0 (ce7f5a3) et ligne 379 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 414 en 17.0 (d203ee6), ligne 414 en 18.0 (e2ab18b), ligne 414 en 19.0 (ce7f5a3) et ligne 416 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 371 en 17.0 (d203ee6), ligne 371 en 18.0 (e2ab18b), ligne 370 en 19.0 (ce7f5a3) et ligne 385 en 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 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 413 en 17.0 (d203ee6), ligne 413 en 18.0 (e2ab18b), ligne 412 en 19.0 (ce7f5a3) et ligne 427 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 605 en 17.0 (d203ee6), ligne 605 en 18.0 (e2ab18b), ligne 604 en 19.0 (ce7f5a3) et ligne 625 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: i18n/flexigo_payment_gocardless.pot, ligne 987 en 17.0 (d203ee6), ligne 987 en 18.0 (e2ab18b), ligne 987 en 19.0 (ce7f5a3) et ligne 1002 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 611 en 17.0 (d203ee6), ligne 611 en 18.0 (e2ab18b), ligne 610 en 19.0 (ce7f5a3) et ligne 631 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 442 en 17.0 (d203ee6), ligne 442 en 18.0 (e2ab18b), ligne 442 en 19.0 (ce7f5a3) et ligne 444 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)
- 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/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)
