feat: add gamification endpoints for driver behavior

This commit is contained in:
Hamza-Ayed
2026-05-08 06:06:33 +03:00
parent 975527f1d0
commit 5928695212
5 changed files with 181 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
<?php
require_once __DIR__ . '/../../connect.php';
$driver_id = filterRequest("driver_id");
$points = filterRequest("points"); // Reward points amount
$challenge_id = filterRequest("challenge_id");
// Check if already claimed today to prevent spam
$checkSql = "SELECT id FROM driverWallet WHERE driverID = :driver_id AND paymentMethod = :challenge_id AND DATE(dateCreated) = CURDATE()";
$stmtCheck = $con->prepare($checkSql);
$stmtCheck->bindParam(':driver_id', $driver_id, PDO::PARAM_INT);
$stmtCheck->bindParam(':challenge_id', $challenge_id, PDO::PARAM_STR);
$stmtCheck->execute();
if ($stmtCheck->rowCount() > 0) {
jsonError("Reward already claimed today");
exit();
}
// Insert into driver wallet
$paymentID = "CHL_" . time();
$sql = "INSERT INTO driverWallet (driverID, paymentID, amount, paymentMethod) VALUES (:driver_id, :paymentID, :amount, :method)";
$stmt = $con->prepare($sql);
$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT);
$stmt->bindParam(':paymentID', $paymentID, PDO::PARAM_STR);
$stmt->bindParam(':amount', $points, PDO::PARAM_STR);
$stmt->bindParam(':method', $challenge_id, PDO::PARAM_STR);
if ($stmt->execute()) {
jsonSuccess("Reward claimed successfully");
} else {
jsonError("Failed to claim reward");
}
?>

View File

@@ -0,0 +1,31 @@
<?php
require_once __DIR__ . '/../../connect.php';
$driver_id = filterRequest("driver_id");
$sql = "
SELECT
COALESCE(ROUND(AVG(behavior_score), 1), 100) as avg_score,
COALESCE(SUM(hard_brakes), 0) as total_hard_brakes,
COALESCE(MAX(max_speed), 0) as max_speed
FROM `driver_behavior`
WHERE driver_id = :driver_id
AND created_at >= DATE(NOW()) - INTERVAL 30 DAY
";
$stmt = $con->prepare($sql);
$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row && $row['max_speed'] !== null) {
jsonSuccess([$row]);
} else {
jsonSuccess([[
"avg_score" => 100,
"total_hard_brakes" => 0,
"max_speed" => 0
]]);
}
?>

View File

@@ -0,0 +1,54 @@
<?php
require_once __DIR__ . '/../../connect.php';
$type = isset($_POST['type']) ? filterRequest("type") : 'trips';
if ($type === 'earnings') {
$sql = "
SELECT
d.id as driver_id,
COALESCE(d.name, d.nameArabic, d.firstName, 'Driver') as name,
d.personal_photo as photoUrl,
COALESCE(SUM(p.amount), 0) as value
FROM `driver` d
JOIN `payments` p ON d.id = p.driverID
WHERE p.created_at >= DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY)
GROUP BY d.id
ORDER BY value DESC
LIMIT 10
";
} else {
// Default to trips
$sql = "
SELECT
d.id as driver_id,
COALESCE(d.name, d.nameArabic, d.firstName, 'Driver') as name,
d.personal_photo as photoUrl,
COUNT(r.id) as value
FROM `driver` d
JOIN `ride` r ON d.id = r.driver_id
WHERE r.status = 'Finished'
AND r.created_at >= DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY)
GROUP BY d.id
ORDER BY value DESC
LIMIT 10
";
}
$stmt = $con->prepare($sql);
$stmt->execute();
if ($stmt->rowCount() > 0) {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Add Rank manually to support older MySQL versions
$rank = 1;
foreach ($rows as &$row) {
$row['rank'] = $rank++;
}
jsonSuccess($rows);
} else {
jsonSuccess([]);
}
?>

View File

@@ -0,0 +1,30 @@
<?php
require_once __DIR__ . '/../../connect.php';
$driver_id = filterRequest("driver_id");
// Driver invites count
$sqlDriver = "SELECT COUNT(*) as total FROM invites WHERE driverId = :driver_id AND isInstall = 1";
$stmtD = $con->prepare($sqlDriver);
$stmtD->bindParam(':driver_id', $driver_id, PDO::PARAM_INT);
$stmtD->execute();
$driverCount = $stmtD->fetchColumn();
// Passenger invites count
$sqlPass = "SELECT COUNT(*) as total FROM invitesToPassengers WHERE driverId = :driver_id AND isInstall = 1";
$stmtP = $con->prepare($sqlPass);
$stmtP->bindParam(':driver_id', $driver_id, PDO::PARAM_INT);
$stmtP->execute();
$passengerCount = $stmtP->fetchColumn();
// Rewards calculation (100 pts per driver, 50 pts per passenger)
$totalRewards = ($driverCount * 100) + ($passengerCount * 50);
jsonSuccess([
[
"driverInvites" => (int)$driverCount,
"passengerInvites" => (int)$passengerCount,
"totalRewards" => $totalRewards
]
]);
?>

View File

@@ -0,0 +1,32 @@
<?php
require_once __DIR__ . '/../../connect.php';
$driver_id = filterRequest("driver_id");
$sql = "
SELECT
DATE(r.created_at) as day,
COUNT(r.id) as trips,
COALESCE(SUM(p.amount), 0) as earnings,
COALESCE(SUM(r.duration)/60, 0) as hours
FROM `ride` r
LEFT JOIN `payments` p ON r.id = p.rideId
WHERE r.driver_id = :driver_id
AND r.status = 'Finished'
AND r.created_at >= DATE(NOW()) - INTERVAL 6 DAY
GROUP BY DATE(r.created_at)
ORDER BY DATE(r.created_at) ASC
";
$stmt = $con->prepare($sql);
$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT);
$stmt->execute();
if ($stmt->rowCount() > 0) {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
jsonSuccess($rows);
} else {
// Return empty array instead of error so the app doesn't crash
jsonSuccess([]);
}
?>