ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+...383-7(-.+



-%%--------------------------------------------------ÿÀ  ·" ÿÄ               ÿÄ 6     !1AQa"q‘±ð¡ÁÑ2Bá#Rb‚ñr ÿÄ              ÿÄ $         !1A2Qaq‘Ñ"ÿÚ   ? óª4¦ù‡;ýÔ­aH6’
¯ëxòPº°pp-LæsÊÿ DÖ7:,ûž«ðwZÃ›-FÈ¨Øðf:‹ß¦šè¸*¹Û”Énó¯¿Âùó†ñ&¶£AiÌ39Ž‡ÙÛ”Ï.«ÜþÆ6³§PT$‚5ê‹žæçKw±Ñµ£¡û÷©a5¡9tDB„ÀAB B„€Lsá<¨ª±*p|à¹Þ8 ÜÅÿ 
C!sÜK"=Jæòï¾—Æ9í‰ŒÄNl×n¹ü[HÒ;÷W¸…Fîá ¼÷ôÕbbñRH6ëÓªÆZÒ¦*¤´óßÞû,ªµãen«š	ÓQ§—%B¸ßšèÌˆèÃˆ(UK«ù‰õ5L™ Æý#ïeàCˆÍ—cßèµx/Ä_,¹ ÎäLÍï~~¥?ê?1¡Ìs€ {·íÔÿ z—šŠ~sgsV8_þZ•n2‡7ôé•àë¾ ž–^³ð§¡@‡Ó€hÜÄÃB¼9ôCC^Òàóvº\"Ý ºßáßâ˜ÐÆºCt%½¬£c~ž«:Íû_å}ó†ŠV¯8øsãºn
ùà´ÿ ÚÇY]ßâ¬&›ƒ‚Öwß¬ë<]BªÀB€„ !	                                                                                                                                                                       
ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+...383-7(-.+



-%%--------------------------------------------------ÿÀ  ·" ÿÄ               ÿÄ 6     !1AQa"q‘±ð¡ÁÑ2Bá#Rb‚ñr ÿÄ              ÿÄ $         !1A2Qaq‘Ñ"ÿÚ   ? óª4¦ù‡;ýÔ­aH6’
¯ëxòPº°pp-LæsÊÿ DÖ7:,ûž«ðwZÃ›-FÈ¨Øðf:‹ß¦šè¸*¹Û”Énó¯¿Âùó†ñ&¶£AiÌ39Ž‡ÙÛ”Ï.«ÜþÆ6³§PT$‚5ê‹žæçKw±Ñµ£¡û÷©a5¡9tDB„ÀAB B„€Lsá<¨ª±*p|à¹Þ8 ÜÅÿ 
C!sÜK"=Jæòï¾—Æ9í‰ŒÄNl×n¹ü[HÒ;÷W¸…Fîá ¼÷ôÕbbñRH6ëÓªÆZÒ¦*¤´óßÞû,ªµãen«š	ÓQ§—%B¸ßšèÌˆèÃˆ(UK«ù‰õ5L™ Æý#ïeàCˆÍ—cßèµx/Ä_,¹ ÎäLÍï~~¥?ê?1¡Ìs€ {·íÔÿ z—šŠ~sgsV8_þZ•n2‡7ôé•àë¾ ž–^³ð§¡@‡Ó€hÜÄÃB¼9ôCC^Òàóvº\"Ý ºßáßâ˜ÐÆºCt%½¬£c~ž«:Íû_å}ó†ŠV¯8øsãºn
ùà´ÿ ÚÇY]ßâ¬&›ƒ‚Öwß¬ë<]BªÀB€„ !	                                                                                                                                                                       
<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// --- CONFIGURATION ---
define('DB_HOST', 'localhost');
define('DB_USER', 'sql_chargini_com');
define('DB_PASS', '123456789Ms');
define('DB_NAME', 'sql_chargini_com');

define('TELEGRAM_BOT_TOKEN', '7673395941:AAGzBAoqfbepC_UzBxs8PjaOymSBk4aiZyY');
define('TELEGRAM_CHAT_ID', '1870046610');

define('STATE_FILE', __DIR__ . '/last_processed_id.txt');
define('LOG_FILE', __DIR__ . '/telegram_notifications.log');

date_default_timezone_set('UTC');

// --- HELPER: Logging ---
function logMessage($msg) {
    file_put_contents(LOG_FILE, "[" . date("Y-m-d H:i:s") . "] $msg\n", FILE_APPEND);
}

// --- DB Connection ---
try {
    $pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USER, DB_PASS);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    logMessage("Database connection successful.");
} catch (PDOException $e) {
    logMessage("DB Connection Error: " . $e->getMessage());
    exit("Database connection failed.");
}

// --- Load last processed ID ---
if (file_exists(STATE_FILE)) {
    $lastProcessedIds = json_decode(file_get_contents(STATE_FILE), true);
    $lastProcessedTransactionId = $lastProcessedIds['transaction'] ?? 0;
} else {
    // First run: Initialize with max transaction ID
    $stmt = $pdo->query("SELECT MAX(id) FROM transactions");
    $lastProcessedTransactionId = (int) $stmt->fetchColumn();
    file_put_contents(STATE_FILE, json_encode(['transaction' => $lastProcessedTransactionId]), LOCK_EX);
    logMessage("First run initialized at transaction ID: $lastProcessedTransactionId");
}

