HandyCafe Docs
owner

การตั้งราคาเซสชัน

HandyCafe ใช้เอนจินการตั้งราคาแบบเซกเมนต์เพื่อคำนวณค่าบริการเซสชันในร้านอินเทอร์เน็ตคาเฟ่หรือเกมมิ่งเซ็นเตอร์ของคุณ แทนที่จะใช้อัตราคงที่เดียวตลอดทั้งเซสชัน เอนจินจะแบ่งแต่ละเซสชันออกเป็นเซกเมนต์ แต่ละเซกเมนต์มีบริบทราคาของตัวเอง วิธีนี้ทำให้การเรียกเก็บเงินถูกต้องแม้ว่าเซสชันจะผ่านหลายสล็อตเวลา การเปลี่ยนราคา การหยุดชั่วคราว หรือการตัดการเชื่อมต่อ

แนวคิดหลัก

ก่อนเข้าสู่รายละเอียด นี่คือคำศัพท์สำคัญ:

คำศัพท์ คำจำกัดความ
อัตราฐานรายชั่วโมง ราคาต่อชั่วโมงก่อนใช้ตัวคูณ กำหนดค่าได้ใน การตั้งค่า > การตั้งราคา
สล็อตราคา ช่วงเวลาที่ตั้งชื่อไว้พร้อมตัวคูณเฉพาะ มี 8 สล็อต แต่ละสล็อตมีรหัสสี
ตัวคูณ ตัวคูณที่ใช้กับอัตราฐาน 1.0 = ราคาปกติ, 0.5 = ราคาครึ่งหนึ่ง, 2.0 = ราคาสองเท่า
เซกเมนต์ ช่วงเวลาต่อเนื่องภายในเซสชันที่บริบทราคา (สล็อต ตัวคูณ ราคาฐาน) ไม่เปลี่ยนแปลง
การตัดยอด การคำนวณสุดท้ายที่กำหนดจำนวนเงินที่ลูกค้าต้องชำระเมื่อเซสชันสิ้นสุด

อัตราฐานรายชั่วโมง

อัตราฐานรายชั่วโมงเป็นรากฐานของการคำนวณราคาทั้งหมด กำหนดค่าได้ใน การตั้งค่า > การตั้งราคา และแสดงราคามาตรฐานต่อชั่วโมงของการใช้งาน PC

การคำนวณภายในทั้งหมดใช้ หน่วยสกุลเงินย่อย (เช่น เซ็นต์สำหรับ USD, กุรุชสำหรับ TRY) หากอัตราฐานคือ 3.00 ดอลลาร์ต่อชั่วโมง ค่าภายในจะเป็น 300 วิธีนี้ขจัดปัญหาการปัดเศษจากจุดทศนิยม

การรองรับสกุลเงินคู่

HandyCafe รองรับสกุลเงินฐานและสกุลเงินท้องถิ่นพร้อมอัตราแลกเปลี่ยน (FX) หากคุณดำเนินกิจการในประเทศที่ราคาสากลแตกต่างจากราคาท้องถิ่น:

  • สกุลเงินฐาน สกุลเงินที่ใช้สำหรับการคำนวณราคาภายใน
  • สกุลเงินท้องถิ่น สกุลเงินที่แสดงให้ลูกค้าและใช้สำหรับการชำระเงิน
  • อัตรา FX ตัวคูณแปลงระหว่างสกุลเงินฐานและสกุลเงินท้องถิ่น

หากทั้งสองสกุลเงินเหมือนกัน อัตรา FX จะถือว่าเป็น 1.0 และไม่มีผลกระทบ

สล็อตราคา

มี สล็อตราคาแบบรหัสสี 8 สล็อต แต่ละสล็อตแสดงระดับราคาที่แตกต่างกัน:

สล็อต สี การใช้งานทั่วไป
Blue น้ำเงิน อัตราปกติ
Orange ส้ม ค่าเพิ่มตอนเย็นหรือวันหยุด
Red แดง ค่าเพิ่มชั่วโมงเร่งด่วน
Green เขียว ส่วนลดนอกชั่วโมงเร่งด่วน
Teal เขียวน้ำเงิน อัตรานักเรียนหรือสมาชิก
Gray เทา ราคาวันหยุดหรือราคาพิเศษ
Cyan ฟ้า อัตรากลางคืน
Emerald เขียวมรกต อัตราโปรโมชัน

