Files
Siro/walletintaleq.intaleq.xyz/v2/main/sms_webhook/process_with_gemini.php
2026-06-16 22:44:11 +03:00

133 lines
7.3 KiB
PHP
Executable File

<?php
// تأكد من أن هذا السكربت لا يمكن الوصول إليه مباشرة من الويب (للحماية)
// يمكنك وضع ملف .htaccess في المجلد لمنع الوصول المباشر
// المسار الصحيح لملف الاتصال
// هذه الطريقة تضمن أن المسار صحيح دائمًا بغض النظر عن كيفية استدعاء السكربت
include_once __DIR__ . '/../../jwtconnect.php';
// يمكنك هنا تضمين أي ملفات مساعدة أخرى
// استخدام __DIR__ هنا أيضًا يضمن إيجاد الملف في نفس المجلد الحالي
include_once __DIR__ . '/finalize_wallet_payment.php';
// --- إعدادات Gemini API ---
// من الأفضل قراءة مفتاح API من متغيرات البيئة لزيادة الأمان
$geminiApiKey = getenv('GEMINI_API_KEY');
$geminiApiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-05-20:generateContent?key=" . $geminiApiKey;
// 1. جلب رسالة واحدة بحالة "pending" لمعالجتها
$stmt_fetch = $con->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";
}
?>