Update: 2026-08-08 12:58:16
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* fuel/request_voucher.php — إصدار قسيمة تزوّد
|
||||
*
|
||||
* السائق يطلب مبلغاً فيحصل على رمز يعطيه لعامل المحطة. لا دَين بعد —
|
||||
* القسيمة حجزٌ من السقف فقط، والدَّين يُقيَّد عند تأكيد المحطة الصرف.
|
||||
*
|
||||
* لماذا قسيمة مسبقة لا خصم عند المضخة؟ لأن عامل المحطة لا يملك وسيلة
|
||||
* للتحقق من هوية السائق ولا من سقفه. القسيمة تنقل القرار إلى تطبيق
|
||||
* السائق حيث الهوية مؤكَّدة والسقف معلوم، ولا يبقى على المحطة إلا
|
||||
* تأكيد رقم.
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../connect.php';
|
||||
require_once __DIR__ . '/functions.php';
|
||||
|
||||
$driverId = $user_id ?? '';
|
||||
if (empty($driverId) || ($role ?? '') !== 'driver') {
|
||||
jsonError('Unauthorized', 401);
|
||||
}
|
||||
|
||||
$amount = (float) (filterRequest('amount', 'numeric') ?: 0);
|
||||
if ($amount <= 0) {
|
||||
jsonError('حدّد مبلغ التزوّد');
|
||||
}
|
||||
|
||||
$obligation = fuelObligation($con, $driverId);
|
||||
if (!$obligation) {
|
||||
jsonError('فعّل محفظة الوقود أولاً');
|
||||
}
|
||||
|
||||
// تحرير المنتهي قبل الحساب: بدونه يبقى المبلغ محجوزاً بقسيمة ماتت،
|
||||
// فيُمنع السائق من التزوّد بسبب طلب نسيه قبل ساعة.
|
||||
fuelExpireStaleVouchers($con, $driverId);
|
||||
|
||||
// قسيمة مفتوحة واحدة في كل وقت. قسيمتان تعنيان رمزين في يد السائق،
|
||||
// وخطأ عامل المحطة في اختيار أحدهما يصرف المبلغ الخطأ — والأهم أن
|
||||
// السائق لا يحتاج أكثر من واحدة أصلاً.
|
||||
$st = $con->prepare("
|
||||
SELECT id, code, amount_authorized, expires_at
|
||||
FROM fuel_vouchers
|
||||
WHERE driver_id = ? AND status = 'issued' AND expires_at >= NOW()
|
||||
LIMIT 1
|
||||
");
|
||||
$st->execute([$driverId]);
|
||||
if ($open = $st->fetch(PDO::FETCH_ASSOC)) {
|
||||
jsonError(
|
||||
'لديك قسيمة سارية بالرمز ' . $open['code'] . ' بقيمة '
|
||||
. (float) $open['amount_authorized'] . '. استخدمها أو ألغِها أولاً.'
|
||||
);
|
||||
}
|
||||
|
||||
$state = fuelCreditState($con, $obligation);
|
||||
if ($amount > $state['available']) {
|
||||
jsonError(
|
||||
'المتاح في محفظة وقودك ' . $state['available'] . ' ' . $obligation['currency']
|
||||
. '. سدّد المستحق عليك ليعود سقفك.'
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
$code = fuelGenerateCode($con);
|
||||
|
||||
$con->prepare("
|
||||
INSERT INTO fuel_vouchers
|
||||
(obligation_id, driver_id, code, amount_authorized, currency, status, expires_at)
|
||||
VALUES (?, ?, ?, ?, ?, 'issued', DATE_ADD(NOW(), INTERVAL ? MINUTE))
|
||||
")->execute([
|
||||
(int) $obligation['id'], $driverId, $code, $amount,
|
||||
$obligation['currency'], FUEL_VOUCHER_TTL_MIN,
|
||||
]);
|
||||
|
||||
$voucherId = (int) $con->lastInsertId();
|
||||
} catch (Throwable $e) {
|
||||
error_log('[fuel/request_voucher] ' . $e->getMessage());
|
||||
jsonError('تعذّر إصدار القسيمة حالياً');
|
||||
}
|
||||
|
||||
error_log("[fuel] قسيمة #$voucherId للسائق $driverId بقيمة $amount");
|
||||
|
||||
jsonSuccess([
|
||||
'voucher_id' => $voucherId,
|
||||
'code' => $code,
|
||||
'amount' => $amount,
|
||||
'currency' => $obligation['currency'],
|
||||
'expires_in_min' => FUEL_VOUCHER_TTL_MIN,
|
||||
'available_after' => round($state['available'] - $amount, 3),
|
||||
], 'أعطِ هذا الرمز لعامل المحطة');
|
||||
Reference in New Issue
Block a user