Cosa dice GoCardless
| Reason | Tipo | Testo di GoCardless |
|---|---|---|
total_amount_confirmation_invalid | invalid_state | Total amount refunded does not match the confirmation value. |
number_of_refunds_exceeded | invalid_state | Maximum of 5 refunds per payment already reached. |
Il riferimento dei rimborsi spiega il primo: «total_amount_confirmation_invalid if the confirmation amount doesn't match the total amount refunded for the payment.». E per cosa serve: «This safeguard is there to prevent two processes from creating refunds without awareness of each other.».
Quel campo, secondo GoCardless, è la somma dei rimborsi che il pagamento ha già più quello che si sta creando, in centesimi. Nel suo esempio, un rimborso di 100 porta un total_amount_confirmation di 150: su quel pagamento erano già stati restituiti 50.

Come calcola il connettore quella cifra
Per ogni rimborso, il connettore somma i rimborsi di quell'incasso che in Odoo risultano in attesa, autorizzati o eseguiti, e vi aggiunge il nuovo. Quelli in errore non contano. Questa somma va come total_amount_confirmation.
Che includa anche quelli in attesa conta: un rimborso in corso è già stato richiesto a GoCardless, e se non lo sommasse la cifra risulterebbe troppo bassa e GoCardless rifiuterebbe il successivo.
Quando non torna
La cifra viene da ciò che Odoo sa. Se qualcuno ha restituito denaro di quell'incasso per una strada che non passa da Odoo, per esempio con un altro programma collegato allo stesso account GoCardless, GoCardless lo ha registrato e Odoo no. Il totale inviato dal connettore risulta quindi inferiore, e GoCardless rifiuta il rimborso. È esattamente il caso per cui esiste questa salvaguardia: se lo accettasse, il cliente riceverebbe due volte lo stesso denaro.
number_of_refunds_exceeded è un'altra cosa: il connettore consente rimborsi parziali, e GoCardless ne ammette al massimo 5 per pagamento. Il sesto viene rifiutato anche se resta un importo da restituire.
Cosa fa Odoo con il connettore
In Odoo un incasso si rimborsa dal suo pagamento, con il pulsante di rimborso, e solo se la sua transazione è confermata. Il connettore invia il rimborso con la sua chiave di idempotenza e, se GoCardless lo rifiuta, la transazione del rimborso passa a «Errore» con «GoCardless rejected the request.» e, sotto, il messaggio di GoCardless con il reason e il request_id tra parentesi quadre.
Dalla versione 1.1.5, un rimborso in errore non mostra il pulsante «Retry collection»: un rimborso non è un incasso.

Cosa fare
- Apri la transazione dell'incasso dalla fattura, con il pulsante «Transazione di pagamento» in alto; il menu delle transazioni compare solo in modalità sviluppatore, e in Odoo 20 non esiste. Da lì, il pulsante dei rimborsi porta alla transazione del rimborso e al suo messaggio.
- Con
total_amount_confirmation_invalid, controlla nella Dashboard di GoCardless i rimborsi di quel pagamento. Se ce n'è uno eseguito fuori da Odoo, il denaro è già tornato al cliente: non restituirlo di nuovo da Odoo. - Con
number_of_refunds_exceeded, quel pagamento non accetta più rimborsi in GoCardless. Se devi ancora restituire qualcosa, dovrà passare da un'altra via. - Per non arrivare al limite, raggruppa in un unico rimborso quanto da restituire su uno stesso incasso.
- Se ti serve GoCardless, conserva il
request_iddel messaggio: la loro documentazione chiede di includerlo quando si contatta il supporto.
Perché Odoo non vede i rimborsi fatti per altra via?
GoCardless segnala via webhook ogni rimborso creato, ma il connettore applica questi avvisi solo ai rimborsi presenti in Odoo: uno creato per altra via non ha una transazione e non entra nella cifra.
Posso restituire solo una parte di un incasso?
Sì. Il connettore consente rimborsi parziali, fino al limite di 5 per pagamento fissato da GoCardless; ciascuno porta nella sua cifra di controllo quelli precedenti.
Con il nostro connettore
In Odoo 17, 18, 19 e 20 il connettore invia in ogni rimborso il totale di quanto rimborsato su quell'incasso, inclusi quelli in corso, così che GoCardless blocchi un rimborso doppio invece di pagarlo, e lascia il rifiuto nella transazione con il suo request_id.
Continua a leggere
Verificato nel codice del connettore (versione 17.0, 18.0, 19.0 e 20.0) e nelle fonti collegate
Fonti
- docs.gocardless.com/docs/api-reference/responses-and-errors
- docs.gocardless.com/docs/api-reference/refund
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 550 in 17.0 (d203ee6), riga 550 in 18.0 (e2ab18b), riga 549 in 19.0 (ce7f5a3) e riga 568 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 389 in 17.0 (d203ee6), riga 389 in 18.0 (e2ab18b), riga 388 in 19.0 (ce7f5a3) e riga 403 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 383 in 17.0 (d203ee6), riga 383 in 18.0 (e2ab18b), riga 382 in 19.0 (ce7f5a3) e riga 397 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 256 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 397 in 17.0 (d203ee6), riga 397 in 18.0 (e2ab18b), riga 396 in 19.0 (ce7f5a3) e riga 411 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 352 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 462 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 521 in 17.0 (d203ee6), riga 521 in 18.0 (e2ab18b), riga 521 in 19.0 (ce7f5a3) e riga 523 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 424 in 17.0 (d203ee6), riga 424 in 18.0 (e2ab18b), riga 423 in 19.0 (ce7f5a3) e riga 438 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 418 in 17.0 (d203ee6), riga 418 in 18.0 (e2ab18b), riga 417 in 19.0 (ce7f5a3) e riga 432 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 63 in 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
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/it.po
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- Codice del modulo: flexigo_payment_gocardless: __manifest__.py, riga 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
