Files
Siro/backend/food/courier/call_customer.php
T

49 lines
2.1 KiB
PHP

<?php
// food/courier/call_customer.php — السائق يتصل بالزبون عبر قناة مقنّعة
// لا رقم هاتف يُعرض لأي طرف: نفتح جلسة WebRTC ونُشعر الزبون بمعرّف الجلسة فقط.
require_once __DIR__ . '/../connect_courier.php';
$orderId = filterRequest('order_id', 'int');
if (!$orderId) jsonError('order_id is required');
$order = foodAssertOrderOwnership($orderId, 'courier', $food_courier_id);
if (!foodOrderAllowsCall($order)) {
// بعد التسليم أو قبل الإسناد لا حاجة تشغيلية للاتصال — والقناة تُقفل
jsonError('Calling is only allowed while the delivery is active', 403);
}
if (foodCallQuotaExceeded($orderId, 'courier')) {
jsonError('Too many call attempts for this order', 429);
}
$session = foodCreateCallSession($orderId, $food_courier_id, (string)$order['passenger_id']);
if (!$session) jsonError('Call service unavailable', 502);
// إشعار صامت للزبون عبر موضوع FCM الخاص به — نفس القناة المستعملة في وحدة
// الطعام أصلاً (ممنوع Database::get('main') هنا لجلب توكن الجهاز).
// الاسم المعروض عام عمداً: هوية السائق الحقيقية لا تُكشف للزبون.
foodSendNotificationToPassenger(
(string)$order['passenger_id'],
'مكالمة واردة',
'سائق التوصيل يتصل بك',
[
// تطبيق الراكب يفرز الإشعارات بـ data['category'] — ونُبقي 'type'
// للتوافق مع بقية حمولات وحدة الطعام.
'category' => 'incoming_call',
'type' => 'incoming_call',
'session_id' => $session['session_id'],
'caller_name' => 'سائق التوصيل',
'caller_avatar' => '',
'ride_id' => 'food_' . $orderId,
'food_order_id' => (string)$orderId,
]
);
appLog("[FOOD][CALL] courier {$food_courier_id} → passenger (order {$orderId})", 'INFO');
jsonSuccess([
'session_id' => $session['session_id'],
'expires_in' => $session['expires_in'],
]);