สล็อตแต่ละอันมีคุณสมบัติ 3 อย่าง:

  1. ชื่อ ป้ายกำกับที่อธิบาย (เช่น "ชั่วโมงเร่งด่วน" หรือ "ส่วนลดกลางคืน")
  2. ตัวคูณ ค่าทศนิยมที่ปรับอัตราฐาน ค่าที่พบบ่อย ได้แก่ 1.0 (ปกติ), 0.5 (ราคาครึ่งหนึ่ง), 1.5 (บวก 50%), 2.0 (ราคาสองเท่า) ตัวคูณต้องเป็นศูนย์หรือค่าบวก
  3. ข้อมูลตาราง การแสดงภายในที่กำหนดว่าสล็อตใช้ในชั่วโมงและวันใด ระบบจัดการโดยอัตโนมัติผ่านกริดตาราง

สล็อตสามารถเปิดหรือปิดใช้งานได้ทีละอัน สล็อตที่ปิดใช้งานจะถูกเพิกเฉยโดยเอนจินราคา

กริดตาราง

ตารางราคาเป็น เมทริกซ์ 7 วัน x 24 ชั่วโมง (รวม 168 บล็อกชั่วโมง) แต่ละบล็อกถูกกำหนดให้กับสล็อตราคาหนึ่งอัน ตารางกำหนดว่าตัวคูณใดใช้งานในช่วงเวลาใด

กริดกำหนดค่าได้ใน การตั้งค่า > ตารางราคา วันเริ่มจากวันจันทร์ถึงวันอาทิตย์ และชั่วโมงเริ่มจาก 00:00 ถึง 23:00 ในการกำหนดสล็อตให้กับบล็อกเวลา ให้เลือกบล็อกในกริดแล้วเลือกสีสล็อตที่ต้องการ

วิธีที่เอนจินอ่านตาราง

ภายใน บล็อกชั่วโมงแต่ละอันจะจับคู่กับตำแหน่งในข้อมูลตาราง เอนจินตรวจสอบข้อมูลตารางของแต่ละสล็อตที่เปิดใช้งาน เพื่อกำหนดว่าสล็อตใดใช้งานในวันและชั่วโมงที่กำหนด

หากไม่มีสล็อตที่ตั้งค่าไว้สำหรับชั่วโมงที่กำหนด เอนจินจะใช้ อัตราฐาน ด้วยตัวคูณ 1.0

เมื่อปิดใช้งานฟีเจอร์ตารางราคาทั้งหมด (ใน การตั้งค่า > การตั้งราคา) เซสชันทุกรายการจะใช้อัตราฐานด้วยตัวคูณ 1.0 โดยไม่คำนึงถึงเวลา

เซกเมนต์ราคา

เซกเมนต์คือช่วงเวลาต่อเนื่องภายในเซสชันที่บริบทราคาไม่เปลี่ยนแปลง เอนจินราคาสร้างเซกเมนต์ใหม่เมื่อเกิด เหตุการณ์ขอบเขต เหล่านี้:

ขอบเขต เหตุกระตุ้น
session_start เซสชันใหม่เริ่มต้น
session_stop เซสชันหยุด
pause แคชเชียร์หยุดเซสชันชั่วคราว
resume แคชเชียร์เล่นเซสชันต่อ
tick นาฬิกาข้ามขอบเขตชั่วโมงเข้าสู่สล็อตราคาอื่น
disconnect เครื่อง PC ลูกข่ายสูญเสียการเชื่อมต่อเครือข่าย
offline เครื่อง PC ลูกข่ายออฟไลน์
load_recovery เซิร์ฟเวอร์รีสตาร์ทและกู้คืนเซสชันที่กำลังทำงาน

เซกเมนต์แต่ละรายการบันทึก:

ฟิลด์ คำอธิบาย
session_id เซสชันที่เซกเมนต์นี้เป็นของ
segment_start เวลา Unix เมื่อเซกเมนต์เริ่มต้น
segment_end เวลา Unix เมื่อเซกเมนต์สิ้นสุด (null หากยังเปิดอยู่)
pricing_slot_id ID ของสล็อตราคาที่ใช้งาน (เช่น "blue", "red" หรือ "base")
multiplier ค่าตัวคูณจากสล็อตราคา
base_price_snapshot อัตราฐานรายชั่วโมงที่บันทึกไว้ ณ เวลาที่เซกเมนต์เปิด
amount ค่าใช้จ่ายที่คำนวณสำหรับเซกเมนต์นี้ (กำหนดเมื่อเซกเมนต์ปิด)
boundary_reason เหตุผลที่เซกเมนต์นี้ถูกสร้าง

