Co mówi GoCardless
| Reason | Typ | Tekst GoCardless |
|---|---|---|
mandate_not_inactive | invalid_state | „Mandate could not be reinstated” oraz „it is already active or being submitted.” |
GoCardless oddziela obie części tekstu myślnikiem. W referencji API szczegółowo to opisuje: „This will fail with a mandate_not_inactive error if the mandate is already being submitted, or is active.”. To błąd invalid_state, a przy takich błędach GoCardless zaleca poinformować użytkownika i nie ponawiać próby („invalid_state → inform the end user, do not allow retry.”).

Które mandaty można reaktywować
Reaktywacja ma więcej warunków niż sam stan:
- To funkcja z ograniczeniami: „Restricted this endpoint requires approved custom payment pages”.
- Działa tylko dla mandatu anulowanego z Dashboardu lub przez API: „A mandate can only be reinstated if it has been cancelled through the dashboard or the API.”. Mandatu anulowanego przez bank nie da się: „Any mandate that has been cancelled by the bank cannot be reinstated.”.
- Dotyczy mandatów anulowanych lub wygasłych („Reinstates a cancelled or expired mandate to the banks.”), a mandat można przedstawić ponownie do 10 razy („Mandates can be resubmitted up to 10 times.”).
Po złożeniu prośby proces przebiega jak przy zakładaniu mandatu: pojawia się resubmission_requested, a potem, jak podaje GoCardless, „so you will receive a submitted webhook, followed by a reinstated or failed webhook up to two working days later.”.
Co robi konektor w Odoo
Na karcie metody płatności klienta konektor pokazuje przycisk „Reinstate mandate (sandbox)”. Pojawia się tylko wtedy, gdy mandat pochodzi z GoCardless, dostawca nie jest w produkcji (w Odoo 17, 18 i 19 według stanu dostawcy, w Odoo 20 według pola produkcji) i „Mandate Status” ma wartość cancelled, failed lub expired.
Po kliknięciu:
- Konektor prosi GoCardless o reaktywację tego mandatu.
- Jeśli GoCardless ją przyjmie, stan przechodzi na
reinstate_requested, a na karcie klienta widać: „Reinstatement of the GoCardless mandate requested. It stays unusable until the bank confirms it.”. Metoda płatności pozostaje zarchiwizowana. - Gdy przyjdzie
reinstated, konektor uznaje mandat za ważny: reaktywuje go i zapisuje: „The GoCardless mandate is usable again (reinstated).”.
Jeśli GoCardless odpowie mandate_not_inactive, konektor tego nie przechwytuje: Odoo pokazuje „GoCardless rejected the request.” z komunikatem GoCardless, reason i request_id, a mandat zostaje bez zmian. Dzieje się tak, gdy Odoo uważa mandat za martwy, a w GoCardless jest już aktywny lub przedstawiany, bo jego zdarzenia jeszcze nie dotarły do Odoo. Po zaakceptowanej prośbie przycisk już się nie pokazuje, bo stan przechodzi na reinstate_requested.
Notatkę, że mandat znów można używać, zapisuje konektor przy przetwarzaniu zdarzenia, bez udziału człowieka. 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 mandate is usable again (reinstated).”.

Co zrobić
- Gdy pojawi się
mandate_not_inactive, znajdź mandat w Dashboardzie GoCardless. Jeśli jest aktywny lub przedstawiany, nie ma czego reaktywować: poczekaj, aż dotrą jego zdarzenia. Zadanie, które co godzinę odzyskuje zagubione zdarzenia, je przyniesie. - Jeśli mandat anulował bank, nie próbuj: GoCardless nie reaktywuje takich mandatów. Poproś klienta o nowy mandat.
- W produkcji konektor nie oferuje reaktywacji: drogą jest nowy mandat podpisany przez klienta.
- Aby to przetestować, użyj sandboxa GoCardless z dostawcą w trybie testowym.
Dlaczego przycisk pojawia się tylko poza produkcją?
Bo GoCardless ogranicza reaktywację do podmiotów z zatwierdzonymi własnymi stronami płatności, a konektor oferuje ją tylko poza produkcją.
Ile trwa, zanim mandat znów zacznie działać?
Tyle, ile trwa odpowiedź banków: według GoCardless najpierw informuje, że poproszono o reaktywację, potem, że mandat został przedstawiony, a do dwóch dni roboczych później, czy został reaktywowany, czy się nie udało. Do tego czasu konektor z niego nie korzysta.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor oferuje reaktywację mandatu anulowanego, nieudanego lub wygasłego, i to tylko poza produkcją, a nie używa go ponownie, dopóki GoCardless nie potwierdzi reaktywacji swoim zdarzeniem.
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/mandate
- docs.gocardless.com/docs/api-reference/events/mandate
- 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: views/payment_token_views.xml, wiersz 23 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: views/payment_token_views.xml, wiersz 22 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 998 w 17.0 (d203ee6), wiersz 998 w 18.0 (e2ab18b), wiersz 998 w 19.0 (ce7f5a3) i wiersz 1013 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 176 w 17.0 (d203ee6), wiersz 176 w 18.0 (e2ab18b), wiersz 176 w 19.0 (ce7f5a3) i wiersz 175 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 173 w 17.0 (d203ee6), wiersz 173 w 18.0 (e2ab18b), wiersz 173 w 19.0 (ce7f5a3) i wiersz 172 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1004 w 17.0 (d203ee6), wiersz 1004 w 18.0 (e2ab18b), wiersz 1004 w 19.0 (ce7f5a3) i wiersz 1019 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 170 w 17.0 (d203ee6), wiersz 170 w 18.0 (e2ab18b), wiersz 170 w 19.0 (ce7f5a3) i wiersz 169 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: const.py, wiersz 158 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 77 w 17.0 (d203ee6), wiersz 77 w 18.0 (e2ab18b), wiersz 77 w 19.0 (ce7f5a3) i wiersz 76 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1157 w 17.0 (d203ee6), wiersz 1157 w 18.0 (e2ab18b), wiersz 1157 w 19.0 (ce7f5a3) i wiersz 1164 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: views/payment_token_views.xml, wiersz 15 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 785 w 17.0 (d203ee6), wiersz 785 w 18.0 (e2ab18b), wiersz 785 w 19.0 (ce7f5a3) i wiersz 800 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)
- 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)
