diff --git a/payment_server/v2/main/db_primary.php b/payment_server/v2/main/db_primary.php new file mode 100644 index 00000000..4ce7faa2 --- /dev/null +++ b/payment_server/v2/main/db_primary.php @@ -0,0 +1,66 @@ + false, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_TIMEOUT => 5, + ] + ); + } catch (PDOException $e) { + error_log('[db_primary] تعذّر الاتصال بالقاعدة الأساسية: ' . $e->getMessage()); + $conn = null; + } + + return $conn; + } +} diff --git a/payment_server/v2/main/ride/driverWallet/driverStatistic.php b/payment_server/v2/main/ride/driverWallet/driverStatistic.php index 9b08ca4b..10e40a3e 100644 --- a/payment_server/v2/main/ride/driverWallet/driverStatistic.php +++ b/payment_server/v2/main/ride/driverWallet/driverStatistic.php @@ -1,7 +1,23 @@ prepare($sql); -$stmt->bindValue(':driverID', $driverID); -$stmt->execute(); +try { + $stmt = $primary->prepare($sql); + $stmt->bindValue(':driverID', $driverID); + $stmt->execute(); +} catch (PDOException $e) { + // ‏بلا هذا الالتقاط كان أي خلل في القاعدة يصير 500 يُسقط الشاشة كلها. + error_log('[driverStatistic] ' . $e->getMessage()); + printFailure("Statistics unavailable"); + exit; +} if ($stmt->rowCount() > 0) { // Fetch the record $row = $stmt->fetchAll(PDO::FETCH_ASSOC); printSuccess( $row); - + } else{ // Print a failure message printFailure($message = "No wallet record found"); } -?> \ No newline at end of file diff --git a/payment_server/v2/main/ride/payment/getAllPayment.php b/payment_server/v2/main/ride/payment/getAllPayment.php index 24699d3a..c17f10de 100644 --- a/payment_server/v2/main/ride/payment/getAllPayment.php +++ b/payment_server/v2/main/ride/payment/getAllPayment.php @@ -1,70 +1,71 @@ 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 على `
` — نفس العلّة بوجه آخر.) + * + * ‏الفصل المعتمد: الرصيد أولاً ومستقلاً، والإحصاءات ثانياً وقابلة للفشل. + * ‏الرصيد رقم مالي من `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"); -} -?> \ No newline at end of file + +// ‏الشكل كما كان: مصفوفة من صفّ واحد، والتطبيق يقرأ message[0]['total_amount']. +printSuccess([$result]);