استرداد حجز
نظرة عامة
يوضح هذا الدليل كيفية التعامل مع طلبات إلغاء الحجوزات واسترداد المبالغ.
:::info نموذج الدفع شام باص يعمل بنظام الدفع النقدي فقط. لا توجد مدفوعات إلكترونية حالياً. :::
حالات الحجز
| الحالة | الوصف | قابل للإلغاء |
|---|---|---|
pending | بانتظار التأكيد | نعم |
confirmed | مؤكد | نعم (بشروط) |
cancelled | ملغي | لا |
completed | مكتمل | لا |
no_show | لم يحضر | لا |
سياسة الإلغاء
الإلغاء قبل 24 ساعة
- استرداد كامل المبلغ
- لا رسوم إلغاء
الإلغاء قبل 12 ساعة
- استرداد 75% من المبلغ
- 25% رسوم إلغاء
الإلغاء قبل 6 ساعات
- استرداد 50% من المبلغ
- 50% رسوم إلغاء
الإلغاء قبل أقل من 6 ساعات
- لا استرداد
- 100% رسوم إلغاء
خطوات الإلغاء
1. البحث عن الحجز
SELECT
b.*,
t.departure_time,
t.origin_city_name,
t.destination_city_name,
p.phone as passenger_phone
FROM bookings b
JOIN trips t ON t.id = b.trip_id
JOIN passengers p ON p.id = b.passenger_id
WHERE b.booking_code = 'SB-XXXXXX';
2. حساب مبلغ الاسترداد
SELECT
b.total_amount,
t.departure_time,
EXTRACT(EPOCH FROM (t.departure_time - NOW())) / 3600 as hours_until_departure,
CASE
WHEN EXTRACT(EPOCH FROM (t.departure_time - NOW())) / 3600 >= 24 THEN b.total_amount
WHEN EXTRACT(EPOCH FROM (t.departure_time - NOW())) / 3600 >= 12 THEN b.total_amount * 0.75
WHEN EXTRACT(EPOCH FROM (t.departure_time - NOW())) / 3600 >= 6 THEN b.total_amount * 0.50
ELSE 0
END as refund_amount
FROM bookings b
JOIN trips t ON t.id = b.trip_id
WHERE b.booking_code = 'SB-XXXXXX';
3. تنفيذ الإلغاء
UPDATE bookings
SET
status = 'cancelled',
cancelled_at = NOW(),
cancellation_reason = 'سبب الإلغاء',
refund_amount = calculated_refund,
cancelled_by = 'user_type' -- 'passenger', 'company', 'admin'
WHERE booking_code = 'SB-XXXXXX';
4. تحديث المقاعد
UPDATE seats
SET
status = 'available',
booking_id = NULL
WHERE booking_id = 'booking_id';
5. إشعار العميل
يتم إرسال إشعار تلقائي عبر WhatsApp يتضمن:
- تأكيد الإلغاء
- مبلغ الاسترداد
- طريقة استلام المبلغ
حالات خاصة
إلغاء بسبب الشركة
إذا ألغت الشركة الرحلة:
- استرداد كامل 100%
- لا رسوم على العميل
UPDATE bookings
SET
status = 'cancelled',
cancelled_at = NOW(),
cancellation_reason = 'إلغاء الرحلة من قبل الشركة',
refund_amount = total_amount,
cancelled_by = 'company'
WHERE trip_id = 'cancelled_trip_id';
إلغاء جماعي
لإلغاء جميع حجوزات رحلة:
UPDATE bookings
SET
status = 'cancelled',
cancelled_at = NOW(),
cancellation_reason = 'إلغاء الرحلة',
refund_amount = total_amount,
cancelled_by = 'admin'
WHERE trip_id = 'trip_id'
AND status IN ('pending', 'confirmed');
التحقق والتدقيق
التحقق من الإلغاء
SELECT * FROM bookings
WHERE booking_code = 'SB-XXXXXX';
سجل التدقيق
SELECT * FROM audit_log
WHERE entity_type = 'booking'
AND action = 'cancel'
ORDER BY created_at DESC
LIMIT 10;