HandyCafe Docs
owner

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:

  1. Nama. Label deskriptif (misalnya, "Jam Sibuk" atau "Diskon Malam").
  2. 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.
  3. 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:

  1. Pengali diskalakan ke bilangan bulat titik tetap (dikalikan dengan 1.000.000).
  2. Perhitungan dilakukan sepenuhnya dalam bilangan bulat 128-bit.
  3. 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