Update: 2026-06-16 22:44:11
This commit is contained in:
127
walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/finalize_deposit.php
Executable file
127
walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/finalize_deposit.php
Executable file
@@ -0,0 +1,127 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user