مقدمة: ما هو نظام الحجوزات؟
نظام الحجوزات Booking System هو نظام يسمح:
- للعميل بحجز موعد
- لصاحب الخدمة بإدارة الأوقات
- للسيستم بمنع التداخل في الحجوزات (Conflict Detection)
- بتتبع المواعيد، التوقيت، الحالة، الدفع، بيانات العميل
- بتوليد تقارير
- بإرسال تنبيهات
- ومعالجة الـ Validation على التواريخ بدقة
النظام يُستخدم في:
- العيادات
- الصالونات
- خدمات السيارات
- المطاعم
- التدريب
- صالات الرياضة
- الحجوزات الفندقية
- وحتى حجوزات غرف الاجتماعات في الشركات
هذا مشروع ضخم… ورح نبنيه خطوة بخطوة.
القسم الأول: تحليل النظام (System Analysis)
قبل البرمجة لازم نعرف:
1) من هم المستخدمون؟
- العميل (Customer)
- مدير النظام (Admin)
- الموظف (Staff)
2) ما الذي يمكن لكل مستخدم فعله؟
العميل:
- إنشاء حساب
- حجز موعد
- تعديل الموعد
- إلغاء الموعد
- عرض حجوزاته الحالية
- البحث عن مواعيد فارغة
الأدمن:
- إدارة المستخدمين
- إضافة خدمات (Service: قص شعر، فحص، موعد…)
- تحديد أوقات الدوام
- إدارة جميع الحجوزات
- عرض التقارير الشهرية
الموظف:
- رؤية جدول اليوم
- تأكيد مواعيد
- إلغاء مواعيد
- تسجيل وصول العميل
القسم الثاني: تصميم قاعدة البيانات (Database Design)
نظام الحجوزات فيها 4 جداول أساسية:
1) جدول العملاء (Users)
| الحقل | النوع | التفاصيل |
|---|---|---|
| id | INT | المفتاح الأساسي |
| name | VARCHAR | اسم العميل |
| phone | VARCHAR | رقم الهاتف |
| VARCHAR | البريد | |
| password | VARCHAR | كلمة المرور |
| created_at | DATETIME | تاريخ التسجيل |
2) جدول الخدمات (Services)
| الحقل | النوع |
|---|---|
| id | INT |
| name | VARCHAR |
| duration | INT (minutes) |
| price | DOUBLE |
| active | BOOL |
3) جدول الحجوزات (Bookings)
| الحقل | النوع | الوصف |
|---|---|---|
| id | INT | معرف الحجز |
| user_id | INT | صاحب الحجز |
| service_id | INT | نوع الخدمة |
| date | DATE | يوم الحجز |
| start_time | TIME | بداية الموعد |
| end_time | TIME | نهاية الموعد |
| status | ENUM | (pending / confirmed / canceled / completed) |
| created_at | DATETIME | وقت الإنشاء |
4) جدول أوقات العمل (Working_Hours)
| الحقل | النوع |
|---|---|
| id | INT |
| day | VARCHAR (Mon…Sun) |
| open_time | TIME |
| close_time | TIME |
| break_start | TIME (optional) |
| break_end | TIME |
القسم الثالث: منطق النظام (Business Logic)
وهنا القوة الحقيقية.
المنطق العام:
عند إنشاء حجز:
- تأكد أن اليوم ضمن جدول العمل
- تأكد أن الوقت ضمن نطاق الدوام
- احسب مدة الخدمة
- حدّد نهاية الموعد
- ابحث عن أي حجز متداخل
- إذا فيه تضارب → رفض
- إذا ما فيه → تسجيل الحجز
- إرسال إشعار للعميل
القسم الرابع: منطق منع التداخل (Conflict Detection)
هذه أصعب نقطة بالنظام.
لو عندك موعد جديد:
start1 --- end1
start2 --- end2
التداخل يحدث لو:
start1 < end2 && start2 < end1
هذه القاعدة الذهبية.
مثال:
- موعد موجود: 10:00 → 11:00
- موعد جديد: 10:30 → 11:15
10:30 < 11:00 ✓
10:00 < 11:15 ✓
إذن يوجد تضارب.
القسم الخامس: واجهة المستخدم (UI/UX)
العميل:
- صفحة اختيار خدمة
- عرض المواعيد المتاحة
- التقويم Calendar View
- صفحة تأكيد الموعد
الأدمن:
- لوحة تحكم
- قائمة الخدمات
- قائمة الحجوزات
- جدول اليوم
- احصائيات شهرية
الموظف:
- Today’s Bookings
- زر “تم الحضور”
- زر “إلغاء”
القسم السادس: الخوارزمية الكاملة لإنشاء حجز
- استلام طلب العميل
- جلب خدمة الخدمة
- حساب end_time = start_time + duration
- التحقق من أن:
- الموعد داخل ساعات العمل
- لا يوجد تضارب مع حجوزات أخرى
- تسجيل الموعد
- إعادة ID الحجز
- إرسال رسالة SMS/Email
- تسجيل العملية في النظام Log
القسم السابع: مثال عملي (Case Study)
العميل يريد حجز قص شعر مدة 30 دقيقة
- الخدمة = HairCut
- المدة = 30 دقيقة
- اليوم = 2025-02-10
- الوقت = 15:00
النظام يحسب:
end_time = 15:30
ما المطلوب من النظام فعله؟
- هل يوم الاثنين مفتوح؟
- هل الموظف متاح بهذا الوقت؟
- هل يوجد فاصل غداء؟
- هل يوجد موعد آخر بين:
15:00 → 15:30
لو وجد موعد مثل:
14:45 → 15:20
فهذا تضارب → reject booking.
لو كل شيء تمام → system inserts booking.
القسم الثامن: كود عملي بلغة C++ (منطق التحقق)
bool isConflict(vector<Booking> bookings,
Time newStart, Time newEnd) {
for (auto &b : bookings) {
if (!(newEnd <= b.start || newStart >= b.end)) {
return true; // يوجد تضارب
}
}
return false;
}
القسم التاسع: مثال أكبر: نظام حجوزات كامل (C++ Pseudo Code)
struct Booking {
string user;
string service;
string date;
Time start;
Time end;
};
class BookingSystem {
private:
vector<Booking> allBookings;
public:
bool book(string user, string service, string date,
Time start, int duration) {
Time end = start.addMinutes(duration);
for (auto &b : allBookings) {
if (b.date == date) {
if (!(end <= b.start || start >= b.end)) {
cout << "Conflict!\n";
return false;
}
}
}
allBookings.push_back({ user, service, date, start, end});
cout << "Booking created.\n";
return true;
}
};
القسم العاشر: ميزات إضافية يمكن إضافتها للنظام
1) نظام الدفع الإلكتروني
- PayPal
- Stripe
- Cash on arrival
2) نظام إرسال رسائل التذكير
- SMS قبل الموعد بـ 24 ساعة
- Email قبل الموعد بـ 2 ساعة
3) لوحة تقارير متقدمة
- عدد الحجوزات اليومية
- عدد الحجوزات الملغاة
- أوقات الذروة
- أكثر خدمة مطلوبة
4) نظام تقييم العملاء
- تقييم الخدمة
- تقييم الموظف
5) دعم الحجوزات المتكررة
مثل:
كل يوم اثنين | الساعة 10 | لمدة 6 أسابيع
6) دعم سعة الغرف (Room Capacity)
مثال: غرفة تستقبل 5 أشخاص بالحجز الواحد.
7) دعم الموظفين
- كل موظف له جدول خاص
- لا يجوز حجز موظف في نفس الوقت مرتين
القسم الحادي عشر: الأخطاء الشائعة في تصميم أنظمة الحجوزات
❌ الحساب اليدوي للوقت بدون التحقق من منطقة الزمن
❌ استخدام DateTime بدون Timezone → كارثة
❌ قبول حجوزات متداخلة بدون قصد
❌ عدم استخدام indexing مناسب في قاعدة البيانات
❌ عدم التحقق من ساعات العمل
❌ عدم توحيد تنسيق التاريخ والوقت
❌ السماح للعميل بحجز في الماضي
❌ عدم إغلاق الحجوزات الغير مؤكدة
❌ عدم وجود حالة للحجز (pending/confirmed)
القسم الثاني عشر: ما الذي يجعل نظام الحجوزات قويًا؟
✔ سريع
✔ يمنع التضارب 100%
✔ يدعم TimeZone
✔ يدعم خدمات متعددة
✔ يدعم موظفين متعددين
✔ وجود API
✔ تقارير دقيقة
✔ سهولة الاستخدام
القسم الثالث عشر: تطبيقات واقعية لنظامك
نظامك يمكن استخدامه لـ:
- عيادة أسنان
- نظام حجز جلسات تصوير
- حجز غرفة اجتماعات
- نظام حجز فندق
- جدول مدرب رياضة
- حجوزات سيارات أو صيانة
- نظام حجوزات صالون رجالي / نسائي
- حجوزات كورسات أو دورات
- حجوزات كومبوتر لاب في مدرسة
كلها نفس المنطق… فقط تتغير البيانات.
الخلاصة النهائية
اليوم تعلمت:
✔ تحليل نظام حجوزات كامل
✔ تصميم قاعدة بيانات كاملة
✔ إدارة العملاء والخدمات
✔ حساب الوقت والمدة
✔ اكتشاف تضارب المواعيد
✔ كتابة خوارزمية الحجز
✔ بناء كود C++ كامل
✔ تصميم UI للعميل والأدمن
✔ الميزات الإضافية المتقدمة
✔ الأخطاء الشائعة وكيف تتجنبها
✔ كيف تجعل نظامك احترافي على مستوى عالمي
اكتشاف المزيد من كود التطور
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.


