Uma causa, quatro códigos
| Código SEPA Core | Texto da GoCardless |
|---|---|
| MS02 | The customer refused to accept this payment. |
| MS03, RR04 | The payment failed but the reason for the failure was not provided, usually for regulatory reasons. |
| SL01 | The payment failed due to a restriction on Direct Debit payments from the payer's bank account. |
As três linhas vêm da tabela de falhas de pagamento (payments · failed) da documentação da GoCardless para o SEPA Core. Ao contrário de outras causas, nenhuma indica que o mandato seja cancelado: o cliente continua autorizado a ser cobrado, embora este débito concreto não tenha passado.

O que está por detrás de cada código
MS02 é a resposta mais clara: o cliente disse ao seu banco que não pagasse aquele recibo. O conector anota no seu código que é a combinação que viu num pagamento SEPA de teste do sandbox da GoCardless. MS03 e RR04 são o contrário: o pagamento falha e o banco não dá o motivo, normalmente por razões regulamentares, por isso a única forma de saber o que se passa é perguntar ao cliente. SL01 aponta para a conta: o banco limita os débitos diretos que lhe podem ser cobrados, e só o titular o pode alterar junto do seu banco.
Com MS02, RR04 e SL01, voltar a apresentar o débito sem falar antes com o cliente costuma acabar da mesma forma e pode custar outra comissão. MS03 tem uma exceção: segundo o guia do Success+, na Áustria, Bélgica, Alemanha, Luxemburgo e Eslováquia o MS03 conta como falta de fundos, e o Success+ pode tentar novamente. Se for esse o caso, o evento chega com will_attempt_retry a true.
O que faz o Odoo com o conector
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. O conector guarda a causa no campo «Causa segundo a GoCardless», não o código SEPA, e mostra «A GoCardless não conseguiu cobrar este pagamento (refer_to_payer).». Depois segue o que disser o evento:
- Se
will_attempt_retryvier atrue, a transação fica «Pendente», a caixa «O Success+ vai tentar novamente» é marcada e a mensagem diz: «O Success+ vai tentar novamente de forma automática; não é preciso fazer nada.». O botão de nova tentativa não aparece. - Caso contrário, a transação passa a «Erro» e aparece o botão «Tentar cobrar novamente», se ainda houver tentativas. Se o Odoo já tivesse dado a cobrança como feita, o conector anula o seu pagamento e a fatura volta a estar pendente de cobrança.
- O mandato não é alterado.
refer_to_payernão está entre as causas com as quais o conector arquiva um mandato, por isso o método de pagamento do cliente continua disponível para a próxima cobrança.
Este último ponto é deliberado: arquivar o mandato por uma recusa pontual obrigaria o cliente a assinar outro sem motivo.
As duas mensagens são escritas pelo conector ao aplicar o evento, sem ninguém presente. Numa base de dados criada em português aparecem em português; numa criada em inglês e depois passada para português aparecem em inglês: «GoCardless could not collect this payment (refer_to_payer).» e «Success+ will retry it automatically; there is nothing to do.».
O que fazer conforme o código
O Odoo não diz qual dos quatro códigos chegou: o conector só guarda a causa. O código vê-o na GoCardless. Segundo o seu centro de ajuda, o motivo de cada falha aparece na cronologia do pagamento, no Dashboard («You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard.»). No modo avançado, o código exato também vem no evento (details.reason_code), e o Dashboard guarda os envios dos últimos 3 meses em Developers > Webhooks, com o seu conteúdo.
| Código | Primeiro passo |
|---|---|
| MS02 | Pergunte ao cliente porque recusou o recibo: montante, data ou desacordo com a fatura. |
| MS03 | Veja «O Success+ vai tentar novamente»: na Áustria, Bélgica, Alemanha, Luxemburgo e Eslováquia, o Success+ pode tentar novamente o MS03 como falta de fundos. Se não estiver marcada, peça ao cliente que consulte o seu banco. |
| RR04 | Peça ao cliente que consulte o seu banco: a GoCardless não recebe o motivo. |
| SL01 | O cliente tem de levantar a limitação de débitos da sua conta, ou dar-lhe outra. |
Quando o cliente confirmar que a cobrança vai passar, use «Tentar cobrar novamente» na transação e confirme o aviso da comissão. O conector responde «Nova tentativa pedida. A GoCardless vai confirmar a nova data de débito.» e deixa-a pendente. Lembre-se do limite: um pagamento pode ser repetido no máximo 3 vezes («Payments can be retried up to 3 times.»).
O mandato é cancelado se o cliente recusar uma cobrança?
Não. Nem a documentação da GoCardless o indica para esta causa nem o conector arquiva o mandato com refer_to_payer. Se o cliente quiser deixar de lhe pagar por débito direto, cancelará o mandato no seu banco, e isso chega com outra causa, mandate_cancelled.

Com o nosso conector
No Odoo 17, 18, 19 e 20 o conector transforma refer_to_payer numa fatura pendente com a causa à vista e um mandato que continua válido. Não adivinha o código SEPA: o Odoo guarda a causa na transação, e o código consulta-o na GoCardless. A decisão de voltar a cobrar é sua, depois de falar com o cliente.
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/events/payment
- docs.gocardless.com/docs/api-reference/payment
- 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: const.py, linha 79 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 76 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 71 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 725 em 17.0 (d203ee6), linha 725 em 18.0 (e2ab18b), linha 724 em 19.0 (ce7f5a3) e linha 748 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 729 em 17.0 (d203ee6), linha 729 em 18.0 (e2ab18b), linha 728 em 19.0 (ce7f5a3) e linha 752 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 754 em 17.0 (d203ee6), linha 754 em 18.0 (e2ab18b), linha 753 em 19.0 (ce7f5a3) e linha 777 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: const.py, linha 122 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: views/payment_transaction_views.xml, linha 13 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 462 em 17.0 (d203ee6), linha 462 em 18.0 (e2ab18b), linha 462 em 19.0 (ce7f5a3) e linha 468 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 377 em 17.0 (d203ee6), linha 377 em 18.0 (e2ab18b), linha 377 em 19.0 (ce7f5a3) e linha 383 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1091 em 17.0 (d203ee6), linha 1091 em 18.0 (e2ab18b), linha 1091 em 19.0 (ce7f5a3) e linha 1113 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1097 em 17.0 (d203ee6), linha 1097 em 18.0 (e2ab18b), linha 1097 em 19.0 (ce7f5a3) e linha 1119 em 20.0 (688d86b)
- 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/optimise/reduced-failed-payments-with-success-plus
- 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: 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: views/payment_transaction_views.xml, linha 27 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/payment/views/payment_transaction_views.xml
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1164 em 17.0 (d203ee6), linha 1164 em 18.0 (e2ab18b), linha 1164 em 19.0 (ce7f5a3) e linha 1176 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1142 em 17.0 (d203ee6), linha 1142 em 18.0 (e2ab18b), linha 1142 em 19.0 (ce7f5a3) e linha 1154 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 617 em 17.0 (d203ee6), linha 617 em 18.0 (e2ab18b), linha 617 em 19.0 (ce7f5a3) e linha 623 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 461 em 17.0 (d203ee6), linha 461 em 18.0 (e2ab18b), linha 460 em 19.0 (ce7f5a3) e linha 479 em 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/webhooks
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- support.gocardless.com/hc/en-gb/articles/360001467265
- Código do módulo: flexigo_payment_gocardless: const.py, linha 66 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
