Salta al contingut principal
GoCardless API · invalid_state

Error mandate_is_inactive de GoCardless en crear un cobrament des d'Odoo

mandate_is_inactive no ve del banc del client sinó de la pròpia API de GoCardless: Odoo ha intentat crear un cobrament amb un mandat que ja no està actiu. És un error de tipus invalid_state, i la documentació de GoCardless és clara sobre què cal fer: avisar qui usa el sistema i no reintentar.

FlexigoTech · Responsable: Víctor Gómez · Actualitzat el 6 de novembre de 2026

L'essencial

Versions
Odoo 17, 18, 19 i 20
Comprovat
al codi del connector, versió 17.0, 18.0, 19.0 i 20.0 · a les fonts enllaçades al final
Lectura
4 min

Què diu GoCardless

ReasonTipusText de GoCardless
mandate_is_inactiveinvalid_state«Payment could not be created» i «mandate is cancelled, failed, or expired.»

GoCardless separa les dues parts del text amb un guió. Els errors invalid_state signifiquen, segons GoCardless, que l'acció no val en l'estat actual del recurs. Aquí el recurs és el mandat: cancel·lat, fallit o caducat, ja no admet cobraments.

Targeta de l'error mandate_is_inactive de GoCardless
El reason, el seu tipus invalid_state i el text amb què GoCardless el documenta.

Com s'arriba a aquest error

Normalment Odoo s'assabenta que un mandat ha mort per un esdeveniment de GoCardless abans d'intentar cobrar-hi. Aquest error apareix quan no ha estat així: l'avís no va arribar o va arribar tard, o el mandat es va cancel·lar just abans del cobrament. El cobrament pot venir d'una subscripció que es renova o d'un pagament registrat amb el mètode de pagament desat del client. Els avisos de GoCardless arriben per webhook: amb la connexió en dos clics, a través de FlexigoTech Cloud; en el mode avançat, a l'endpoint que vas crear tu al Dashboard de GoCardless. Si aquest camí falla, Odoo no se n'assabenta a temps.

Què fa el connector

Sense un tractament especial, veuries l'error tal qual, amb el text de l'API, i el mandat seguiria oferint-se per a la següent factura. El connector fa una altra cosa:

  1. Reconeix el reason mandate_is_inactive a la resposta.
  2. Pregunta a GoCardless per aquell mandat per confirmar-ne l'estat.
  3. Si està cancel·lat, fallit, caducat, consumit o bloquejat, l'arxiva a Odoo. Si és la primera notícia d'aquell mandat mort, ho escriu a la fitxa del client, amb l'estat del mandat entre parèntesis («The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.»), i crea l'activitat «GoCardless mandate lost».
  4. Passa la transacció a «Error» amb el seu propi missatge, en lloc de l'error en cru: «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.».

Si el mandat resultés estar actiu, el connector no el toca i la transacció mostra l'error de GoCardless: «GoCardless rejected the request.» seguit del missatge de l'API i del seu request_id. El mateix tractament té el botó de reintentar un cobrament quan GoCardless contesta mandate_is_inactive.

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, com la renovació d'una subscripció: «The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.», «GoCardless mandate lost», «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.» i «GoCardless rejected the request.».

Per què no convé reintentar

GoCardless ho posa a la descripció dels errors invalid_state: cal informar l'usuari i no deixar que reintenti. Un mandat cancel·lat no torna a estar actiu perquè s'insisteixi; necessita una signatura nova del client o, en alguns casos i només amb permisos especials de GoCardless, una reactivació.

Esquema: què respon GoCardless amb mandate_is_inactive i què fa Odoo amb el connector
Esquema fet a partir del codi del connector (17.0, 18.0, 19.0 i 20.0) i de la documentació de GoCardless.

Què fer

  • Mira el missatge de la transacció i la nota del connector a la fitxa del client. 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. Els dos textos diuen en quin estat és el mandat.
  • Demana al client un mandat nou i cobra-hi la factura pendent.
  • Si passa sovint, revisa que els webhooks de GoCardless arribin al teu Odoo: són els que avisen abans que arribi el cobrament. Tot i així, el connector demana cada hora els esdeveniments que s'hagin perdut.

Per què el connector consulta el mandat en lloc d'arxivar-lo sense més?

Perquè només arxiva el que GoCardless confirma mort. Si la consulta diu que el mandat és actiu, arxivar-lo obligaria el client a signar sense necessitat.

Amb el nostre connector

A Odoo 17, 18, 19 i 20 el connector converteix un error d'API en una tasca clara: el mandat mort surt de la llista de mètodes de pagament, el client queda avisat a la seva fitxa i la factura continua pendent fins que hi hagi un mandat que funcioni.

Continua llegint

GoCardless MD01: mandate_cancelled i authorisation_disputed en un cobrament SEPAEl codi SEPA MD01 arriba a GoCardless com a mandate_cancelled o authorisation_disputed, en un cobrament fallit, retornat o cancel·lat. Què fa Odoo amb ell.GoCardless bank_account_closed: AC04 i MD07, el compte ja no existeixGoCardless bank_account_closed amb AC04 (compte tancat) o MD07 (titular traspassat): el mandat queda cancel·lat. Què fa Odoo amb la factura i amb el client.Error retry_failed de GoCardless en reintentar un cobrament des d'OdooGoCardless respon retry_failed si el pagament no ha fallat o ja no admet reintents. Quan surt a Odoo el botó «Retry collection» i què fa el connector.
Comprovat al codi del connector (versió 17.0, 18.0, 19.0 i 20.0) i a les fonts enllaçades

Fonts

  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 15 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 247 a 17.0 (d203ee6), línia 247 a 18.0 (e2ab18b), línia 247 a 19.0 (ce7f5a3) i línia 258 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 71 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 6 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/mandate
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 278 a 17.0 (d203ee6), línia 278 a 18.0 (e2ab18b), línia 278 a 19.0 (ce7f5a3) i línia 289 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 33 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 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: const.py, línia 134 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 397 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 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: const.py, línia 117 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1148 a 17.0 (d203ee6), línia 1148 a 18.0 (e2ab18b), línia 1148 a 19.0 (ce7f5a3) i línia 1155 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 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)
  • docs.gocardless.com/docs/api-reference/events/mandate
  • 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/responses-and-errors
  • 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: 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: models/payment_token.py, línia 83 a 17.0 (d203ee6), línia 83 a 18.0 (e2ab18b), línia 83 a 19.0 (ce7f5a3) i línia 82 a 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/ca.po
  • 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)
  • 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