getMessage() . "\n"); } // getRedisConnection() تُعيد المتغير العام $redis فقط، وbootstrap.php يتركه null // عند فشل الاتصال — فهي لا ترمي استثناءً والـ try/catch أعلاه لا يلتقط شيئاً. // بدون هذا الفحص كان السكربت ينهار فوراً بـ "call to a member function get() on null". if (!$redis) { error_log('[cron_kazan_adjuster] ABORT: Redis unavailable — Kazan discounts left untouched.'); die("Redis unavailable — aborting without touching Kazan discounts.\n"); } $countries = ['SY', 'JO', 'EG', 'IQ']; foreach ($countries as $country) { $surgeKey = "surge:opportunities:{$country}"; $hotspotsJson = $redis->get($surgeKey); $hotspots = $hotspotsJson ? json_decode($hotspotsJson, true) : []; // In a real scenario, Kazan configs might be stored in a `kazan_commissions` table // or applied dynamically at the ride request time. // Here we will save the "active discounted Kazan multiplier" in Redis so the ride logic can apply it instantly. $kazanDiscountConfig = []; if (!empty($hotspots)) { foreach ($hotspots as $grid => $multiplier) { // If competitor surge is high enough, we lower our Kazan by a factor // Standard Kazan is let's say 15%. if ($multiplier > 1.2) { // Apply a 30% reduction to Kazan Commission for this grid $kazanDiscountConfig[$grid] = 0.70; // 70% of standard commission } elseif ($multiplier > 1.05) { // Apply a 15% reduction $kazanDiscountConfig[$grid] = 0.85; } } } $kazanKey = "surge:kazan_discounts:{$country}"; if (empty($kazanDiscountConfig)) { $redis->del($kazanKey); echo "[$country] No active Kazan discounts.\n"; } else { $redis->setex($kazanKey, 1200, json_encode($kazanDiscountConfig)); echo "[$country] Updated Kazan discounts for " . count($kazanDiscountConfig) . " active hotspots.\n"; } } echo "Done.\n";