HandyCafe Docs
owner

Penetapan Harga Sesi

HandyCafe menggunakan enjin penetapan harga berasaskan segmen untuk mengira kos sesi di kafe internet atau pusat permainan anda. Daripada mengenakan kadar rata tunggal untuk keseluruhan sesi, enjin membahagikan setiap sesi kepada segmen, masing-masing dengan konteks harga tersendiri. Pendekatan ini memastikan pengebilan yang tepat walaupun sesi merentasi berbilang slot masa, perubahan harga, jeda atau pemutusan sambungan.

Konsep Teras

Sebelum mendalami butiran, berikut adalah istilah utama:

Istilah Definisi
Kadar sejam asas Harga setiap jam sebelum sebarang pengganda dikenakan. Ditetapkan dalam Tetapan > Penetapan Harga.
Slot harga Tempoh masa bernama dengan pengganda tertentu. Terdapat 8 slot, masing-masing berkod warna.
Pengganda Faktor yang dikenakan pada kadar asas. 1.0 = harga standard, 0.5 = separuh harga, 2.0 = harga dua kali ganda.
Segmen Tempoh berterusan dalam sesi yang konteks harganya (slot, pengganda, harga asas) kekal tidak berubah.
Penyelesaian Pengiraan akhir yang menentukan berapa banyak pelanggan perlu bayar apabila sesi tamat.

Kadar Sejam Asas

Kadar sejam asas ialah asas semua pengiraan harga. Ia ditetapkan dalam Tetapan > Penetapan Harga dan mewakili harga standard setiap jam penggunaan PC.

Semua pengiraan dalaman menggunakan unit mata wang kecil (contoh: sen untuk USD, sen untuk MYR). Jika kadar asas anda ialah RM3.00 setiap jam, nilai dalaman ialah 300. Ini menghapuskan isu pembundaran titik terapung.

Sokongan Dwi Mata Wang

HandyCafe menyokong mata wang asas dan mata wang tempatan dengan kadar pertukaran (FX). Jika anda beroperasi di negara yang harga antarabangsa berbeza daripada harga tempatan:

  • Mata wang asas. Mata wang yang digunakan untuk pengiraan harga dalaman.
  • Mata wang tempatan. Mata wang yang dipaparkan kepada pelanggan dan digunakan untuk pembayaran.
  • Kadar FX. Faktor penukaran antara mata wang asas dan tempatan.

Jika kedua-dua mata wang sama, kadar FX dianggap sebagai 1.0 dan tidak memberi kesan.

Slot Harga

Terdapat 8 slot harga berkod warna, masing-masing mewakili tahap harga yang berbeza:

Slot Warna Penggunaan Biasa
Biru Biru Kadar standard
Oren Oren Surcaj petang atau hujung minggu
Merah Merah Premium waktu puncak
Hijau Hijau Diskaun luar puncak
Teal Teal Kadar pelajar atau ahli
Kelabu Kelabu Harga cuti atau khas
Sian Sian Kadar malam
Zamrud Zamrud Kadar promosi

Setiap slot mempunyai tiga sifat:

  1. Nama. Label deskriptif (contoh: "Waktu Puncak" atau "Diskaun Malam").
  2. Pengganda. Nilai perpuluhan yang mengubah suai kadar asas. Nilai biasa termasuk 1.0 (standard), 0.5 (separuh harga), 1.5 (surcaj 50%), 2.0 (harga dua kali ganda). Pengganda mestilah sifar atau positif.
  3. Data jadual. Perwakilan dalaman yang mentakrifkan jam mana dan hari mana slot berkenaan. Ini diurus secara automatik melalui grid jadual.

Slot boleh didayakan atau dilumpuhkan secara individu. Slot yang dilumpuhkan diabaikan oleh enjin penetapan harga.

Grid Jadual

Jadual harga ialah matriks 7 hari kali 24 jam (168 blok satu jam secara keseluruhan). Setiap blok ditetapkan kepada satu slot harga. Jadual menentukan pengganda mana yang dikenakan pada bila-bila masa.

Grid dikonfigurasikan dalam Tetapan > Jadual Harga. Hari berjalan dari Isnin hingga Ahad dan jam berjalan dari 00:00 hingga 23:00. Untuk menetapkan slot kepada blok masa, pilih blok dalam grid dan pilih warna slot yang dikehendaki.

Cara Enjin Membaca Jadual

Secara dalaman, setiap blok jam dipetakan ke kedudukan dalam data jadual. Enjin menyemak data jadual setiap slot yang didayakan untuk menentukan slot mana yang aktif untuk mana-mana hari dan jam tertentu.

Jika tiada slot mempunyai bit yang ditetapkan untuk jam tertentu, enjin kembali kepada kadar asas dengan pengganda 1.0.

Apabila ciri jadual harga dilumpuhkan sepenuhnya (dalam Tetapan > Penetapan Harga), semua sesi menggunakan kadar asas dengan pengganda 1.0 tanpa mengira masa.

Segmen Harga

Segmen ialah tempoh masa berterusan dalam sesi yang konteks harganya tidak berubah. Enjin penetapan harga mencipta segmen baharu apabila mana-mana peristiwa sempadan ini berlaku:

