Update: 2026-06-15 19:39:21
This commit is contained in:
@@ -21,11 +21,21 @@ if (!$country) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$price = 0.0;
|
||||
$price_for_driver = 0.0;
|
||||
$withCommission = 0.0;
|
||||
$kazan = 0.0;
|
||||
$isNightFare = false;
|
||||
$prices = [];
|
||||
$pricesRaw = [];
|
||||
|
||||
$categories = [
|
||||
'totalPassengerSpeed' => 'Speed',
|
||||
'totalPassengerBalash' => 'Awfar Car',
|
||||
'totalPassengerComfort' => 'Comfort',
|
||||
'totalPassengerElectric' => 'Electric',
|
||||
'totalPassengerLady' => 'Lady',
|
||||
'totalPassengerScooter' => 'Delivery',
|
||||
'totalPassengerVan' => 'Van',
|
||||
'totalPassengerRayehGai' => 'Speed',
|
||||
'totalPassengerRayehGaiComfort' => 'Comfort',
|
||||
'totalPassengerRayehGaiBalash' => 'Awfar Car',
|
||||
];
|
||||
|
||||
// Common variables
|
||||
date_default_timezone_set('Asia/Damascus');
|
||||
@@ -58,27 +68,52 @@ if (!$kazanRow) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$result = calculateDynamicPrice($country, $minFare, $distance, $duration, $kazanRow, $startNameAddress, $endNameAddress, $destLat, $destLng, $passengerLat, $passengerLng);
|
||||
$price = $result['price'];
|
||||
$price_for_driver = $result['price_for_driver'];
|
||||
$withCommission = $result['withCommission'];
|
||||
$kazan = $result['kazan'];
|
||||
$isNightFare = $result['isNightFare'];
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Helper Functions for Countries
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
function calculateDynamicPrice($country, $minFare, $distance, $duration, $kazanRow, $startNameAddress, $endNameAddress, $destLat, $destLng, $passengerLat, $passengerLng) {
|
||||
$comfortPrice = (float) $kazanRow['comfortPrice'];
|
||||
$speedPrice = (float) $kazanRow['speedPrice'];
|
||||
$familyPrice = (float) $kazanRow['familyPrice'];
|
||||
$deliveryPrice = (float) $kazanRow['deliveryPrice'];
|
||||
$naturePrice = (float) $kazanRow['naturePrice'];
|
||||
$heavyPrice = (float) $kazanRow['heavyPrice'];
|
||||
$latePrice = (float) $kazanRow['latePrice'];
|
||||
$kazanPercent = (float) $kazanRow['kazan'];
|
||||
function getPerKmRate($carType, $kazanRow) {
|
||||
$rateColumns = [
|
||||
'Comfort' => 'comfortPrice',
|
||||
'Speed' => 'speedPrice',
|
||||
'Lady' => 'ladyPrice',
|
||||
'Electric' => 'electricPrice',
|
||||
'Van' => 'vanPrice',
|
||||
'Delivery' => 'deliveryPrice',
|
||||
'Mishwar Vip' => 'mishwarVipPrice',
|
||||
'Fixed Price' => 'fixedPrice',
|
||||
'Awfar Car' => 'awfarPrice',
|
||||
];
|
||||
|
||||
$column = $rateColumns[$carType] ?? 'speedPrice';
|
||||
$rate = floatval($kazanRow[$column] ?? 0);
|
||||
|
||||
if ($rate <= 0) {
|
||||
$oldColumnMap = [
|
||||
'Lady' => 'familyPrice',
|
||||
'Mishwar Vip' => 'freePrice',
|
||||
'Electric' => 'naturePrice',
|
||||
'Van' => 'heavyPrice',
|
||||
];
|
||||
$oldColumn = $oldColumnMap[$carType] ?? null;
|
||||
if ($oldColumn && isset($kazanRow[$oldColumn])) {
|
||||
$rate = floatval($kazanRow[$oldColumn]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($rate <= 0) {
|
||||
$rate = floatval($kazanRow['speedPrice'] ?? 36);
|
||||
}
|
||||
|
||||
return $rate;
|
||||
}
|
||||
|
||||
function calculateDynamicPrice($country, $minFare, $distance, $duration, $kazanRow, $startNameAddress, $endNameAddress, $destLat, $destLng, $passengerLat, $passengerLng, $carType = 'Speed') {
|
||||
$naturePrice = (float) ($kazanRow['naturePrice'] ?? 0);
|
||||
$heavyPrice = (float) ($kazanRow['heavyPrice'] ?? 0);
|
||||
$latePrice = (float) ($kazanRow['latePrice'] ?? 0);
|
||||
$kazanPercent = (float) ($kazanRow['kazan'] ?? 10);
|
||||
|
||||
// === General Settings ===
|
||||
$minBillableKm = 0.2;
|
||||
$airportAddon = 0.0;
|
||||
@@ -124,7 +159,8 @@ function calculateDynamicPrice($country, $minFare, $distance, $duration, $kazanR
|
||||
|
||||
$billableDistance = ($distance < $minBillableKm) ? $minBillableKm : $distance;
|
||||
$isLongSpeed = $billableDistance > $longSpeedThresholdKm;
|
||||
$perKmSpeedBaseFromServer = $speedPrice;
|
||||
|
||||
$perKmSpeedBaseFromServer = getPerKmRate($carType, $kazanRow);
|
||||
$perKmSpeed = $isLongSpeed ? $longSpeedPerKm : $perKmSpeedBaseFromServer;
|
||||
|
||||
$reductionPct40 = 0.0;
|
||||
@@ -205,64 +241,64 @@ if (!empty($promo_code)) {
|
||||
}
|
||||
|
||||
// 3. Fetch Passenger Wallet (Negative Balance / Debt)
|
||||
// Using Redis for ultra-fast reads, with a fallback to the Payment Server API.
|
||||
$negativeBalance = 0;
|
||||
if (!empty($passenger_id)) {
|
||||
try {
|
||||
$redis = new Redis();
|
||||
$redis->connect('127.0.0.1', 6379);
|
||||
$redisKey = "passenger_debt_" . $passenger_id;
|
||||
|
||||
$redisDebt = $redis->get($redisKey);
|
||||
|
||||
if ($redisDebt !== false) {
|
||||
$negativeBalance = (float) $redisDebt;
|
||||
} else {
|
||||
// Fallback: If not in Redis, call the Payment Server Endpoint
|
||||
// TODO: Replace with the actual Payment Server Endpoint URL and API Key
|
||||
/*
|
||||
$paymentApiUrl = "https://payment.siroapp.com/api/get_debt?passenger_id=" . urlencode($passenger_id);
|
||||
$options = [
|
||||
"http" => [
|
||||
"header" => "Authorization: Bearer YOUR_API_KEY\r\n"
|
||||
]
|
||||
];
|
||||
$context = stream_context_create($options);
|
||||
$response = file_get_contents($paymentApiUrl, false, $context);
|
||||
if ($response !== false) {
|
||||
$data = json_decode($response, true);
|
||||
if (isset($data['debt'])) {
|
||||
$negativeBalance = (float) $data['debt'];
|
||||
// Cache the result in Redis for future pricing calls (e.g. 1 hour)
|
||||
$redis->setex($redisKey, 3600, $negativeBalance);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
// If Redis fails, gracefully default to 0 or fallback API
|
||||
$negativeBalance = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$prices = ['total' => $withCommission];
|
||||
// Calculate prices for all categories
|
||||
foreach ($categories as $key => $carType) {
|
||||
$result = calculateDynamicPrice($country, $minFare, $distance, $duration, $kazanRow, $startNameAddress, $endNameAddress, $destLat, $destLng, $passengerLat, $passengerLng, $carType);
|
||||
$withCommission = $result['withCommission'];
|
||||
$price_for_driver = $result['price_for_driver'];
|
||||
|
||||
// 4. Apply Discount and Negative Balance
|
||||
foreach ($prices as $key => $price) {
|
||||
// Apply discount (Assuming percentage discount if amount <= 100, else fixed amount)
|
||||
// Apply discount
|
||||
if ($discount > 0 && $discount <= 100) {
|
||||
$prices[$key] = max(0, $price - ($price * ($discount / 100)));
|
||||
$finalPrice = max(0, $withCommission - ($withCommission * ($discount / 100)));
|
||||
} else {
|
||||
$prices[$key] = max(0, $price - $discount);
|
||||
$finalPrice = max(0, $withCommission - $discount);
|
||||
}
|
||||
|
||||
// Add negative balance
|
||||
$prices[$key] += $negativeBalance;
|
||||
$finalPrice += $negativeBalance;
|
||||
|
||||
$prices[$key] = $finalPrice;
|
||||
|
||||
// For the token, we map the clean database carType to the final price and driver price
|
||||
$pricesRaw[$carType] = [
|
||||
'price' => $finalPrice,
|
||||
'driver_price' => $price_for_driver
|
||||
];
|
||||
}
|
||||
|
||||
// 4. Generate Cryptographically Signed Token
|
||||
$priceToken = "";
|
||||
if (isset($encryptionHelper)) {
|
||||
$tokenPayload = [
|
||||
'passenger_id' => $passenger_id,
|
||||
'start_location' => $passengerLat . ',' . $passengerLng,
|
||||
'end_location' => $destLat . ',' . $destLng,
|
||||
'expires' => time() + 180, // Valid for 3 minutes
|
||||
'prices' => $pricesRaw
|
||||
];
|
||||
$priceToken = $encryptionHelper->encryptData(json_encode($tokenPayload));
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'data' => $prices,
|
||||
'price_token' => $priceToken,
|
||||
'applied_discount' => $discount,
|
||||
'added_negative_balance' => $negativeBalance
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user