Co mówi GoCardless
| Reason | Typ | Tekst GoCardless |
|---|---|---|
mandate_is_inactive | invalid_state | „Payment could not be created” oraz „mandate is cancelled, failed, or expired.” |
GoCardless rozdziela obie części tekstu myślnikiem. Błędy invalid_state oznaczają, według GoCardless, że dana operacja nie jest dozwolona w bieżącym stanie zasobu. Tutaj zasobem jest mandat: anulowany, nieudany lub wygasły nie dopuszcza już pobrań.

Jak dochodzi do tego błędu
Zwykle Odoo dowiaduje się, że mandat przestał działać, z wydarzenia GoCardless, zanim spróbuje pobrać płatność. Ten błąd pojawia się wtedy, gdy tak się nie stało: powiadomienie nie dotarło lub dotarło za późno, albo mandat został anulowany tuż przed pobraniem. Pobranie może pochodzić z subskrypcji, która się odnawia, albo z płatności zarejestrowanej przy zapisanej metodzie płatności klienta. Powiadomienia GoCardless przychodzą przez webhook: przy połączeniu w dwóch kliknięciach za pośrednictwem FlexigoTech Cloud, a w trybie zaawansowanym na endpoint, który sam utworzyłeś w Dashboardzie GoCardless. Jeśli ta droga zawiedzie, Odoo nie dowie się na czas.
Co robi konektor
Bez specjalnej obsługi zobaczyłbyś błąd w surowej postaci, z tekstem z API, a mandat nadal byłby proponowany przy następnej fakturze. Konektor robi co innego:
- Rozpoznaje reason
mandate_is_inactivew odpowiedzi. - Pyta GoCardless o ten mandat, aby potwierdzić jego stan.
- Jeśli jest anulowany, nieudany, wygasły, zużyty lub zablokowany, archiwizuje go w Odoo. Jeśli to pierwsza informacja o martwym mandacie, zapisuje ją w karcie klienta, z podaniem stanu mandatu w nawiasie („The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.”), i tworzy aktywność „GoCardless mandate lost”.
- Przenosi transakcję do stanu „Błąd” z własnym komunikatem, zamiast surowego błędu: „The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.”.
Jeśli mandat okaże się aktywny, konektor go nie rusza, a transakcja pokazuje błąd GoCardless: „GoCardless rejected the request.” wraz z komunikatem API i jego request_id. Tak samo obsługiwany jest przycisk ponowienia pobrania, gdy GoCardless odpowiada mandate_is_inactive.
Te teksty pojawiają się w języku osoby uruchamiającej pobranie. Jeśli uruchamia je zadanie zaplanowane, na przykład odnowienie subskrypcji, zapisują się bez nikogo przy komputerze. 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: „The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.”, „GoCardless mandate lost”, „The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.” oraz „GoCardless rejected the request.”.
Dlaczego nie warto ponawiać
GoCardless zapisuje to w opisie błędów invalid_state: należy poinformować użytkownika i nie pozwalać mu ponawiać próby. Anulowany mandat nie stanie się aktywny przez ponawianie; potrzebuje nowego podpisu klienta lub, w niektórych przypadkach i tylko przy specjalnych uprawnieniach GoCardless, reaktywacji.

Co zrobić
- Sprawdź komunikat transakcji i notatkę konektora w karcie klienta. Transakcję otwierasz z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji widoczne jest tylko w trybie deweloperskim, a w Odoo 20 nie istnieje. Oba teksty mówią, w jakim stanie jest mandat.
- Poproś klienta o nowy mandat i pobierz z jego pomocą oczekującą fakturę.
- Jeśli dzieje się to często, sprawdź, czy webhooki GoCardless docierają do Twojego Odoo: to one ostrzegają przed nadejściem pobrania. Mimo to konektor co godzinę pobiera zdarzenia, które mogły zostać zgubione.
Dlaczego konektor sprawdza mandat zamiast po prostu go archiwizować?
Bo archiwizuje tylko to, co GoCardless potwierdzi jako martwe. Jeśli zapytanie pokaże, że mandat jest aktywny, jego archiwizacja zmusiłaby klienta do niepotrzebnego podpisywania.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor zamienia błąd API w jasne zadanie: martwy mandat znika z listy metod płatności, klient zostaje powiadomiony w swojej karcie, a faktura pozostaje oczekująca, aż pojawi się działający mandat.
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 247 w 17.0 (d203ee6), wiersz 247 w 18.0 (e2ab18b), wiersz 247 w 19.0 (ce7f5a3) i wiersz 258 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 71 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 6 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/mandate
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 278 w 17.0 (d203ee6), wiersz 278 w 18.0 (e2ab18b), wiersz 278 w 19.0 (ce7f5a3) i wiersz 289 w 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: const.py, wiersz 134 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_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: 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 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: 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)
- docs.gocardless.com/docs/api-reference/events/mandate
- 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
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 321 w 17.0 (d203ee6), wiersz 321 w 18.0 (e2ab18b), wiersz 321 w 19.0 (ce7f5a3) i wiersz 332 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)
- 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)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pl.po
- 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)
- 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