Sempadan Pencetus
session_start Sesi baharu bermula
session_stop Sesi dihentikan
pause Juruwang menjeda sesi
resume Juruwang menyambung semula sesi yang dijeda
tick Jam melepasi sempadan jam ke slot harga yang berbeza
disconnect PC klien kehilangan sambungan rangkaian
offline PC klien pergi ke luar talian
load_recovery Pelayan dimulakan semula dan memulihkan sesi yang sedang berjalan

Setiap segmen merekodkan:

Medan Penerangan
session_id Sesi yang segmen ini milik
segment_start Cap masa Unix apabila segmen bermula
segment_end Cap masa Unix apabila segmen tamat (null jika masih terbuka)
pricing_slot_id ID slot harga yang aktif (contoh: "blue", "red" atau "base")
multiplier Nilai pengganda daripada slot harga
base_price_snapshot Kadar sejam asas yang ditangkap pada saat segmen dibuka
amount Kos yang dikira untuk segmen ini (ditetapkan apabila segmen ditutup)
boundary_reason Sebab segmen ini dicipta

Mengapa Tangkap Harga Asas?

base_price_snapshot menangkap kadar sejam asas pada saat tepat segmen dibuka. Ini penting kerana pentadbir boleh menukar kadar asas semasa sesi. Dengan menangkap, setiap segmen menggunakan kadar yang berkuat kuasa apabila ia bermula, memastikan pengebilan yang adil dan boleh diaudit.

Formula Kos

Kos satu segmen dikira sebagai:

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

Dengan lebih tepat, enjin menggunakan aritmetik integer berskala untuk mengelakkan ralat titik terapung:

  1. Pengganda diskalakan kepada integer titik tetap (darab dengan 1,000,000).
  2. Pengiraan dilakukan sepenuhnya dalam integer 128-bit.
  3. Pembahagian siling digunakan. Hasil sentiasa dibundarkan ke atas ke unit kecil seterusnya.

Pengiraan Mengikut Minit

Jika pilihan "kira mengikut minit" didayakan dalam Tetapan > Penetapan Harga, formula berubah sedikit:

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

Di mana used_minutes = ceil(duration_seconds / 60). Ini bermakna sebarang minit separa dikira sebagai minit penuh.

Pengiraan Jumlah Sesi

Jumlah kos sesi dikira dalam tiga langkah:

Langkah 1: Jumlahkan Semua Segmen

raw_total = jumlah semua jumlah segmen tertutup + jumlah separa segmen terbuka

Jumlah separa segmen terbuka dikira dalam masa nyata menggunakan formula di atas dengan cap masa semasa sebagai tamat segmen.

Langkah 2: Kenakan Pembundaran

rounded_total = round_up(raw_total, rounding_step)

Pembundaran sentiasa ke atas (siling) untuk melindungi hasil. Langkah pembundaran boleh dikonfigurasikan dalam Tetapan > Penetapan Harga. Sebagai contoh, jika langkah pembundaran ialah 50 (mewakili RM0.50 dalam mata wang dengan 2 digit pecahan), jumlah mentah RM3.27 dibundarkan ke atas kepada RM3.50.

Langkah 3: Kenakan Minimum Yuran Permulaan

final_total = max(rounded_total, startup_fee)

Yuran permulaan ialah caj minimum untuk mana-mana sesi, tanpa mengira tempoh. Jika jumlah yang dibundarkan kurang daripada yuran permulaan, yuran permulaan dicaj sebaliknya.

Penyelesaian

Penyelesaian ialah proses memuktamadkan pengebilan untuk sesi. Terdapat dua peringkat penyelesaian:

Penyelesaian Mula (Prabayar Sahaja)

Apabila sesi prabayar bermula, rekod penyelesaian "mula" dicipta. Ini menangkap:

  • Kos yang dikira. Kos yang dikira oleh sistem untuk masa yang dibeli.
  • Jumlah yang dicaj. Jumlah yang pelanggan sebenarnya bayar (biasanya sama dengan kos yang dikira).

Untuk mod prabayar "Kunci Semasa Pembelian", jumlah terkunci ini menentukan kos sesi tanpa mengira perubahan harga semasa sesi.

Penyelesaian Berhenti

Apabila mana-mana sesi (prabayar atau pascabayar) dihentikan, rekod penyelesaian "berhenti" dicipta:

Medan Penerangan
Kos yang dikira Jumlah yang dikira oleh sistem daripada semua segmen harga
Jumlah yang dicaj Jumlah yang sebenarnya dicaj (lalai kepada kos yang dikira)
Jumlah diselaraskan secara manual Jika juruwang melaraskan harga secara manual, kos asal yang dikira disimpan di sini
Kadar komisen Kadar komisen kaedah pembayaran (sebagai peratusan)
commission_fee Jumlah komisen yang dikira
fixed_fee Yuran tetap kaedah pembayaran
computed_timeline_snapshot Rekod JSON setiap segmen harga dalam sesi

Tangkapan garis masa menyediakan jejak audit lengkap yang menunjukkan tepat bagaimana kos dikira, segmen demi segmen.

