Skip to main content

Doładowanie portfela z dokumentem

Klient z włączonym rozliczeniem zaległością może doładować portfel — online sam, albo gotówką i kartą przy ladzie. Do każdej wpłaty powstaje dokument: faktura albo paragon, z pozycją wybraną z listy przygotowanej przez recepcję.

Doładowanie jest drugą połową kredytu na portfelu: zaległość robi saldo ujemne, a doładowanie je zeruje.

👤 Instrukcja dla pracownika

Przygotowanie listy usług

Ścieżka: Dashboard ➔ Klienci ➔ (klient) ➔ Edycja ➔ Ustawienia ➔ Zaległość

Usługi są w sekcji Zaległość, pod przełącznikiem „Zezwól na rozliczenie zaległością" — pojawiają się dopiero po jego włączeniu, bo doładowanie istnieje po to, żeby uregulować zaległość. Dodaj pozycje: nazwa (wolny tekst) plus stawka VAT (8%, 23%, 0% albo zwolniona). Kolejność na liście jest kolejnością na rozwijanej liście u klienta.

Limit zaległości, przełącznik doładowania i usługi zapisuje jeden przycisk „Zapisz zaległość".

Kto może doładować

Przełącznik „Klient może doładować portfel sam" (domyślnie włączony) rozdziela dwie rzeczy:

  • włączony — klient widzi „Doładuj portfel" w aplikacji i płaci online przez Przelewy24; recepcja też może przyjąć wpłatę przy ladzie,
  • wyłączony — przycisk znika klientowi z aplikacji, a wpłatę przyjmuje wyłącznie recepcja. Dokument powstaje tak samo.

Sprawdzenie jest po stronie serwera, nie tylko w UI: próba założenia doładowania przez samego klienta przy wyłączonym przełączniku wraca błędem TOPUP_SELF_SERVICE_DISABLED.

Bez ani jednej usługi doładowanie nie jest dla klienta dostępne — przycisk nie pojawia się ani u niego, ani na jego profilu. Dokument musi mieć co wpisać w pozycji.

Usunięcie usługi z listy nie kasuje jej z bazy, tylko archiwizuje — dokumenty już wystawione zachowują swoją nazwę i stawkę.

Doładowanie przy ladzie

Ścieżka: Dashboard ➔ Klienci ➔ (klient) ➔ profil ➔ Doładuj portfel

Wybierz usługę, wpisz kwotę (albo kliknij jedną z szybkich: 200 / 500 / 1000 / 2000 zł) i przyjmij Gotówkę lub Kartę. Maksimum to 5000 zł na jedno doładowanie — saldo portfela samo nie ma górnego limitu.

Po zatwierdzeniu: portfel rośnie, wpłata trafia do raportu kasowego lokalizacji, a dokument idzie do klienta.

Doładowanie przez klienta

Ścieżka (klient): Płatności ➔ Doładuj portfel

Ta sama lista usług i te same kwoty, tylko płatność idzie przez Przelewy24. Portfel rośnie dopiero po potwierdzeniu wpłaty przez Przelewy24, nie w chwili kliknięcia — porzucony koszyk zostawia po sobie tylko nieopłaconą płatność.

Faktura czy paragon

Decyduje ustawienie faktur na koncie klienta, dokładnie tak jak przy każdej innej jego płatności. Dialog pokazuje, co powstanie, jeszcze przed wpłatą. Zmiana jest w Edycja ➔ Faktury.

Nie ma osobnego przełącznika „faktura/paragon" per doładowanie — jedno ustawienie oznacza, że klient nie dostanie faktury za zajęcia i paragonu za doładowanie tego samego dnia.

🛠️ Dokumentacja techniczna

Model danych

Migracja 0263_wallet_topup_services.sql:

  • client_wallet_topup_service — pozycje per klient (name, vat_rate, sort_order, archived),
  • client_settings.allow_self_topup (migracja 0264) — czy klient może doładować sam; domyślnie 1, bo każdy klient z włączoną zaległością mógł to robić wcześniej,
  • payment.topup_service_name i payment.topup_vat_rate — nazwa i stawka zamrożone na płatności w chwili jej utworzenia.

Zamrożenie jest celowe: lista usług jest edytowalna, a dokument już wystawiony musi zachować brzmienie i stawkę, z jakimi wyszedł. Kolumny siedzą na payment, a nie w tabeli obok, żeby generowanie dokumentu zostało jednym zapytaniem.

Dlaczego doładowanie to zwykły payment

Doładowanie zapisuje się jako payment z payment_type = 'wallet_topup'. Dzięki temu trzy rzeczy działają bez nowego kodu:

EfektSkąd wynika
Wpłata gotówką wchodzi do utargugetCashBalance liczy paid_cash / paid_card niezależnie od typu płatności
Dokument powstaje samprocessPaymentStatusChange obsługuje każdą płatność w statusie paid_*
Płatność online przechodzi normalną ścieżką/api/payments/initialize operuje na identyfikatorach płatności, bez wiedzy o typie

Przepływ

Idempotencja po stronie webhooka

Przelewy24 ponawia powiadomienie, a ponowienie nie może doładować portfela drugi raz. completeWalletTopup sprawdza, czy istnieje już wallet_transaction typu credit wskazująca na tę płatność, i jeśli tak — kończy z alreadyCredited: true, nie dotykając salda. Dokument też nie jest wtedy wystawiany po raz drugi.

VAT na pozycji

calculateNetFromGross(gross, tax) przelicza brutto na netto stawką pozycji, a nie zaszytymi 8%. Domyślnie zostaje klubowe 8% (usługi sportowe), pozycja zwolniona (zw) ma netto równe brutto, a doładowanie bierze stawkę z wybranej usługi. Zmiana jest zgodna wstecz — wszystkie dotychczasowe wywołania nie podają stawki i dostają 8%.

Ograniczenia

  • Wygenerowanie dokumentu jest nieblokujące: pieniądze są już w kasie i na portfelu, więc awaria Fakturowni nie może tego wycofać. Błąd trafia do logów i do raportu brakujących dokumentów.
  • Zwrot niewykorzystanych środków z portfela nie jest objęty tą funkcją — admin koryguje saldo ręcznie w EditWalletDialog.
  • Doładowanie online jest liczone jako wpływ w chwili potwierdzenia przez Przelewy24; usługa, którą finansuje, mogła być wykonana wcześniej (patrz uwaga księgowa w rozliczeniu zaległością).

Testy

  • __tests__/lib/wallet-topup.test.ts — limity kwoty (0, 5000, powyżej, grosze) oraz nazwa pozycji na dokumencie dla wallet_topup i brak wpływu na pozostałe typy.