Qué dice GoCardless
| Evento | Causa | Texto de GoCardless |
|---|---|---|
| mandates · expired | mandate_expired | The mandate is being marked as expired, because no payments have been collected against it for the dormancy period of your service user number. If you have access to the mandate reinstation API endpoint, you can use this to attempt to set this mandate up again. |
| payments · cancelled | mandate_expired | The mandate expired before the payment could be collected. |
La descripción del evento lo deja claro: «No collection attempts were made against the mandate within the dormancy period of your service user number.». Y la consecuencia: «As a result it has expired, and no further collections can be taken against it.». El estado del mandato pasa a expired, que GoCardless define como caducado por inactividad.

Cuándo aparece
Le pasa a un mandato que se firmó y luego dejó de usarse: un cliente que ya no compra, o uno al que se cobra tan de tarde en tarde que entre un cobro y el siguiente pasa todo el periodo de inactividad. Lo cuenta el tiempo sin intentos de cobro, no la fecha de la firma.
Si cuando caduca había un cobro esperando a presentarse, GoCardless lo cancela con la misma causa: «The mandate expired before the payment could be collected.».
Lo que hace Odoo con el conector
- El evento del mandato caducado lo retira. El conector da por muerto un mandato
expired: archiva el método de pago del cliente, escribe en su ficha que el mandato ya no se puede usar y crea la actividad «Mandato de GoCardless perdido». Solo lo hace la primera vez; si otro evento trae la misma noticia, ya lo encuentra archivado. - El pago cancelado pasa a «Error» su transacción, que se abre desde la factura con el botón «Transacción de pago» de arriba, con «GoCardless no pudo cobrar este pago (mandate_expired).». Si la factura ya estaba pagada con ese cobro, anula el pago y la factura vuelve a estar pendiente. Y como
mandate_expiredes una de las causas con las que el conector archiva el mandato, ese evento también lo retira, comoexpired. - En la ficha del método de pago, «Estado del mandato» dice
expired.
Esos textos los escribe el conector al aplicar el evento, sin nadie delante. En una base de datos creada en castellano salen así; en una creada en inglés y pasada después a castellano, en inglés: «The GoCardless direct debit mandate of … is no longer usable (mandate_expired). No further collection can be taken against it. Ask the customer to set up a new mandate.», «GoCardless mandate lost» y «GoCardless could not collect this payment (mandate_expired).».
Si Odoo intenta cobrar con el mandato antes de enterarse, porque el evento se perdió por el camino, GoCardless contesta mandate_is_inactive. El conector consulta entonces el mandato, lo archiva y pone en la transacción su propio mensaje: «El mandato de GoCardless del cliente está en estado expired, así que no se puede cobrar. Pide al cliente un mandato nuevo.». La tarea que cada hora recupera los eventos perdidos acaba trayendo también el evento del mandato.

¿Reactivarlo o pedir otro?
GoCardless deja dos caminos. Para seguir cobrando a ese cliente, dice, hay que pedirle permiso y usar la reactivación del mandato («you should request their permission and use the reinstate endpoint»). Pero ese endpoint es restringido: pide páginas de pago propias aprobadas por GoCardless («Restricted this endpoint requires approved custom payment pages»).
El conector no reactiva mandatos en producción: el botón «Reactivar mandato (sandbox)» de la ficha del método de pago solo sale con el proveedor en pruebas y con el mandato cancelado, fallido o caducado. En producción, el camino es un mandato nuevo.
Qué hacer
- Habla con el cliente: si sigue siendo cliente, pídele que firme un mandato nuevo. En Odoo será un método de pago nuevo.
- Cobra con él las facturas pendientes. Los cobros que GoCardless canceló por la caducidad no se presentarán solos.
- Si un cliente se cobra muy de tarde en tarde, cuenta con que su mandato puede caducar entre un cobro y otro.
¿Puedo cobrar con un mandato caducado si el cliente está de acuerdo?
Con ese mandato, no: GoCardless no deja crear cobros con él. Hace falta uno nuevo o, donde se pueda usar, la reactivación de GoCardless.
¿Se puede probar la reactivación?
Sí, en el sandbox de GoCardless. Con el proveedor en pruebas, la ficha del método de pago enseña «Reactivar mandato (sandbox)» cuando el mandato está caducado.
Con nuestro conector
En Odoo 17, 18, 19 y 20 el conector retira el mandato caducado en cuanto GoCardless lo comunica, deja el cobro cancelado en error con su causa y avisa en la ficha del cliente, para pedir un mandato nuevo antes de la siguiente factura.
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/events/mandate
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/mandate
- Código del módulo: flexigo_payment_gocardless: const.py, línea 33 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 83 en 17.0 (d203ee6), línea 83 en 18.0 (e2ab18b), línea 83 en 19.0 (ce7f5a3) y línea 82 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 131 en 17.0 (d203ee6), línea 131 en 18.0 (e2ab18b), línea 131 en 19.0 (ce7f5a3) y línea 130 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1241 en 17.0 (d203ee6), línea 1241 en 18.0 (e2ab18b), línea 1241 en 19.0 (ce7f5a3) y línea 1252 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 527 en 17.0 (d203ee6), línea 527 en 18.0 (e2ab18b), línea 527 en 19.0 (ce7f5a3) y línea 532 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: const.py, línea 76 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 914 en 17.0 (d203ee6), línea 914 en 18.0 (e2ab18b), línea 913 en 19.0 (ce7f5a3) y línea 937 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 725 en 17.0 (d203ee6), línea 725 en 18.0 (e2ab18b), línea 724 en 19.0 (ce7f5a3) y línea 748 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 754 en 17.0 (d203ee6), línea 754 en 18.0 (e2ab18b), línea 753 en 19.0 (ce7f5a3) y línea 777 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 464 en 17.0 (d203ee6), línea 464 en 18.0 (e2ab18b), línea 464 en 19.0 (ce7f5a3) y línea 469 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 278 en 17.0 (d203ee6), línea 278 en 18.0 (e2ab18b), línea 278 en 19.0 (ce7f5a3) y línea 289 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 321 en 17.0 (d203ee6), línea 321 en 18.0 (e2ab18b), línea 321 en 19.0 (ce7f5a3) y línea 332 en 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1343 en 17.0 (d203ee6), línea 1343 en 18.0 (e2ab18b), línea 1343 en 19.0 (ce7f5a3) y línea 1354 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: 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: 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 162 en 17.0 (d203ee6), línea 162 en 18.0 (e2ab18b), línea 162 en 19.0 (ce7f5a3) y línea 161 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/17.0/odoo/http.py
- 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
- 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)
