HandyCafe Docs
owner

Tarificarea sesiunilor

HandyCafe folosește un motor de tarificare bazat pe segmente pentru a calcula costurile sesiunilor în internet cafe-ul sau centrul de gaming. În loc să aplice un singur tarif fix pentru întreaga sesiune, motorul împarte fiecare sesiune în segmente, fiecare cu propriul context de tarifare. Această abordare asigură facturarea precisă chiar și când sesiunile trec peste mai multe intervale de timp, modificări de tarif, pauze sau deconectări.

Concepte fundamentale

Înainte de a intra în detalii, iată termenii cheie:

Termen Definiție
Tariful orar de bază Prețul pe oră înainte de aplicarea multiplicatorilor. Setat în Setări > Tarifare.
Interval de tarificare O perioadă de timp cu un multiplicator specific. Există 8 intervale, fiecare cu cod de culori.
Multiplicator Un factor aplicat tarifului de bază. 1,0 = preț standard, 0,5 = preț redus la jumătate, 2,0 = preț dublu.
Segment O perioadă continuă în cadrul unei sesiuni în care contextul de tarifare (interval, multiplicator, preț de bază) rămâne neschimbat.
Decontare Calculul final care determină cât datorează clientul la încheierea sesiunii.

Tariful orar de bază

Tariful orar de bază este fundația tuturor calculelor de tarifare. Este setat în Setări > Tarifare și reprezintă prețul standard pe oră de utilizare a PC-ului.

Toate calculele interne folosesc unități monetare minore (de exemplu, bani pentru RON, cenți pentru USD). Dacă tariful de bază este 3,00 $ pe oră, valoarea internă este 300. Aceasta elimină problemele de rotunjire în virgulă mobilă.

Suport pentru monedă duală

HandyCafe acceptă o monedă de bază și o monedă locală cu un curs de schimb (FX). Dacă operați într-o țară unde prețurile internaționale diferă de cele locale:

  • Moneda de bază. Moneda folosită pentru calculele interne de tarifare.
  • Moneda locală. Moneda afișată clienților și folosită pentru plăți.
  • Cursul FX. Factorul de conversie între moneda de bază și cea locală.

Dacă ambele monede sunt aceleași, cursul FX este tratat ca 1,0 și nu are efect.

Intervale de tarificare

Există 8 intervale de tarificare cu cod de culori, fiecare reprezentând un nivel diferit de tarifare:

Interval Culoare Utilizare tipică
Albastru Albastru Tarif standard
Portocaliu Portocaliu Suprataxă seara sau în weekend
Roșu Roșu Tarif premium ore de vârf
Verde Verde Reducere ore de gol
Teal Teal Tarif studenți sau membri
Gri Gri Tarifare de sărbători sau specială
Cyan Cyan Tarif de noapte
Smarald Smarald Tarif promoțional

Fiecare interval are trei proprietăți:

  1. Nume. O etichetă descriptivă (de exemplu, "Ore de vârf" sau "Reducere de noapte").
  2. Multiplicator. O valoare zecimală care modifică tariful de bază. Valorile comune includ 1,0 (standard), 0,5 (preț redus la jumătate), 1,5 (suprataxă de 50%), 2,0 (preț dublu). Multiplicatorul trebuie să fie zero sau pozitiv.
  3. Date de program. O reprezentare internă care definește ce ore din ce zile se aplică intervalul. Aceasta este gestionată automat prin grila de program.

Intervalele pot fi activate sau dezactivate individual. Intervalele dezactivate sunt ignorate de motorul de tarifare.

Grila de program

Programul de tarifare este o matrice de 7 zile pe 24 ore (168 de blocuri de câte o oră în total). Fiecare bloc este atribuit unui interval de tarifare. Programul determină ce multiplicator se aplică la orice moment dat.

Grila se configurează în Setări > Program tarifare. Zilele merg de luni până duminică iar orele de la 00:00 la 23:00. Pentru a atribui un interval unui bloc de timp, selectați blocul în grilă și alegeți culoarea intervalului dorit.

Cum citește motorul programul

Intern, fiecare bloc de oră se mapează la o poziție în datele de program. Motorul verifică datele de program ale fiecărui interval activat pentru a determina ce interval este activ pentru orice zi și oră dată.

Dacă niciun interval nu are bitul setat pentru o oră dată, motorul recurge la tariful de bază cu multiplicatorul 1,0.

Când funcția de program de tarifare este dezactivată complet (în Setări > Tarifare), toate sesiunile folosesc tariful de bază cu multiplicatorul 1,0 indiferent de oră.

Segmente de tarifare

Un segment este o perioadă continuă de timp în cadrul unei sesiuni în care contextul de tarifare nu se schimbă. Motorul de tarifare creează un segment nou de fiecare dată când apare unul din aceste evenimente limită:

