-- 2026_08_07_driver_cancel_compensation.sql -- -- ‏تعويض السائق عند عدم حضور الراكب (إلغاء السائق بعد الوصول والانتظار). -- ‏النموذج: التعويض = مسافة الاقتراب إلى الراكب × سعر الكيلومتر لنوع السيارة -- ‏ + دقائق الانتظار الفعلية × سعر الدقيقة حسب وقت اليوم. -- ‏يُخصم من محفظة الراكب ويُضاف لمحفظة السائق. الأسعار من kazan نفسه الذي -- ‏تُسعَّر به الرحلة، عبر ride/pricing/pricing_helper.php. -- -- ‏يستبدل هذا الملف مقاربة "الرسم الثابت" السابقة: المبلغ لم يعد يُقرأ من -- ‏طلب العميل (كان filterRequest("penalty_fee") بلا سقف ولا تحقق)، ولم يعد -- ‏رقماً ثابتاً — صار محسوباً من بيانات مسجَّلة على الخادم. -- -- ⚠️ ‏هذا الملف لقاعدة primary (jorSiroDB) حصراً. الملف التوأم _ride.sql يُنفَّذ على قاعدة الرحلات (intaleq-ridesDB). -- ══════════════════════════════════════════════════════════════ -- ١) سياسة التعويض لكل دولة (قاعدة primary فقط — kazan يُقرأ عبر $con) -- ══════════════════════════════════════════════════════════════ ALTER TABLE `kazan` ADD COLUMN `cancelCompensationCap` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT 'سقف تعويض عدم حضور الراكب بعملة الدولة. 0 = التعويض معطّل بالكامل' AFTER `startPrice`, ADD COLUMN `cancelMinWaitMinutes` TINYINT UNSIGNED NOT NULL DEFAULT 5 COMMENT 'أقل دقائق انتظار بعد الوصول قبل أن يستحق السائق تعويضاً' AFTER `cancelCompensationCap`; -- ══════════════════════════════════════════════════════════════ -- ٢) بيانات الوصول والاقتراب (قاعدتا primary و ride) -- -- ‏هذان العمودان للتوثيق النهائي فقط ولا يُكتبان أثناء الرحلة: القيمتان -- ‏تعيشان في هاش Redis نفسه الذي يستخدمه السوكِت لحالة الرحلة -- ‏(ride:$id:state، الحقول pickup_approach_km و driver_arrived_at)، -- ‏وتُثبَّتان هنا كتابةً واحدة مدمجة في جملة تحديث الحالة عند الإلغاء. -- ‏أي: صفر كتابات إضافية على المسار الحار (القبول والوصول). -- ══════════════════════════════════════════════════════════════ ALTER TABLE `ride` ADD COLUMN `driverArrivedAt` DATETIME NULL DEFAULT NULL COMMENT 'لحظة تأكيد وصول السائق لنقطة الالتقاط — يختمها الخادم بعد تحقق الموقع', ADD COLUMN `pickupApproachKm` FLOAT NOT NULL DEFAULT 0 COMMENT 'المسافة من موقع السائق لحظة القبول إلى نقطة الالتقاط (كم)'; -- ══════════════════════════════════════════════════════════════ -- ٣) تطبيق الإيقاف على الخادم (قاعدتا primary و ride) -- ‏كان الإيقاف يُكتب في تخزين تطبيق السائق وحده، فيُفكّ بإعادة التثبيت. -- -- ‏مسار الفحص في acceptRide.php هو مفتاح Redis بـ TTL (driver:$id:blocked) -- ‏فينتهي الإيقاف تلقائياً بلا كرون تنظيف وبلا استعلام على كل قبول. -- ‏هذا العمود سجل دائم للمراجعة الإدارية، يُكتب في الإلغاء الثالث فقط. -- ══════════════════════════════════════════════════════════════ ALTER TABLE `driver` ADD COLUMN `blockedUntil` DATETIME NULL DEFAULT NULL COMMENT 'إيقاف استقبال الرحلات حتى هذا الوقت (إلغاءات متكررة). NULL = غير موقوف'; -- ‏للتراجع: -- ALTER TABLE `kazan` DROP COLUMN `cancelCompensationCap`, DROP COLUMN `cancelMinWaitMinutes`; -- ALTER TABLE `ride` DROP COLUMN `driverArrivedAt`, DROP COLUMN `pickupApproachKm`; -- ALTER TABLE `driver` DROP COLUMN `blockedUntil`;