Saltar para o conteúdo principal
GoCardless API · invalid_state

Erro mandate_is_inactive da GoCardless ao criar uma cobrança a partir do Odoo

mandate_is_inactive não vem do banco do cliente, mas da própria API da GoCardless: o Odoo tentou criar uma cobrança com um mandato que já não está ativo. É um erro do tipo invalid_state, e a documentação da GoCardless é clara quanto ao que fazer: avisar quem usa o sistema e não voltar a tentar.

FlexigoTech · Responsável: Víctor Gómez · Atualizado em 6 de novembro de 2026

O essencial

Módulo
GoCardless
Versões
Odoo 17, 18, 19 e 20
Verificado
no código do conector, versão 17.0, 18.0, 19.0 e 20.0 · nas fontes indicadas no fim
Leitura
4 min

O que diz a GoCardless

ReasonTipoTexto da GoCardless
mandate_is_inactiveinvalid_state«Payment could not be created» e «mandate is cancelled, failed, or expired.»

A GoCardless separa as duas partes do texto com um travessão. Os erros invalid_state significam, segundo a GoCardless, que a ação não é válida no estado atual do recurso. Aqui o recurso é o mandato: cancelado, falhado ou expirado, já não aceita cobranças.

Cartão do erro mandate_is_inactive da GoCardless
O reason, o seu tipo invalid_state e o texto com que a GoCardless o documenta.

Como se chega a este erro

O normal é que o Odoo fique a saber que um mandato morreu por um evento da GoCardless antes de tentar cobrar com ele. Este erro aparece quando não foi assim: o aviso não chegou ou chegou tarde, ou o mandato foi cancelado mesmo antes da cobrança. A cobrança pode vir de uma subscrição que se renova ou de um pagamento registado com o método de pagamento guardado do cliente. Os avisos da GoCardless chegam por webhook: com a ligação em dois cliques, através do FlexigoTech Cloud; no modo avançado, ao endpoint que criou no Dashboard da GoCardless. Se esse caminho falhar, o Odoo não fica a saber a tempo.

O que faz o conector

Sem um tratamento especial, veria o erro tal como está, com o texto da API, e o mandato continuaria a ser oferecido para a fatura seguinte. O conector faz outra coisa:

  1. Reconhece o reason mandate_is_inactive na resposta.
  2. Pergunta à GoCardless por esse mandato para confirmar o seu estado.
  3. Se estiver cancelado, falhado, expirado, consumido ou bloqueado, arquiva-o no Odoo. Se for a primeira notícia desse mandato morto, regista-o na ficha do cliente, com o estado do mandato entre parênteses («O mandato de débito direto GoCardless de … já não pode ser usado (cancelled). Não é possível cobrar mais nada com ele. Peça ao cliente que crie um novo mandato.»), e cria a atividade «Mandato da GoCardless perdido».
  4. Passa a transação para «Erro» com a sua própria mensagem, em vez do erro em bruto: «O mandato GoCardless do cliente está no estado …, pelo que não pode ser cobrado. Peça ao cliente um novo mandato.».

Se o mandato estiver afinal ativo, o conector não lhe toca e a transação mostra o erro da GoCardless: «A GoCardless rejeitou o pedido.» seguido da mensagem da API e do seu request_id. O mesmo tratamento tem o botão de tentar novamente uma cobrança quando a GoCardless responde mandate_is_inactive.

Estes textos saem no idioma de quem lança a cobrança; se for uma ação agendada, como a renovação de uma subscrição, são escritos sem ninguém à frente: numa base de dados criada em português saem assim, e numa criada em inglês e passada depois para português, em inglês: «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.» e «GoCardless rejected the request.».

Porque não convém voltar a tentar

A GoCardless indica-o na descrição dos erros invalid_state: há que informar o utilizador e não o deixar voltar a tentar. Um mandato cancelado não volta a estar ativo por se insistir; precisa de uma nova assinatura do cliente ou, em alguns casos e só com permissões especiais da GoCardless, de uma reativação.

