Qué dice GoCardless
| Reason | Tipo | Texto de GoCardless |
|---|---|---|
mandate_not_inactive | invalid_state | «Mandate could not be reinstated» y «it is already active or being submitted.» |
GoCardless separa las dos partes del texto con una raya. En la referencia de la API lo detalla: «This will fail with a mandate_not_inactive error if the mandate is already being submitted, or is active.». Es un error invalid_state, y para esos GoCardless pide avisar al usuario y no reintentar («invalid_state → inform the end user, do not allow retry.»).

Qué mandatos se pueden reactivar
La reactivación tiene más condiciones que el estado:
- Es una función restringida: «Restricted this endpoint requires approved custom payment pages».
- Solo vale para un mandato cancelado desde el Dashboard o la API: «A mandate can only be reinstated if it has been cancelled through the dashboard or the API.». Uno que canceló el banco, no: «Any mandate that has been cancelled by the bank cannot be reinstated.».
- Sirve para mandatos cancelados o caducados («Reinstates a cancelled or expired mandate to the banks.»), y un mandato se puede volver a presentar hasta 10 veces («Mandates can be resubmitted up to 10 times.»).
Después de pedirla, el proceso es el de un alta: llega resubmission_requested y luego, como dice GoCardless, «so you will receive a submitted webhook, followed by a reinstated or failed webhook up to two working days later.».
Lo que hace Odoo con el conector
En la ficha del método de pago del cliente, el conector pone el botón «Reactivar mandato (sandbox)». Solo sale si el mandato es de GoCardless, el proveedor no está en producción (en Odoo 17, 18 y 19, el estado del proveedor; en Odoo 20, la casilla de producción) y «Estado del mandato» es cancelled, failed o expired.
Al pulsarlo:
- El conector pide a GoCardless la reactivación de ese mandato.
- Si GoCardless la acepta, el estado pasa a
reinstate_requestedy en la ficha del cliente queda «Se ha pedido reactivar el mandato de GoCardless. No se podrá usar hasta que el banco lo confirme.». El método de pago sigue archivado. - Cuando llega
reinstated, el conector lo vuelve a dar por bueno: lo reactiva y escribe «El mandato de GoCardless se puede volver a usar (reinstated).».
Si GoCardless contesta mandate_not_inactive, el conector no lo captura: Odoo enseña «GoCardless rechazó la solicitud.» con el mensaje de GoCardless, el reason y el request_id, y el mandato se queda como estaba. Pasa cuando Odoo cree que el mandato está muerto y en GoCardless ya está activo o presentándose, porque sus eventos aún no han llegado a Odoo. Después de una petición aceptada, el botón ya no sale, porque el estado pasa a reinstate_requested.
La nota de que el mandato se puede volver a usar la escribe el conector al aplicar el evento, sin nadie delante. En una base de datos creada en castellano sale así; en una creada en inglés y pasada después a castellano, en inglés: «The GoCardless mandate is usable again (reinstated).».

Qué hacer
- Si sale
mandate_not_inactive, busca el mandato en el Dashboard de GoCardless. Si está activo o presentándose, no hay nada que reactivar: espera a que lleguen sus eventos. La tarea que cada hora recupera los eventos perdidos los trae. - Si el mandato lo canceló el banco, no lo intentes: GoCardless no reactiva esos. Pide al cliente un mandato nuevo.
- En producción, el conector no ofrece la reactivación: el camino es un mandato nuevo firmado por el cliente.
- Para probarlo, usa el sandbox de GoCardless con el proveedor en pruebas.
¿Por qué el botón solo sale fuera de producción?
Porque GoCardless restringe la reactivación a quien tiene páginas de pago propias aprobadas, y el conector solo la ofrece fuera de producción.
¿Cuánto tarda en volver a valer el mandato?
Lo que tarden los bancos: según GoCardless, primero avisa de que se pidió la reactivación, después de que el mandato se ha presentado y, hasta dos días hábiles más tarde, de si ha quedado reactivado o ha fallado. Hasta entonces, el conector no lo usa.
Con nuestro conector
En Odoo 17, 18, 19 y 20 el conector solo ofrece reactivar un mandato cancelado, fallido o caducado, y solo fuera de producción, y no lo vuelve a usar hasta que GoCardless confirma la reactivación con su evento.
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/mandate
- docs.gocardless.com/docs/api-reference/events/mandate
- Código del módulo: flexigo_payment_gocardless: const.py, línea 134 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: views/payment_token_views.xml, línea 23 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: views/payment_token_views.xml, línea 22 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 1072 en 17.0 (d203ee6), línea 1072 en 18.0 (e2ab18b), línea 1072 en 19.0 (ce7f5a3) y línea 1093 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 176 en 17.0 (d203ee6), línea 176 en 18.0 (e2ab18b), línea 176 en 19.0 (ce7f5a3) y línea 175 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 173 en 17.0 (d203ee6), línea 173 en 18.0 (e2ab18b), línea 173 en 19.0 (ce7f5a3) y línea 172 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1080 en 17.0 (d203ee6), línea 1080 en 18.0 (e2ab18b), línea 1080 en 19.0 (ce7f5a3) y línea 1101 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 170 en 17.0 (d203ee6), línea 170 en 18.0 (e2ab18b), línea 170 en 19.0 (ce7f5a3) y línea 169 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: const.py, línea 158 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 77 en 17.0 (d203ee6), línea 77 en 18.0 (e2ab18b), línea 77 en 19.0 (ce7f5a3) y línea 76 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1250 en 17.0 (d203ee6), línea 1250 en 18.0 (e2ab18b), línea 1250 en 19.0 (ce7f5a3) y línea 1261 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: views/payment_token_views.xml, línea 15 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 847 en 17.0 (d203ee6), línea 847 en 18.0 (e2ab18b), línea 847 en 19.0 (ce7f5a3) y línea 868 en 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/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)
