Saltar para o conteúdo principal
API GoCardless · invalid_state · reembolsos

GoCardless refund_payment_invalid_state: esta cobrança ainda não pode ser reembolsada

Um reembolso da GoCardless devolve ao cliente o dinheiro de uma cobrança, e a GoCardless só o aceita se essa cobrança estiver confirmada ou já liquidada. Caso contrário, responde refund_payment_invalid_state. Além disso, a GoCardless tem um período de reembolso seguro de 7 dias corridos, e o conector do Odoo acrescenta a sua própria regra de 2 dias.

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
refund_payment_invalid_stateinvalid_statePayment must be confirmed or paid_out before it can be refunded.

Na referência dos reembolsos, a GoCardless acrescenta um prazo: «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.». Esse período pode ser retirado: «The safer refund period can be disabled by contacting GoCardless.». E recorda porque existe: «A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank.».

Os reembolsos pela API, além disso, vêm desligados: «This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard.».

Cartão do erro refund_payment_invalid_state da GoCardless
O reason, o seu tipo invalid_state e os estados confirmed e paid_out que a GoCardless exige para reembolsar.

As regras de prazo, num relance

Dias desde a cobrançaGoCardless, por defeitoO conector
Menos de 2dentro do período seguro: devolve um erronão envia o reembolso
2 ou mais, mas menos de 7dentro do período seguro: devolve um erroenvia-o e deixa um aviso no registo do servidor
7 ou maisfora do período seguroenvia-o

As duas contagens não começam no mesmo sítio. A GoCardless conta a partir da data de débito do pagamento. O conector conta a partir da última mudança de estado da transação da cobrança no Odoo. Se a GoCardless tiver retirado o período seguro, entre 2 e 7 dias o reembolso pode avançar.

Quando sai refund_payment_invalid_state com o conector

O Odoo só deixa reembolsar uma transação confirmada, e o conector confirma-a quando a GoCardless indica confirmed ou paid_out. Por isso, com o conector, este reason quer dizer que o pagamento mudou na GoCardless e o Odoo ainda não o sabe: uma falha tardia, que a GoCardless pode comunicar com o pagamento já confirmado, ou uma devolução do cliente cujo evento ainda não chegou.

O que faz o conector

  1. Com menos de 2 dias, não envia nada: o Odoo para com «A GoCardless não pode reembolsar uma cobrança até esta estar liquidada. Esta foi debitada há … dia(s); os reembolsos são possíveis após 2 dias.».
  2. Caso contrário, envia o reembolso à GoCardless com a sua chave de idempotência. Se a GoCardless o rejeitar, por este reason, pelo período seguro ou por qualquer outro motivo, a transação do reembolso passa a «Erro» com «A GoCardless rejeitou o pedido.» e, por baixo, a mensagem da GoCardless com o reason e o request_id.
  3. Se aceitar, a transação fica «Pendente» com «Reembolso enviado. A GoCardless vai descontá-lo de uma liquidação futura.», e passa a «Confirmado» quando a GoCardless o pagar ou o descontar numa liquidação.

Desde a versão 1.1.5, um reembolso em erro não mostra o botão «Tentar cobrar novamente»: um reembolso não é uma cobrança, e não há nada que a GoCardless possa voltar a tentar. Se a GoCardless não conseguir que o dinheiro chegue ao cliente, o conector passa o reembolso para erro com «A GoCardless não conseguiu pagar este reembolso (…).». 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: «GoCardless could not pay this refund back (…).».

Esquema: o que a GoCardless responde ao reembolsar 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

  1. Abra a transação da cobrança 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. A partir dela, o botão de reembolsos leva à transação do reembolso e à sua mensagem.
  2. Se o reason for refund_payment_invalid_state, veja o pagamento no Dashboard da GoCardless. Se falhou tarde ou o cliente o devolveu, não há nada para reembolsar: o dinheiro já não está consigo. O Odoo refletirá isso quando o evento chegar; a tarefa que de hora a hora recupera os eventos perdidos trá-lo.
  3. Se a recusa vier do período seguro, aguarde 7 dias desde a data de débito, ou peça à GoCardless que o retire.
  4. Para reembolsar outra vez, faça-o a partir do pagamento da cobrança, com o seu botão de reembolso. O conector admite reembolsos parciais.

