O que diz a GoCardless
| Onde | Reason ou causa | Texto da GoCardless |
|---|---|---|
API, ao criar uma cobrança (invalid_state) | mandate_replaced | Mandate has been replaced. Check links[new_mandate] in the error or on the mandate itself. |
| mandates · replaced | scheme_identifier_changed | The 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.»).

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:
- Toma o mandato novo de
links.new_mandate. - 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.
- 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.».

O que fazer
- 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. - 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.
- 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.
- 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
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)
