Qué dice GoCardless
| Reason | Tipo | Texto de GoCardless |
|---|---|---|
refund_payment_invalid_state | invalid_state | Payment must be confirmed or paid_out before it can be refunded. |
En la referencia de los reembolsos, GoCardless añade un plazo: «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.». Ese periodo se puede quitar: «The safer refund period can be disabled by contacting GoCardless.». Y recuerda por qué existe: «A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank.».
Los reembolsos por la API, además, vienen apagados: «This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard.».

Las reglas de plazo, de un vistazo
| Días desde el cobro | GoCardless, por defecto | El conector |
|---|---|---|
| Menos de 2 | dentro del periodo seguro: devuelve un error | no manda el reembolso |
| 2 o más, pero menos de 7 | dentro del periodo seguro: devuelve un error | lo manda y deja un aviso en el registro del servidor |
| 7 o más | fuera del periodo seguro | lo manda |
Los dos no cuentan desde el mismo sitio. GoCardless cuenta desde la fecha de cargo del pago. El conector cuenta desde el último cambio de estado de la transacción del cobro en Odoo. Si GoCardless te ha quitado el periodo seguro, entre 2 y 7 días el reembolso puede salir adelante.
Cuándo sale refund_payment_invalid_state con el conector
Odoo solo deja reembolsar una transacción confirmada, y el conector la confirma cuando GoCardless dice confirmed o paid_out. Así que, con el conector, este reason quiere decir que el pago ha cambiado en GoCardless y Odoo todavía no lo sabe: un fallo tardío, que GoCardless puede comunicar con el pago ya confirmado, o una devolución del cliente cuyo evento aún no ha llegado.
Lo que hace el conector
- Con menos de 2 días, no manda nada: Odoo para con «GoCardless no puede reembolsar un cobro hasta que se haya liquidado. Este se cargó hace … día(s); se puede reembolsar a partir de 2 días.».
- Si no, manda el reembolso a GoCardless con su clave de idempotencia. Si GoCardless lo rechaza, por este reason, por el periodo seguro o por cualquier otro motivo, la transacción del reembolso pasa a «Error» con «GoCardless rechazó la solicitud.» y, debajo, el mensaje de GoCardless con el reason y el
request_id. - Si lo acepta, la transacción queda en «Pendiente» con «Reembolso enviado. GoCardless lo descontará de una liquidación futura.», y pasa a «Confirmado» cuando GoCardless lo paga o lo descuenta de una liquidación.
Desde la versión 1.1.5, un reembolso en error no enseña el botón «Reintentar el cobro»: un reembolso no es un cobro, y no hay nada que GoCardless pueda reintentar. Si GoCardless no consigue que el dinero llegue al cliente, el conector pasa el reembolso a error con «GoCardless no pudo devolver este reembolso (…).». Ese texto lo escribe al aplicar el evento, sin nadie delante: en una base de datos creada en castellano sale así, y en una creada en inglés y pasada después a castellano, en inglés: «GoCardless could not pay this refund back (…).».

Qué hacer
- Abre la transacción del cobro desde la factura, con el botón «Transacción de pago» de arriba; el menú de transacciones solo sale en modo desarrollador, y en Odoo 20 no existe. Desde ella, el botón de reembolsos lleva a la transacción del reembolso y a su mensaje.
- Si el reason es
refund_payment_invalid_state, mira el pago en el Dashboard de GoCardless. Si falló tarde o el cliente lo devolvió, no hay nada que reembolsar: el dinero ya no está contigo. Odoo lo reflejará cuando llegue el evento; la tarea que cada hora recupera los eventos perdidos lo trae. - Si el rechazo viene del periodo seguro, espera a que pasen 7 días desde la fecha de cargo, o pide a GoCardless que lo quite.
- Para reembolsar otra vez, hazlo desde el pago del cobro, con su botón de reembolso. El conector admite reembolsos parciales.
¿Por qué el conector deja reembolsar desde los 2 días si GoCardless habla de 7?
Los 2 días son el mínimo del conector: por debajo no manda nada. GoCardless permite quitar su periodo seguro, y mientras está activo es GoCardless quien rechaza el reembolso antes de 7 días. Entre 2 y 7 días el conector avisa en el registro, porque un fallo SEPA todavía puede llegar.
¿Un cobro reembolsado puede fallar después?
Sí. GoCardless lo advierte: un pago reembolsado, del todo o en parte, todavía puede recibir un fallo tardío o una devolución del banco del cliente. En ese caso habrías devuelto un dinero que no llegaste a quedarte.
Con nuestro conector
En Odoo 17, 18, 19 y 20 el conector no manda reembolsos de cobros de menos de 2 días, deja en error con su request_id los que GoCardless rechaza y no ofrece reintentar un reembolso, que no es un cobro.
Sigue leyendo
Comprobado en el código del conector (versión 17.0, 18.0, 19.0 y 20.0) y en las fuentes enlazadas
Fuentes
- docs.gocardless.com/docs/api-reference/responses-and-errors
- docs.gocardless.com/docs/api-reference/refund
- support.gocardless.com/hc/en-gb/articles/360001467265
- Código del módulo: flexigo_payment_gocardless: const.py, línea 41 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 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
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 256 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: const.py, línea 106 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 361 en 17.0 (d203ee6), línea 361 en 18.0 (e2ab18b), línea 360 en 19.0 (ce7f5a3) y línea 375 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 365 en 17.0 (d203ee6), línea 365 en 18.0 (e2ab18b), línea 364 en 19.0 (ce7f5a3) y línea 379 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 440 en 17.0 (d203ee6), línea 440 en 18.0 (e2ab18b), línea 440 en 19.0 (ce7f5a3) y línea 445 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 371 en 17.0 (d203ee6), línea 371 en 18.0 (e2ab18b), línea 370 en 19.0 (ce7f5a3) y línea 385 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 397 en 17.0 (d203ee6), línea 397 en 18.0 (e2ab18b), línea 396 en 19.0 (ce7f5a3) y línea 411 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 397 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 462 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 560 en 17.0 (d203ee6), línea 560 en 18.0 (e2ab18b), línea 560 en 19.0 (ce7f5a3) y línea 565 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 413 en 17.0 (d203ee6), línea 413 en 18.0 (e2ab18b), línea 412 en 19.0 (ce7f5a3) y línea 427 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 605 en 17.0 (d203ee6), línea 605 en 18.0 (e2ab18b), línea 604 en 19.0 (ce7f5a3) y línea 625 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 352 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1060 en 17.0 (d203ee6), línea 1060 en 18.0 (e2ab18b), línea 1060 en 19.0 (ce7f5a3) y línea 1081 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 611 en 17.0 (d203ee6), línea 611 en 18.0 (e2ab18b), línea 610 en 19.0 (ce7f5a3) y línea 631 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 470 en 17.0 (d203ee6), línea 470 en 18.0 (e2ab18b), línea 470 en 19.0 (ce7f5a3) y línea 475 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 424 en 17.0 (d203ee6), línea 424 en 18.0 (e2ab18b), línea 423 en 19.0 (ce7f5a3) y línea 438 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 418 en 17.0 (d203ee6), línea 418 en 18.0 (e2ab18b), línea 417 en 19.0 (ce7f5a3) y línea 432 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 63 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: const.py, línea 117 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/es.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
- Código del módulo: flexigo_payment_gocardless: __manifest__.py, línea 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
