HandyCafe Docs
owner

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:

  1. Nazwa. Opisowa etykieta (na przykład "Godziny szczytu" lub "Zniżka nocna").
  2. 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.
  3. 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:

  1. Mnożnik jest skalowany do liczby stałoprzecinkowej (pomnożony przez 1 000 000).
  2. Obliczenia są wykonywane w całości na 128-bitowych liczbach całkowitych.
  3. 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