Limită Declanșator
session_start O sesiune nouă începe
session_stop Sesiunea este oprită
pause Casierul pune sesiunea în pauză
resume Casierul reia o sesiune aflată în pauză
tick Ceasul trece de o limită de oră într-un interval de tarifare diferit
disconnect PC-ul client pierde conexiunea de rețea
offline PC-ul client trece offline
load_recovery Serverul repornește și recuperează o sesiune în desfășurare

Fiecare segment înregistrează:

Câmp Descriere
session_id Sesiunea căreia îi aparține acest segment
segment_start Marcaj temporal Unix când a început segmentul
segment_end Marcaj temporal Unix când s-a încheiat segmentul (null dacă este încă deschis)
pricing_slot_id ID-ul intervalului de tarifare activ (de exemplu, "blue", "red" sau "base")
multiplier Valoarea multiplicatorului din intervalul de tarifare
base_price_snapshot Tariful orar de bază capturat la momentul deschiderii segmentului
amount Costul calculat pentru acest segment (setat la închiderea segmentului)
motiv_limită De ce a fost creat acest segment

De ce se face instantaneu al prețului de bază?

Instantaneul base_price_snapshot capturează tariful orar de bază la momentul exact al deschiderii segmentului. Aceasta este esențial deoarece un administrator ar putea schimba tariful de bază în timpul sesiunii. Prin realizarea instantaneului, fiecare segment folosește tariful care era în vigoare la începerea sa, asigurând facturare echitabilă și auditabilă.

Formula de cost

Costul unui singur segment este calculat astfel:

amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )

Mai precis, motorul folosește aritmetică pe numere întregi scalate pentru a evita erorile de virgulă mobilă:

  1. Multiplicatorul este scalat la un întreg în virgulă fixă (înmulțit cu 1.000.000).
  2. Calculul este efectuat integral pe numere întregi de 128 biți.
  3. Se folosește împărțire cu rotunjire în sus. Rezultatul se rotunjește întotdeauna în sus la următoarea unitate minoră.

Calcul pe minute

Dacă opțiunea "calcul pe minute" este activată în Setări > Tarifare, formula se modifică ușor:

amount = ceil( (base_price_snapshot * multiplier * used_minutes) / 60 )

Unde used_minutes = ceil(duration_seconds / 60). Aceasta înseamnă că orice minut parțial este socotit ca minut întreg.

Calculul totalului sesiunii

Costul total al sesiunii este calculat în trei pași:

Pasul 1: Însumarea tuturor segmentelor

total_brut = suma tuturor sumelor segmentelor închise + suma parțială a segmentului deschis

Suma parțială a segmentului deschis este calculată în timp real folosind formula de mai sus cu marcajul temporal curent ca sfârșit de segment.

Pasul 2: Aplicarea rotunjirii

total_rotunjit = rotunjire_sus(total_brut, pas_rotunjire)

Rotunjirea merge întotdeauna în sus (plafon) pentru a proteja veniturile. Pasul de rotunjire este configurabil în Setări > Tarifare. De exemplu, dacă pasul de rotunjire este 50 (reprezentând 0,50 $ într-o monedă cu 2 zecimale), un total brut de 3,27 $ se rotunjește la 3,50 $.

Pasul 3: Aplicarea minimului taxei de pornire

total_final = max(total_rotunjit, taxa_de_pornire)

Taxa de pornire este taxa minimă pentru orice sesiune, indiferent de durată. Dacă totalul rotunjit este mai mic decât taxa de pornire, se percepe taxa de pornire.

Decontare

Decontarea este procesul de finalizare a facturării pentru o sesiune. Există două etape de decontare:

Decontare la pornire (doar prepaid)

Când începe o sesiune prepaid, se creează o înregistrare de decontare "la pornire". Aceasta capturează:

  • Costul calculat. Costul calculat de sistem pentru timpul achiziționat.
  • Suma facturată. Suma pe care clientul a plătit-o efectiv (de obicei la fel cu costul calculat).

Pentru modul prepaid "Blocare la achiziție", această sumă blocată determină costul sesiunii indiferent de modificările de tarifare în timpul sesiunii.

Decontare la oprire

Când orice sesiune (prepaid sau postpaid) este oprită, se creează o înregistrare de decontare "la oprire":

Câmp Descriere
Costul calculat Totalul calculat de sistem din toate segmentele de tarifare
Suma facturată Suma efectiv percepută (implicit costul calculat)
Suma ajustată manual Dacă casierul a ajustat manual prețul, costul calculat original este păstrat aici
Rata comisionului Rata comisionului metodei de plată (ca procent)
commission_fee Suma de comision calculată
fixed_fee Taxa fixă a metodei de plată
computed_timeline_snapshot O înregistrare JSON a fiecărui segment de tarifare din sesiune