ทำไมต้อง Snapshot ราคาฐาน?

base_price_snapshot บันทึกอัตราฐานรายชั่วโมง ณ เวลาที่เซกเมนต์เปิด สิ่งนี้สำคัญเพราะผู้ดูแลระบบอาจเปลี่ยนอัตราฐานระหว่างเซสชัน ด้วยการ snapshot เซกเมนต์แต่ละรายการจะใช้อัตราที่มีผลเมื่อเริ่มต้น ทำให้การเรียกเก็บเงินยุติธรรมและตรวจสอบได้

สูตรคำนวณค่าใช้จ่าย

ค่าใช้จ่ายของเซกเมนต์เดียวคำนวณดังนี้:

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

ในรายละเอียด เอนจินใช้การคำนวณจำนวนเต็มแบบ scaled เพื่อหลีกเลี่ยงข้อผิดพลาดจากจุดทศนิยม:

  1. ตัวคูณถูก scaled เป็นจำนวนเต็มจุดตรึง (คูณด้วย 1,000,000)
  2. การคำนวณดำเนินการทั้งหมดในจำนวนเต็ม 128 บิต
  3. ใช้การหารแบบปัดขึ้น ผลลัพธ์ปัดขึ้นเสมอไปยังหน่วยสกุลเงินย่อยถัดไป

การคำนวณแบบนาที

หากเปิดใช้ตัวเลือก "คำนวณตามนาที" ใน การตั้งค่า > การตั้งราคา สูตรจะเปลี่ยนเล็กน้อย:

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

โดย used_minutes = ceil(duration_seconds / 60) หมายความว่านาทีที่ไม่เต็มจะถูกนับเป็นนาทีเต็ม

การคำนวณยอดรวมเซสชัน

ค่าใช้จ่ายรวมเซสชันคำนวณใน 3 ขั้นตอน:

ขั้นตอนที่ 1: รวมเซกเมนต์ทั้งหมด

raw_total = ผลรวมของจำนวนเงินเซกเมนต์ที่ปิดทั้งหมด + จำนวนเงินบางส่วนของเซกเมนต์ที่เปิดอยู่

จำนวนเงินบางส่วนของเซกเมนต์ที่เปิดอยู่คำนวณแบบเรียลไทม์โดยใช้สูตรข้างต้น โดยใช้เวลาปัจจุบันเป็นเวลาสิ้นสุดเซกเมนต์

ขั้นตอนที่ 2: ใช้การปัดเศษ

rounded_total = round_up(raw_total, rounding_step)

การปัดเศษจะปัด ขึ้น (ceiling) เสมอเพื่อปกป้องรายได้ ขั้นตอนการปัดกำหนดค่าได้ใน การตั้งค่า > การตั้งราคา ตัวอย่างเช่น หากขั้นตอนการปัดคือ 50 (แทน 0.50 ดอลลาร์ในสกุลเงินที่มี 2 ทศนิยม) ยอดรวมดิบ 3.27 ดอลลาร์จะปัดขึ้นเป็น 3.50 ดอลลาร์

ขั้นตอนที่ 3: ใช้ค่าธรรมเนียมเริ่มต้นขั้นต่ำ

final_total = max(rounded_total, startup_fee)

ค่าธรรมเนียมเริ่มต้นคือค่าธรรมเนียมขั้นต่ำสำหรับเซสชันใดก็ตาม โดยไม่คำนึงถึงระยะเวลา หากยอดรวมที่ปัดเศษน้อยกว่าค่าธรรมเนียมเริ่มต้น จะเรียกเก็บค่าธรรมเนียมเริ่มต้นแทน

การตัดยอด

การตัดยอดคือกระบวนการสรุปการเรียกเก็บเงินสำหรับเซสชัน มีขั้นตอนการตัดยอด 2 ขั้นตอน:

การตัดยอดเริ่มต้น (จ่ายล่วงหน้าเท่านั้น)

เมื่อเซสชันจ่ายล่วงหน้าเริ่มต้น บันทึกการตัดยอด "เริ่มต้น" จะถูกสร้าง ซึ่งบันทึก:

  • ค่าใช้จ่ายที่คำนวณ ค่าใช้จ่ายที่ระบบคำนวณสำหรับเวลาที่ซื้อ
  • จำนวนเงินที่เรียกเก็บ จำนวนเงินที่ลูกค้าจ่ายจริง (โดยปกติเท่ากับค่าใช้จ่ายที่คำนวณ)

