Update: 2026-08-07 02:32:14

This commit is contained in:
Hamza-Ayed
2026-08-07 02:32:15 +03:00
parent 3081aea802
commit 70772cf0d2
6 changed files with 283 additions and 5 deletions
+19 -2
View File
@@ -31,12 +31,24 @@ function computePassengerCancelFee(
$rideId,
array $ride,
$driverId,
string &$exemptReason
string &$exemptReason,
&$currency = null
): float {
// ‏العملة تُحسم من الدولة دائماً، حتى مع الإعفاء: التطبيق يحتاجها ليعرض
// ‏"الإلغاء مجاني" أو "سيُخصم 1.20 دينار" بوحدة صحيحة.
$currency = 'SYP';
// ── إعفاء ١: لا سائق قَبِل بعد ──────────────────────────
// ‏لا أحد تحرّك، فلا أحد يستحق تعويضاً. وهذه أغلب حالات الإلغاء.
if (empty($driverId) || (string) $driverId === '0') {
$exemptReason = 'no_driver_assigned';
try {
$stmtCur = $con->prepare("SELECT currency, country FROM kazan LIMIT 1");
$stmtCur->execute();
$rowCur = $stmtCur->fetch(PDO::FETCH_ASSOC) ?: [];
$currency = !empty($rowCur['currency'])
? (string) $rowCur['currency']
: getCurrencyByCountry((string) ($rowCur['country'] ?? 'Syria'));
} catch (PDOException $e) { /* الافتراضي يكفي */ }
return 0.0;
}
@@ -45,6 +57,11 @@ function computePassengerCancelFee(
$stmtKazan->execute();
$kazan = $stmtKazan->fetch(PDO::FETCH_ASSOC) ?: [];
// ‏العمود currency هو المرجع، وgetCurrencyByCountry احتياط إن كان فارغاً.
$currency = !empty($kazan['currency'])
? (string) $kazan['currency']
: getCurrencyByCountry((string) ($kazan['country'] ?? 'Syria'));
$cap = (float) ($kazan['passengerCancelCap'] ?? 0);
if ($cap <= 0) {
// ‏الرسم معطّل لهذه الدولة — الافتراضي حتى تضبطه الإدارة.
@@ -103,7 +120,7 @@ function computePassengerCancelFee(
$fee = round(min($fee, $cap, PASSENGER_CANCEL_ABSOLUTE_CAP), 2);
error_log("[cancel_fee] ride=$rideId رسم إلغاء: {$approachKm}كم"
. " + {$billableMinutes}د = $fee (سقف $cap)");
. " + {$billableMinutes}د = $fee $currency (سقف $cap)");
return max(0.0, $fee);
}
@@ -79,9 +79,11 @@ try {
// =================================================================
$cancelFee = 0.0;
$feeExemptReason = '';
$feeCurrency = 'SYP';
try {
$cancelFee = computePassengerCancelFee(
$con, $redisLocation ?? null, $rideId, $ride, $driverId, $feeExemptReason
$con, $redisLocation ?? null, $rideId, $ride, $driverId,
$feeExemptReason, $feeCurrency
);
} catch (Throwable $eFee) {
// ‏فشل حساب الرسم لا يمنع الإلغاء أبداً — الإلغاء حق للراكب.
@@ -201,8 +203,9 @@ try {
// ‏الرسم يُرجَع للتطبيق ليعرضه صراحةً. خصم صامت من المحفظة يكتشفه
// ‏الراكب لاحقاً هو أسرع طريق لشكوى ولمراجعة سيئة.
jsonSuccess([
'cancel_fee' => $cancelFee ?? 0,
'fee_exempt' => ($cancelFee ?? 0) > 0 ? '' : ($feeExemptReason ?? ''),
'cancel_fee' => $cancelFee ?? 0,
'fee_currency' => $feeCurrency ?? 'SYP',
'fee_exempt' => ($cancelFee ?? 0) > 0 ? '' : ($feeExemptReason ?? ''),
], "Ride cancelled successfully");
} catch (PDOException $e) {
+54
View File
@@ -0,0 +1,54 @@
<?php
// ============================================================
// preview_cancel_fee.php — كم سيكلّف الإلغاء؟ (بلا إلغاء)
//
// ‏نقطة قراءة خالصة: تحسب الرسم بنفس دالة الإلغاء الفعلي ولا تغيّر شيئاً.
// ‏بدونها لا يستطيع التطبيق تحذير الراكب قبل الضغط، فيكتشف الخصم بعد
// ‏فوات الأوان — وهذا أسرع طريق لشكوى ومراجعة سيئة.
//
// ‏تستخدم computePassengerCancelFee نفسها عمداً: أي تحذير يخالف ما يُخصم
// ‏فعلاً أسوأ من غياب التحذير أصلاً.
// ============================================================
require_once __DIR__ . '/../../connect.php';
require_once __DIR__ . '/../pricing/pricing_helper.php';
require_once __DIR__ . '/cancel_fee_helper.php';
$rideId = filterRequest("ride_id");
if (!$rideId) {
jsonError("Missing Ride ID");
}
try {
$stmt = $con->prepare("SELECT * FROM ride WHERE id = ?");
$stmt->execute([$rideId]);
$ride = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$ride) {
jsonError("Ride not found", 404);
}
// ‏رحلة بدأت فعلاً لا تُلغى أصلاً — نفس شرط الإلغاء الحقيقي.
if (($ride['status'] ?? '') === 'Begin') {
jsonError("Cannot cancel started ride");
}
$exemptReason = '';
$currency = 'SYP';
$fee = computePassengerCancelFee(
$con, $redisLocation ?? null, $rideId, $ride,
$ride['driver_id'] ?? '0', $exemptReason, $currency
);
jsonSuccess([
'cancel_fee' => $fee,
'fee_currency' => $currency,
'fee_exempt' => $fee > 0 ? '' : $exemptReason,
'will_charge' => $fee > 0,
], "ok");
} catch (PDOException $e) {
error_log("[preview_cancel_fee] " . $e->getMessage());
jsonError("DB Error", 500);
}