Instantaneul cronologic oferă o pistă de audit completă care arată exact cum a fost calculat costul, segment cu segment.

Taxe metode de plată

Fiecare metodă de plată poate avea două tipuri de taxe:

Comision (procente)

Rata comisionului este exprimată ca procent. Taxa de comision este calculată aplicând această rată la suma facturată.

Exemplu: Dacă suma facturată este 10,00 $ (1000 unități minore) și metoda de plată are o rată de comision de 2,5%, taxa de comision este 0,25 $ (25 unități minore).

Taxă fixă

O taxă fixă dedusă per tranzacție, indiferent de sumă. De exemplu, o taxă de procesare card de credit de 0,30 $.

Ambele taxe sunt informative. Reprezintă costul pentru afacere al acceptării acelei metode de plată. Sunt înregistrate în decontare dar nu sunt adăugate la factura clientului.

TVA (Taxa pe Valoarea Adăugată)

TVA este configurată ca procent (0--100%) în Setări > Tarifare. Este aplicată peste suma calculată a sesiunii:

TVA = suma facturată x (rata TVA / 100)

Suma TVA este afișată separat în dialogul de plată astfel încât casierul poate vedea defalcarea taxei.

Moduri de tarifare prepaid

Așa cum este descris în Gestionarea sesiunilor, sesiunile prepaid acceptă două moduri de tarifare:

Blocare la achiziție

Când începe o sesiune prepaid, decontarea "la pornire" blochează suma facturată. Pe durata sesiunii:

  • Ora de sfârșit a sesiunii este fixată pe baza minutelor achiziționate.
  • Chiar dacă programul de tarifare se schimbă, sesiunea continuă până la expirarea timpului blocat.
  • Decontarea la oprire folosește suma blocată de la decontarea la pornire.

Program în timp real

Timpul rămas al sesiunii este recalculat continuu pe măsură ce intervalele de tarifare se schimbă:

  • Dacă sesiunea intră într-un interval mai ieftin, timpul rămas se extinde (clientul primește mai multe minute pentru banii săi).
  • Dacă sesiunea intră într-un interval mai scump, timpul rămas se contractă.
  • Decontarea la oprire reflectă tarifarea efectiv aplicată pe parcursul sesiunii.

Zecimale

Numărul de zecimale folosite pentru afișarea monedei este configurabil (2--4 zecimale). Aceasta afectează modul în care sumele sunt afișate în interfață dar nu schimbă calculele interne în unități minore.

Exemplu: Cu 2 zecimale, 3,50 $ se afișează ca "3.50". Cu 3 zecimale, s-ar afișa ca "3.500".

Exemple practice

Exemplul 1: Sesiune postpaid simplă

  • Tarif de bază: 3,00 $/oră (300 unități minore)
  • Program: Interval standard (multiplicator 1,0) toată ziua
  • Sesiune: 10:00 la 11:30 (90 minute)
  • Taxa de pornire: 0,50 $

Calcul:

Segment 1: (300 * 1,0 * 5400) / 3600 = 450 unități minore (4,50 $)
Total: max(4,50 $, 0,50 $) = 4,50 $

Exemplul 2: Sesiune pe două intervale

  • Tarif de bază: 4,00 $/oră (400 unități minore)
  • Program: Standard (1,0) de la 10:00--12:00, Happy Hour (0,5) de la 12:00--14:00
  • Sesiune: 11:00 la 13:00 (120 minute)
  • Taxa de pornire: 1,00 $

Calcul:

Segment 1 (11:00-12:00, standard): (400 * 1,0 * 3600) / 3600 = 400 (4,00 $)
Segment 2 (12:00-13:00, happy hour): (400 * 0,5 * 3600) / 3600 = 200 (2,00 $)
Total: 4,00 $ + 2,00 $ = 6,00 $
Final: max(6,00 $, 1,00 $) = 6,00 $

Exemplul 3: Sesiune cu pauză

  • Tarif de bază: 2,00 $/oră (200 unități minore)
  • Program: Interval standard (multiplicator 1,0) toată ziua
  • Sesiune: Start 10:00, Pauză 10:30, Reluare 11:00, Oprire 11:45
  • Taxa de pornire: 0,50 $

Calcul:

Segment 1 (10:00-10:30, activ): (200 * 1,0 * 1800) / 3600 = 100 (1,00 $)
Perioada de pauză (10:30-11:00): fără taxare
Segment 2 (11:00-11:45, activ): (200 * 1,0 * 2700) / 3600 = 150 (1,50 $)
Total: 1,00 $ + 1,50 $ = 2,50 $
Final: max(2,50 $, 0,50 $) = 2,50 $

Pași următori