O que diz a GoCardless
| Reason | Tipo | Texto da GoCardless |
|---|---|---|
mandate_not_inactive | invalid_state | «Mandate could not be reinstated» e «it is already active or being submitted.» |
A GoCardless separa as duas partes do texto com um travessão. Na referência da API detalha: «This will fail with a mandate_not_inactive error if the mandate is already being submitted, or is active.». É um erro invalid_state, e para esses a GoCardless pede que se avise o utilizador e não se volte a tentar («invalid_state → inform the end user, do not allow retry.»).

Que mandatos se podem reativar
A reativação tem mais condições do que o estado:
- É uma função restrita: «Restricted this endpoint requires approved custom payment pages».
- Só vale para um mandato cancelado através do Dashboard ou da API: «A mandate can only be reinstated if it has been cancelled through the dashboard or the API.». Um que cancelou o banco, não: «Any mandate that has been cancelled by the bank cannot be reinstated.».
- Serve para mandatos cancelados ou expirados («Reinstates a cancelled or expired mandate to the banks.»), e um mandato pode voltar a ser apresentado até 10 vezes («Mandates can be resubmitted up to 10 times.»).
Depois de a pedir, o processo é o de uma adesão: chega resubmission_requested e depois, como diz a GoCardless, «so you will receive a submitted webhook, followed by a reinstated or failed webhook up to two working days later.».
O que o Odoo faz com o conector
Na ficha do método de pagamento do cliente, o conector mostra o botão «Reativar mandato (sandbox)». Só aparece se o mandato for da GoCardless, o fornecedor não estiver em produção (no Odoo 17, 18 e 19, o estado do fornecedor; no Odoo 20, a caixa de produção) e «Estado do mandato» for cancelled, failed ou expired.
Ao carregar nele:
- O conector pede à GoCardless a reativação desse mandato.
- Se a GoCardless a aceitar, o estado passa a
reinstate_requestede na ficha do cliente fica «Foi pedida a reativação do mandato da GoCardless. Não poderá ser usado até o banco o confirmar.». O método de pagamento continua arquivado. - Quando chega
reinstated, o conector volta a dá-lo por válido: reativa-o e escreve «O mandato GoCardless pode voltar a ser usado (reinstated).».
Se a GoCardless responder mandate_not_inactive, o conector não o captura: o Odoo mostra «A GoCardless rejeitou o pedido.» com a mensagem da GoCardless, o reason e o request_id, e o mandato fica como estava. Acontece quando o Odoo acha que o mandato está morto e na GoCardless já está ativo ou em apresentação, porque os seus eventos ainda não chegaram ao Odoo. Depois de um pedido aceite, o botão deixa de aparecer, porque o estado passa a reinstate_requested.
A nota de que o mandato pode voltar a ser usado é escrita pelo conector ao aplicar o evento, sem ninguém à frente. 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 mandate is usable again (reinstated).».

O que fazer
- Se aparecer
mandate_not_inactive, procure o mandato no Dashboard da GoCardless. Se estiver ativo ou em apresentação, não há nada a reativar: espere que cheguem os seus eventos. A tarefa que de hora a hora recupera os eventos em falta trá-los. - Se o mandato foi cancelado pelo banco, não tente: a GoCardless não reativa esses. Peça ao cliente um mandato novo.
- Em produção, o conector não oferece a reativação: o caminho é um mandato novo assinado pelo cliente.
- Para testar, use o sandbox da GoCardless com o fornecedor em testes.
Porque é que o botão só aparece fora de produção?
Porque a GoCardless restringe a reativação a quem tem páginas de pagamento próprias aprovadas, e o conector só a oferece fora de produção.
Quanto tempo demora a voltar a ser válido o mandato?
O que demorarem os bancos: segundo a GoCardless, depois de resubmission_requested chega submitted e, até dois dias úteis depois, reinstated ou failed conforme respondam os bancos. Até lá, o conector não o usa.
Com o nosso conector
No Odoo 17, 18, 19 e 20 o conector só oferece reativar um mandato cancelado, falhado ou expirado, e só fora de produção, e não volta a usá-lo até a GoCardless confirmar a reativação com o seu evento.
Continue a ler
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/mandate
- docs.gocardless.com/docs/api-reference/events/mandate
- 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: views/payment_token_views.xml, linha 23 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: views/payment_token_views.xml, linha 22 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 1071 em 17.0 (d203ee6), linha 1071 em 18.0 (e2ab18b), linha 1071 em 19.0 (ce7f5a3) e linha 1093 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 176 em 17.0 (d203ee6), linha 176 em 18.0 (e2ab18b), linha 176 em 19.0 (ce7f5a3) e linha 175 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 173 em 17.0 (d203ee6), linha 173 em 18.0 (e2ab18b), linha 173 em 19.0 (ce7f5a3) e linha 172 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1079 em 17.0 (d203ee6), linha 1079 em 18.0 (e2ab18b), linha 1079 em 19.0 (ce7f5a3) e linha 1101 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 170 em 17.0 (d203ee6), linha 170 em 18.0 (e2ab18b), linha 170 em 19.0 (ce7f5a3) e linha 169 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 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: 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: views/payment_token_views.xml, linha 15 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 847 em 17.0 (d203ee6), linha 847 em 18.0 (e2ab18b), linha 847 em 19.0 (ce7f5a3) e linha 869 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)
- 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)
