Session Pricing
Gumagamit ang HandyCafe ng segment-based pricing engine para kalkulahin ang session cost sa iyong internet cafe o gaming center. Sa halip na mag-apply ng iisang flat rate para sa buong session, hinahati ng engine ang bawat session sa mga segment na may kanya-kanyang pricing context. Tinitiyak ng approach na ito ang tumpak na billing kahit tumawid ang sessions sa maraming time slots, pagbabago ng presyo, pauses, o disconnections.
Mga Pangunahing Konsepto
Bago sumabak sa mga detalye, narito ang mga pangunahing termino:
| Termino | Kahulugan |
|---|---|
| Base hourly rate | Ang presyo kada oras bago i-apply ang anumang multipliers. Naka-set sa Settings > Pricing. |
| Pricing slot | Isang pinangalanang time period na may partikular na multiplier. Mayroon 8 slots na color-coded. |
| Multiplier | Isang factor na inilalapat sa base rate. 1.0 = karaniwang presyo, 0.5 = kalahating presyo, 2.0 = dobleng presyo. |
| Segment | Isang tuloy-tuloy na panahon sa loob ng session kung saan ang pricing context (slot, multiplier, base price) ay hindi nagbabago. |
| Settlement | Ang huling kalkulasyon na nagtatakda kung magkano ang utang ng customer kapag nagtapos ang session. |
Base Hourly Rate
Ang base hourly rate ang pundasyon ng lahat ng pricing calculations. Naka-set ito sa Settings > Pricing at kinakatawan nito ang standard na presyo kada oras ng PC usage.
Lahat ng internal calculations ay gumagamit ng minor currency units (halimbawa, cents para sa USD, sentimo para sa PHP). Kung ang base rate mo ay $3.00 kada oras, ang internal value ay 300. Ine-eliminate nito ang floating-point rounding issues.
Dual Currency Support
Sinusuportahan ng HandyCafe ang base currency at local currency na may exchange (FX) rate. Kung nag-o-operate ka sa bansa kung saan naiiba ang international pricing sa local pricing:
- Base currency. Ang currency na ginagamit para sa internal pricing calculations.
- Local currency. Ang currency na ipinapakita sa mga customer at ginagamit para sa payments.
- FX rate. Ang conversion factor sa pagitan ng base at local currencies.
Kung pareho ang dalawang currencies, ang FX rate ay tinatrato bilang 1.0 at walang epekto.
Mga Pricing Slots
Mayroon 8 color-coded na pricing slots na kumakatawan sa iba't ibang pricing tier:
| Slot | Kulay | Karaniwang Paggamit |
|---|---|---|
| Blue | Blue | Standard rate |
| Orange | Orange | Evening o weekend surcharge |
| Red | Red | Peak hours premium |
| Green | Green | Off-peak discount |
| Teal | Teal | Rate ng mag-aaral o miyembro |
| Gray | Gray | Holiday o espesyal na pagpepresyo |
| Cyan | Cyan | Night rate |
| Emerald | Emerald | Rate ng promosyon |
Ang bawat slot ay may tatlong properties:
- Name. Isang descriptive label (halimbawa, "Peak Hours" o "Night Discount").
- Multiplier. Isang decimal value na nagmo-modify sa base rate. Mga karaniwang values ay 1.0 (standard), 0.5 (half price), 1.5 (50% surcharge), 2.0 (double price). Ang multiplier ay dapat zero o positive.
- Schedule data. Isang internal representation na nagtatakda kung aling mga oras ng aling mga araw ang naaangkop sa slot. Awtomatiko itong mina-manage sa pamamagitan ng schedule grid.
Ang mga slots ay maaaring isa-isang i-enable o i-disable. Hindi pinapansin ng pricing engine ang mga disabled slots.
Ang Schedule Grid
Ang pricing schedule ay isang 7-day by 24-hour matrix (168 one-hour blocks sa kabuuan). Ang bawat block ay naka-assign sa isang pricing slot. Tinutukoy ng schedule kung aling multiplier ang naaangkop sa anumang sandali.
Naka-configure ang grid sa Settings > Pricing Schedule. Ang mga araw ay tumatakbo mula Lunes hanggang Linggo at ang mga oras ay mula 00:00 hanggang 23:00. Para mag-assign ng slot sa isang time block, piliin ang block sa grid at piliin ang gustong slot color.
Paano Binabasa ng Engine ang Schedule
Sa internal, ang bawat hour block ay nagma-map sa isang posisyon sa schedule data. Tinitingnan ng engine ang schedule data ng bawat enabled slot para matukoy kung aling slot ang aktibo para sa anumang araw at oras.
Kung walang slot ang naka-set para sa isang partikular na oras, nag-fa-fall back ang engine sa base rate na may multiplier na 1.0.
Kapag naka-disable nang buo ang pricing schedule feature (sa Settings > Pricing), lahat ng sessions ay gumagamit ng base rate na may 1.0 multiplier anuman ang oras.
Mga Pricing Segments
Ang segment ay isang tuloy-tuloy na time period sa loob ng session kung saan hindi nagbabago ang pricing context. Lumilikha ang pricing engine ng bagong segment tuwing may nangyayaring alinman sa mga boundary events na ito:
| Boundary | Trigger |
|---|---|
| session_start | Nagsisimula ang bagong session |
| session_stop | Itinigil ang session |
| i-pause | Pini-pause ng cashier ang session |
| ipagpatuloy | Nire-resume ng cashier ang naka-pause na session |
| tick | Tumawid ang orasan sa hour boundary patungo sa ibang pricing slot |
| idiskonekta | Nawalan ng network connection ang client PC |
| offline | Nag-offline ang client PC |
| load_recovery | Nag-restart ang server at nire-recover ang tumatakbong session |
Ang bawat segment ay nagrererecord ng:
| Field | Paglalarawan |
|---|---|
| session_id | Ang session na kinabibilangan ng segment na ito |
| segment_start | Unix timestamp kung kailan nagsimula ang segment |
| segment_end | Unix timestamp kung kailan natapos ang segment (null kung bukas pa) |
| pricing_slot_id | Ang ID ng aktibong pricing slot (halimbawa, "blue", "red", o "base") |
| multiplier | Ang multiplier value mula sa pricing slot |
| base_price_snapshot | Ang base hourly rate na naka-capture sa sandaling nabuksan ang segment |
| amount | Ang calculated cost para sa segment na ito (nase-set kapag nagsara ang segment) |
| boundary_reason | Kung bakit ginawa ang segment na ito |
Bakit Nag-snapshot ng Base Price?
Ang base_price_snapshot ay kumukuha ng base hourly rate sa eksaktong sandaling nabuksan ang segment. Kritikal ito dahil maaaring baguhin ng administrator ang base rate habang tumatakbo ang session. Sa pag-snapshot, ang bawat segment ay gumagamit ng rate na naka-epekto nang nagsimula ito, na tinitiyak ang patas at auditable na billing.
Cost Formula
Ang gastos ng isang segment ay kinakalkula bilang:
amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )
Mas tiyak, gumagamit ang engine ng scaled integer arithmetic para iwasan ang floating-point errors:
- Ang multiplier ay naka-scale sa fixed-point integer (pinarami ng 1,000,000).
- Ang kalkulasyon ay ginagawa nang buo sa 128-bit integers.
- Gumagamit ng ceiling division. Palaging nag-round up ang resulta sa susunod na minor unit.
Kalkulasyon ayon sa Minuto
Kung naka-enable ang "calculate by minutes" option sa Settings > Pricing, bahagyang nagbabago ang formula:
amount = ceil( (base_price_snapshot * multiplier * used_minutes) / 60 )
Kung saan used_minutes = ceil(duration_seconds / 60). Ibig sabihin, ang anumang bahagi ng minuto ay ibinibilang bilang buong minuto.
Kalkulasyon ng Session Total
Ang kabuuang session cost ay kinakalkula sa tatlong hakbang:
Hakbang 1: I-sum ang Lahat ng Segments
raw_total = kabuuan ng lahat ng closed segment amounts + open segment partial amount
Ang open segment partial amount ay kinakalkula sa real time gamit ang formula sa itaas na ang kasalukuyang timestamp ang segment end.
Hakbang 2: I-apply ang Rounding
rounded_total = round_up(raw_total, rounding_step)
Palaging pataas ang rounding (ceiling) para maprotektahan ang revenue. Ang rounding step ay naka-configure sa Settings > Pricing. Halimbawa, kung ang rounding step ay 50 (kumakatawan sa $0.50 sa currency na may 2 fraction digits), ang raw total na $3.27 ay nag-round up sa $3.50.
Hakbang 3: I-apply ang Startup Fee Minimum
final_total = max(rounded_total, startup_fee)
Ang startup fee ang minimum charge para sa anumang session, anuman ang tagal. Kung ang rounded total ay mas mababa sa startup fee, ang startup fee ang sisingilin.
Settlement
Ang settlement ang proseso ng pag-finalize ng billing para sa isang session. May dalawang settlement stages:
Simulan ang Settlement (Prepaid Lamang)
Kapag nagsimula ang prepaid session, isang "start" settlement record ang nalilikha. Kinukuha nito ang:
- Calculated cost. Ang system-calculated cost para sa biniling oras.
- Amount charged. Ang halagang aktwal na binayaran ng customer (karaniwan ay pareho sa calculated cost).
Para sa "Lock at Purchase" prepaid mode, ang locked amount na ito ang nagtatakda ng session cost anuman ang mga pagbabago sa pricing sa panahon ng session.
Stop Settlement
Kapag itinigil ang anumang session (prepaid o postpaid), isang "stop" settlement record ang nalilikha:
| Field | Paglalarawan |
|---|---|
| Kinakalkula na gastos | Ang system-calculated total mula sa lahat ng pricing segments |
| Amount charged | Ang halagang aktwal na siningil (default sa calculated cost) |
| Manu-manong inayos ang halaga | Kung manu-manong in-adjust ng cashier ang presyo, naitatago dito ang orihinal na calculated cost |
| Rate ng komisyon | Paraan ng pagbabayad rate ng komisyon (bilang porsyento) |
| bayad_komisyon | Ang kinakalkula na halaga ng komisyon |
| fixed_fee | Nakapirming bayad sa paraan ng pagbabayad |
| computed_timeline_snapshot | Isang JSON record ng bawat pricing segment sa session |
Ang timeline snapshot ay nagbibigay ng kumpletong audit trail na nagpapakita nang eksakto kung paano kinalkula ang gastos, segment by segment.
Mga Payment Method Fees
Ang bawat payment method ay maaaring magkaroon ng dalawang uri ng fees:
Commission (Basis Points)
Ang commission rate ay ipinapahayag bilang porsyento. Ang commission fee ay kinakalkula sa pamamagitan ng pag-apply ng rate na ito sa amount charged.
Halimbawa: Kung ang amount charged ay $10.00 (1000 minor units) at ang payment method ay may 2.5% commission rate, ang commission fee ay $0.25 (25 minor units).
Fixed Fee
Isang flat fee na ibinabawas kada transaksyon, anuman ang halaga. Halimbawa, isang credit card processing fee na $0.30.
Parehong fees ay informational. Kinakatawan nila ang gastos sa negosyo ng pagtanggap ng payment method na iyon. Nire-record ang mga ito sa settlement ngunit hindi idinaragdag sa bill ng customer.
VAT (Value Added Tax)
Ang VAT ay naka-configure bilang porsyento (0-100%) sa Settings > Pricing. Inilapat ito sa ibabaw ng kalkuladong halaga ng session:
VAT = amount charged x (VAT rate / 100)
Ang VAT amount ay hiwalay na ipinapakita sa payment dialog para makita ng cashier ang tax breakdown.
Mga Prepaid Pricing Modes
Gaya ng inilarawan sa Session Management, ang prepaid sessions ay sumusuporta ng dalawang pricing modes:
Lock at Purchase
Kapag nagsimula ang prepaid session, nilo-lock ng "start" settlement ang charged amount. Sa buong tagal ng session:
- Ang session end time ay nakabase sa mga biniling minuto.
- Kahit magbago ang pricing schedule, nagpapatuloy ang session hanggang mag-expire ang locked time.
- Ang stop settlement ay gumagamit ng locked amount mula sa start settlement.
Live Schedule
Ang natitirang oras ng session ay patuloy na nire-recalculate habang nagbabago ang mga pricing slots:
- Kung pumasok ang session sa mas murang slot, humahaba ang natitirang oras (mas maraming minuto ang nakukuha ng customer sa kanilang pera).
- Kung pumasok ang session sa mas mahal na slot, pumaigsí ang natitirang oras.
- Ang stop settlement ay nagre-reflect ng aktwal na pricing na inilapat sa buong session.
Mga Fraction Digits
Ang bilang ng decimal places na ginagamit para sa currency display ay naka-configure (2-4 fraction digits). Naaapektuhan nito kung paano ipinapakita ang mga halaga sa UI ngunit hindi binabago ang internal minor-unit calculations.
Halimbawa: Sa 2 fraction digits, ang $3.50 ay ipinapakita bilang "3.50". Sa 3 fraction digits, ipapakita ito bilang "3.500".
Mga Praktikal na Halimbawa
Halimbawa 1: Simpleng Postpaid Session
- Base rate: $3.00/oras (300 minor units)
- Schedule: Standard slot (multiplier 1.0) buong araw
- Session: 10:00 AM hanggang 11:30 AM (90 minuto)
- Startup fee: $0.50
Kalkulasyon:
Segment 1: (300 * 1.0 * 5400) / 3600 = 450 minor units ($4.50)
Total: max($4.50, $0.50) = $4.50
Halimbawa 2: Session na Tumawid sa Dalawang Slots
- Base rate: $4.00/oras (400 minor units)
- Iskedyul: Standard (1.0) mula 10:00-12:00, Happy Hour (0.5) mula 12:00-14:00
- Session: 11:00 AM hanggang 1:00 PM (120 minuto)
- Startup fee: $1.00
Kalkulasyon:
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
Halimbawa 3: Session na may Pause
- Base rate: $2.00/oras (200 minor units)
- Schedule: Standard slot (multiplier 1.0) buong araw
- Session: Start 10:00, Pause 10:30, Resume 11:00, Stop 11:45
- Startup fee: $0.50
Kalkulasyon:
Segment 1 (10:00-10:30, active): (200 * 1.0 * 1800) / 3600 = 100 ($1.00)
Paused period (10:30-11:00): walang singil
Segment 2 (11:00-11:45, active): (200 * 1.0 * 2700) / 3600 = 150 ($1.50)
Total: $1.00 + $1.50 = $2.50
Final: max($2.50, $0.50) = $2.50
Mga Susunod na Hakbang
- Session Management: Alamin ang buong session lifecycle
- Mga Setting: Pagpepresyo: I-configure ang base rate, rounding, at startup fee
- Mga Setting: Iskedyul ng Pagpepresyo: I-set up ang 7x24 schedule grid
- Payment Methods: I-configure ang mga paraan ng pagbabayad na may commission at fees