Update: 2026-08-08 14:57:58
This commit is contained in:
@@ -1,70 +1,71 @@
|
||||
<?php
|
||||
include "../../connect.php";
|
||||
include_once "../../db_primary.php";
|
||||
|
||||
$driverID = filterRequest("driverID");
|
||||
|
||||
$sql = "SELECT
|
||||
(
|
||||
SELECT
|
||||
COUNT(*)
|
||||
FROM
|
||||
`ride`
|
||||
WHERE
|
||||
LOWER(`ride`.`status`) IN ('finished','completed')
|
||||
AND `ride`.`created_at` BETWEEN CURRENT_DATE() + INTERVAL 7 HOUR AND CURRENT_DATE() + INTERVAL 10 HOUR
|
||||
AND `ride`.`driver_id` = :driverID
|
||||
) AS morning_count,
|
||||
(
|
||||
SELECT
|
||||
COUNT(*)
|
||||
FROM
|
||||
`ride`
|
||||
WHERE
|
||||
LOWER(`ride`.`status`) IN ('finished','completed')
|
||||
AND `ride`.`created_at` BETWEEN CURRENT_DATE() + INTERVAL 15 HOUR AND CURRENT_DATE() + INTERVAL 18 HOUR
|
||||
AND `ride`.`driver_id` = :driverID
|
||||
) AS afternoon_count,
|
||||
(
|
||||
SELECT
|
||||
COALESCE(SUM(amount), 0) AS total_amount
|
||||
FROM
|
||||
payments
|
||||
WHERE
|
||||
isGiven = 'waiting' AND `driverID` = :driverID
|
||||
) AS total_amount,
|
||||
(
|
||||
SELECT
|
||||
COALESCE(SUM(price), 0) AS total_amount
|
||||
FROM
|
||||
ride
|
||||
WHERE
|
||||
`driver_id` = :driverID
|
||||
AND LOWER(`ride`.`status`) IN ('finished','completed')
|
||||
AND `ride`.`created_at` > CURRENT_DATE() - INTERVAL 1 WEEK
|
||||
) AS total_amount_last_week
|
||||
FROM
|
||||
dual
|
||||
LIMIT 1;
|
||||
|
||||
|
||||
";
|
||||
/**
|
||||
* كان معرّف السائق يُدمج في نص الاستعلام مباشرةً (حقن SQL)، وكانت الحالة
|
||||
* تُطابق 'Finished' فقط بينما خط الرحلات الحالي يكتب 'completed' — فتظهر
|
||||
* أرباح السائق ورحلاته أصفاراً.
|
||||
* كان استعلاماً واحداً يقرأ `payments` و`ride` معاً — و`ride` ليس في قاعدة
|
||||
* الدفع. النتيجة `SQLSTATE[42S02]: Table 'payment.ride' doesn't exist`، وبلا
|
||||
* try/catch صار خطأً قاتلاً يُسقط النقطة بـ 500 فتعلق شاشة رصيد الكابتن.
|
||||
* (وقبل إطفاء display_errors كان الخطأ يُطبع داخل الردّ فيصل التطبيق كـ
|
||||
* FormatException على `<br />` — نفس العلّة بوجه آخر.)
|
||||
*
|
||||
* الفصل المعتمد: الرصيد أولاً ومستقلاً، والإحصاءات ثانياً وقابلة للفشل.
|
||||
* الرصيد رقم مالي من `payments` في قاعدة الدفع ولا عذر لسقوطه، أما عدّ
|
||||
* الرحلات فمعلومة مساعدة من قاعدة أخرى — تعذّرها يُعيد أصفاراً ولا يحجب
|
||||
* عن الكابتن رصيده.
|
||||
*
|
||||
* و`ride` تُقرأ عبر اتصال مستقل لا عبر إشارة مؤهَّلة: القاعدتان قد تكونان
|
||||
* على خادمين مختلفين — انظر db_primary.php.
|
||||
*/
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->bindValue(':driverID', $driverID);
|
||||
$stmt->execute();
|
||||
|
||||
if ($stmt->rowCount() > 0) {
|
||||
// Fetch the record
|
||||
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
// ── ١. الرصيد — من قاعدة الدفع، لا يعتمد على شيء خارجها ──
|
||||
$balanceStmt = $con->prepare(
|
||||
"SELECT COALESCE(SUM(amount), 0) AS total_amount
|
||||
FROM payments
|
||||
WHERE isGiven = 'waiting' AND `driverID` = :driverID"
|
||||
);
|
||||
$balanceStmt->bindValue(':driverID', $driverID);
|
||||
$balanceStmt->execute();
|
||||
$totalAmount = $balanceStmt->fetchColumn();
|
||||
|
||||
printSuccess( $row);
|
||||
|
||||
$result = [
|
||||
'total_amount' => $totalAmount !== false ? $totalAmount : 0,
|
||||
'morning_count' => 0,
|
||||
'afternoon_count' => 0,
|
||||
'total_amount_last_week' => 0,
|
||||
];
|
||||
|
||||
// ── ٢. إحصاءات الرحلات — اتصال مستقل بالقاعدة الأساسية ──
|
||||
$primary = primaryDbConnection();
|
||||
|
||||
if ($primary !== null) {
|
||||
try {
|
||||
$statsStmt = $primary->prepare(
|
||||
"SELECT
|
||||
COALESCE(SUM(`created_at` BETWEEN CURRENT_DATE() + INTERVAL 7 HOUR
|
||||
AND CURRENT_DATE() + INTERVAL 10 HOUR), 0) AS morning_count,
|
||||
COALESCE(SUM(`created_at` BETWEEN CURRENT_DATE() + INTERVAL 15 HOUR
|
||||
AND CURRENT_DATE() + INTERVAL 18 HOUR), 0) AS afternoon_count,
|
||||
COALESCE(SUM(CASE WHEN `created_at` > CURRENT_DATE() - INTERVAL 1 WEEK
|
||||
THEN `price` ELSE 0 END), 0) AS total_amount_last_week
|
||||
FROM `ride`
|
||||
WHERE `driver_id` = :driverID
|
||||
AND LOWER(`status`) IN ('finished','completed')"
|
||||
);
|
||||
$statsStmt->bindValue(':driverID', $driverID);
|
||||
$statsStmt->execute();
|
||||
|
||||
if ($stats = $statsStmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
$result['morning_count'] = (int) $stats['morning_count'];
|
||||
$result['afternoon_count'] = (int) $stats['afternoon_count'];
|
||||
$result['total_amount_last_week'] = $stats['total_amount_last_week'];
|
||||
}
|
||||
} catch (PDOException $e) {
|
||||
error_log('[getAllPayment] ride stats unavailable: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
// Print a failure message
|
||||
printFailure($message = "No wallet record found");
|
||||
}
|
||||
?>
|
||||
|
||||
// الشكل كما كان: مصفوفة من صفّ واحد، والتطبيق يقرأ message[0]['total_amount'].
|
||||
printSuccess([$result]);
|
||||
|
||||
Reference in New Issue
Block a user