สำหรับโหมดจ่ายล่วงหน้า "ล็อกราคาตอนซื้อ" จำนวนเงินที่ล็อกไว้จะกำหนดค่าเซสชัน โดยไม่คำนึงถึงการเปลี่ยนราคาระหว่างเซสชัน

การตัดยอดหยุด

เมื่อเซสชันใดก็ตาม (จ่ายล่วงหน้าหรือจ่ายทีหลัง) หยุด บันทึกการตัดยอด "หยุด" จะถูกสร้าง:

ฟิลด์ คำอธิบาย
ค่าใช้จ่ายที่คำนวณ ยอดรวมที่ระบบคำนวณจากเซกเมนต์ราคาทั้งหมด
จำนวนเงินที่เรียกเก็บ จำนวนเงินที่เรียกเก็บจริง (ค่าเริ่มต้นเป็นค่าที่คำนวณ)
จำนวนเงินที่ปรับด้วยตนเอง หากแคชเชียร์ปรับราคาด้วยตนเอง ค่าที่คำนวณเดิมจะถูกเก็บไว้ที่นี่
อัตราค่าคอมมิชชัน อัตราค่าคอมมิชชันของวิธีการชำระเงิน (เป็นเปอร์เซ็นต์)
commission_fee จำนวนค่าคอมมิชชันที่คำนวณ
fixed_fee ค่าธรรมเนียมคงที่ของวิธีการชำระเงิน
computed_timeline_snapshot บันทึก JSON ของทุกเซกเมนต์ราคาในเซสชัน

snapshot ของไทม์ไลน์ให้เส้นทางตรวจสอบที่สมบูรณ์ แสดงวิธีการคำนวณค่าใช้จ่ายทีละเซกเมนต์

ค่าธรรมเนียมวิธีการชำระเงิน

วิธีการชำระเงินแต่ละวิธีสามารถมีค่าธรรมเนียม 2 ประเภท:

ค่าคอมมิชชัน (Basis Points)

อัตราค่าคอมมิชชันแสดงเป็นเปอร์เซ็นต์ ค่าคอมมิชชันคำนวณโดยใช้อัตรานี้กับจำนวนเงินที่เรียกเก็บ

ตัวอย่าง: หากจำนวนเงินที่เรียกเก็บคือ 10.00 ดอลลาร์ (1000 หน่วยย่อย) และวิธีการชำระเงินมีอัตราค่าคอมมิชชัน 2.5% ค่าคอมมิชชันคือ 0.25 ดอลลาร์ (25 หน่วยย่อย)

ค่าธรรมเนียมคงที่

ค่าธรรมเนียมคงที่ที่หักต่อรายการ โดยไม่คำนึงถึงจำนวนเงิน ตัวอย่างเช่น ค่าธรรมเนียมการประมวลผลบัตรเครดิต 0.30 ดอลลาร์

ค่าธรรมเนียมทั้งสองเป็นข้อมูลเชิงอ้างอิง แสดงต้นทุนของธุรกิจในการรับวิธีการชำระเงินนั้น ค่าธรรมเนียมถูกบันทึกในการตัดยอดแต่ไม่ถูกเพิ่มเข้าบิลของลูกค้า

VAT (ภาษีมูลค่าเพิ่ม)

VAT กำหนดค่าเป็นเปอร์เซ็นต์ (0-100%) ใน การตั้งค่า > การตั้งราคา และคำนวณเพิ่มจากจำนวนเงินเซสชันที่คำนวณ:

VAT = จำนวนเงินที่เรียกเก็บ x (อัตรา VAT / 100)

จำนวน VAT แสดงแยกในหน้าต่างชำระเงินเพื่อให้แคชเชียร์เห็นรายละเอียดภาษี

โหมดราคาจ่ายล่วงหน้า

ตามที่อธิบายใน การจัดการเซสชัน เซสชันจ่ายล่วงหน้ารองรับโหมดราคา 2 โหมด:

ล็อกราคาตอนซื้อ

เมื่อเซสชันจ่ายล่วงหน้าเริ่ม การตัดยอด "เริ่มต้น" จะล็อกจำนวนเงินที่เรียกเก็บ ตลอดระยะเวลาเซสชัน:

  • เวลาสิ้นสุดเซสชันถูกกำหนดตามนาทีที่ซื้อ
  • แม้ว่าตารางราคาจะเปลี่ยน เซสชันจะดำเนินต่อจนกว่าเวลาที่ล็อกจะหมด
  • การตัดยอดหยุดใช้จำนวนเงินที่ล็อกจากการตัดยอดเริ่มต้น

