Co mówi GoCardless
| Reason | Typ | Tekst 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. |
Dokumentacja zwrotów wyjaśnia pierwszy z nich: „total_amount_confirmation_invalid if the confirmation amount doesn't match the total amount refunded for the payment.”. Oraz po co ono jest: „This safeguard is there to prevent two processes from creating refunds without awareness of each other.”.
To pole, według GoCardless, to suma zwrotów już zapisanych przy płatności plus tworzony zwrot, w groszach. W ich przykładzie zwrot na 100 ma total_amount_confirmation równe 150: z tej płatności wcześniej zwrócono już 50.

Jak konektor liczy tę kwotę
Przy każdym zwrocie konektor sumuje zwroty tej płatności, które w Odoo są oczekujące, autoryzowane lub wykonane, i dodaje nowy. Zwroty w błędzie się nie liczą. Ta suma trafia jako total_amount_confirmation.
Liczenie także oczekujących ma znaczenie: zwrot w drodze jest już zlecony do GoCardless, więc gdyby go nie uwzględnić, kwota byłaby za niska i GoCardless odrzuciłby kolejny zwrot.
Kiedy kwota się nie zgadza
Kwota wynika z tego, co wie Odoo. Jeśli ktoś zwrócił pieniądze z tej płatności inną drogą, na przykład innym programem podłączonym do tego samego konta GoCardless, GoCardless ma to zapisane, a Odoo nie. Suma wysłana przez konektor jest wtedy za niska i GoCardless odrzuca zwrot. Dokładnie na taki przypadek działa to zabezpieczenie: gdyby zaakceptował zwrot, klient dostałby te same pieniądze dwa razy.
number_of_refunds_exceeded to coś innego: konektor pozwala na zwroty częściowe, a GoCardless przyjmuje najwyżej 5 zwrotów na płatność. Szósty zostanie odrzucony, nawet jeśli nadal pozostaje kwota do zwrotu.
Co robi Odoo z konektorem
W Odoo płatność za zlecenie zwraca się z jej poziomu, przyciskiem zwrotu, i tylko wtedy, gdy jej transakcja jest potwierdzona. Konektor wysyła zwrot z kluczem idempotentności, a jeśli GoCardless go odrzuci, transakcja zwrotu przechodzi w stan „Błąd” z komunikatem „GoCardless rejected the request.” i poniżej komunikatem GoCardless z reason oraz request_id w nawiasach kwadratowych.
Od wersji 1.1.5 zwrot w błędzie nie pokazuje przycisku „Retry collection”: zwrot to nie obciążenie.

Co zrobić
- Otwórz transakcję obciążenia z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji pojawia się tylko w trybie deweloperskim, a w Odoo 20 go nie ma. Stamtąd przycisk zwrotów prowadzi do transakcji zwrotu i jej komunikatu.
- Przy
total_amount_confirmation_invalidsprawdź w Dashboardzie GoCardless zwroty tej płatności. Jeśli któryś wykonano poza Odoo, pieniądze już wróciły do klienta: nie zwracaj ich ponownie z Odoo. - Przy
number_of_refunds_exceededta płatność nie przyjmuje w GoCardless więcej zwrotów. Jeśli nadal trzeba coś zwrócić, musi to pójść inną drogą. - Aby nie dojść do limitu, połącz w jeden zwrot wszystko, co trzeba zwrócić z tego samego obciążenia.
- Jeśli potrzebujesz GoCardless, zachowaj
request_idz komunikatu: ich dokumentacja prosi o podanie go przy kontakcie z pomocą techniczną.
Dlaczego Odoo nie widzi zwrotów wykonanych inną drogą?
GoCardless informuje webhookiem o każdym utworzonym zwrocie, ale konektor stosuje te powiadomienia tylko do zwrotów, które ma w Odoo: zwrot utworzony inną drogą nie ma transakcji i nie wchodzi do kwoty.
Czy mogę zwrócić tylko część obciążenia?
Tak. Konektor pozwala na zwroty częściowe, do limitu 5 zwrotów na płatność ustalonego przez GoCardless; każdy z nich w swojej kwocie kontrolnej uwzględnia wcześniejsze.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor wysyła przy każdym zwrocie sumę zwróconych kwot z tej płatności, łącznie z tymi w drodze, aby GoCardless zatrzymał podwójny zwrot zamiast go wykonać, a odrzucenie zostawia w transakcji wraz z jej request_id.
Czytaj dalej
Sprawdzone w kodzie źródłowym konektora (wersja 17.0, 18.0, 19.0 i 20.0) i w podlinkowanych źródłach
Źródła
- docs.gocardless.com/docs/api-reference/responses-and-errors
- docs.gocardless.com/docs/api-reference/refund
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 550 w 17.0 (d203ee6), wiersz 550 w 18.0 (e2ab18b), wiersz 549 w 19.0 (ce7f5a3) i wiersz 568 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 389 w 17.0 (d203ee6), wiersz 389 w 18.0 (e2ab18b), wiersz 388 w 19.0 (ce7f5a3) i wiersz 403 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 383 w 17.0 (d203ee6), wiersz 383 w 18.0 (e2ab18b), wiersz 382 w 19.0 (ce7f5a3) i wiersz 397 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 256 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 397 w 17.0 (d203ee6), wiersz 397 w 18.0 (e2ab18b), wiersz 396 w 19.0 (ce7f5a3) i wiersz 411 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 352 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 397 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 462 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 521 w 17.0 (d203ee6), wiersz 521 w 18.0 (e2ab18b), wiersz 521 w 19.0 (ce7f5a3) i wiersz 523 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 424 w 17.0 (d203ee6), wiersz 424 w 18.0 (e2ab18b), wiersz 423 w 19.0 (ce7f5a3) i wiersz 438 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 418 w 17.0 (d203ee6), wiersz 418 w 18.0 (e2ab18b), wiersz 417 w 19.0 (ce7f5a3) i wiersz 432 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 63 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 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/pl.po
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
