O que diz a GoCardless
| Reason | Tipo | Texto da GoCardless |
|---|---|---|
refund_payment_invalid_state | invalid_state | Payment 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.».

As regras de prazo, num relance
| Dias desde a cobrança | GoCardless, por defeito | O conector |
|---|---|---|
| Menos de 2 | dentro do período seguro: devolve um erro | não envia o reembolso |
| 2 ou mais, mas menos de 7 | dentro do período seguro: devolve um erro | envia-o e deixa um aviso no registo do servidor |
| 7 ou mais | fora do período seguro | envia-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
- 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.».
- 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. - 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 (…).».

O que fazer
- 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.
- 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. - Se a recusa vier do período seguro, aguarde 7 dias desde a data de débito, ou peça à GoCardless que o retire.
- 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
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)
