Files
Siro/walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/finalize_deposit.php
2026-06-16 22:44:11 +03:00

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;
}
}
}
?>