ไอเดีย #5: ระบบรับสมัครกิจกรรม/อีเวนต์ พร้อมตั๋ว QR
เคยเป็นทีมงานหน้างานอีเวนต์ไหมครับ ผู้เข้าร่วมต่อแถวยาว ทีมงานถือรายชื่อที่พิมพ์ออกมาหลายแผ่น ไล่หาชื่อทีละคน บางคนสมัครผ่านฟอร์มออนไลน์ไว้สองรอบ บางคนบอกว่าสมัครแล้วแต่หาไม่เจอ แถมที่นั่งที่ประกาศไว้จำกัดก็มีคนสมัครเกินมาเพราะไม่มีใครปิดฟอร์มทัน ไม่ว่าจะเป็นงานวิ่ง เวิร์กช็อป หรืองานสัมมนาของชมรม ระบบรับสมัครพร้อมตั๋ว QR ช่วยให้วันงานราบรื่นขึ้นมาก
ใครจะใช้
- ผู้จัดงาน — สร้างอีเวนต์ กำหนดโควตา และดูรายชื่อผู้สมัคร
- ผู้สมัคร — กรอกฟอร์มสมัคร รับตั๋ว และแสดงตั๋วตอนเข้างาน
- ทีมงานหน้างาน (staff) — สแกนตั๋วเพื่อเช็กอินผ่านมือถือ
ฟีเจอร์ขั้นต่ำ (MVP)
- สร้างอีเวนต์ ระบุชื่องาน สถานที่ วันเวลา รายละเอียด และวันปิดรับสมัคร
- ฟอร์มสมัครที่ผู้จัดกำหนดช่องเพิ่มเติมได้ เช่น ไซซ์เสื้อ หรืออาหารที่แพ้
- โควตาที่นั่ง ปิดรับอัตโนมัติเมื่อเต็ม และมีรายชื่อสำรองให้เลือกเปิดใช้
- ออกตั๋วพร้อม QR Code ที่มีรหัสสุ่มยาวพอเดาไม่ได้ ส่งทางอีเมลและดูได้ในหน้าเว็บ
- หน้าเช็กอินสำหรับ staff สแกน QR ด้วยกล้องมือถือ แสดงชื่อและสถานะทันที
- กันการเช็กอินซ้ำ ตั๋วที่ใช้แล้วต้องขึ้นเตือนพร้อมเวลาที่เช็กอินครั้งแรก
- แดชบอร์ดผู้จัด แสดงยอดสมัคร ยอดเช็กอิน และ export รายชื่อเป็น Excel
ต่อยอดได้อีก
- อีเวนต์แบบเสียเงิน รับชำระผ่าน PromptPay QR และแนบสลิปให้ผู้จัดตรวจ หรือเชื่อม payment gateway
- ตั๋วหลายประเภท เช่น Early Bird ตั๋วนักศึกษา แต่ละแบบมีโควตาแยก
- ส่งตั๋วและข้อความเตือนก่อนวันงานผ่าน LINE OA
- ออกใบประกาศนียบัตรเป็น PDF ให้คนที่เช็กอินจริง
โครงข้อมูลตั้งต้น
events— id, organizer_id, title, venue, start_at, capacity, close_at, statusevent_fields— id, event_id, label, field_type, is_required, sort_orderregistrations— id, event_id, full_name, email, phone, answers (JSON), status, created_attickets— id, registration_id, ticket_code, checked_in_at, checked_in_by
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ มือใหม่ แต่ได้เจอโจทย์ที่ใช้จริงในงานลูกค้าหลายอย่าง เขียนด้วย Yii2 หรือ Laravel กับ PostgreSQL หรือ MySQL ส่วนการสแกนใช้ไลบรารีอ่าน QR ฝั่ง JavaScript ผ่านกล้องในเบราว์เซอร์ สิ่งที่จะได้เรียนรู้
- การนับโควตาให้ถูกต้องเมื่อมีคนสมัครพร้อมกันจำนวนมาก
- การเก็บคำตอบฟอร์มแบบยืดหยุ่นด้วยคอลัมน์ JSON
- การสร้าง QR และส่งอีเมลผ่าน queue แทนการส่งตรงในคำขอ
- การทำหน้าเว็บที่ใช้กล้องมือถือ
ข้อควรระวัง
- Race condition ตอนที่นั่งใกล้เต็ม ถ้าเช็กยอดแล้วค่อย insert แยกกัน อาจได้ผู้สมัครเกินโควตา ควรล็อกแถวของอีเวนต์ใน transaction ก่อนนับ
- รหัสตั๋วห้ามเป็นเลขเรียงต่อกัน ไม่อย่างนั้นใครก็เดารหัสตั๋วของคนอื่นได้
- ชื่อ เบอร์โทร และข้อมูลการแพ้อาหารเป็นข้อมูลส่วนบุคคลตาม PDPA บางอย่างอาจเข้าข่ายข้อมูลสุขภาพ ควรขอความยินยอม แจ้งวัตถุประสงค์ และกำหนดเวลาลบหลังจบงาน
ใครเคยดูแลระบบลงทะเบียนวันงานจริงบ้าง วันนั้นเจอปัญหาอะไรหน้างานที่ไม่ได้คิดไว้ก่อน เช่น เน็ตล่ม หรือมือถือ staff แบตหมด และถ้าเป็นคุณจะออกแบบให้เช็กอินแบบออฟไลน์ได้อย่างไร มาแลกเปลี่ยนและโพสต์ผลงานกันในกระทู้นี้ได้เลยครับ