Update: 2026-08-07 02:37:30
This commit is contained in:
@@ -167,3 +167,66 @@ function estimateDriverEarningsAdvantage(
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* صف التسعير الصحيح لدولة هذه الرحلة.
|
||||||
|
*
|
||||||
|
* ⚠️ لا تستخدم "SELECT * FROM kazan LIMIT 1" أبداً. جدول kazan يحمل صفاً
|
||||||
|
* لكل دولة بمقاييس متباعدة جداً:
|
||||||
|
* Syria 40 SYP/كم · 9 SYP/دقيقة
|
||||||
|
* Egypt 3.5 EGP/كم · 0.8 EGP/دقيقة
|
||||||
|
* Jordan 0.284 JOD/كم· 0.05 JOD/دقيقة
|
||||||
|
* فـ LIMIT 1 يعيد أول صف (سوريا) ويطبّق أسعارها على رحلة أردنية — أي
|
||||||
|
* مئات الأضعاف. حدث هذا فعلاً في مسارَي الإلغاء.
|
||||||
|
*
|
||||||
|
* مصدر الدولة: driver.site عبر الرحلة — نفس ما يفعله finish_ride_updates.php.
|
||||||
|
* وإن تعذّر (رحلة بلا سائق مثلاً) نقع على $fallbackCountry.
|
||||||
|
*
|
||||||
|
* @return array صف kazan، أو مصفوفة فارغة إن لم يُوجد شيء إطلاقاً.
|
||||||
|
*/
|
||||||
|
function getKazanForRide(PDO $con, $rideId, string $fallbackCountry = 'Syria', $driverId = null): array
|
||||||
|
{
|
||||||
|
$country = '';
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!empty($driverId) && (string) $driverId !== '0') {
|
||||||
|
// مسار الإلغاء يصفّر ride.driver_id قبل الوصول إلى هنا، فالانضمام
|
||||||
|
// عبر الرحلة يرجع فارغاً. المستدعي يمرّر السائق الذي يعرفه.
|
||||||
|
$stmt = $con->prepare("SELECT site FROM driver WHERE id = ? LIMIT 1");
|
||||||
|
$stmt->execute([$driverId]);
|
||||||
|
} else {
|
||||||
|
$stmt = $con->prepare("
|
||||||
|
SELECT d.site AS country_code
|
||||||
|
FROM ride r
|
||||||
|
LEFT JOIN driver d ON d.id = r.driver_id
|
||||||
|
WHERE r.id = ? LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([$rideId]);
|
||||||
|
}
|
||||||
|
$country = (string) ($stmt->fetchColumn() ?: '');
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
error_log("[pricing] تعذّر تحديد دولة الرحلة $rideId: " . $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($country === '') {
|
||||||
|
$country = $fallbackCountry;
|
||||||
|
error_log("[pricing] الرحلة $rideId بلا دولة معروفة — السقوط على $country");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$stmt = $con->prepare("SELECT * FROM kazan WHERE country = ? LIMIT 1");
|
||||||
|
$stmt->execute([$country]);
|
||||||
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if (!$row) {
|
||||||
|
error_log("[pricing] لا صف kazan للدولة $country — السقوط على $fallbackCountry");
|
||||||
|
$stmt->execute([$fallbackCountry]);
|
||||||
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $row ?: [];
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
error_log("[pricing] تعذّر جلب أسعار $country: " . $e->getMessage());
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -41,21 +41,16 @@ function computePassengerCancelFee(
|
|||||||
// لا أحد تحرّك، فلا أحد يستحق تعويضاً. وهذه أغلب حالات الإلغاء.
|
// لا أحد تحرّك، فلا أحد يستحق تعويضاً. وهذه أغلب حالات الإلغاء.
|
||||||
if (empty($driverId) || (string) $driverId === '0') {
|
if (empty($driverId) || (string) $driverId === '0') {
|
||||||
$exemptReason = 'no_driver_assigned';
|
$exemptReason = 'no_driver_assigned';
|
||||||
try {
|
$rowCur = getKazanForRide($con, $rideId);
|
||||||
$stmtCur = $con->prepare("SELECT currency, country FROM kazan LIMIT 1");
|
$currency = !empty($rowCur['currency'])
|
||||||
$stmtCur->execute();
|
? (string) $rowCur['currency']
|
||||||
$rowCur = $stmtCur->fetch(PDO::FETCH_ASSOC) ?: [];
|
: getCurrencyByCountry((string) ($rowCur['country'] ?? 'Syria'));
|
||||||
$currency = !empty($rowCur['currency'])
|
|
||||||
? (string) $rowCur['currency']
|
|
||||||
: getCurrencyByCountry((string) ($rowCur['country'] ?? 'Syria'));
|
|
||||||
} catch (PDOException $e) { /* الافتراضي يكفي */ }
|
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── سياسة الدولة ────────────────────────────────────────
|
// ── سياسة الدولة ────────────────────────────────────────
|
||||||
$stmtKazan = $con->prepare("SELECT * FROM kazan LIMIT 1");
|
// أسعار دولة هذه الرحلة تحديداً — لا أول صف في الجدول.
|
||||||
$stmtKazan->execute();
|
$kazan = getKazanForRide($con, $rideId, 'Syria', $driverId);
|
||||||
$kazan = $stmtKazan->fetch(PDO::FETCH_ASSOC) ?: [];
|
|
||||||
|
|
||||||
// العمود currency هو المرجع، وgetCurrencyByCountry احتياط إن كان فارغاً.
|
// العمود currency هو المرجع، وgetCurrencyByCountry احتياط إن كان فارغاً.
|
||||||
$currency = !empty($kazan['currency'])
|
$currency = !empty($kazan['currency'])
|
||||||
@@ -137,13 +132,8 @@ function applyCancelFeeTransfer(PDO $con, $passengerId, $driverId, $rideId, floa
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
$kazanRow = getKazanForRide($con, $rideId, 'Syria', $driverId);
|
||||||
$stmtKazan = $con->prepare("SELECT country FROM kazan LIMIT 1");
|
$country = strtolower((string) ($kazanRow['country'] ?? 'jordan'));
|
||||||
$stmtKazan->execute();
|
|
||||||
$country = strtolower((string) ($stmtKazan->fetchColumn() ?: 'jordan'));
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
$country = 'jordan';
|
|
||||||
}
|
|
||||||
|
|
||||||
$walletServer = "https://walletintaleq.intaleq.xyz";
|
$walletServer = "https://walletintaleq.intaleq.xyz";
|
||||||
if ($country === 'jordan') {
|
if ($country === 'jordan') {
|
||||||
|
|||||||
@@ -226,9 +226,11 @@ try {
|
|||||||
// + دقائق الانتظار × سعر الدقيقة حسب وقت اليوم
|
// + دقائق الانتظار × سعر الدقيقة حسب وقت اليوم
|
||||||
// كل المدخلات مسجَّلة على الخادم؛ لا شيء منها من العميل.
|
// كل المدخلات مسجَّلة على الخادم؛ لا شيء منها من العميل.
|
||||||
// ─────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────
|
||||||
$stmtKazan = $con->prepare("SELECT * FROM kazan LIMIT 1");
|
// أسعار دولة هذه الرحلة تحديداً. كان "LIMIT 1" يعيد أول صف
|
||||||
$stmtKazan->execute();
|
// (سوريا) فيطبّق 40 SYP/كم على رحلة أردنية سعرها 0.284 JOD/كم.
|
||||||
$kazan = $stmtKazan->fetch(PDO::FETCH_ASSOC) ?: [];
|
// $driverId يُمرَّر صراحةً: القسم ٣ صفّر ride.driver_id قبل هذه
|
||||||
|
// النقطة، فالبحث عبر الرحلة كان سيرجع بلا دولة ويقع على سوريا.
|
||||||
|
$kazan = getKazanForRide($con, $rideId, 'Syria', $driverId);
|
||||||
$country = $kazan['country'] ?? 'Jordan';
|
$country = $kazan['country'] ?? 'Jordan';
|
||||||
|
|
||||||
$compensationCap = (float) ($kazan['cancelCompensationCap'] ?? 0);
|
$compensationCap = (float) ($kazan['cancelCompensationCap'] ?? 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user