Przejdź do głównej treści
GoCardless · mandaty · replaced

GoCardless mandate_replaced: mandat ma swojego następcę

Czasem GoCardless anuluje mandat i zastępuje go nowym, na przykład gdy wierzyciel zmienia identyfikator schematu. Informuje o tym zdarzeniem replaced, które zawiera identyfikator nowego mandatu, a konektor przenosi na niego metodę płatności klienta. Jeśli Odoo spróbuje obciążyć stary mandat, zanim zdąży się o tym dowiedzieć, API odpowie mandate_replaced.

FlexigoTech · Odpowiada: Víctor Gómez · Aktualizacja: 6 listopada 2026

Najważniejsze

Wersje
Odoo 17, 18, 19 i 20
Sprawdzone
w kodzie źródłowym konektora, wersja 17.0, 18.0, 19.0 i 20.0 · w źródłach podanych na końcu
Czas czytania
3 min

Co mówi GoCardless

MiejsceReason lub przyczynaTekst GoCardless
API, przy tworzeniu obciążenia (invalid_state)mandate_replacedMandate has been replaced. Check links[new_mandate] in the error or on the mandate itself.
mandates · replacedscheme_identifier_changedThe 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.”).

Karta błędu mandate_replaced z GoCardless
Reason, jego typ invalid_state, pole links.new_mandate oraz przyczyna scheme_identifier_changed ze zdarzenia.

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:

  1. Pobiera nowy mandat z links.new_mandate.
  2. 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.
  3. 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.”.

Schemat: co GoCardless wysyła przy replaced i co Odoo robi z konektorem
Schemat przygotowany na podstawie kodu konektora (17.0, 18.0, 19.0 i 20.0) oraz dokumentacji GoCardless; przekreślone jest to, czego nie trzeba robić.

Co zrobić

  1. 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.
  2. 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.
  3. 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.
  4. 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

Błąd mandate_is_inactive w GoCardless przy tworzeniu pobrania z OdooGoCardless zwraca mandate_is_inactive przy płatności z mandatem anulowanym, nieudanym lub wygasłym. Dlaczego tak się dzieje i jak obsługuje to konektor w Odoo.GoCardless bank_account_transferred: AMEND, mandat przechodzi na inne kontoGoCardless informuje o zmianie konta klienta kodem transferred i AMEND. Co Odoo robi z konektorem i czego nie trzeba robić.GoCardless mandate_expired: mandat wygasł z powodu braku użyciaGoCardless oznacza mandat jako expired, gdy przez cały okres uśpienia nie podjęto z nim żadnej próby obciążenia. Co robi Odoo i jak dalej pobierać płatności.
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)