133 lines
7.3 KiB
PHP
Executable File
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";
|
|
}
|
|
?>
|
|
|