Què diu GoCardless
| Reason | Tipus | Text de GoCardless |
|---|---|---|
retry_failed | invalid_state | Payment could not be retried. |
La documentació del reintent (POST /payments/{id}/actions/retry) dona les regles: el pagament es reintenta si el seu mandat està actiu, l'API retorna retry_failed si el pagament no ha fallat i «Payments can be retried up to 3 times.». Com amb tots els errors invalid_state, GoCardless demana avisar qui fa servir el sistema i no deixar que reintenti. El connector anota al seu codi que un quart reintent va rebre també retry_failed al sandbox de GoCardless.

Per què surt
Segons la documentació, retry_failed arriba quan el pagament no ha fallat, i el connector el va veure també en demanar un quart reintent. Amb un mandat que ja no està actiu, la documentació no diu quin error arriba: el connector espera retry_failed o mandate_is_inactive i els tracta igual.
Això d'un pagament que no està fallit abasta més del que sembla. Un cobrament pendent o confirmat no ha fallat, i un de retornat (charged_back) tampoc: els diners van arribar i el banc del client els va retirar després. Segons la documentació de GoCardless, qualsevol d'ells rebria retry_failed.
Amb el límit de reintents, el que confon és Success+. Quan Success+ reintenta un pagament, GoCardless envia un esdeveniment resubmission_requested, igual que amb qualsevol altre reintent. El connector suma un per cada esdeveniment d'aquests, vingui de Success+ o d'un reintent demanat des d'Odoo, i anota al seu codi que el límit de 3 de GoCardless inclou els de Success+. Com que cada cobrament que envia el connector demana retry_if_possible, amb Success+ activat és fàcil que part d'aquest cupo ja estigui gastada quan mires la factura.
El que veus a Odoo amb el connector
La transacció s'obre des de la factura, amb el botó «Transacció de pagament» de dalt; el menú de transaccions només surt en mode desenvolupador, i a Odoo 20 no existeix. El botó «Retry collection» de la transacció només apareix quan el connector acceptaria el reintent: ho controla un camp calculat amb la mateixa regla que comprova el servidor en prémer-lo. Si la regla diu que no, el botó no surt i el seu motiu no arriba a la pantalla. El que veus és l'estat de la transacció i el seu grup GoCardless:
| Situació | El que veus a la transacció |
|---|---|
| Success+ ho reintentarà | Estat «Pendent», la casella «Success+ Will Retry» marcada i, a «Missatge», «GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do.». Sense botó. |
| Fallit, sense Success+, amb menys de 3 reintents i el mandat actiu | Estat «Error» i el botó «Retry collection». |
| Ja n'hi ha 3 | Estat «Error» i «GoCardless Retries» a 3. Sense botó. |
| El mandat està arxivat | Estat «Error»; al contacte, la nota del mandat i l'activitat «GoCardless mandate lost». Sense botó. |
| Pendent o confirmat | Sense botó. |
| Retornat, per exemple amb MD06 | Estat «Error», encara que el mandat segueixi actiu. Sense botó: a GoCardless el pagament és a charged_back, no a failed. |
En prémer el botó, Odoo demana confirmar: «GoCardless will try to collect this payment again, which can cost a fee. Continue?». Si GoCardless l'accepta, la transacció passa a pendent amb «Retry requested. GoCardless will confirm the new charge date.». Quan arriba l'esdeveniment resubmission_requested, el connector suma el reintent i escriu la data: «GoCardless will collect this payment again on … (retry requested, retry 1 of 3).». En prémer no suma res, i així cada reintent compta una sola vegada.
El que arriba amb els esdeveniments ho escriu el connector sense ningú al davant. El connector no està traduït al català: aquests textos surten sempre en anglès, també en un Odoo en català, tant si els llança un usuari com una tasca programada: el missatge de Success+ de la taula, la nova data de càrrec i, si el mandat va morir per un esdeveniment, la nota i l'activitat del contacte: «GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do.», «GoCardless will collect this payment again on … (retry requested, retry 1 of 3).» i «GoCardless mandate lost». El que surt de prémer el botó va en el teu idioma.

