Co mówi GoCardless
| Zdarzenie | Kod SEPA Core | Tekst GoCardless |
|---|---|---|
| payments · failed | AC04 | The bank account for this payment has been closed. The mandate will also be cancelled. |
| payments · failed | MD07 | This payment failed because the customer is deceased. |
| mandates · cancelled | AC04 | The bank account for this mandate has been closed. Any subscriptions and pending payment will also be cancelled. |
| mandates · cancelled | MD07 | This mandate has been cancelled because the customer is deceased. |
Przyczyna jest w każdym z czterech wierszy ta sama, bank_account_closed; kod wskazuje powód. Zwróć uwagę na trzeci wiersz: oprócz mandatu GoCardless anuluje też oczekujące płatności z tego mandatu, które dotrą do Ciebie jako płatności anulowane z tą samą przyczyną.

Dwa zdarzenia dla tego samego faktu
Zamknięcie konta trafia do Odoo dwa razy: z nieudaną płatnością i z anulowanym mandatem. Konektor obsługuje oba: pierwsze zdarzenie, które przyjdzie, archiwizuje mandat i wysyła powiadomienie, a drugie zastaje mandat już zarchiwizowany i nie powtarza powiadomienia. Jeśli któreś nie dotrze przez webhook, zadanie cykliczne, które co godzinę pyta GoCardless o zgubione zdarzenia, je odzyska, do 100 na przebieg.
Co robi konektor
- Przechodzi transakcję w stan błędu z komunikatem „GoCardless could not collect this payment (bank_account_closed).” i zapisuje przyczynę.
- Jeśli faktura była już opłacona tym poborem, anuluje płatność w Odoo i faktura wraca do stanu oczekującego.
- Archiwizuje sposób płatności klienta:
bank_account_closedto jedna z czterech przyczyn, dla których konektor uznaje mandat za martwy, obokmandate_cancelled,mandate_expirediauthorisation_disputed. - Zapisuje to w karcie klienta: „The GoCardless direct debit mandate of … is no longer usable (bank_account_closed). No further collection can be taken against it. Ask the customer to set up a new mandate.”
- Tworzy aktywność „GoCardless mandate lost”, żeby ktoś zajął się tym przed następną fakturą.
Zarchiwizowany mandat pozostaje w Odoo jako historia, ale nie jest już proponowany do poboru. Transakcję otwiera się z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji widoczne jest tylko w trybie deweloperskim, a w Odoo 20 nie istnieje.
Te trzy teksty konektor zapisuje przy stosowaniu zdarzenia, bez udziału człowieka. Są one ogólnie dostępne tylko w języku angielskim, także w polskiej instancji Odoo: konektor nie jest przetłumaczony na polski, więc wszystkie jego komunikaty i etykiety pojawiają się zawsze po angielsku. Dokładnie te trzy cytaty zapisują się w bazie danych: „GoCardless could not collect this payment (bank_account_closed).”, „The GoCardless direct debit mandate of … is no longer usable (bank_account_closed). No further collection can be taken against it. Ask the customer to set up a new mandate.” oraz „GoCardless mandate lost”.
Jak sprawdzić, czy to AC04 czy MD07
Z poziomu Odoo nie da się tego rozróżnić. Przyczyna jest ta sama, konektor zapisuje przyczynę, a nie kod SEPA, a notatka w karcie klienta i aktywność mówią to samo w obu przypadkach. Kod zobaczysz w GoCardless. Według ich centrum pomocy powód każdej porażki pojawia się w osi czasu płatności, w Dashboardzie („You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard.”). W trybie zaawansowanym dokładny kod znajduje się też w zdarzeniu (details.reason_code), a Dashboard przechowuje wysyłki webhooków z ostatnich 3 miesięcy w Developers > Webhooks, wraz z ich treścią.
Jeśli kod to MD07
MD07 nie jest problemem technicznym. Posiadacz konta zmarł i mandat zostaje anulowany. Zaległych faktur tego klienta nie uda się pobrać przez polecenie zapłaty, a sposób ich odzyskania to kwestia dla Twojego doradcy podatkowego, nie konektora. Rozsądnie jest sprawdzić zaplanowane płatności i subskrypcje tego klienta w Odoo, aby nie generowały się kolejne. Notatka w Odoo prosi o nowy mandat także w tym przypadku, bo zna tylko przyczynę: przy MD07 o nowy mandat nie proś.
Co zrobić przy AC04
- Skontaktuj się z klientem: ma nowe konto, albo je będzie mieć, i musi z nim podpisać mandat.
- Gdy podpisze, nowy mandat pojawi się w Odoo jako kolejny sposób płatności; stary pozostaje zarchiwizowany.
- Pobierz nowym mandatem zaległe faktury.

Czy mogę ponowić płatność z bank_account_closed?
Nie ma to sensu: konto nie istnieje. Ponadto konektor archiwizuje mandat, a przy zarchiwizowanym mandacie przycisk „Retry collection” nie pojawia się w transakcji.
A jeśli klient zmienił bank przez usługę przeniesienia kont?
To nie jest zamknięcie: GoCardless przekazuje to jako mandat przeniesiony, z przyczyną bank_account_transferred, a mandat pozostaje ważny.
Z naszym konektorem
Konektor GoCardless dla Odoo 17, 18, 19 i 20 robi przy bank_account_closed to, co zrobiłaby uważna osoba: oznacza pobranie jako nieudane, ponownie otwiera fakturę, wycofuje martwy mandat, żeby nikt go nie użył, i zostawia w karcie klienta ostrzeżenie z przyczyną.
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)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 442 w 17.0 (d203ee6), wiersz 442 w 18.0 (e2ab18b), wiersz 441 w 19.0 (ce7f5a3) i wiersz 456 w 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: const.py, wiersz 145 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- 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 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: 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: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/events/payment
- 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/webhooks
- 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)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