Esquema: o que a GoCardless responde com mandate_is_inactive e o que o Odoo faz com o conector
Esquema feito a partir do código do conector (17.0, 18.0, 19.0 e 20.0) e da documentação da GoCardless.

O que fazer

  • Veja a mensagem da transação e a nota do conector na ficha do cliente. A transação abre-se a partir da fatura, com o botão «Transação de Pagamento» no topo; o menu de transações só aparece em modo de programador, e no Odoo 20 não existe. As duas mensagens dizem em que estado está o mandato.
  • Peça ao cliente um novo mandato e cobre com ele a fatura pendente.
  • Se acontecer com frequência, verifique que os webhooks da GoCardless chegam ao seu Odoo: são eles que avisam antes de a cobrança chegar. Mesmo assim, o conector pede de hora a hora os eventos que se tenham perdido.

Porque é que o conector consulta o mandato em vez de o arquivar sem mais?

Porque só arquiva o que a GoCardless confirma morto. Se a consulta disser que o mandato está ativo, arquivá-lo obrigaria o cliente a assinar sem necessidade.

Com o nosso conector

No Odoo 17, 18, 19 e 20 o conector transforma um erro de API numa tarefa clara: o mandato morto sai da lista de métodos de pagamento, o cliente fica avisado na sua ficha e a fatura continua pendente até haver um mandato que funcione.

Continue a ler

GoCardless MD01: mandate_cancelled e authorisation_disputed num débito SEPAO código SEPA MD01 chega na GoCardless como mandate_cancelled ou authorisation_disputed, num débito falhado, devolvido ou cancelado. O que o Odoo faz com ele.GoCardless bank_account_closed: AC04 e MD07, a conta já não existeGoCardless bank_account_closed com AC04 (conta encerrada) ou MD07 (titular falecido): o mandato fica cancelado. O que o Odoo faz à fatura e ao cliente.Erro retry_failed da GoCardless ao tentar cobrar novamente a partir do OdooA GoCardless responde retry_failed se o pagamento não falhou ou já não admite novas tentativas. Eis quando surge o botão «Tentar cobrar novamente» no Odoo.
Verificado no código do conector (versão 17.0, 18.0, 19.0 e 20.0) e nas fontes indicadas

Fontes

  • Código do módulo: flexigo_payment_gocardless: const.py, linha 15 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 247 em 17.0 (d203ee6), linha 247 em 18.0 (e2ab18b), linha 247 em 19.0 (ce7f5a3) e linha 258 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 71 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: __manifest__.py, linha 6 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/mandate
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 278 em 17.0 (d203ee6), linha 278 em 18.0 (e2ab18b), linha 278 em 19.0 (ce7f5a3) e linha 289 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: const.py, linha 33 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 131 em 17.0 (d203ee6), linha 131 em 18.0 (e2ab18b), linha 131 em 19.0 (ce7f5a3) e linha 130 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: const.py, linha 134 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 397 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 469 em 17.0 (d203ee6), linha 469 em 18.0 (e2ab18b), linha 468 em 19.0 (ce7f5a3) e linha 487 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: const.py, linha 117 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1244 em 17.0 (d203ee6), linha 1244 em 18.0 (e2ab18b), linha 1244 em 19.0 (ce7f5a3) e linha 1256 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 525 em 17.0 (d203ee6), linha 525 em 18.0 (e2ab18b), linha 525 em 19.0 (ce7f5a3) e linha 531 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 558 em 17.0 (d203ee6), linha 558 em 18.0 (e2ab18b), linha 558 em 19.0 (ce7f5a3) e linha 564 em 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/events/mandate
  • Código do módulo: flexigo_payment_gocardless: __manifest__.py, linha 31 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 321 em 17.0 (d203ee6), linha 321 em 18.0 (e2ab18b), linha 321 em 19.0 (ce7f5a3) e linha 332 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1346 em 17.0 (d203ee6), linha 1346 em 18.0 (e2ab18b), linha 1346 em 19.0 (ce7f5a3) e linha 1358 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 83 em 17.0 (d203ee6), linha 83 em 18.0 (e2ab18b), linha 83 em 19.0 (ce7f5a3) e linha 82 em 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pt.po
  • Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 462 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 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