Files

66 lines
2.4 KiB
PHP

<?php
/**
* fuel/stations.php — المحطات الشريكة
*
* ‏قائمة للسائق، مرتّبة بالقرب إن أرسل موقعه. لا يُرجع مفاتيح المحطات
* ‏ولا أي حقل تشغيلي — القائمة تُعرض في تطبيق السائق، وكل ما يخرج إليه
* ‏يجب افتراض أنه علنيّ.
*/
require_once __DIR__ . '/../connect.php';
require_once __DIR__ . '/functions.php';
$driverId = $user_id ?? '';
if (empty($driverId) || ($role ?? '') !== 'driver') {
jsonError('Unauthorized', 401);
}
$lat = filterRequest('lat', 'numeric');
$lng = filterRequest('lng', 'numeric');
try {
if ($lat !== null && $lng !== null) {
// ‏مسافة تقريبية بفرق الإحداثيات لا Haversine: الغرض ترتيب قائمة
// ‏محطات في مدينة واحدة، والفارق بين الطريقتين على هذا النطاق
// ‏لا يغيّر ترتيباً — بينما الحساب المثلثي على كل صف يكلّف بلا مقابل.
$st = $con->prepare("
SELECT id, name_ar, chain_name, city, address, lat, lng, phone,
discount_percent,
(POW(lat - ?, 2) + POW(lng - ?, 2)) AS dist
FROM fuel_stations
WHERE is_active = 1
ORDER BY (lat IS NULL), dist ASC
LIMIT 50
");
$st->execute([(float) $lat, (float) $lng]);
} else {
$st = $con->query("
SELECT id, name_ar, chain_name, city, address, lat, lng, phone,
discount_percent
FROM fuel_stations
WHERE is_active = 1
ORDER BY city ASC, name_ar ASC
LIMIT 50
");
}
$rows = $st->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
error_log('[fuel/stations] ' . $e->getMessage());
jsonError('Server error');
}
$out = array_map(static fn(array $r): array => [
'id' => (int) $r['id'],
'name' => $r['name_ar'],
'chain' => $r['chain_name'],
'city' => $r['city'],
'address' => $r['address'],
'lat' => $r['lat'] !== null ? (float) $r['lat'] : null,
'lng' => $r['lng'] !== null ? (float) $r['lng'] : null,
'phone' => $r['phone'],
'discount_percent' => (float) $r['discount_percent'],
], $rows);
jsonSuccess(['stations' => $out], 'success');