Co mówi GoCardless
| Zdarzenie | Przyczyna | Kod SEPA Core | Tekst GoCardless |
|---|---|---|---|
| payments · failed | insufficient_funds | AM04 | The customer's account had insufficient funds to make this payment. |
Dokumentacja zdarzenia failed dodaje kluczowy element: GoCardless ponawia płatność samodzielnie, gdy pole will_attempt_retry zdarzenia ma wartość true („GoCardless will automatically retry the payment if event's will_attempt_retry field is true.”). Ten automatyczny ponowny obieg to Success+, a żeby z niego korzystać, trzeba go włączyć w Dashboardzie GoCardless.
Według przewodnika Success+ ponawia wyłącznie płatności nieudane z powodu braku środków. W SEPA są to dwa kody: AM04 oraz MS03, a MS03 tylko w Austrii, Belgii, Niemczech, Luksemburgu i na Słowacji. GoCardless zastrzega jednak, że jego kryteria mogą się zmieniać: miarodajne dla każdej awarii jest pole will_attempt_retry.

Dlaczego pojawia się, gdy faktura wydawała się już opłacona
Obciążenie SEPA nie rozstrzyga się od razu: według GoCardless zaksięgowanie płatności może zająć do 5 dni roboczych. Zazwyczaj bank klienta zgłasza awarię dzień roboczy po dacie obciążenia, zanim płatność przejdzie w stan confirmed. W nielicznych przypadkach zgłasza ją później, gdy płatność jest już oznaczona jako confirmed: to późna awaria (late failure), a przewodnik Success+ jako przykład podaje właśnie brak środków. Dlatego AM04 może się pojawić, gdy w Odoo pobranie było już potwierdzone, a faktura uzgodniona. Konektor to uwzględnia: jeśli pobranie, które Odoo uznało za zrealizowane, się nie udaje, anuluje swoją płatność i faktura wraca do statusu oczekującej.
Konektor GoCardless dla Odoo pobiera wyłącznie przez SEPA Core i w euro, a dla nieudanej płatności SEPA Core dokumentacja GoCardless podaje dla insufficient_funds jeden kod: AM04. W Odoo zobaczysz przyczynę, a nie kod, ponieważ konektor zapisuje przyczynę zdarzenia, a nie kod SEPA. Konektor odnotowuje też w swoim kodzie, że kombinacja insufficient_funds z AM04 to ta, którą zaobserwowano w rzeczywistych płatnościach SEPA w sandboksie GoCardless.
Co widzisz w Odoo z konektorem
Każde pobranie wysyłane przez konektor prosi GoCardless o retry_if_possible, czyli opcję Success+. Gdy nadejdzie awaria, mogą zajść dwie sytuacje, a transakcja pokazuje, która w grupie GoCardless: „GoCardless Cause” oraz pole „Success+ Will Retry”. Transakcję otwiera się z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji jest dostępne tylko w trybie deweloperskim, a w Odoo 20 nie istnieje.
will_attempt_retry | Stan | „Wiadomość” transakcji | Przycisk „Retry collection” |
|---|---|---|---|
| true | „Oczekujące” | „GoCardless could not collect this payment (insufficient_funds). Success+ will retry it automatically; there is nothing to do.” | Nie pojawia się |
| false | „Błąd”, a faktura wraca do statusu oczekującej | „GoCardless could not collect this payment (insufficient_funds).” oraz, jeśli GoCardless poda powód, „It will not be retried automatically (…).” | Pojawia się, jeśli zostały próby i mandat jest aktywny |
Te komunikaty zapisuje konektor podczas stosowania zdarzenia, bez udziału użytkownika. 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 collect this payment (insufficient_funds). Success+ will retry it automatically; there is nothing to do.”, „GoCardless could not collect this payment (insufficient_funds).” oraz „It will not be retried automatically (…).”.
Transakcja celowo pozostaje oczekująca, gdy Success+ będzie ponawiać próbę: pieniądze mogą jeszcze wpłynąć, a stan błędu sugerowałby, że pobranie przepadło. Za każdym razem, gdy GoCardless ponownie przedstawia pobranie, wysyła zdarzenie resubmission_requested, a konektor zwiększa licznik „GoCardless Retries”, niezależnie od tego, czy ponowienie wykonało Success+, czy zleciłeś je Ty.
Co zrobić
- Otwórz transakcję z faktury i sprawdź „GoCardless Cause” oraz „Success+ Will Retry”.
- Jeśli Success+ ponowi próbę, nic nie rób: przycisk ponowienia w ogóle się nie pojawia. GoCardless prosi, by w tym czasie nie pobierać od klienta należności innym sposobem, bo mógłby zapłacić dwukrotnie.
- Jeśli nie ponowi, porozmawiaj najpierw z klientem, kiedy będzie miał środki, i naciśnij „Retry collection”, gdy to potwierdzi. Przycisk nie wybiera daty: nową datę obciążenia ustala GoCardless, a transakcja przechodzi w stan „Retry requested. GoCardless will confirm the new charge date.”.
- Pilnuj liczby prób: GoCardless dopuszcza co najwyżej 3 ponowienia na płatność („Payments can be retried up to 3 times.”), a konektor wlicza też te wykonane przez Success+ w „GoCardless Retries”.
Czy AM04 anuluje mandat klienta?
Nie. Przyczyna insufficient_funds nie znajduje się wśród tych, które powodują, że konektor archiwizuje mandat: są nimi mandate_cancelled, bank_account_closed, mandate_expired i authorisation_disputed. Klient nadal ma swoją metodę płatności na następną fakturę.
Dlaczego Success+ nie ponawia wszystkich awarii?
Ponieważ jego przewodnik ogranicza to do płatności bez środków: w SEPA to AM04 oraz, tylko w pięciu krajach, MS03. Klient, który odrzuca obciążenie, lub zamknięte konto nie naprawią się przez ponowne przedstawienie polecenia. Konektor nie podejmuje tej decyzji: kieruje się polem will_attempt_retry każdej awarii.

Z naszym konektorem
Konektor GoCardless dla Odoo 17, 18, 19 i 20 przekłada zdarzenie na coś, czym można zarządzać z poziomu faktury: pozostawia transakcję oczekującą, gdy pracuje Success+, przenosi ją w stan błędu i ponownie otwiera fakturę, gdy ponowienia już nie będzie, a także liczy próby, by nie oferować ponowienia, które nie ma sensu. Nie może natomiast wpłacić pieniędzy na konto klienta: jeśli AM04 się powtarza, rozmowa z klientem jest tym, co rozwiązuje pobranie.
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/events/payment
- docs.gocardless.com/docs/api-reference/payment
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 15 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 76 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 71 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 260 w 17.0 (d203ee6), wiersz 260 w 18.0 (e2ab18b), wiersz 260 w 19.0 (ce7f5a3) i wiersz 271 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 729 w 17.0 (d203ee6), wiersz 729 w 18.0 (e2ab18b), wiersz 728 w 19.0 (ce7f5a3) i wiersz 752 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 746 w 17.0 (d203ee6), wiersz 746 w 18.0 (e2ab18b), wiersz 745 w 19.0 (ce7f5a3) i wiersz 769 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 732 w 17.0 (d203ee6), wiersz 732 w 18.0 (e2ab18b), wiersz 731 w 19.0 (ce7f5a3) i wiersz 755 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 754 w 17.0 (d203ee6), wiersz 754 w 18.0 (e2ab18b), wiersz 753 w 19.0 (ce7f5a3) i wiersz 777 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 680 w 17.0 (d203ee6), wiersz 680 w 18.0 (e2ab18b), wiersz 679 w 19.0 (ce7f5a3) i wiersz 703 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 430 w 17.0 (d203ee6), wiersz 430 w 18.0 (e2ab18b), wiersz 429 w 19.0 (ce7f5a3) i wiersz 444 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 122 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 119 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 461 w 17.0 (d203ee6), wiersz 461 w 18.0 (e2ab18b), wiersz 460 w 19.0 (ce7f5a3) i wiersz 479 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 484 w 17.0 (d203ee6), wiersz 484 w 18.0 (e2ab18b), wiersz 483 w 19.0 (ce7f5a3) i wiersz 502 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: views/payment_transaction_views.xml, wiersz 13 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 63 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 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: views/payment_transaction_views.xml, wiersz 22 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: views/payment_transaction_views.xml, wiersz 27 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: views/payment_transaction_views.xml, wiersz 28 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pl.po
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 436 w 17.0 (d203ee6), wiersz 436 w 18.0 (e2ab18b), wiersz 436 w 19.0 (ce7f5a3) i wiersz 438 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1083 w 17.0 (d203ee6), wiersz 1083 w 18.0 (e2ab18b), wiersz 1083 w 19.0 (ce7f5a3) i wiersz 1090 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 703 w 17.0 (d203ee6), wiersz 703 w 18.0 (e2ab18b), wiersz 703 w 19.0 (ce7f5a3) i wiersz 710 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 356 w 17.0 (d203ee6), wiersz 356 w 18.0 (e2ab18b), wiersz 356 w 19.0 (ce7f5a3) i wiersz 358 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1063 w 17.0 (d203ee6), wiersz 1063 w 18.0 (e2ab18b), wiersz 1063 w 19.0 (ce7f5a3) i wiersz 1070 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 408 w 17.0 (d203ee6), wiersz 408 w 18.0 (e2ab18b), wiersz 408 w 19.0 (ce7f5a3) i wiersz 410 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1016 w 17.0 (d203ee6), wiersz 1016 w 18.0 (e2ab18b), wiersz 1016 w 19.0 (ce7f5a3) i wiersz 1031 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1022 w 17.0 (d203ee6), wiersz 1022 w 18.0 (e2ab18b), wiersz 1022 w 19.0 (ce7f5a3) i wiersz 1037 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- support.gocardless.com/hc/en-gb/articles/360001467265
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 66 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
