ไอเดีย #33: ระบบจองคอร์ส/คลาสเรียนพิเศษ
“ซื้อแพ็กเกจ 20 ชั่วโมงไปแล้ว เรียนไปกี่ชั่วโมงแล้วนะ” เป็นคำถามที่ครูสอนพิเศษและเจ้าของสถาบันกวดวิชาเล็ก ๆ ได้ยินแทบทุกสัปดาห์ ผู้ปกครองจำไม่ได้ ครูก็นับจากสมุดที่เขียนด้วยมือ พอมีเลื่อนคลาส ชดเชยคลาส หรือเปลี่ยนครู ตัวเลขก็เริ่มไม่ตรงกัน ทั้งที่ธุรกิจสอนพิเศษ สอนดนตรี สอนว่ายน้ำ มีอยู่ทุกอำเภอ ระบบจองคอร์สที่เข้าใจเรื่องรอบเรียนและชั่วโมงคงเหลือจึงมีคนรอใช้อยู่จริง
ใครจะใช้
- ผู้เรียนหรือผู้ปกครอง — ดูตารางว่าง จองรอบ เช็กชั่วโมงคงเหลือ
- ครูผู้สอน — ดูตารางสอนของตัวเอง เช็กชื่อผู้เรียนในแต่ละรอบ
- เจ้าของหรือแอดมินสถาบัน — สร้างคอร์ส แพ็กเกจ รอบเรียน และดูรายได้
ฟีเจอร์ขั้นต่ำ (MVP)
- สร้างคอร์สและรอบเรียน (session) กำหนดวัน เวลา ครู ห้อง และจำนวนที่นั่ง
- ขายแพ็กเกจแบบนับชั่วโมงหรือนับครั้ง มีวันหมดอายุ
- ผู้เรียนจองรอบที่ยังว่าง ระบบตัดที่นั่งและกันจองเกิน
- เช็กชื่อหลังเรียน แล้วหักชั่วโมงจากแพ็กเกจอัตโนมัติ
- ยกเลิกหรือเลื่อนรอบตามกติกา เช่น แจ้งล่วงหน้าอย่างน้อยกี่ชั่วโมงจึงคืนชั่วโมงให้
- หน้าสรุปชั่วโมงคงเหลือของผู้เรียนแต่ละคน ดูประวัติการใช้ย้อนหลังได้
ต่อยอดได้อีก
- แจ้งเตือนผู้ปกครองผ่าน LINE ก่อนถึงคลาสและเมื่อชั่วโมงใกล้หมด
- ชำระค่าแพ็กเกจผ่าน PromptPay QR แล้วแนบสลิปให้แอดมินยืนยัน
- ระบบ waitlist เมื่อรอบเต็ม มีคนยกเลิกก็เลื่อนคิวถัดไปขึ้นมา
- คำนวณค่าสอนครูตามจำนวนชั่วโมงที่สอนจริงในแต่ละเดือน
โครงข้อมูลตั้งต้น
courses— id, name, description, default_duration_minsessions— id, course_id, teacher_id, room, start_at, end_at, capacitypackages— id, student_id, course_id, total_hours, expires_onbookings— id, session_id, student_id, package_id, status, attendedhour_ledger— id, package_id, booking_id, delta_hours, reason, created_at
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ ปานกลาง ฝั่งหลังบ้านใช้ Yii2 หรือ Laravel + PostgreSQL/MySQL ส่วนฝั่งผู้ปกครองอาจทำเป็นเว็บมือถือหรือแอป Flutter สิ่งที่จะได้ฝึก:
- แนวคิด ledger คือไม่เก็บชั่วโมงคงเหลือเป็นตัวเลขเดียว แต่เก็บทุกการเพิ่มลดแล้วรวมเอา ทำให้ตรวจย้อนได้
- การกันจองเกินที่นั่งด้วย transaction และ row lock
- การแสดงปฏิทินรายสัปดาห์ด้วยไลบรารีปฏิทินฝั่ง JavaScript
- การเขียนกติกาธุรกิจ (business rule) ให้แก้ไขได้โดยไม่ต้องแก้โค้ด
ข้อควรระวัง
- ถ้าสองคนกดจองที่นั่งสุดท้ายพร้อมกัน ต้องมี race condition handling ไม่อย่างนั้นห้องจะเกินจำนวน
- ผู้เรียนส่วนใหญ่เป็นเด็ก ข้อมูลชื่อ โรงเรียน เบอร์ผู้ปกครองอยู่ภายใต้ PDPA ควรขอความยินยอมให้ชัดและจำกัดสิทธิ์ครูให้เห็นเฉพาะนักเรียนของตัวเอง
- กติกาคืนชั่วโมงและแพ็กเกจหมดอายุควรเขียนให้ผู้ปกครองเห็นก่อนซื้อ จะได้ไม่มีข้อพิพาทภายหลัง
มีใครเคยทำระบบให้โรงเรียนสอนพิเศษหรือสถาบันดนตรีบ้างไหมครับ เจอเคสชดเชยคลาสแบบไหนที่ทำให้ปวดหัวที่สุด แล้วถ้าเป็นคุณจะออกแบบแพ็กเกจแบบนับครั้งหรือนับชั่วโมง มาแลกเปลี่ยนกันในกระทู้นี้ และถ้าใครลงมือทำแล้วอย่าลืมเอามาแชร์ในบอร์ดนี้นะครับ