Harga Sesi
HandyCafe menggunakan mesin penetapan harga berbasis segmen untuk menghitung biaya sesi di warnet atau pusat permainan Anda. Alih-alih menerapkan tarif tetap untuk seluruh sesi, mesin ini membagi setiap sesi menjadi segmen-segmen, masing-masing dengan konteks harga tersendiri. Pendekatan ini memastikan penagihan yang akurat bahkan ketika sesi mencakup beberapa slot waktu, perubahan harga, jeda, atau pemutusan.
Konsep Inti
Sebelum masuk ke detail, berikut adalah istilah kunci:
| Istilah | Definisi |
|---|---|
| Tarif dasar per jam | Harga per jam sebelum pengali diterapkan. Diatur di Settings > Pricing. |
| Slot harga | Periode waktu bernama dengan pengali tertentu. Ada 8 slot, masing-masing diberi kode warna. |
| Pengali | Faktor yang diterapkan pada tarif dasar. 1.0 = harga standar, 0.5 = setengah harga, 2.0 = dua kali lipat harga. |
| Segmen | Periode kontinu dalam sesi di mana konteks harga (slot, pengali, harga dasar) tetap tidak berubah. |
| Penyelesaian | Perhitungan akhir yang menentukan berapa banyak yang harus dibayar pelanggan ketika sesi berakhir. |
Tarif Dasar Per Jam
Tarif dasar per jam adalah dasar dari semua perhitungan harga. Ini diatur di Settings > Pricing dan mewakili harga standar per jam penggunaan PC.
Semua perhitungan internal menggunakan unit mata uang kecil (misalnya, sen untuk USD, kurus untuk TRY). Jika tarif dasar Anda adalah $3.00 per jam, nilai internalnya adalah 300. Ini menghilangkan masalah pembulatan floating-point.
Dukungan Mata Uang Ganda
HandyCafe mendukung mata uang dasar dan mata uang lokal dengan kurs pertukaran (FX). Jika Anda beroperasi di negara di mana harga internasional berbeda dari harga lokal:
- Mata uang dasar. Mata uang yang digunakan untuk perhitungan harga internal.
- Mata uang lokal. Mata uang yang ditampilkan kepada pelanggan dan digunakan untuk pembayaran.
- Kurs FX. Faktor konversi antara mata uang dasar dan lokal.
Jika kedua mata uang sama, kurs FX dianggap sebagai 1.0 dan tidak berpengaruh.
Slot Harga
Ada 8 slot harga dengan kode warna, masing-masing mewakili tingkat harga yang berbeda:
| Slot | Warna | Penggunaan Umum |
|---|---|---|
| Biru | Biru | Tarif standar |
| Oranye | Oranye | Biaya tambahan malam atau akhir pekan |
| Merah | Merah | Premium jam sibuk |
| Hijau | Hijau | Diskon di luar jam sibuk |
| Teal | Teal | Tarif pelajar atau anggota |
| Abu-abu | Abu-abu | Harga liburan atau khusus |
| Cyan | Cyan | Tarif malam |
| Emerald | Emerald | Tarif promosi |
Setiap slot memiliki tiga properti:
- Nama. Label deskriptif (misalnya, "Jam Sibuk" atau "Diskon Malam").
- Pengali. Nilai desimal yang memodifikasi tarif dasar. Nilai umum termasuk 1.0 (standar), 0.5 (setengah harga), 1.5 (biaya tambahan 50%), 2.0 (dua kali lipat harga). Pengali harus nol atau positif.
- Data jadwal. Representasi internal yang menentukan jam mana dari hari mana slot berlaku. Ini dikelola secara otomatis melalui grid jadwal.
Slot dapat diaktifkan atau dinonaktifkan secara individual. Slot yang dinonaktifkan diabaikan oleh mesin penetapan harga.
Grid Jadwal
Jadwal harga adalah matriks 7 hari x 24 jam (total 168 blok satu jam). Setiap blok ditetapkan ke satu slot harga. Jadwal menentukan pengali mana yang berlaku pada saat tertentu.
Grid dikonfigurasi di Settings > Pricing Schedule. Hari berjalan dari Senin hingga Minggu dan jam berjalan dari 00:00 hingga 23:00. Untuk menetapkan slot ke blok waktu, pilih blok di grid dan pilih warna slot yang diinginkan.
Cara Mesin Membaca Jadwal
Secara internal, setiap blok jam dipetakan ke posisi dalam data jadwal. Mesin memeriksa data jadwal setiap slot yang diaktifkan untuk menentukan slot mana yang aktif untuk hari dan jam tertentu.
Jika tidak ada slot yang memiliki bit yang diatur untuk jam tertentu, mesin kembali ke tarif dasar dengan pengali 1.0.
Ketika fitur jadwal harga dinonaktifkan sepenuhnya (di Settings > Pricing), semua sesi menggunakan tarif dasar dengan pengali 1.0 terlepas dari waktu.
Segmen Harga
Segmen adalah periode waktu kontinu dalam sesi di mana konteks harga tidak berubah. Mesin penetapan harga membuat segmen baru setiap kali salah satu dari peristiwa batas ini terjadi:
| Batas | Pemicu |
|---|---|
| session_start | Sesi baru dimulai |
| session_stop | Sesi dihentikan |
| pause | Kasir menjeda sesi |
| resume | Kasir melanjutkan sesi yang dijeda |
| tick | Jam melewati batas jam ke slot harga yang berbeda |
| disconnect | PC klien kehilangan koneksi jaringan |
| offline | PC klien offline |
| load_recovery | Server restart dan memulihkan sesi yang berjalan |
Setiap segmen mencatat:
| Bidang | Deskripsi |
|---|---|
| session_id | Sesi yang dimiliki segmen ini |
| segment_start | Stempel waktu Unix ketika segmen dimulai |
| segment_end | Stempel waktu Unix ketika segmen berakhir (null jika masih terbuka) |
| pricing_slot_id | ID slot harga aktif (misalnya, "blue", "red", atau "base") |
| multiplier | Nilai pengali dari slot harga |
| base_price_snapshot | Tarif dasar per jam yang diambil saat segmen dibuka |
| amount | Biaya yang dihitung untuk segmen ini (ditetapkan saat segmen ditutup) |
| boundary_reason | Mengapa segmen ini dibuat |
Mengapa Mengambil Snapshot Harga Dasar?
base_price_snapshot menangkap tarif dasar per jam pada saat segmen dibuka. Ini penting karena administrator dapat mengubah tarif dasar di tengah sesi. Dengan mengambil snapshot, setiap segmen menggunakan tarif yang berlaku saat dimulai, memastikan penagihan yang adil dan dapat diaudit.
Rumus Biaya
Biaya satu segmen dihitung sebagai:
amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )
Lebih tepatnya, mesin menggunakan aritmatika bilangan bulat berskala untuk menghindari kesalahan floating-point:
- Pengali diskalakan ke bilangan bulat titik tetap (dikalikan dengan 1.000.000).
- Perhitungan dilakukan sepenuhnya dalam bilangan bulat 128-bit.
- Pembagian langit-langit digunakan. Hasil selalu dibulatkan ke unit kecil berikutnya.
Perhitungan Berdasarkan Menit
Jika opsi "hitung berdasarkan menit" diaktifkan di Settings > Pricing, rumusnya sedikit berubah:
amount = ceil( (base_price_snapshot * multiplier * used_minutes) / 60 )
Di mana used_minutes = ceil(duration_seconds / 60). Ini berarti setiap menit parsial dihitung sebagai satu menit penuh.
Perhitungan Total Sesi
Total biaya sesi dihitung dalam tiga langkah:
Langkah 1: Jumlahkan Semua Segmen
raw_total = jumlah dari semua jumlah segmen tertutup + jumlah parsial segmen terbuka
Jumlah parsial segmen terbuka dihitung secara real-time menggunakan rumus di atas dengan stempel waktu saat ini sebagai akhir segmen.
Langkah 2: Terapkan Pembulatan
rounded_total = round_up(raw_total, rounding_step)
Pembulatan selalu naik (langit-langit) untuk melindungi pendapatan. Langkah pembulatan dapat dikonfigurasi di Settings > Pricing. Misalnya, jika langkah pembulatan adalah 50 (mewakili $0.50 dalam mata uang dengan 2 digit pecahan), total mentah $3.27 dibulatkan menjadi $3.50.
Langkah 3: Terapkan Biaya Minimum Awal
final_total = max(rounded_total, startup_fee)
Biaya awal adalah biaya minimum untuk setiap sesi, terlepas dari durasinya. Jika total yang dibulatkan kurang dari biaya awal, biaya awal yang dibebankan.
Penyelesaian
Penyelesaian adalah proses finalisasi penagihan untuk sesi. Ada dua tahap penyelesaian:
Penyelesaian Awal (Hanya Prabayar)
Ketika sesi prabayar dimulai, catatan penyelesaian "awal" dibuat. Ini menangkap:
- Biaya yang dihitung. Biaya yang dihitung sistem untuk waktu yang dibeli.
- Jumlah yang dibebankan. Jumlah yang sebenarnya dibayar pelanggan (biasanya sama dengan biaya yang dihitung).
Untuk mode prabayar "Kunci saat Pembelian", jumlah yang terkunci ini menentukan biaya sesi terlepas dari perubahan harga selama sesi.
Penyelesaian Akhir
Ketika sesi apa pun (prabayar atau pascabayar) dihentikan, catatan penyelesaian "akhir" dibuat:
| Bidang | Deskripsi |
|---|---|
| Biaya yang dihitung | Total yang dihitung sistem dari semua segmen harga |
| Jumlah yang dibebankan | Jumlah yang sebenarnya dibebankan (default ke biaya yang dihitung) |
| Jumlah yang disesuaikan secara manual | Jika kasir menyesuaikan harga secara manual, biaya yang dihitung asli disimpan di sini |
| Tarif komisi | Tarif komisi metode pembayaran (sebagai persentase) |
| commission_fee | Jumlah komisi yang dihitung |
| fixed_fee | Biaya tetap metode pembayaran |
| computed_timeline_snapshot | Catatan JSON dari setiap segmen harga dalam sesi |
Snapshot timeline menyediakan jejak audit lengkap yang menunjukkan dengan tepat bagaimana biaya dihitung, segmen demi segmen.
Biaya Metode Pembayaran
Setiap metode pembayaran dapat memiliki dua jenis biaya:
Komisi (Basis Poin)
Tarif komisi dinyatakan sebagai persentase. Biaya komisi dihitung dengan menerapkan tarif ini pada jumlah yang dibebankan.
Contoh: Jika jumlah yang dibebankan adalah $10.00 (1000 unit kecil) dan metode pembayaran memiliki tarif komisi 2.5%, biaya komisi adalah $0.25 (25 unit kecil).
Biaya Tetap
Biaya tetap yang dipotong per transaksi, terlepas dari jumlahnya. Misalnya, biaya pemrosesan kartu kredit sebesar $0.30.
Kedua biaya ini bersifat informasional. Mereka mewakili biaya bagi bisnis untuk menerima metode pembayaran tersebut. Mereka dicatat dalam penyelesaian tetapi tidak ditambahkan ke tagihan pelanggan.
PPN (Pajak Pertambahan Nilai)
PPN dikonfigurasi sebagai persentase (0--100%) di Settings > Pricing. Ini diterapkan di atas jumlah sesi yang dihitung:
PPN = jumlah yang dibebankan x (tarif PPN / 100)
Jumlah PPN ditampilkan secara terpisah di dialog pembayaran sehingga kasir dapat melihat rincian pajak.
Mode Harga Prabayar
Seperti dijelaskan dalam Manajemen Sesi, sesi prabayar mendukung dua mode harga:
Kunci saat Pembelian
Ketika sesi prabayar dimulai, penyelesaian "awal" mengunci jumlah yang dibebankan. Selama durasi sesi:
- Waktu akhir sesi tetap berdasarkan menit yang dibeli.
- Bahkan jika jadwal harga berubah, sesi berlanjut hingga waktu terkunci habis.
- Penyelesaian akhir menggunakan jumlah yang terkunci dari penyelesaian awal.
Jadwal Langsung
Waktu yang tersisa dalam sesi dihitung ulang secara terus-menerus saat slot harga berubah:
- Jika sesi memasuki slot yang lebih murah, waktu yang tersisa diperpanjang (pelanggan mendapatkan lebih banyak menit untuk uang mereka).
- Jika sesi memasuki slot yang lebih mahal, waktu yang tersisa berkurang.
- Penyelesaian akhir mencerminkan harga sebenarnya yang diterapkan selama sesi.
Digit Pecahan
Jumlah tempat desimal yang digunakan untuk tampilan mata uang dapat dikonfigurasi (2--4 digit pecahan). Ini mempengaruhi bagaimana jumlah ditampilkan di UI tetapi tidak mengubah perhitungan unit kecil internal.
Contoh: Dengan 2 digit pecahan, $3.50 ditampilkan sebagai "3.50". Dengan 3 digit pecahan, akan ditampilkan sebagai "3.500".
Contoh Praktis
Contoh 1: Sesi Pascabayar Sederhana
- Tarif dasar: $3.00/jam (300 unit kecil)
- Jadwal: Slot standar (pengali 1.0) sepanjang hari
- Sesi: 10:00 AM hingga 11:30 AM (90 menit)
- Biaya awal: $0.50
Perhitungan:
Segmen 1: (300 * 1.0 * 5400) / 3600 = 450 unit kecil ($4.50)
Total: max($4.50, $0.50) = $4.50
Contoh 2: Sesi yang Mencakup Dua Slot
- Tarif dasar: $4.00/jam (400 unit kecil)
- Jadwal: Standar (1.0) dari 10:00--12:00, Happy Hour (0.5) dari 12:00--14:00
- Sesi: 11:00 AM hingga 1:00 PM (120 menit)
- Biaya awal: $1.00
Perhitungan:
Segmen 1 (11:00-12:00, standar): (400 * 1.0 * 3600) / 3600 = 400 ($4.00)
Segmen 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
Contoh 3: Sesi dengan Jeda
- Tarif dasar: $2.00/jam (200 unit kecil)
- Jadwal: Slot standar (pengali 1.0) sepanjang hari
- Sesi: Mulai 10:00, Jeda 10:30, Lanjutkan 11:00, Berhenti 11:45
- Biaya awal: $0.50
Perhitungan:
Segmen 1 (10:00-10:30, aktif): (200 * 1.0 * 1800) / 3600 = 100 ($1.00)
Periode jeda (10:30-11:00): tidak ada biaya
Segmen 2 (11:00-11:45, aktif): (200 * 1.0 * 2700) / 3600 = 150 ($1.50)
Total: $1.00 + $1.50 = $2.50
Final: max($2.50, $0.50) = $2.50
Langkah Selanjutnya
- Manajemen Sesi: Pelajari siklus hidup sesi penuh
- Pengaturan: Harga: Konfigurasikan tarif dasar, pembulatan, dan biaya awal
- Pengaturan: Jadwal Harga: Atur grid jadwal 7x24
- Metode Pembayaran: Konfigurasikan metode pembayaran dengan komisi dan biaya