prepare("SELECT id, message_body FROM `raw_sms_log` WHERE `status` = 'pending' ORDER BY created_at ASC LIMIT 1"); $stmt_fetch->execute(); $sms = $stmt_fetch->fetch(PDO::FETCH_ASSOC); if (!$sms) { exit("No pending messages found.\n"); } $sms_id = $sms['id']; $sms_text = $sms['message_body']; // 2. بناء الطلب (Prompt) الذكي إلى Gemini $prompt = "Analyze the following financial SMS and return ONLY a valid JSON object. - `transaction_type`: Must be 'income' (money received) or 'payout' (money sent). - `amount`: Must be a number (float). - `currency`: Must be a 3-letter code (e.g., SYP). - `phone_number`: The phone number of the other party. Must be a string, or `null` if not found. SMS Text: \"$sms_text\""; $payload = ['contents' => [['parts' => [['text' => $prompt]]]]]; // 3. إرسال الطلب إلى Gemini API $ch = curl_init($geminiApiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); $response = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 4. معالجة رد Gemini $result = json_decode($response, true); $gemini_text_response = $result['candidates'][0]['content']['parts'][0]['text'] ?? null; if ($httpcode == 200 && $gemini_text_response) { $clean_json_str = trim(str_replace(['```json', '```'], '', $gemini_text_response)); $data = json_decode($clean_json_str, true); if ($data && isset($data['transaction_type'])) { // --- نجحت المعالجة: استخراج البيانات --- $phone_raw = $data['phone_number'] ?? null; $amount = isset($data['amount']) ? (float)$data['amount'] : 0; // توحيد صيغة رقم الهاتف (مثال بسيط) $phone_norm = $phone_raw; // يمكنك إضافة منطق أكثر تعقيداً هنا إذا لزم الأمر if ($data['transaction_type'] === 'income' && !empty($phone_norm) && $amount > 0) { // البحث عن فاتورة مطابقة خلال آخر 60 دقيقة $q = $con->prepare("SELECT id FROM invoices_sms WHERE status='pending' AND user_phone=:p AND amount=:a AND created_at >= (NOW() - INTERVAL 60 MINUTE) ORDER BY created_at DESC LIMIT 1"); $q->execute([':p' => $phone_norm, ':a' => $amount]); $inv = $q->fetch(PDO::FETCH_ASSOC); if ($inv) { // تم العثور على فاتورة مطابقة -> قم بتحديثها وتنفيذ الإجراء النهائي $con->prepare("UPDATE invoices_sms SET status='completed' WHERE id=:id")->execute([':id' => $inv['id']]); // افترض أن هذه الدالة موجودة في ملف jwtconnect.php أو ملف مساعد آخر $ok = function_exists('finalizeWalletPaymentByInvoice') ? finalizeWalletPaymentByInvoice($con, $inv['id']) : false; $note = $ok ? 'finalized' : 'finalize_failed'; $con->prepare("UPDATE raw_sms_log SET status='processed', gemini_result=:r WHERE id=:id")->execute([':r' => json_encode($data, JSON_UNESCAPED_UNICODE), ':id' => $sms_id]); echo "Income matched -> invoice {$inv['id']} -> $note\n"; } else { // لم يتم العثور على فاتورة مطابقة $con->prepare("UPDATE raw_sms_log SET status='failed', gemini_result=:r WHERE id=:id")->execute([':r' => json_encode(['warn' => 'no pending invoice match', 'parsed' => $data], JSON_UNESCAPED_UNICODE), ':id' => $sms_id]); echo "No matching pending invoice found.\n"; } } elseif ($data['transaction_type'] === 'payout' && !empty($phone_norm) && $amount > 0) { // --- منطق معالجة الدفعات الصادرة --- $q = $con->prepare("SELECT id FROM payout_requests WHERE status='pending' AND driver_phone=:p AND amount=:a ORDER BY created_at DESC LIMIT 1"); $q->execute([':p' => $phone_norm, ':a' => $amount]); $payout = $q->fetch(PDO::FETCH_ASSOC); if ($payout) { // تم العثور على طلب سحب مطابق -> قم بتحديثه واستدعاء الإتمام $payout_id = $payout['id']; $con->prepare("UPDATE payout_requests SET status='completed', completed_at=NOW() WHERE id=:id")->execute([':id' => $payout_id]); include_once __DIR__ . '/finalize_payout.php'; if (function_exists('finalizePayout')) { finalizePayout($con, $payout_id); $note = "Payout request {$payout_id} finalized."; } else { $note = "CRITICAL: finalizePayout function not found!"; } $con->prepare("UPDATE raw_sms_log SET status='processed', gemini_result=:r WHERE id=:id")->execute([':r'=>json_encode($data), ':id'=>$sms_id]); error_log("[ProcessGemini] $note"); } else { // لم يتم العثور على طلب سحب مطابق $con->prepare("UPDATE raw_sms_log SET status='failed', gemini_result=:r WHERE id=:id")->execute([':r'=>json_encode(['warn'=>'no pending payout match', 'parsed'=>$data]), ':id'=>$sms_id]); error_log("[ProcessGemini] No matching pending payout found for SMS ID {$sms_id}"); } } } else { // فشل تحليل رد Gemini $stmt_update = $con->prepare("UPDATE `raw_sms_log` SET `status` = 'failed', `gemini_result` = :result WHERE `id` = :id"); $stmt_update->execute([':result' => json_encode(['error' => "Failed to parse Gemini's JSON response", 'response' => $gemini_text_response]), ':id' => $sms_id]); echo "Failed to parse Gemini's JSON response for message ID $sms_id.\n"; } } else { // لم يتم استلام رد من Gemini أو حدث خطأ في الطلب $stmt_update = $con->prepare("UPDATE `raw_sms_log` SET `status` = 'failed', `gemini_result` = :result WHERE `id` = :id"); $stmt_update->execute([':result' => json_encode(['error' => 'No valid response from Gemini API', 'http_code' => $httpcode]), ':id' => $sms_id]); echo "No valid response from Gemini API for message ID $sms_id. HTTP Code: $httpcode\n"; } ?>