Porque é que o conector deixa reembolsar a partir dos 2 dias se a GoCardless fala de 7?

Os 2 dias são o mínimo do conector: abaixo disso não envia nada. A GoCardless permite retirar o seu período seguro, e enquanto estiver ativo é a GoCardless que rejeita o reembolso antes dos 7 dias. Entre 2 e 7 dias o conector avisa no registo, porque uma falha SEPA ainda pode chegar.

Uma cobrança reembolsada pode falhar depois?

Sim. A GoCardless avisa: um pagamento reembolsado, total ou parcialmente, ainda pode receber uma falha tardia ou uma devolução do banco do cliente. Nesse caso teria devolvido um dinheiro que não chegou a ficar consigo.

Com o nosso conector

No Odoo 17, 18, 19 e 20 o conector não envia reembolsos de cobranças com menos de 2 dias, deixa em erro, com o seu request_id, os que a GoCardless rejeita, e não oferece tentar de novo um reembolso, que não é uma cobrança.

Continue a ler

GoCardless total_amount_confirmation_invalid: o total reembolsado não bate certoGoCardless rejeita um reembolso com total_amount_confirmation_invalid se o total reembolsado não bater certo, ou com number_of_refunds_exceeded após 5.GoCardless MD06: o cliente pede ao banco o estorno de uma cobrançaO cliente pede ao banco o estorno de um débito GoCardless: charged_back, refund_requested e MD06. O que acontece no Odoo à fatura e ao mandato.GoCardless insufficient_funds (AM04): a conta do cliente não tinha saldoUm débito da GoCardless falha com insufficient_funds e o código SEPA AM04. O que significa, quando o Success+ o volta a tentar e o que o Odoo faz à fatura.
Verificado no código do conector (versão 17.0, 18.0, 19.0 e 20.0) e nas fontes indicadas

Fontes

  • 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 do módulo: flexigo_payment_gocardless: const.py, linha 41 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 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 do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 256 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: const.py, linha 106 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 361 em 17.0 (d203ee6), linha 361 em 18.0 (e2ab18b), linha 360 em 19.0 (ce7f5a3) e linha 375 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 365 em 17.0 (d203ee6), linha 365 em 18.0 (e2ab18b), linha 364 em 19.0 (ce7f5a3) e linha 379 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 437 em 17.0 (d203ee6), linha 437 em 18.0 (e2ab18b), linha 437 em 19.0 (ce7f5a3) e linha 443 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 371 em 17.0 (d203ee6), linha 371 em 18.0 (e2ab18b), linha 370 em 19.0 (ce7f5a3) e linha 385 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 397 em 17.0 (d203ee6), linha 397 em 18.0 (e2ab18b), linha 396 em 19.0 (ce7f5a3) e linha 411 em 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_provider.py, linha 462 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 558 em 17.0 (d203ee6), linha 558 em 18.0 (e2ab18b), linha 558 em 19.0 (ce7f5a3) e linha 564 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 413 em 17.0 (d203ee6), linha 413 em 18.0 (e2ab18b), linha 412 em 19.0 (ce7f5a3) e linha 427 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 605 em 17.0 (d203ee6), linha 605 em 18.0 (e2ab18b), linha 604 em 19.0 (ce7f5a3) e linha 625 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 352 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 1059 em 17.0 (d203ee6), linha 1059 em 18.0 (e2ab18b), linha 1059 em 19.0 (ce7f5a3) e linha 1081 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 611 em 17.0 (d203ee6), linha 611 em 18.0 (e2ab18b), linha 610 em 19.0 (ce7f5a3) e linha 631 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 468 em 17.0 (d203ee6), linha 468 em 18.0 (e2ab18b), linha 468 em 19.0 (ce7f5a3) e linha 474 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 424 em 17.0 (d203ee6), linha 424 em 18.0 (e2ab18b), linha 423 em 19.0 (ce7f5a3) e linha 438 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 418 em 17.0 (d203ee6), linha 418 em 18.0 (e2ab18b), linha 417 em 19.0 (ce7f5a3) e linha 432 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 63 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 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)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pt.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 do módulo: flexigo_payment_gocardless: __manifest__.py, linha 31 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)