Files
tripz-llc/backend/fuel/request_voucher.php
T
2026-08-09 16:56:13 +03:00

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