Co mówi GoCardless
| Miejsce | Reason lub przyczyna | Tekst GoCardless |
|---|---|---|
API, przy tworzeniu obciążenia (invalid_state) | mandate_replaced | Mandate has been replaced. Check links[new_mandate] in the error or on the mandate itself. |
| mandates · replaced | scheme_identifier_changed | The creditor has changed to a different scheme identifier, so this mandate has been cancelled and replaced by a new one. |
Dokumentacja zdarzeń wyjaśnia to tak: „The mandate has been cancelled and replaced by a new mandate (for example, because the creditor has moved to a new Service User Number).”. A zdarzenie zawiera: „The event will include links[new_mandate] with the ID of the new mandate.”.
mandate_replaced to błąd invalid_state: operacja nie jest dozwolona w bieżącym stanie zasobu. Przy takich błędach GoCardless zaleca poinformować użytkownika i nie ponawiać próby („invalid_state → inform the end user, do not allow retry.”).

Kiedy się pojawia
Zmiany nie powoduje klient ani jego bank: zdarzenie replaced ma źródło gocardless, a udokumentowaną przyczyną jest to, że wierzyciel, czyli konto, przez które pobierasz płatności w GoCardless, przeszedł na inny identyfikator schematu. GoCardless anuluje stary mandat i tworzy nowy w jego miejsce.
mandate_replaced pojawia się tylko wtedy, gdy Odoo próbuje obciążyć stary mandat: przy odnawianiu subskrypcji albo przy płatności zarejestrowanej zapisaną metodą płatności klienta, zanim Odoo zastosuje zdarzenie.
Co robi Odoo z konektorem
Po zdarzeniu replaced:
- Pobiera nowy mandat z
links.new_mandate. - Przypisuje do tego mandatu zapisaną metodę płatności klienta i uznaje ją za poprawną, zamiast uznać ją za utraconą. Jeśli metoda była zarchiwizowana, zostaje reaktywowana; w Odoo 17 nie można odarchiwizować metody płatności, więc wtedy konektor tworzy nową dla nowego mandatu.
- Zapisuje to w karcie klienta: „The GoCardless mandate is usable again (replaced).”.
Tę notatkę konektor zapisuje przy stosowaniu zdarzenia, bez udziału użytkownika. W bazie danych założonej po polsku widnieje ona w tym samym języku, co konektor: „The GoCardless mandate is usable again (replaced).”.
Przy mandate_replaced w obciążeniu konektor nie robi nic szczególnego: przy tworzeniu obciążenia wyodrębnia tylko mandate_is_inactive. Transakcja przechodzi w stan „Błąd” z komunikatem „GoCardless rejected the request.” i poniżej z komunikatem GoCardless z mandate_replaced oraz request_id w nawiasach kwadratowych. Nowy mandat pobiera ze zdarzenia, a nie z błędu. Ten komunikat pojawia się w języku osoby uruchamiającej obciążenie; jeśli uruchamia je zaplanowane działanie, w bazie założonej po angielsku i przełączonej potem na polski zostaje po angielsku: „GoCardless rejected the request.”.

Co zrobić
- Jeśli obciążenie zostało z błędem
mandate_replaced, otwórz transakcję z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji jest widoczne tylko w trybie deweloperskim, a w Odoo 20 nie istnieje. - Sprawdź w karcie klienta, czy jest już notatka, że mandat można ponownie użyć (replaced). Jeśli jest, metoda płatności wskazuje już nowy mandat.
- Jeśli jej nie ma, zdarzenie jeszcze nie dotarło. Zadanie, które co godzinę odzyskuje zgubione zdarzenia, je przywróci; jeśli trwa to dłużej, sprawdź, czy webhooki GoCardless docierają do Odoo.
- Gdy metoda płatności jest aktualna, ponów obciążenie faktury.
Czy trzeba prosić klienta o ponowne podpisanie?
Nie, aby dalej pobierać płatności przez konektor: nowy mandat tworzy GoCardless, a konektor przenosi na niego zapisaną metodę płatności.
Co w Odoo 17?
То samo, z jedną różnicą: jeśli stara metoda płatności była zarchiwizowana, Odoo 17 nie pozwala jej reaktywować, więc konektor tworzy nową dla nowego mandatu. W wersjach 18, 19 i 20 reaktywuje tę istniejącą.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor śledzi nowy mandat, gdy tylko GoCardless zgłosi zastąpienie: klient zachowuje swoją metodę płatności, a kolejna faktura zostaje obciążona mandatem, który GoCardless ustanowił w jego miejsce.
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/events/mandate
- Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 72 w 17.0 (d203ee6), wiersz 72 w 18.0 (e2ab18b), wiersz 72 w 19.0 (ce7f5a3) i wiersz 71 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 150 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 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: models/payment_token.py, wiersz 96 w 17.0 (d203ee6), wiersz 96 w 18.0 (e2ab18b), wiersz 96 w 19.0 (ce7f5a3) i wiersz 95 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: 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: models/payment_transaction.py, wiersz 281 w 17.0 (d203ee6), wiersz 281 w 18.0 (e2ab18b), wiersz 281 w 19.0 (ce7f5a3) i wiersz 292 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 117 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)
- 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
- Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
