Co mówi GoCardless
| Reason | Typ | Tekst GoCardless |
|---|---|---|
refund_payment_invalid_state | invalid_state | Payment must be confirmed or paid_out before it can be refunded. |
W dokumentacji zwrotów GoCardless podaje termin: „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.”. Ten okres można wyłączyć: „The safer refund period can be disabled by contacting GoCardless.”. I przypomina, po co istnieje: „A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank.”.
Zwroty przez API są ponadto domyślnie wyłączone: „This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard.”.

Reguły terminów w skrócie
| Dni od obciążenia | GoCardless, domyślnie | Konektor |
|---|---|---|
| Mniej niż 2 | w bezpiecznym okresie: zwraca błąd | nie wysyła zwrotu |
| 2 lub więcej, ale mniej niż 7 | w bezpiecznym okresie: zwraca błąd | wysyła go i zostawia ostrzeżenie w logu serwera |
| 7 lub więcej | poza bezpiecznym okresem | wysyła go |
Obie strony nie liczą od tego samego momentu. GoCardless liczy od daty obciążenia płatności. Konektor liczy od ostatniej zmiany stanu transakcji obciążenia w Odoo. Jeśli GoCardless wyłączył bezpieczny okres, między 2 a 7 dniem zwrot może przejść.
Kiedy z konektorem pojawia się refund_payment_invalid_state
Odoo pozwala zwrócić tylko potwierdzoną transakcję, a konektor potwierdza ją, gdy GoCardless zwróci confirmed lub paid_out. Ten reason oznacza więc, że płatność zmieniła się w GoCardless, a Odoo jeszcze o tym nie wie: późną awarię, którą GoCardless może zgłosić dla już potwierdzonego obciążenia, albo zwrot od klienta, którego zdarzenie jeszcze nie dotarło.
Co robi konektor
- Przy mniej niż 2 dniach nic nie wysyła: Odoo zatrzymuje się na „GoCardless cannot refund a collection until it has settled. This one was charged … day(s) ago; refunds are possible after 2 days.”.
- W przeciwnym razie wysyła zwrot do GoCardless z kluczem idempotencji. Jeśli GoCardless go odrzuci, z tym reason, przez bezpieczny okres lub z innego powodu, transakcja zwrotu przechodzi w stan „Błąd” z komunikatem „GoCardless rejected the request.”, a pod nim komunikat GoCardless z reason i
request_id. - Jeśli zaakceptuje, transakcja zostaje w stanie „Oczekujące” z komunikatem „Refund submitted. GoCardless will deduct it from a future payout.” i przechodzi w „Potwierdzone”, gdy GoCardless wypłaci zwrot lub potrąci go z rozliczenia.
Od wersji 1.1.5 zwrot w błędzie nie pokazuje przycisku „Retry collection”: zwrot to nie obciążenie i nie ma czego GoCardless mógłby ponowić. Jeśli GoCardless nie zdoła oddać pieniędzy klientowi, konektor przenosi zwrot do błędu z komunikatem „GoCardless could not pay this refund back (…).”. Konektor nie jest przetłumaczony na polski: te teksty zawsze pojawiają się po angielsku, także w Odoo po polsku, niezależnie od tego, czy uruchamia je użytkownik, czy zaplanowane działanie: „GoCardless could not pay this refund back (…).”.

Co zrobić
- Otwórz transakcję obciążenia z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji pojawia się tylko w trybie deweloperskim i w Odoo 20 nie istnieje. Stamtąd przycisk zwrotów prowadzi do transakcji zwrotu i jej komunikatu.
- Jeśli reason to
refund_payment_invalid_state, sprawdź płatność w Dashboardzie GoCardless. Jeśli awaria była późna albo klient zwrócił płatność, nie ma czego zwracać: pieniędzy już u Ciebie nie ma. Odoo to odzwierciedli, gdy dotrze zdarzenie; zadanie odzyskujące zgubione zdarzenia co godzinę je pobiera. - Jeśli odrzucenie pochodzi z bezpiecznego okresu, poczekaj, aż upłyną 7 dni od daty obciążenia, albo poproś GoCardless o jego wyłączenie.
- Aby zwrócić ponownie, zrób to z płatności obciążenia, przyciskiem zwrotu. Konektor obsługuje zwroty częściowe.
Dlaczego konektor pozwala zwracać od 2 dni, skoro GoCardless mówi o 7?
2 dni to minimum konektora: poniżej niczego nie wysyła. GoCardless pozwala wyłączyć swój bezpieczny okres i dopóki jest włączony, to GoCardless odrzuca zwrot przed 7 dniem. Między 2 a 7 dniem konektor ostrzega w logu, bo awaria SEPA nadal może nadejść.
Czy obciążenie po zwrocie może jeszcze się nie udać?
Tak. GoCardless to zaznacza: płatność zwrócona w całości lub w części może nadal otrzymać późną awarię albo zwrot z banku klienta. Wtedy oddałbyś pieniądze, których w końcu nie zatrzymałeś.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor nie wysyła zwrotów obciążeń młodszych niż 2 dni, zostawia w błędzie z request_id te zwroty, które GoCardless odrzuci, i nie oferuje ponawiania zwrotu, który nie jest obciążeniem.
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
- support.gocardless.com/hc/en-gb/articles/360001467265
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 41 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
- 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: const.py, wiersz 106 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 361 w 17.0 (d203ee6), wiersz 361 w 18.0 (e2ab18b), wiersz 360 w 19.0 (ce7f5a3) i wiersz 375 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 365 w 17.0 (d203ee6), wiersz 365 w 18.0 (e2ab18b), wiersz 364 w 19.0 (ce7f5a3) i wiersz 379 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 414 w 17.0 (d203ee6), wiersz 414 w 18.0 (e2ab18b), wiersz 414 w 19.0 (ce7f5a3) i wiersz 416 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 371 w 17.0 (d203ee6), wiersz 371 w 18.0 (e2ab18b), wiersz 370 w 19.0 (ce7f5a3) i wiersz 385 w 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 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 413 w 17.0 (d203ee6), wiersz 413 w 18.0 (e2ab18b), wiersz 412 w 19.0 (ce7f5a3) i wiersz 427 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 605 w 17.0 (d203ee6), wiersz 605 w 18.0 (e2ab18b), wiersz 604 w 19.0 (ce7f5a3) i wiersz 625 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: i18n/flexigo_payment_gocardless.pot, wiersz 987 w 17.0 (d203ee6), wiersz 987 w 18.0 (e2ab18b), wiersz 987 w 19.0 (ce7f5a3) i wiersz 1002 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 611 w 17.0 (d203ee6), wiersz 611 w 18.0 (e2ab18b), wiersz 610 w 19.0 (ce7f5a3) i wiersz 631 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 442 w 17.0 (d203ee6), wiersz 442 w 18.0 (e2ab18b), wiersz 442 w 19.0 (ce7f5a3) i wiersz 444 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)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 117 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- 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
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
