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:
- Nama. Label deskriptif (contoh: "Waktu Puncak" atau "Diskaun Malam").
- 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.
- 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:
- Pengganda diskalakan kepada integer titik tetap (darab dengan 1,000,000).
- Pengiraan dilakukan sepenuhnya dalam integer 128-bit.
- 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
- Pengurusan Sesi: Ketahui kitaran hayat sesi yang lengkap
- Tetapan: Penetapan Harga: Konfigurasikan kadar asas, pembundaran dan yuran permulaan
- Tetapan: Jadual Harga: Sediakan grid jadual 7x24
- Kaedah Pembayaran: Konfigurasikan kaedah pembayaran dengan komisen dan yuran