Wycena sesji
HandyCafe wykorzystuje segmentowy silnik wyceny do obliczania kosztów sesji w kafejce internetowej lub centrum gamingowym. Zamiast stosować jedną ryczałtową stawkę dla całej sesji, silnik dzieli każdą sesję na segmenty, z których każdy ma własny kontekst cenowy. Takie podejście zapewnia dokładne rozliczanie nawet gdy sesje obejmują wiele slotów czasowych, zmiany cen, pauzy lub rozłączenia.
Podstawowe pojęcia
Zanim przejdziemy do szczegółów, oto kluczowe terminy:
| Termin | Definicja |
|---|---|
| Bazowa stawka godzinowa | Cena za godzinę przed zastosowaniem jakichkolwiek mnożników. Ustawiana w Ustawieniach > Wycena. |
| Slot cenowy | Nazwany okres z określonym mnożnikiem. Jest 8 slotów, każdy oznaczony kolorem. |
| Mnożnik | Współczynnik stosowany do stawki bazowej. 1.0 = cena standardowa, 0.5 = połowa ceny, 2.0 = podwójna cena. |
| Segment | Ciągły okres w ramach sesji, w którym kontekst cenowy (slot, mnożnik, cena bazowa) pozostaje niezmieniony. |
| Rozliczenie | Końcowe obliczenie określające ile klient jest winien po zakończeniu sesji. |
Bazowa stawka godzinowa
Bazowa stawka godzinowa jest fundamentem wszystkich obliczeń cenowych. Ustawiana jest w Ustawieniach > Wycena i reprezentuje standardową cenę za godzinę korzystania z komputera.
Wszystkie wewnętrzne obliczenia używają mniejszych jednostek walutowych (na przykład grosze dla PLN). Jeśli stawka bazowa wynosi 12,00 zł za godzinę, wartość wewnętrzna to 1200. Eliminuje to błędy zaokrąglania zmiennoprzecinkowego.
Obsługa dwóch walut
HandyCafe obsługuje walutę bazową i walutę lokalną z kursem wymiany (FX). Jeśli działasz w kraju gdzie wycena międzynarodowa różni się od lokalnej:
- Waluta bazowa. Waluta używana do wewnętrznych obliczeń cenowych.
- Waluta lokalna. Waluta wyświetlana klientom i używana do płatności.
- Kurs FX. Współczynnik konwersji między walutą bazową a lokalną.
Jeśli obie waluty są takie same, kurs FX jest traktowany jako 1.0 i nie ma wpływu.
Sloty cenowe
Jest 8 oznaczonych kolorami slotów cenowych, z których każdy reprezentuje inny poziom cenowy:
| Slot | Kolor | Typowe zastosowanie |
|---|---|---|
| Niebieski | Niebieski | Stawka standardowa |
| Pomarańczowy | Pomarańczowy | Dopłata wieczorna lub weekendowa |
| Czerwony | Czerwony | Premia za godziny szczytu |
| Zielony | Zielony | Zniżka poza szczytem |
| Morski | Morski | Stawka studencka lub członkowska |
| Szary | Szary | Wycena świąteczna lub specjalna |
| Cyan | Cyan | Stawka nocna |
| Szmaragdowy | Szmaragdowy | Stawka promocyjna |
Każdy slot ma trzy właściwości:
- Nazwa. Opisowa etykieta (na przykład "Godziny szczytu" lub "Zniżka nocna").
- Mnożnik. Wartość dziesiętna modyfikująca stawkę bazową. Typowe wartości to 1.0 (standardowa), 0.5 (połowa ceny), 1.5 (50% dopłaty), 2.0 (podwójna cena). Mnożnik musi być zerowy lub dodatni.
- Dane harmonogramu. Wewnętrzna reprezentacja definiująca w jakich godzinach jakich dni slot obowiązuje. Zarządzane automatycznie przez siatkę harmonogramu.
Sloty mogą być indywidualnie włączane lub wyłączane. Wyłączone sloty są ignorowane przez silnik wyceny.
Siatka harmonogramu
Harmonogram cenowy to macierz 7 dni na 24 godziny (łącznie 168 jednogodzinnych bloków). Każdy blok jest przypisany do jednego slotu cenowego. Harmonogram określa który mnożnik obowiązuje w danym momencie.
Siatkę konfiguruje się w Ustawieniach > Harmonogram wyceny. Dni biegną od poniedziałku do niedzieli, a godziny od 00:00 do 23:00. Aby przypisać slot do bloku czasowego, zaznacz blok w siatce i wybierz pożądany kolor slotu.
Jak silnik odczytuje harmonogram
Wewnętrznie każdy blok godzinowy mapuje się na pozycję w danych harmonogramu. Silnik sprawdza dane harmonogramu każdego włączonego slotu, aby określić który slot jest aktywny dla danego dnia i godziny.
Jeśli żaden slot nie ma ustawionego bitu dla danej godziny, silnik stosuje stawkę bazową z mnożnikiem 1.0.
Gdy funkcja harmonogramu cenowego jest całkowicie wyłączona (w Ustawieniach > Wycena), wszystkie sesje używają stawki bazowej z mnożnikiem 1.0 niezależnie od czasu.
Segmenty cenowe
Segment to ciągły okres w ramach sesji, w którym kontekst cenowy nie zmienia się. Silnik wyceny tworzy nowy segment za każdym razem gdy wystąpi jedno z tych zdarzeń granicznych:
| Granica | Wyzwalacz |
|---|---|
| session_start | Rozpoczyna się nowa sesja |
| session_stop | Sesja zostaje zatrzymana |
| pause | Kasjer wstrzymuje sesję |
| resume | Kasjer wznawia wstrzymaną sesję |
| tick | Zegar przekracza granicę godziny i wchodzi w inny slot cenowy |
| disconnect | Komputer kliencki traci połączenie sieciowe |
| offline | Komputer kliencki przechodzi w tryb offline |
| load_recovery | Serwer restartuje się i odzyskuje uruchomioną sesję |
Każdy segment rejestruje:
| Pole | Opis |
|---|---|
| session_id | Sesja, do której należy ten segment |
| segment_start | Znacznik czasu Unix rozpoczęcia segmentu |
| segment_end | Znacznik czasu Unix zakończenia segmentu (null jeśli wciąż otwarty) |
| pricing_slot_id | ID aktywnego slotu cenowego (na przykład "blue", "red" lub "base") |
| multiplier | Wartość mnożnika z slotu cenowego |
| base_price_snapshot | Bazowa stawka godzinowa przechwycona w momencie otwarcia segmentu |
| amount | Obliczony koszt tego segmentu (ustawiany przy zamykaniu segmentu) |
| boundary_reason | Powód utworzenia tego segmentu |
Dlaczego zrzut ceny bazowej?
base_price_snapshot przechwytuje bazową stawkę godzinową w dokładnym momencie otwarcia segmentu. Jest to krytyczne ponieważ administrator może zmienić stawkę bazową w trakcie sesji. Dzięki zrzutowi każdy segment używa stawki obowiązującej w momencie jego rozpoczęcia, zapewniając uczciwe i audytowalne rozliczenia.
Wzór kosztowy
Koszt pojedynczego segmentu jest obliczany jako:
amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )
Dokładniej silnik używa skalowanej arytmetyki całkowitoliczbowej aby uniknąć błędów zmiennoprzecinkowych:
- Mnożnik jest skalowany do liczby stałoprzecinkowej (pomnożony przez 1 000 000).
- Obliczenia są wykonywane w całości na 128-bitowych liczbach całkowitych.
- Używane jest dzielenie z zaokrągleniem w górę. Wynik jest zawsze zaokrąglany w górę do następnej mniejszej jednostki walutowej.
Obliczanie minutowe
Jeśli opcja "obliczaj minutowo" jest włączona w Ustawieniach > Wycena, wzór zmienia się nieznacznie:
amount = ceil( (base_price_snapshot * multiplier * used_minutes) / 60 )
Gdzie used_minutes = ceil(duration_seconds / 60). Oznacza to że każda niepełna minuta jest liczona jako pełna minuta.
Obliczanie sumy sesji
Łączny koszt sesji jest obliczany w trzech krokach:
Krok 1: Sumowanie wszystkich segmentów
raw_total = suma wszystkich zamkniętych kwot segmentów + częściowa kwota otwartego segmentu
Częściowa kwota otwartego segmentu jest obliczana w czasie rzeczywistym przy użyciu powyższego wzoru z bieżącym znacznikiem czasu jako końcem segmentu.
Krok 2: Zastosowanie zaokrąglenia
rounded_total = round_up(raw_total, rounding_step)
Zaokrąglenie jest zawsze w górę (sufit) w celu ochrony przychodów. Krok zaokrąglenia jest konfigurowalny w Ustawieniach > Wycena. Na przykład jeśli krok zaokrąglenia to 50 (reprezentujący 0,50 zł w walucie z 2 miejscami dziesiętnymi), surowa suma 3,27 zł zaokrągla się w górę do 3,50 zł.
Krok 3: Zastosowanie minimalnej opłaty startowej
final_total = max(rounded_total, startup_fee)
Opłata startowa to minimalna opłata za jakąkolwiek sesję, niezależnie od czasu trwania. Jeśli zaokrąglona suma jest niższa od opłaty startowej, naliczana jest opłata startowa.
Rozliczenie
Rozliczenie to proces finalizacji rachunku za sesję. Są dwa etapy rozliczenia:
Rozliczenie startowe (tylko przedpłata)
Gdy rozpoczyna się sesja przedpłacona, tworzony jest rekord rozliczenia "start". Przechwytuje on:
- Obliczony koszt. Koszt obliczony przez system za zakupiony czas.
- Kwota obciążenia. Kwota faktycznie zapłacona przez klienta (zazwyczaj taka sama jak obliczony koszt).
Dla trybu przedpłaconego "Zablokuj przy zakupie" ta zablokowana kwota określa koszt sesji niezależnie od zmian cenowych w trakcie sesji.
Rozliczenie końcowe
Gdy dowolna sesja (przedpłacona lub postpaid) jest zatrzymywana, tworzony jest rekord rozliczenia "stop":
| Pole | Opis |
|---|---|
| Obliczony koszt | Łączna kwota obliczona przez system ze wszystkich segmentów cenowych |
| Kwota obciążenia | Faktycznie naliczona kwota (domyślnie równa kosztowi obliczonemu) |
| Ręcznie skorygowana kwota | Jeśli kasjer ręcznie skorygował cenę, oryginalny obliczony koszt jest zachowany tutaj |
| Stawka prowizji | Stawka prowizji metody płatności (jako procent) |
| commission_fee | Obliczona kwota prowizji |
| fixed_fee | Stała opłata metody płatności |
| computed_timeline_snapshot | Rekord JSON każdego segmentu cenowego w sesji |
Zrzut osi czasu zapewnia pełną ścieżkę audytu pokazującą dokładnie jak obliczono koszt, segment po segmencie.
Opłaty metod płatności
Każda metoda płatności może mieć dwa typy opłat:
Prowizja (punkty bazowe)
Stawka prowizji jest wyrażona jako procent. Opłata prowizyjna jest obliczana przez zastosowanie tej stawki do kwoty obciążenia.
Przykład: Jeśli kwota obciążenia to 10,00 zł (1000 mniejszych jednostek) a metoda płatności ma stawkę prowizji 2,5%, opłata prowizyjna to 0,25 zł (25 mniejszych jednostek).
Opłata stała
Stała opłata odejmowana za transakcję, niezależnie od kwoty. Na przykład opłata za przetwarzanie karty kredytowej w wysokości 0,30 zł.
Obie opłaty mają charakter informacyjny. Reprezentują koszt dla firmy za przyjęcie danej metody płatności. Są rejestrowane w rozliczeniu, ale nie są dodawane do rachunku klienta.
VAT (podatek od towarów i usług)
VAT jest konfigurowany jako procent (0--100%) w Ustawieniach > Wycena. Stosowany jest do obliczonej kwoty sesji:
VAT = kwota obciążenia x (stawka VAT / 100)
Kwota VAT jest wyświetlana osobno w oknie płatności, aby kasjer mógł zobaczyć rozbicie podatkowe.
Tryby wyceny przedpłaconej
Jak opisano w Zarządzaniu sesami, sesje przedpłacone obsługują dwa tryby wyceny:
Zablokuj przy zakupie
Gdy sesja przedpłacona się rozpoczyna, rozliczenie "start" blokuje naliczoną kwotę. Przez czas trwania sesji:
- Czas zakończenia sesji jest ustalony na podstawie zakupionych minut.
- Nawet jeśli harmonogram cenowy się zmieni, sesja trwa do wygaśnięcia zablokowanego czasu.
- Rozliczenie końcowe używa zablokowanej kwoty z rozliczenia startowego.
Harmonogram na żywo
Pozostały czas sesji jest przeliczany ciągle wraz ze zmianą slotów cenowych:
- Jeśli sesja wchodzi w tańszy slot, pozostały czas się wydłuża (klient dostaje więcej minut za swoje pieniądze).
- Jeśli sesja wchodzi w droższy slot, pozostały czas się skraca.
- Rozliczenie końcowe odzwierciedla faktycznie zastosowaną wycenę w trakcie całej sesji.
Miejsca dziesiętne
Liczba miejsc po przecinku używana do wyświetlania walut jest konfigurowalna (2--4 miejsca dziesiętne). Wpływa to na sposób wyświetlania kwot w interfejsie, ale nie zmienia wewnętrznych obliczeń w mniejszych jednostkach walutowych.
Przykład: Przy 2 miejscach dziesiętnych 3,50 zł jest wyświetlane jako "3,50". Przy 3 miejscach dziesiętnych wyświetlałoby się jako "3,500".
Praktyczne przykłady
Przykład 1: Prosta sesja postpaid
- Stawka bazowa: 12,00 zł/godz. (1200 mniejszych jednostek)
- Harmonogram: Slot standardowy (mnożnik 1.0) cały dzień
- Sesja: 10:00 do 11:30 (90 minut)
- Opłata startowa: 2,00 zł
Obliczenie:
Segment 1: (1200 * 1.0 * 5400) / 3600 = 1800 mniejszych jednostek (18,00 zł)
Suma: max(18,00 zł, 2,00 zł) = 18,00 zł
Przykład 2: Sesja obejmująca dwa sloty
- Stawka bazowa: 16,00 zł/godz. (1600 mniejszych jednostek)
- Harmonogram: Standardowy (1.0) od 10:00-12:00, Happy Hour (0.5) od 12:00-14:00
- Sesja: 11:00 do 13:00 (120 minut)
- Opłata startowa: 4,00 zł
Obliczenie:
Segment 1 (11:00-12:00, standardowy): (1600 * 1.0 * 3600) / 3600 = 1600 (16,00 zł)
Segment 2 (12:00-13:00, happy hour): (1600 * 0.5 * 3600) / 3600 = 800 (8,00 zł)
Suma: 16,00 zł + 8,00 zł = 24,00 zł
Końcowa: max(24,00 zł, 4,00 zł) = 24,00 zł
Przykład 3: Sesja z pauzą
- Stawka bazowa: 8,00 zł/godz. (800 mniejszych jednostek)
- Harmonogram: Slot standardowy (mnożnik 1.0) cały dzień
- Sesja: Start 10:00, Pauza 10:30, Wznowienie 11:00, Stop 11:45
- Opłata startowa: 2,00 zł
Obliczenie:
Segment 1 (10:00-10:30, aktywny): (800 * 1.0 * 1800) / 3600 = 400 (4,00 zł)
Okres pauzy (10:30-11:00): brak opłat
Segment 2 (11:00-11:45, aktywny): (800 * 1.0 * 2700) / 3600 = 600 (6,00 zł)
Suma: 4,00 zł + 6,00 zł = 10,00 zł
Końcowa: max(10,00 zł, 2,00 zł) = 10,00 zł
Następne kroki
- Zarządzanie sesjami: Poznaj pełny cykl życia sesji
- Ustawienia: Wycena: Skonfiguruj stawkę bazową, zaokrąglanie i opłatę startową
- Ustawienia: Harmonogram wyceny: Skonfiguruj siatkę 7x24
- Metody płatności: Skonfiguruj metody płatności z prowizją i opłatami