Si GoCardless contesta retry_failed
Si tot i això l'API contesta retry_failed o mandate_is_inactive, el connector consulta el mandat abans d'ensenyar res:
- Si el mandat és mort, l'arxiva i ho diu a la transacció: «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.».
- Si segueix actiu, ensenya l'error de GoCardless tal qual: «GoCardless rejected the request.» i a sota el missatge de l'API, amb el seu reason i el
request_id.
Amb un cobrament retornat ja no s'arriba aquí: des de la versió 1.1.4, el connector no ofereix el botó si el pagament no és a failed a GoCardless, i un retornat és a charged_back.
Què fer
- Si el botó no surt, mira l'estat de la transacció, «Success+ Will Retry» i «GoCardless Retries»: una de les situacions de la taula ho explica.
- Si ja n'hi ha 3, parla amb el client: el connector ja no en demana un altre.
- Si el mandat està arxivat, demana'n un de nou i cobra amb ell.
- En un cobrament retornat no hi ha botó: parla abans amb el client i, si escau, torna a cobrar la factura amb un cobrament nou.
Cada reintent costa diners?
Pot ser. El botó ho avisa abans d'enviar res, i el connector no l'ofereix mentre Success+ va a reintentar el cobrament, perquè un reintent a mà només afegiria una comissió. Les tarifes concretes depenen del teu contracte amb GoCardless.
Puc reintentar un cobrament retornat pel client?
Amb aquest botó, no: el connector no l'ofereix en un cobrament retornat, perquè GoCardless només reintenta pagaments fallits i un retornat no ho és. Una devolució, com un MD06, es resol parlant amb el client i, si escau, amb un cobrament nou.
Amb el nostre connector
A Odoo 17, 18, 19 i 20 el connector compta els reintents amb els esdeveniments de GoCardless i només ensenya el botó quan la seva regla ho permet: ni amb Success+ en marxa, ni amb 3 reintents, ni amb el mandat arxivat. Si tot i això arriba retry_failed, mira el mandat abans d'ensenyar-te l'error.
Continua llegint
Comprovat al codi del connector (versió 17.0, 18.0, 19.0 i 20.0) i a les fonts enllaçades
Fonts
- docs.gocardless.com/docs/api-reference/payment
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Codi del mòdul: flexigo_payment_gocardless: const.py, línia 119 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 680 a 17.0 (d203ee6), línia 680 a 18.0 (e2ab18b), línia 679 a 19.0 (ce7f5a3) i línia 703 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 449 a 17.0 (d203ee6), línia 449 a 18.0 (e2ab18b), línia 448 a 19.0 (ce7f5a3) i línia 463 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: const.py, línia 122 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 260 a 17.0 (d203ee6), línia 260 a 18.0 (e2ab18b), línia 260 a 19.0 (ce7f5a3) i línia 271 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: views/payment_transaction_views.xml, línia 13 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 63 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 418 a 17.0 (d203ee6), línia 418 a 18.0 (e2ab18b), línia 417 a 19.0 (ce7f5a3) i línia 432 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: views/payment_transaction_views.xml, línia 27 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: views/payment_transaction_views.xml, línia 28 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/ca.po
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 729 a 17.0 (d203ee6), línia 729 a 18.0 (e2ab18b), línia 728 a 19.0 (ce7f5a3) i línia 752 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 713 a 17.0 (d203ee6), línia 713 a 18.0 (e2ab18b), línia 712 a 19.0 (ce7f5a3) i línia 736 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 430 a 17.0 (d203ee6), línia 430 a 18.0 (e2ab18b), línia 429 a 19.0 (ce7f5a3) i línia 444 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 437 a 17.0 (d203ee6), línia 437 a 18.0 (e2ab18b), línia 436 a 19.0 (ce7f5a3) i línia 451 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 442 a 17.0 (d203ee6), línia 442 a 18.0 (e2ab18b), línia 441 a 19.0 (ce7f5a3) i línia 456 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 435 a 17.0 (d203ee6), línia 435 a 18.0 (e2ab18b), línia 434 a 19.0 (ce7f5a3) i línia 449 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_token.py, línia 131 a 17.0 (d203ee6), línia 131 a 18.0 (e2ab18b), línia 131 a 19.0 (ce7f5a3) i línia 130 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 469 a 17.0 (d203ee6), línia 469 a 18.0 (e2ab18b), línia 468 a 19.0 (ce7f5a3) i línia 487 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 321 a 17.0 (d203ee6), línia 321 a 18.0 (e2ab18b), línia 321 a 19.0 (ce7f5a3) i línia 332 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 397 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 462 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 484 a 17.0 (d203ee6), línia 484 a 18.0 (e2ab18b), línia 483 a 19.0 (ce7f5a3) i línia 502 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 683 a 17.0 (d203ee6), línia 683 a 18.0 (e2ab18b), línia 682 a 19.0 (ce7f5a3) i línia 706 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1016 a 17.0 (d203ee6), línia 1016 a 18.0 (e2ab18b), línia 1016 a 19.0 (ce7f5a3) i línia 1031 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 567 a 17.0 (d203ee6), línia 567 a 18.0 (e2ab18b), línia 567 a 19.0 (ce7f5a3) i línia 569 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1063 a 17.0 (d203ee6), línia 1063 a 18.0 (e2ab18b), línia 1063 a 19.0 (ce7f5a3) i línia 1070 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 408 a 17.0 (d203ee6), línia 408 a 18.0 (e2ab18b), línia 408 a 19.0 (ce7f5a3) i línia 410 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 436 a 17.0 (d203ee6), línia 436 a 18.0 (e2ab18b), línia 436 a 19.0 (ce7f5a3) i línia 438 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1083 a 17.0 (d203ee6), línia 1083 a 18.0 (e2ab18b), línia 1083 a 19.0 (ce7f5a3) i línia 1090 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 495 a 17.0 (d203ee6), línia 495 a 18.0 (e2ab18b), línia 495 a 19.0 (ce7f5a3) i línia 497 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1022 a 17.0 (d203ee6), línia 1022 a 18.0 (e2ab18b), línia 1022 a 19.0 (ce7f5a3) i línia 1037 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 560 a 17.0 (d203ee6), línia 560 a 18.0 (e2ab18b), línia 560 a 19.0 (ce7f5a3) i línia 562 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1481 a 17.0 (d203ee6), línia 1481 a 18.0 (e2ab18b), línia 1481 a 19.0 (ce7f5a3) i línia 1488 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1233 a 17.0 (d203ee6), línia 1233 a 18.0 (e2ab18b), línia 1233 a 19.0 (ce7f5a3) i línia 1240 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 521 a 17.0 (d203ee6), línia 521 a 18.0 (e2ab18b), línia 521 a 19.0 (ce7f5a3) i línia 523 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 31 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/events/payment
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
