ไอเดีย #3: ระบบจองห้องประชุมในบริษัท
"ห้องนี้ผมจองไว้แล้วนะ" ประโยคนี้น่าจะเคยได้ยินกันในหลายออฟฟิศ บางที่ใช้กระดาษแปะหน้าห้อง บางที่ใช้ไฟล์ตารางแชร์กัน แต่ก็ยังมีคนจองทับ ลืมยกเลิก หรือจองห้องใหญ่ไว้ทั้งวันแต่ใช้จริงแค่ชั่วโมงเดียว คนที่ลำบากที่สุดคือฝ่ายธุรการที่ต้องคอยไกล่เกลี่ย ระบบจองห้องประชุมจึงเป็นโปรเจกต์ที่เล็กพอสำหรับมือใหม่ และมีคนอยากใช้จริงแน่นอน
ใครจะใช้
- พนักงานทั่วไป — ดูว่าห้องไหนว่าง แล้วจองเวลาที่ต้องการ
- หัวหน้าหรือฝ่ายธุรการ — อนุมัติการจองห้องที่ต้องขออนุญาต เช่น ห้องประชุมใหญ่หรือห้องผู้บริหาร
- ผู้ดูแลระบบ — จัดการข้อมูลห้อง อุปกรณ์ในห้อง และสิทธิ์ผู้ใช้
ฟีเจอร์ขั้นต่ำ (MVP)
- จัดการข้อมูลห้อง ได้แก่ ชื่อห้อง ความจุ อุปกรณ์ เช่น โปรเจกเตอร์หรือจอสำหรับประชุมออนไลน์
- หน้าปฏิทินแสดงการจองรายวันและรายสัปดาห์ แยกสีตามห้อง ใช้ไลบรารีปฏิทินฝั่ง JavaScript ได้
- ฟอร์มจองห้อง ระบุหัวข้อ เวลาเริ่ม เวลาสิ้นสุด และจำนวนผู้เข้าร่วม
- ตรวจสอบเวลาชนกัน ห้องเดียวกันห้ามมีช่วงเวลาซ้อนทับ
- ขั้นตอนอนุมัติสำหรับห้องที่กำหนด สถานะ รออนุมัติ / อนุมัติ / ไม่อนุมัติ / ยกเลิก
- แจ้งเตือนผู้จองเมื่อได้รับการอนุมัติ และเตือนก่อนเริ่มประชุม ผ่านอีเมลหรือ LINE
- ผู้จองยกเลิกการจองของตัวเองได้ เพื่อคืนห้องให้คนอื่น
ต่อยอดได้อีก
- การจองแบบประจำ เช่น ประชุมทีมทุกวันจันทร์ 9 โมง
- จอแท็บเล็ตหน้าห้องแสดงสถานะว่าง/ไม่ว่าง และให้กดยืนยันเข้าใช้ ถ้าไม่ยืนยันภายในเวลาที่กำหนดให้ปล่อยห้องอัตโนมัติ
- ขอจัดเลี้ยงอาหารว่างหรืออุปกรณ์เพิ่มเติมไปพร้อมกับการจอง
- รายงานอัตราการใช้ห้อง เพื่อดูว่าห้องไหนแน่นหรือห้องไหนแทบไม่มีใครใช้
โครงข้อมูลตั้งต้น
rooms— id, name, capacity, equipment, need_approval, is_activeusers— id, name, email, department, rolebookings— id, room_id, user_id, title, start_at, end_at, attendees, statusbooking_approvals— id, booking_id, approver_id, action, comment, created_at
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ มือใหม่ ทำได้ด้วย Yii2 หรือ Laravel คู่กับ MySQL หรือ PostgreSQL ส่วนหน้าปฏิทินเลือกไลบรารีปฏิทินโอเพนซอร์สที่ถนัด จุดที่จะได้ฝึกจริงจังคือ
- เงื่อนไขช่วงเวลาซ้อนทับ คือ start_at ของใหม่น้อยกว่า end_at ของเดิม และ end_at ของใหม่มากกว่า start_at ของเดิม
- การส่งข้อมูลเป็น JSON ให้ปฏิทินฝั่งหน้าเว็บ
- การออกแบบ workflow สถานะ และการเก็บประวัติการอนุมัติ
- การตั้ง cron ส่งแจ้งเตือนล่วงหน้า
ข้อควรระวัง
- Race condition ถ้าสองคนกดจองช่วงเวลาเดียวกันพร้อมกัน การเช็กใน PHP อย่างเดียวไม่พอ ควรใช้ transaction ร่วมกับการล็อกแถว หรือใน PostgreSQL ใช้ exclusion constraint กันไว้ที่ฐานข้อมูล
- เรื่อง timezone ตั้งค่าให้ตรงกันทั้งเซิร์ฟเวอร์ ฐานข้อมูล และแอป ไม่อย่างนั้นการจองจะเลื่อนไปทีละ 7 ชั่วโมง
- สิทธิ์การยกเลิกและแก้ไข ต้องเช็กว่าเป็นเจ้าของการจองหรือผู้ดูแลจริง
ออฟฟิศของเพื่อน ๆ ตอนนี้จองห้องประชุมกันแบบไหน ใช้ได้ดีหรือมีปัญหาอะไรบ้าง แล้วถ้าทำระบบนี้เอง จะจัดการเรื่องคนจองแล้วไม่มาใช้อย่างไร ใครทำเสร็จแล้วเอามาโชว์หรือขอคำแนะนำในกระทู้นี้ได้เลยครับ