ตารางราคาแบบเรียลไทม์

เวลาที่เหลือของเซสชันจะถูกคำนวณใหม่อย่างต่อเนื่องเมื่อสล็อตราคาเปลี่ยน:

  • หากเซสชันเข้าสู่สล็อตที่ถูกกว่า เวลาที่เหลือจะยืดออก (ลูกค้าได้นาทีมากขึ้นต่อเงินที่จ่าย)
  • หากเซสชันเข้าสู่สล็อตที่แพงกว่า เวลาที่เหลือจะหดลง
  • การตัดยอดหยุดสะท้อนราคาจริงที่ใช้ตลอดเซสชัน

จำนวนทศนิยม

จำนวนทศนิยมที่ใช้สำหรับแสดงสกุลเงินสามารถกำหนดค่าได้ (2-4 ทศนิยม) ค่านี้ส่งผลต่อการแสดงจำนวนเงินใน UI แต่ไม่เปลี่ยนการคำนวณหน่วยย่อยภายใน

ตัวอย่าง: ด้วย 2 ทศนิยม จะแสดงเป็น "3.50" ด้วย 3 ทศนิยม จะแสดงเป็น "3.500"

ตัวอย่างจริง

ตัวอย่างที่ 1: เซสชันจ่ายทีหลังแบบง่าย

  • อัตราฐาน: 3.00 ดอลลาร์/ชั่วโมง (300 หน่วยย่อย)
  • ตาราง: สล็อตปกติ (ตัวคูณ 1.0) ตลอดทั้งวัน
  • เซสชัน: 10:00 น. ถึง 11:30 น. (90 นาที)
  • ค่าธรรมเนียมเริ่มต้น: 0.50 ดอลลาร์

การคำนวณ:

เซกเมนต์ 1: (300 * 1.0 * 5400) / 3600 = 450 หน่วยย่อย (4.50 ดอลลาร์)
ยอดรวม: max(4.50 ดอลลาร์, 0.50 ดอลลาร์) = 4.50 ดอลลาร์

ตัวอย่างที่ 2: เซสชันข้าม 2 สล็อต

  • อัตราฐาน: 4.00 ดอลลาร์/ชั่วโมง (400 หน่วยย่อย)
  • ตาราง: ปกติ (1.0) จาก 10:00-12:00, Happy Hour (0.5) จาก 12:00-14:00
  • เซสชัน: 11:00 น. ถึง 13:00 น. (120 นาที)
  • ค่าธรรมเนียมเริ่มต้น: 1.00 ดอลลาร์

การคำนวณ:

เซกเมนต์ 1 (11:00-12:00, ปกติ): (400 * 1.0 * 3600) / 3600 = 400 (4.00 ดอลลาร์)
เซกเมนต์ 2 (12:00-13:00, happy hour): (400 * 0.5 * 3600) / 3600 = 200 (2.00 ดอลลาร์)
ยอดรวม: 4.00 ดอลลาร์ + 2.00 ดอลลาร์ = 6.00 ดอลลาร์
สุดท้าย: max(6.00 ดอลลาร์, 1.00 ดอลลาร์) = 6.00 ดอลลาร์

ตัวอย่างที่ 3: เซสชันที่มีการหยุดชั่วคราว

  • อัตราฐาน: 2.00 ดอลลาร์/ชั่วโมง (200 หน่วยย่อย)
  • ตาราง: สล็อตปกติ (ตัวคูณ 1.0) ตลอดทั้งวัน
  • เซสชัน: เริ่ม 10:00, หยุดชั่วคราว 10:30, เล่นต่อ 11:00, หยุด 11:45
  • ค่าธรรมเนียมเริ่มต้น: 0.50 ดอลลาร์

การคำนวณ:

เซกเมนต์ 1 (10:00-10:30, ใช้งาน): (200 * 1.0 * 1800) / 3600 = 100 (1.00 ดอลลาร์)
ช่วงหยุดชั่วคราว (10:30-11:00): ไม่มีค่าใช้จ่าย
เซกเมนต์ 2 (11:00-11:45, ใช้งาน): (200 * 1.0 * 2700) / 3600 = 150 (1.50 ดอลลาร์)
ยอดรวม: 1.00 ดอลลาร์ + 1.50 ดอลลาร์ = 2.50 ดอลลาร์
สุดท้าย: max(2.50 ดอลลาร์, 0.50 ดอลลาร์) = 2.50 ดอลลาร์

ขั้นตอนถัดไป