// --- Fetch new transactions ---
$stmt = $pdo->prepare(
    "SELECT t.id, t.user_id, t.transactional_id, t.transactional_type, t.amount_in_base, t.created_at
     FROM transactions t
     JOIN users u ON t.user_id = u.id
     WHERE t.trx_type = '-' AND t.notified = 0 AND t.id > ?
     ORDER BY t.id ASC"
);
$stmt->execute([$lastProcessedTransactionId]);
$newTransactions = $stmt->fetchAll(PDO::FETCH_ASSOC);

$latestTransactionId = $lastProcessedTransactionId;

// --- Process transactions ---
foreach ($newTransactions as $transaction) {
    // Get user name
    $userStmt = $pdo->prepare("SELECT CONCAT(firstname, ' ', lastname) AS user_name FROM users WHERE id = ?");
    $userStmt->execute([$transaction['user_id']]);
    $user = $userStmt->fetch(PDO::FETCH_ASSOC);
    $clientName = $user['user_name'] ?? "User ID: {$transaction['user_id']}";

    // Get payment type
    $paymentType = 'Unknown Payment Type';
    if ($transaction['transactional_type'] === 'App\\Models\\Order') {
        $orderStmt = $pdo->prepare("SELECT payment_method_id FROM orders WHERE id = ?");
        $orderStmt->execute([$transaction['transactional_id']]);
        $order = $orderStmt->fetch(PDO::FETCH_ASSOC);
        if ($order && ($order['payment_method_id'] == -1 || is_null($order['payment_method_id']))) {
            $paymentType = 'Wallet Payment';
        } elseif ($order) {
            $gatewayStmt = $pdo->prepare("SELECT name FROM gateways WHERE id = ?");
            $gatewayStmt->execute([$order['payment_method_id']]);
            $gateway = $gatewayStmt->fetch(PDO::FETCH_ASSOC);
            $paymentType = $gateway['name'] ?? 'Unknown Gateway';
        }
    } elseif ($transaction['transactional_type'] === 'App\\Models\\Deposit') {
        $depositStmt = $pdo->prepare("SELECT payment_method_id FROM deposits WHERE id = ?");
        $depositStmt->execute([$transaction['transactional_id']]);
        $deposit = $depositStmt->fetch(PDO::FETCH_ASSOC);
        if ($deposit) {
            $gatewayStmt = $pdo->prepare("SELECT name FROM gateways WHERE id = ?");
            $gatewayStmt->execute([$deposit['payment_method_id']]);
            $gateway = $gatewayStmt->fetch(PDO::FETCH_ASSOC);
            $paymentType = $gateway['name'] ?? 'Unknown Gateway';
        }
    }

    // Get card type and product name
    $cardType = 'Unknown';
    $productName = 'N/A';
    if ($transaction['transactional_type'] === 'App\\Models\\Order') {
        $detailsStmt = $pdo->prepare("SELECT detailable_type, detailable_id FROM order_details WHERE order_id = ? LIMIT 1");
        $detailsStmt->execute([$transaction['transactional_id']]);
        $detail = $detailsStmt->fetch(PDO::FETCH_ASSOC);
        if ($detail) {
            $cardType = $detail['detailable_type'] === 'App\\Models\\TopUpService' ? 'topup' : 'card';
            if ($detail['detailable_type'] === 'App\\Models\\TopUpService') {
                $productStmt = $pdo->prepare("SELECT name FROM topup_services WHERE id = ?");
                $productStmt->execute([$detail['detailable_id']]);
                $product = $productStmt->fetch(PDO::FETCH_ASSOC);
                $productName = $product['name'] ?? 'Unknown TopUp Service';
            } elseif ($detail['detailable_type'] === 'App\\Models\\Card') {
                $productStmt = $pdo->prepare("SELECT name FROM cards WHERE id = ?");
                $productStmt->execute([$detail['detailable_id']]);
                $product = $productStmt->fetch(PDO::FETCH_ASSOC);
                $productName = $product['name'] ?? 'Unknown Card';
            }
        }
    }

    // Format message
    $formattedTime = date('Y-m-d H:i:s', strtotime($transaction['created_at']));
    $message = "<b>🔔 New Payment Alert!</b>\n\n" .
               "<b>👤 Client:</b> " . htmlspecialchars($clientName) . "\n" .
               "<b>💳 Payment Type:</b> " . htmlspecialchars($paymentType) . "\n" .
               "<b>🎫 Card Type:</b> " . htmlspecialchars($cardType) . "\n" .
               "<b>📦 Product Name:</b> " . htmlspecialchars($productName) . "\n" .
               "<b>💰 Amount:</b> " . number_format($transaction['amount_in_base'], 2) . " TND\n" .
               "<b>📅 Transaction Time:</b> $formattedTime\n" .

    // Send message
    if (sendTelegramMessage($message)) {
        $latestTransactionId = $transaction['id'];
        $pdo->prepare("UPDATE transactions SET notified = 1 WHERE id = ?")->execute([$transaction['id']]);
        logMessage("Transaction ID {$transaction['id']} sent successfully.");
    } else {
        logMessage("Failed to send Transaction ID {$transaction['id']}. Will retry next run.");
        break;
    }
}

// --- Save latest processed ID ---
file_put_contents(STATE_FILE, json_encode(['transaction' => $latestTransactionId]), LOCK_EX);

echo "Processed up to Transaction ID: $latestTransactionId\n";

// --- Send Telegram ---
function sendTelegramMessage($message) {
    $url = 'https://api.telegram.org/bot' . TELEGRAM_BOT_TOKEN . '/sendMessage';
    $postData = [
        'chat_id' => TELEGRAM_CHAT_ID,
        'text' => $message,
        'parse_mode' => 'HTML'
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        logMessage("cURL Error: " . curl_error($ch));
        curl_close($ch);
        return false;
    }

    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $httpCode === 200;
}
?>