Co mówi GoCardless
| Zdarzenie | Przyczyna | Kody | Tekst GoCardless |
|---|---|---|---|
| payments · failed | direct_debit_not_enabled | AG01, AC06 | The bank account for this payment does not support SEPA Direct Debit. The mandate will also be cancelled. |
| payments · failed | account_blocked_for_any_financial_transaction | AC06 | This payment failed because the payer's account was blocked. |
| mandates · cancelled | direct_debit_not_enabled | AG01, AC06 | The bank account for this mandate does not support SEPA direct debit. Any subscriptions and pending payments will also be cancelled. |
| mandates · cancelled | account_blocked_for_any_financial_transaction | AC06 | The bank account for this mandate was blocked. Any subscriptions and pending payments will also be cancelled. |
Obie przyczyny pojawiają się także w payments · cancelled: tam trafiają pobrania, które wciąż czekały na przedstawienie z tym mandatem i które GoCardless anuluje razem z nim.

Skąd się to bierze
Tu nie zawodzi podpis, zawodzi konto. Mandat istnieje, ale gdy GoCardless przedstawia polecenie zapłaty, bank klienta odpowiada, że na tym koncie nie przyjmuje się poleceń zapłaty SEPA albo że jest ono zablokowane. Dlatego te zdarzenia mają pochodzenie bank: decyduje o nich bank płatnika.
direct_debit_not_enabled pociąga za sobą mandat. GoCardless go anuluje, a razem z nim upadają subskrypcje i oczekujące pobrania. Przy account_blocked_for_any_financial_transaction konto jest zablokowane; gdy GoCardless z tego powodu anuluje także mandat, komunikuje to we własnym zdarzeniu, z tą samą przyczyną.
Co robi Odoo przy każdym zdarzeniu
| Zdarzenie, które przychodzi | Co robi konektor |
|---|---|
| payments · failed | Transakcja przechodzi w stan „Błąd” z komunikatem „GoCardless could not collect this payment (direct_debit_not_enabled).” albo z przyczyną zablokowanego konta. Jeśli to pobranie zdążyło już opłacić fakturę, anuluje płatność, a faktura znów czeka na zapłatę. |
| payments · cancelled | To samo co przy nieudanej płatności. |
| mandates · cancelled | Archiwizuje metodę płatności, zapisuje w karcie klienta, że ten mandat już nie działa, i tworzy aktywność „GoCardless mandate lost”. |
Uwaga na kolejność: zdarzenie płatności nie wycofuje mandatu, bo te przyczyny nie należą do czterech, przy których konektor archiwizuje mandat po otrzymaniu płatności. Robi to zdarzenie mandatu. A jeśli nie dotrze przez webhook, zbierze je cogodzinne zadanie, które szuka utraconych zdarzeń.
Dwa teksty przytoczone w tabeli powstają ze zdarzenia, nie z kliknięcia. 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 (direct_debit_not_enabled).” i „GoCardless mandate lost”.
Nie ma też co czekać na Success+: jego przewodnik mówi, że ponawia tylko płatności, które nie powiodły się z powodu braku środków. Konektor i tak przy każdej porażce sprawdza pole will_attempt_retry zdarzenia, a jeśli nie ma wartości true, zostawia transakcję w stanie błędu.
A przycisk ponowienia
Aby zobaczyć komunikat, wejdź w fakturę i kliknij u góry „Transakcja płatnicza”. Menu transakcji pojawia się tylko w trybie programisty, a w Odoo 20 już go nie ma.
Przy nieudanej płatności, dopóki Odoo nie zarchiwizuje mandatu, ta transakcja oferuje „Retry collection”; przy anulowanej nie. Niewiele to daje: GoCardless ponawia tylko płatności, których mandat jest wciąż aktywny, a przy direct_debit_not_enabled właśnie go anulował. Jeśli odpowiedzią jest retry_failed lub mandate_is_inactive, konektor pyta o mandat, archiwizuje go, jeśli jest martwy, i zapisuje to w transakcji: „The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.”. Od tej chwili przycisk znika.

Co zrobić
- Porozmawiaj z klientem. Jeśli konto nie obsługuje poleceń zapłaty, potrzebujesz innego, które je obsługuje; jeśli jest zablokowane (AC06), najpierw musi to rozwiązać ze swoim bankiem.
- Gdy konto jest w porządku, klient podpisuje nowy mandat, który w Odoo pojawi się jako kolejna metoda płatności.
- Pobierz ponownie tą metodą otwarte faktury. Pobrania anulowane przez GoCardless nie zostaną przedstawione same z siebie.
- Jeśli potrzebujesz dokładnego kodu, poszukaj go w GoCardless, bo Odoo zapisuje tylko przyczynę: konektor nie przechowuje kodu SEPA. Ich centrum pomocy tłumaczy to tak: „You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard.”.
Dlaczego AC06 występuje przy obu przyczynach?
GoCardless używa tego samego kodu AC06 dla konta, które nie obsługuje poleceń zapłaty, i dla konta zablokowanego. W praktyce to bez różnicy: dziś to konto nie nadaje się do pobierania płatności i potrzebne jest inne albo odblokowanie przez bank.
Czy mogę reaktywować mandat?
Jeśli konto nie obsługuje poleceń zapłaty, nie ma to sensu: nadal by ich nie obsługiwało. Potrzebny jest nowy mandat z innym kontem.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 ten błąd nie pozostaje ukryty: transakcja pokazuje przyczynę od GoCardless, faktura otwiera się ponownie, jeśli była opłacona, a gdy tylko przyjdzie anulowanie mandatu, klient zostaje oznaczony, aby poprosić go o inne konto przed następną fakturą.
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
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 15 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/events/mandate
- 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 33 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 83 w 17.0 (d203ee6), wiersz 83 w 18.0 (e2ab18b), wiersz 83 w 19.0 (ce7f5a3) i wiersz 82 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 131 w 17.0 (d203ee6), wiersz 131 w 18.0 (e2ab18b), wiersz 131 w 19.0 (ce7f5a3) i wiersz 130 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 725 w 17.0 (d203ee6), wiersz 725 w 18.0 (e2ab18b), wiersz 724 w 19.0 (ce7f5a3) i wiersz 748 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: const.py, wiersz 117 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 74 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 435 w 17.0 (d203ee6), wiersz 435 w 18.0 (e2ab18b), wiersz 434 w 19.0 (ce7f5a3) i wiersz 449 w 20.0 (688d86b)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- 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 1148 w 17.0 (d203ee6), wiersz 1148 w 18.0 (e2ab18b), wiersz 1148 w 19.0 (ce7f5a3) i wiersz 1155 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 495 w 17.0 (d203ee6), wiersz 495 w 18.0 (e2ab18b), wiersz 495 w 19.0 (ce7f5a3) i wiersz 497 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: 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)
- docs.gocardless.com/docs/api-reference/payment
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 469 w 17.0 (d203ee6), wiersz 469 w 18.0 (e2ab18b), wiersz 468 w 19.0 (ce7f5a3) i wiersz 487 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1233 w 17.0 (d203ee6), wiersz 1233 w 18.0 (e2ab18b), wiersz 1233 w 19.0 (ce7f5a3) i wiersz 1240 w 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
- 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)
- Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/responses-and-errors
