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:
- Nume. O etichetă descriptivă (de exemplu, "Ore de vârf" sau "Reducere de noapte").
- 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.
- 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ă:
- Multiplicatorul este scalat la un întreg în virgulă fixă (înmulțit cu 1.000.000).
- Calculul este efectuat integral pe numere întregi de 128 biți.
- 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
- Gestionarea sesiunilor: Aflați ciclul complet al sesiunii
- Setări: Tarifare: Configurați tariful de bază, rotunjirea și taxa de pornire
- Setări: Program tarifare: Configurați grila de program 7x24
- Metode de plată: Configurați metodele de plată cu comision și taxe