Saltar para o conteúdo principal
GoCardless · mandatos · replaced

GoCardless mandate_replaced: o mandato tem um substituto

Por vezes a GoCardless cancela um mandato e substitui-o por um novo, por exemplo quando o credor muda de identificador. Comunica-o com o evento replaced, que traz o id do mandato novo, e o conector passa para ele o método de pagamento do cliente. Se o Odoo tentar cobrar com o antigo antes de o saber, a API responde mandate_replaced.

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

OndeReason ou causaTexto da GoCardless
API, ao criar uma cobrança (invalid_state)mandate_replacedMandate has been replaced. Check links[new_mandate] in the error or on the mandate itself.
mandates · replacedscheme_identifier_changedThe creditor has changed to a different scheme identifier, so this mandate has been cancelled and replaced by a new one.

A documentação de eventos explica-o assim: «The mandate has been cancelled and replaced by a new mandate (for example, because the creditor has moved to a new Service User Number).». E o que traz o evento: «The event will include links[new_mandate] with the ID of the new mandate.».

mandate_replaced é um erro invalid_state: a ação não vale no estado atual do recurso. Para estes erros a GoCardless pede que se avise o utilizador e que não se volte a tentar («invalid_state → inform the end user, do not allow retry.»).

Cartão do erro mandate_replaced da GoCardless
O reason, o seu tipo invalid_state, o campo links.new_mandate e a causa scheme_identifier_changed do evento.

Quando aparece

A mudança não é provocada pelo cliente nem pelo seu banco: o evento replaced tem origem gocardless, e a causa documentada é que o credor, a conta com que cobra na GoCardless, passou para outro identificador de esquema. A GoCardless cancela o mandato antigo e cria um novo no seu lugar.

mandate_replaced só aparece se o Odoo tentar cobrar com o mandato antigo: a cobrança de uma subscrição que se renova, ou um pagamento registado com o método de pagamento guardado do cliente, antes de o Odoo ter aplicado o evento.

O que faz o Odoo com o conector

Com o evento replaced:

  1. Toma o mandato novo de links.new_mandate.
  2. Passa para esse mandato o método de pagamento guardado do cliente e dá-o por válido, em vez de o dar por perdido. Se o método estava arquivado, reativa-o; o Odoo 17 não permite desarquivar um método de pagamento, e aí o conector cria um novo para o mandato novo.
  3. Escreve-o na ficha do cliente: «O mandato GoCardless pode voltar a ser usado (replaced).».

Essa nota é escrita pelo conector ao aplicar o evento, sem ninguém à frente. Numa base de dados criada em português sai assim; numa criada em inglês e passada depois para português, em inglês: «The GoCardless mandate is usable again (replaced).».

Com mandate_replaced numa cobrança, o conector não faz nada de especial: ao criar uma cobrança trata à parte apenas mandate_is_inactive. A transação passa a «Erro» com «A GoCardless rejeitou o pedido.» e, por baixo, a mensagem da GoCardless com mandate_replaced e o request_id entre parênteses retos. O mandato novo é tirado do evento, não do erro. Essa mensagem sai no idioma de quem lança a cobrança; se a lança uma ação agendada, numa base criada em inglês e passada depois para português sai em inglês: «GoCardless rejected the request.».

Esquema: o que a GoCardless envia com replaced 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 está riscado é o que não é preciso.

O que fazer

  1. Se uma cobrança ficar em erro com mandate_replaced, abra a transação 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.
  2. Veja na ficha do cliente se já está a nota de que o mandato pode voltar a ser usado (replaced). Se estiver, o método de pagamento já aponta para o mandato novo.
  3. Se não estiver, o evento ainda não chegou. A tarefa que a cada hora recupera os eventos perdidos trá-lo; se demorar mais do que isso, verifique se os webhooks da GoCardless chegam ao Odoo.
  4. Com o método de pagamento atualizado, volte a cobrar a fatura.

É preciso pedir ao cliente que assine outra vez?

Não para continuar a cobrar com o conector: o mandato novo é criado pela GoCardless e o conector passa para ele o método de pagamento guardado.

O que acontece no Odoo 17?

O mesmo, com uma diferença: se o método de pagamento antigo estava arquivado, o Odoo 17 não permite reativá-lo, por isso o conector cria um novo para o mandato novo. No 18, 19 e 20 reativa o que já existia.

Com o nosso conector

No Odoo 17, 18, 19 e 20 o conector segue o mandato novo assim que a GoCardless avisa da substituição: o cliente mantém o seu método de pagamento e a fatura seguinte é cobrada com o mandato que a GoCardless deixou no seu lugar.

Continue a ler

Erro mandate_is_inactive da GoCardless ao criar uma cobrança a partir do OdooA GoCardless responde mandate_is_inactive ao criar um pagamento com um mandato cancelado, falhado ou expirado. Porquê e como o conector o resolve no Odoo.GoCardless bank_account_transferred: AMEND, o mandato passa para outra contaA GoCardless avisa com transferred e o código AMEND de que o mandato passou para outra conta do cliente. O que faz o Odoo com o conector e o que não é preciso.GoCardless mandate_expired: o mandato caducou por não ser usadoA GoCardless marca um mandato como expired quando não se tenta cobrar com ele durante todo o período de inatividade. O que faz o Odoo e como continuar a cobrar.
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/events/mandate
  • Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 72 em 17.0 (d203ee6), linha 72 em 18.0 (e2ab18b), linha 72 em 19.0 (ce7f5a3) e linha 71 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: const.py, linha 150 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 158 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 77 em 17.0 (d203ee6), linha 77 em 18.0 (e2ab18b), linha 77 em 19.0 (ce7f5a3) e linha 76 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 96 em 17.0 (d203ee6), linha 96 em 18.0 (e2ab18b), linha 96 em 19.0 (ce7f5a3) e linha 95 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1253 em 17.0 (d203ee6), linha 1253 em 18.0 (e2ab18b), linha 1253 em 19.0 (ce7f5a3) e linha 1265 em 20.0 (688d86b)
  • 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: models/payment_transaction.py, linha 281 em 17.0 (d203ee6), linha 281 em 18.0 (e2ab18b), linha 281 em 19.0 (ce7f5a3) e linha 292 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: 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: 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)
  • 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)