Trzy zdarzenia i cztery wiersze, ten sam kod
| Zdarzenie | Przyczyna | Tekst GoCardless |
|---|---|---|
| payments · failed | mandate_cancelled | The customer cancelled their mandate at their bank. |
| payments · charged_back | mandate_cancelled | This payment was charged back by the customer's bank, because the customer disputed authorising the transaction. |
| payments · cancelled | authorisation_disputed | This payment has been cancelled because the payer disputes authorising its mandate. |
| payments · cancelled | mandate_cancelled | This payment has been cancelled because the payer disputes authorising its mandate. |
Wszystkie cztery wiersze pochodzą z tabeli SEPA Core w dokumentacji GoCardless i mają kod MD01; płatność anulowana występuje z dwiema przyczynami i tym samym tekstem. Mandat też zostaje anulowany, a GoCardless informuje o tym osobnym zdarzeniem: „A payment under this mandate failed, indicating that the mandate has been cancelled at the customer's bank. Any subscriptions and pending payments will also be cancelled.”.

Co zmienia się w zależności od momentu
Jeśli klient anuluje mandat, zanim obciążenie zostanie zrealizowane, płatność się nie udaje: pieniądze nie wpłynęły. Jeśli kwestionuje ją po zaksięgowaniu, jest to zwrot: pieniądze wpłynęły i odchodzą. A jeśli były płatności oczekujące na wysłanie, GoCardless anuluje je przed przekazaniem. Konektor zapisuje w swoim kodzie, że zobaczył przyczynę authorisation_disputed z kodem MD01 w płatności testowej z sandboxa, jako zwrot już rozliczonej płatności.
Co Odoo robi z konektorem
Transakcję otwiera się z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji pojawia się tylko w trybie deweloperskim, a w Odoo 20 nie istnieje. We wszystkich trzech przypadkach transakcja kończy się statusem „Błąd” z widoczną przyczyną. Komunikat zależy od zdarzenia: „GoCardless could not collect this payment (mandate_cancelled).” przy nieudanej płatności oraz „GoCardless reported a chargeback for this payment (mandate_cancelled). The funds have been taken back and will be deducted from a future payout.” przy zwrocie. Jeśli Odoo miało fakturę opłaconą tym obciążeniem, konektor anuluje płatność i faktura wraca do stanu oczekującego.
Najważniejszy jest mandat. mandate_cancelled i authorisation_disputed należą do czterech przyczyn, dla których konektor uznaje go za nieważny, więc:
- archiwizuje metodę płatności klienta, która przestaje być oferowana do pobierania;
- zapisuje w jego karcie „GoCardless mandate lost”, a dokładniej: „The GoCardless direct debit mandate of … is no longer usable (mandate_cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.”;
- tworzy aktywność „GoCardless mandate lost”.
Przychodzi kilka zdarzeń z tą samą informacją, to o płatności i o mandacie, ale ostrzeżenie pojawia się tylko raz: druga wiadomość zastaje mandat już zarchiwizowany.
Wszystkie te teksty konektor zapisuje przy stosowaniu zdarzenia, bez udziału człowieka. Konektor nie jest przetłumaczony na polski, więc te komunikaty zawsze wyświetlają się po angielsku, także w Odoo po polsku: „GoCardless could not collect this payment (mandate_cancelled).”, „GoCardless reported a chargeback for this payment (mandate_cancelled). The funds have been taken back and will be deducted from a future payout.”, „The GoCardless direct debit mandate of … is no longer usable (mandate_cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.” oraz „GoCardless mandate lost”.
Co zrobić
Zanim poprosisz o nowy mandat, ustal, dlaczego go anulował. Klient, który przestał chcieć usługę, potrzebuje rezygnacji, a nie kolejnego podpisu. Jeśli to była jego pomyłka albo zmiana w banku, poproś o ponowne podpisanie i pobierz z nowym mandatem faktury, które zostały otwarte. Jeśli twierdzi, że nigdy nie autoryzował obciążenia, sprawdź, jak mandat został podpisany, zanim pobierzesz od niego kolejne płatności.
Czy warto ponowić płatność z MD01?
Nie. Mandat przestał istnieć dla jego banku, a przy zarchiwizowanym mandacie przycisk „Retry collection” nie pojawia się w transakcji. Potrzebny jest nowy mandat podpisany przez klienta.

Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor odróżnia nieudaną płatność od zwrotu, w razie potrzeby ponownie otwiera fakturę, usuwa mandat i zostawia zadanie rozmowy z klientem w jego karcie. Nie prosi natomiast sam o nowy mandat: tę rozmowę prowadzisz Ty.
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: 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 71 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 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 713 w 17.0 (d203ee6), wiersz 713 w 18.0 (e2ab18b), wiersz 712 w 19.0 (ce7f5a3) i wiersz 736 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: 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_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: 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 529 w 17.0 (d203ee6), wiersz 529 w 18.0 (e2ab18b), wiersz 529 w 19.0 (ce7f5a3) i wiersz 531 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)
- 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/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)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pl.po
- 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
