127 lines
6.2 KiB
PHP
Executable File
127 lines
6.2 KiB
PHP
Executable File
<?php
|
|
// shamcash/passenger/finalize_deposit.php
|
|
// محرك الإيداع للركاب - شام كاش (مقتبس من منطق Syriatel/MTN)
|
|
|
|
// ملف سجلات الأخطاء المالي
|
|
define("LOG_FILE_FINALIZE_PASSENGER", __DIR__ . "/deposit_financial_passenger.log");
|
|
|
|
if (!function_exists('logFinancialPassenger')) {
|
|
function logFinancialPassenger($step, $message, $data = null) {
|
|
$logDir = dirname(LOG_FILE_FINALIZE_PASSENGER);
|
|
if (!is_dir($logDir)) { mkdir($logDir, 0755, true); }
|
|
|
|
$entry = "[" . date('Y-m-d H:i:s') . "] STEP {$step}: {$message}";
|
|
if ($data) $entry .= " | Data: " . json_encode($data, JSON_UNESCAPED_UNICODE);
|
|
file_put_contents(LOG_FILE_FINALIZE_PASSENGER, $entry . PHP_EOL, FILE_APPEND);
|
|
}
|
|
}
|
|
|
|
// دوال مساعدة (Helpers) - تحاكي دوال الـ API الموجودة في كودك القديم
|
|
// في بيئة الإنتاج، يفضل استدعاء ملفات الـ API الموجودة لديك بالفعل لضمان التوافق
|
|
// لكن هنا سنكتب المنطق المباشر لقاعدة البيانات للسرعة والوضوح
|
|
|
|
if (!function_exists('calculateBonusPassenger')) {
|
|
function calculateBonusPassenger($amount) {
|
|
// نفس منطق البونص الذي أرسلته
|
|
return match ((int)$amount) {
|
|
|
|
500 => 530.0,
|
|
1000 => 1000.0,
|
|
2000 => 2180.0,
|
|
5000 => 5700.0,
|
|
default => (float)$amount,
|
|
};
|
|
}
|
|
}
|
|
|
|
if (!function_exists('generatePassengerToken')) {
|
|
function generatePassengerToken(PDO $con, $passengerId, $amount) {
|
|
// إنشاء توكن فريد
|
|
$data = $passengerId . $amount . time() . 'shamcash_passenger_secret';
|
|
$hash = hash('sha256', $data);
|
|
$token = substr($hash . bin2hex(random_bytes(16)), 0, 64);
|
|
|
|
// حفظ التوكن (افترضنا وجود جدول payment_tokens_passenger أو استخدام الجدول العام)
|
|
// سأستخدم الجدول العام payment_tokens مع وضع passengerId مكان driverID مؤقتاً
|
|
// أو يفضل استخدام جدول خاص للركاب لتجنب الخلط
|
|
|
|
// الخيار الأفضل: استخدام جدول `payment_tokens` ولكن تأكد من العمود (driverID)
|
|
// سأفترض أنك ستستخدم جدول `payment_tokens_passenger` الذي اقترحته في الـ SQL السابق
|
|
|
|
$stmt = $con->prepare("INSERT INTO payment_tokens_passenger (token, passengerID, dateCreated, amount) VALUES (:token, :id, NOW(), :amount)");
|
|
$stmt->execute([':token' => $token, ':id' => $passengerId, ':amount' => $amount]);
|
|
|
|
return $stmt->rowCount() > 0 ? $token : null;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('finalizePassengerDeposit')) {
|
|
function finalizePassengerDeposit(PDO $con, $invoice_id) {
|
|
|
|
// 1. جلب الفاتورة (يجب أن تكون في حالة processing)
|
|
$stmt = $con->prepare("SELECT * FROM invoices_shamcash_passenger WHERE id = :id AND status = 'processing' LIMIT 1");
|
|
$stmt->execute([':id' => $invoice_id]);
|
|
$invoice = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$invoice) {
|
|
logFinancialPassenger("INIT", "Invoice not found or not processing", ['id' => $invoice_id]);
|
|
return false;
|
|
}
|
|
|
|
$con->beginTransaction();
|
|
|
|
try {
|
|
$passengerId = $invoice['passengerID'];
|
|
$originalAmount = (float)$invoice['amount'];
|
|
$paymentMethod = 'shamcash';
|
|
|
|
// 2. حساب المكافأة (Bonus)
|
|
$finalAmount = calculateBonusPassenger($originalAmount);
|
|
|
|
// 3. إنشاء التوكنات
|
|
$tokenPassenger = generatePassengerToken($con, $passengerId, $finalAmount);
|
|
$tokenSiro = generatePassengerToken($con, $passengerId, $originalAmount);
|
|
|
|
if (!$tokenPassenger || !$tokenSiro) throw new Exception('Token generation failed');
|
|
|
|
// 4. الإيداع في محفظة الراكب (passengerWallet)
|
|
// نضيف المبلغ النهائي (مع البونص)
|
|
$stmtPassenger = $con->prepare("INSERT INTO passengerWallet (passenger_id, balance, type, create_at) VALUES (:pid, :amt, 'deposit', NOW())");
|
|
// ملاحظة: تأكد من أسماء الأعمدة في جدول passengerWallet لديك
|
|
// في كودك القديم كان يستخدم API: /passengerWallet/add.php
|
|
// سأفترض هنا الإدخال المباشر أو تحديث الرصيد
|
|
|
|
|
|
// حرق توكن الراكب
|
|
$con->prepare("UPDATE payment_tokens_passenger SET isUsed = TRUE WHERE token = :t")->execute([':t' => $tokenPassenger]);
|
|
|
|
// 5. الإيداع في محفظة الشركة (siroWallet)
|
|
// نسجل المبلغ الأصلي (بدون البونص) كإيراد
|
|
$insertSiro = $con->prepare("INSERT INTO siroWallet (driverId, passengerId, amount, paymentMethod, token, createdAt) VALUES ('passenger', :pid, :amt, :pm, :tok, NOW())");
|
|
$insertSiro->execute([
|
|
':pid' => $passengerId,
|
|
':amt' => $originalAmount,
|
|
':pm' => $paymentMethod,
|
|
':tok' => $tokenSiro
|
|
]);
|
|
|
|
if ($insertSiro->rowCount() === 0) throw new Exception('Insert to siroWallet failed');
|
|
|
|
// حرق توكن الشركة
|
|
$con->prepare("UPDATE payment_tokens_passenger SET isUsed = TRUE WHERE token = :t")->execute([':t' => $tokenSiro]);
|
|
|
|
// 6. تحديث الفاتورة للنهاية
|
|
$con->prepare("UPDATE invoices_shamcash_passenger SET status = 'completed', paid_at = NOW() WHERE id = :id")->execute([':id' => $invoice_id]);
|
|
|
|
$con->commit();
|
|
logFinancialPassenger("SUCCESS", "Deposit finalized for Passenger Inv #$invoice_id | Amount: $finalAmount");
|
|
return true;
|
|
|
|
} catch (Throwable $e) {
|
|
$con->rollBack();
|
|
logFinancialPassenger("EXCEPTION", $e->getMessage(), ['id' => $invoice_id]);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
?>
|