89 lines
3.5 KiB
PHP
89 lines
3.5 KiB
PHP
<?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),
|
|
], 'أعطِ هذا الرمز لعامل المحطة');
|