การตั้งราคาเซสชัน
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.0 (ปกติ), 0.5 (ราคาครึ่งหนึ่ง), 1.5 (บวก 50%), 2.0 (ราคาสองเท่า) ตัวคูณต้องเป็นศูนย์หรือค่าบวก
- ข้อมูลตาราง การแสดงภายในที่กำหนดว่าสล็อตใช้ในชั่วโมงและวันใด ระบบจัดการโดยอัตโนมัติผ่านกริดตาราง
สล็อตสามารถเปิดหรือปิดใช้งานได้ทีละอัน สล็อตที่ปิดใช้งานจะถูกเพิกเฉยโดยเอนจินราคา
กริดตาราง
ตารางราคาเป็น เมทริกซ์ 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 เพื่อหลีกเลี่ยงข้อผิดพลาดจากจุดทศนิยม:
- ตัวคูณถูก scaled เป็นจำนวนเต็มจุดตรึง (คูณด้วย 1,000,000)
- การคำนวณดำเนินการทั้งหมดในจำนวนเต็ม 128 บิต
- ใช้การหารแบบปัดขึ้น ผลลัพธ์ปัดขึ้นเสมอไปยังหน่วยสกุลเงินย่อยถัดไป
การคำนวณแบบนาที
หากเปิดใช้ตัวเลือก "คำนวณตามนาที" ใน การตั้งค่า > การตั้งราคา สูตรจะเปลี่ยนเล็กน้อย:
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 ดอลลาร์
ขั้นตอนถัดไป
- การจัดการเซสชัน: เรียนรู้วงจรชีวิตเซสชันทั้งหมด
- การตั้งค่า: การตั้งราคา: กำหนดค่าอัตราฐาน การปัดเศษ และค่าธรรมเนียมเริ่มต้น
- การตั้งค่า: ตารางราคา: ตั้งค่ากริดตาราง 7x24
- วิธีการชำระเงิน: กำหนดค่าวิธีการชำระเงินพร้อมค่าคอมมิชชันและค่าธรรมเนียม