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