Yuran Kaedah Pembayaran

Setiap kaedah pembayaran boleh mempunyai dua jenis yuran:

Komisen (Mata Asas)

Kadar komisen dinyatakan sebagai peratusan. Yuran komisen dikira dengan mengenakan kadar ini pada jumlah yang dicaj.

Contoh: Jika jumlah yang dicaj ialah RM10.00 (1000 unit kecil) dan kaedah pembayaran mempunyai kadar komisen 2.5%, yuran komisen ialah RM0.25 (25 unit kecil).

Yuran Tetap

Yuran rata yang ditolak setiap transaksi, tanpa mengira jumlah. Contoh: yuran pemprosesan kad kredit sebanyak RM0.30.

Kedua-dua yuran adalah bermaklumat. Ia mewakili kos kepada perniagaan untuk menerima kaedah pembayaran tersebut. Ia direkodkan dalam penyelesaian tetapi tidak ditambah kepada bil pelanggan.

Cukai (Cukai Nilai Ditambah)

Cukai dikonfigurasikan sebagai peratusan (0-100%) dalam Tetapan > Penetapan Harga. Ia dikenakan di atas jumlah sesi yang dikira:

Cukai = jumlah dicaj x (kadar cukai / 100)

Jumlah cukai dipaparkan secara berasingan dalam dialog pembayaran supaya juruwang boleh melihat pecahan cukai.

Mod Harga Prabayar

Seperti yang diterangkan dalam Pengurusan Sesi, sesi prabayar menyokong dua mod harga:

Kunci Semasa Pembelian

Apabila sesi prabayar bermula, penyelesaian "mula" mengunci jumlah yang dicaj. Untuk tempoh sesi:

  • Masa tamat sesi ditetapkan berdasarkan minit yang dibeli.
  • Walaupun jadual harga berubah, sesi berterusan sehingga masa terkunci tamat.
  • Penyelesaian berhenti menggunakan jumlah terkunci daripada penyelesaian mula.

Jadual Langsung

Baki masa sesi dikira semula secara berterusan apabila slot harga berubah:

  • Jika sesi memasuki slot yang lebih murah, baki masa bertambah (pelanggan mendapat lebih banyak minit untuk wang mereka).
  • Jika sesi memasuki slot yang lebih mahal, baki masa berkurang.
  • Penyelesaian berhenti mencerminkan harga sebenar yang dikenakan sepanjang sesi.

Digit Pecahan

Bilangan tempat perpuluhan yang digunakan untuk paparan mata wang boleh dikonfigurasikan (2-4 digit pecahan). Ini mempengaruhi cara jumlah dipaparkan dalam UI tetapi tidak mengubah pengiraan unit kecil dalaman.

Contoh: Dengan 2 digit pecahan, RM3.50 dipaparkan sebagai "3.50". Dengan 3 digit pecahan, ia akan dipaparkan sebagai "3.500".

Contoh Praktikal

Contoh 1: Sesi Pascabayar Mudah

  • Kadar asas: RM3.00/jam (300 unit kecil)
  • Jadual: Slot standard (pengganda 1.0) sepanjang hari
  • Sesi: 10:00 pagi hingga 11:30 pagi (90 minit)
  • Yuran permulaan: RM0.50

Pengiraan:

Segmen 1: (300 * 1.0 * 5400) / 3600 = 450 unit kecil (RM4.50)
Jumlah: max(RM4.50, RM0.50) = RM4.50

Contoh 2: Sesi Merentasi Dua Slot

  • Kadar asas: RM4.00/jam (400 unit kecil)
  • Jadual: Standard (1.0) dari 10:00-12:00, Waktu Gembira (0.5) dari 12:00-14:00
  • Sesi: 11:00 pagi hingga 1:00 petang (120 minit)
  • Yuran permulaan: RM1.00

Pengiraan:

Segmen 1 (11:00-12:00, standard): (400 * 1.0 * 3600) / 3600 = 400 (RM4.00)
Segmen 2 (12:00-13:00, waktu gembira): (400 * 0.5 * 3600) / 3600 = 200 (RM2.00)
Jumlah: RM4.00 + RM2.00 = RM6.00
Akhir: max(RM6.00, RM1.00) = RM6.00

Contoh 3: Sesi dengan Jeda

  • Kadar asas: RM2.00/jam (200 unit kecil)
  • Jadual: Slot standard (pengganda 1.0) sepanjang hari
  • Sesi: Mula 10:00, Jeda 10:30, Sambung Semula 11:00, Berhenti 11:45
  • Yuran permulaan: RM0.50

Pengiraan:

Segmen 1 (10:00-10:30, aktif): (200 * 1.0 * 1800) / 3600 = 100 (RM1.00)
Tempoh jeda (10:30-11:00): tiada caj
Segmen 2 (11:00-11:45, aktif): (200 * 1.0 * 2700) / 3600 = 150 (RM1.50)
Jumlah: RM1.00 + RM1.50 = RM2.50
Akhir: max(RM2.50, RM0.50) = RM2.50

Langkah Seterusnya