login_username)) { $responseText = "💰 *مدیریت مالی*\n\nلطفاً یکی از گزینه‌های زیر را انتخاب کنید:"; $keyboard = json_encode([ "resize_keyboard" => true, "keyboard" => [ [["text" => "🏧 تراکنش های برداشت"], ["text" => "💸 تراکنش‌های فروش"]], [["text" => "🔍 جستجوی تراکنش"]], [["text" => "➕ افزایش موجودی"], ["text" => "➖ کسر موجودی"]], [["text" => "↩️ بازگشت به مدیریت"]] ] ]); sendMessage($from_id, $responseText, $keyboard); die; } if ($text == "🏧 تراکنش های برداشت" && isAdmin($user->login_username)) { $page = 1; $limit = 5; $offset = ($page - 1) * $limit; $queryCount = " SELECT COUNT(*) AS total FROM `withdrawals` "; $stmt = $pdo->prepare($queryCount); $stmt->execute(); $total = (int) $stmt->fetch()->total; if ($total == 0) { sendMessage($from_id, "❗ هیچ تراکنش برداشتی ثبت نشده است."); die; } $totalPages = max(1, ceil($total / $limit)); $queryRows = " SELECT * FROM `withdrawals` ORDER BY `id` DESC LIMIT $limit OFFSET $offset "; $stmt = $pdo->prepare($queryRows); $stmt->execute(); $rows = $stmt->fetchAll(); $msg = "📄 *لیست تراکنش‌های برداشت*\n\n"; foreach ($rows as $r) { if ($r->status == "pending") $statusText = "🔄 در صف انتظار"; elseif ($r->status == "sent") $statusText = "🚚 درحال واریز"; elseif ($r->status == "done") $statusText = "✅ تسویه شده"; elseif ($r->status == "rejected") $statusText = "❌ رد شده"; else $statusText = "نامشخص"; // زمان درخواست شمسی $rTime = jdate("H:i:s - Y/m/d", strtotime($r->created_at), tr_num: 'en'); $msg .= "📌 *شناسه برداشت:* `{$r->withdraw_id}`\n" . "👤 کاربر: `{$r->username}`\n" . "💳 کارت مقصد: `{$r->card_number}`\n" . "💵 مبلغ: `" . number_format($r->amount_irt) . "` تومان\n" . "📅 زمان درخواست: {$rTime}\n" . "📍 وضعیت: {$statusText}\n" . "———————————————\n"; } $msg .= "\nصفحه {$page} از {$totalPages}"; $nav = ["inline_keyboard" => []]; $row = []; if ($page < $totalPages) $row[] = ["text" => "بعدی ➡️", "callback_data" => "wdadmin_" . ($page + 1)]; if (!empty($row)) $nav["inline_keyboard"][] = $row; setStep($from_id, "admin-wd-page-$page"); sendMessage($from_id, $msg, json_encode($nav)); die; } if (isset($data) && strpos($data, "wdadmin_") === 0 && isAdmin($user->login_username)) { $page = (int) str_replace("wdadmin_", "", $data); $limit = 5; $offset = ($page - 1) * $limit; $queryCount = " SELECT COUNT(*) AS total FROM `withdrawals` "; $stmt = $pdo->prepare($queryCount); $stmt->execute(); $total = (int) $stmt->fetch()->total; $totalPages = max(1, ceil($total / $limit)); $queryRows = " SELECT * FROM `withdrawals` ORDER BY `id` DESC LIMIT $limit OFFSET $offset "; $stmt = $pdo->prepare($queryRows); $stmt->execute(); $rows = $stmt->fetchAll(); $msg = "📄 *لیست تراکنش‌های برداشت*\n\n"; foreach ($rows as $r) { if ($r->status == "pending") $statusText = "🔄 در صف انتظار"; elseif ($r->status == "sent") $statusText = "🚚 درحال واریز"; elseif ($r->status == "done") $statusText = "✅ تسویه شده"; elseif ($r->status == "rejected") $statusText = "❌ رد شده"; else $statusText = "نامشخص"; // زمان درخواست شمسی $rTime = jdate("H:i:s - Y/m/d", strtotime($r->created_at), tr_num: 'en'); $msg .= "📌 *شناسه برداشت:* `{$r->withdraw_id}`\n" . "👤 کاربر: `{$r->username}`\n" . "💳 کارت مقصد: `{$r->card_number}`\n" . "💵 مبلغ: `" . number_format($r->amount_irt) . "` تومان\n" . "📅 زمان درخواست: {$rTime}\n" . "📍 وضعیت: {$statusText}\n" . "———————————————\n"; } $msg .= "\nصفحه {$page} از {$totalPages}"; $nav = ["inline_keyboard" => []]; $row = []; if ($page > 1) $row[] = ["text" => "⬅️ قبلی", "callback_data" => "wdadmin_" . ($page - 1)]; if ($page < $totalPages) $row[] = ["text" => "بعدی ➡️", "callback_data" => "wdadmin_" . ($page + 1)]; if (!empty($row)) $nav["inline_keyboard"][] = $row; editMessage($from_id, $message_id, $msg, json_encode($nav)); die; } if ($text == "💸 تراکنش‌های فروش" && isAdmin($user->login_username)) { $page = 1; $limit = 5; $offset = ($page - 1) * $limit; $stmt = $pdo->prepare("SELECT COUNT(*) AS total FROM `transactions`"); $stmt->execute(); $total = (int) $stmt->fetch()->total; if ($total == 0) { sendMessage($from_id, "❗ هیچ تراکنش فروشی ثبت نشده است."); die; } $totalPages = ceil($total / $limit); $stmt = $pdo->prepare(" SELECT * FROM `transactions` ORDER BY `id` DESC LIMIT $limit OFFSET $offset "); $stmt->execute(); $rows = $stmt->fetchAll(); $msg = "📄 *لیست تراکنش‌های فروش*\n\n"; foreach ($rows as $r) { if ($r->status == "done") $status = "✅ تایید شده"; elseif ($r->status == "pending") $status = "⏳ در انتظار"; elseif ($r->status == "rejected") $status = "❌ رد شده"; else $status = "نامشخص"; // زمان درخواست شمسی $rTime = jdate("H:i:s - Y/m/d", strtotime($r->created_at), tr_num: 'en'); $msg .= "🆔 شناسه سفارش: `{$r->order_id}`\n" . "👤 کاربر: `{$r->username}`\n" . "💰 مقدار: `{$r->amount_usdt}` USDT\n" . "💵 مبلغ: `" . number_format($r->amount_irt) . "` تومان\n" . "📌 وضعیت: {$status}\n" . "📅 زمان درخواست: {$rTime}\n" . "———————————————\n"; } $msg .= "\nصفحه {$page} از {$totalPages}"; $nav = ["inline_keyboard" => []]; $row = []; if ($page < $totalPages) $row[] = ["text" => "بعدی ➡️", "callback_data" => "adminsell_" . ($page + 1)]; if (!empty($row)) $nav["inline_keyboard"][] = $row; setStep($from_id, "admin-sell-page-$page"); sendMessage($from_id, $msg, json_encode($nav)); die; } if (isset($data) && strpos($data, "adminsell_") === 0 && isAdmin($user->login_username)) { $page = (int) str_replace("adminsell_", "", $data); $limit = 5; $offset = ($page - 1) * $limit; $stmt = $pdo->prepare("SELECT COUNT(*) AS total FROM `transactions`"); $stmt->execute(); $total = (int) $stmt->fetch()->total; $totalPages = ceil($total / $limit); $stmt = $pdo->prepare(" SELECT * FROM `transactions` ORDER BY `id` DESC LIMIT $limit OFFSET $offset "); $stmt->execute(); $rows = $stmt->fetchAll(); $msg = "📄 *لیست تراکنش‌های فروش*\n\n"; foreach ($rows as $r) { if ($r->status == "done") $status = "✅ تایید شده"; elseif ($r->status == "pending") $status = "⏳ در انتظار"; elseif ($r->status == "rejected") $status = "❌ رد شده"; else $status = "نامشخص"; // زمان درخواست شمسی $rTime = jdate("H:i:s - Y/m/d", strtotime($r->created_at), tr_num: 'en'); $msg .= "🆔 شناسه سفارش: `{$r->order_id}`\n" . "👤 کاربر: `{$r->username}`\n" . "💰 مقدار: `{$r->amount_usdt}` USDT\n" . "💵 مبلغ: `" . number_format($r->amount_irt) . "` تومان\n" . "📌 وضعیت: {$status}\n" . "📅 زمان درخواست: {$rTime}\n" . "———————————————\n"; } $msg .= "\nصفحه {$page} از {$totalPages}"; $nav = ["inline_keyboard" => []]; $row = []; if ($page > 1) $row[] = ["text" => "⬅️ قبلی", "callback_data" => "adminsell_" . ($page - 1)]; if ($page < $totalPages) $row[] = ["text" => "بعدی ➡️", "callback_data" => "adminsell_" . ($page + 1)]; if (!empty($row)) $nav["inline_keyboard"][] = $row; editMessage($from_id, $message_id, $msg, json_encode($nav)); die; } if ($text == "➕ افزایش موجودی" && isAdmin($user->login_username)) { setStep($from_id, "admin-addbalance-enteruser"); sendMessage( $from_id, "👤 *افزایش موجودی*\n\nلطفاً *نام کاربری* حساب مورد نظر را وارد کنید:" , $backToAdminKeyboard ); die; } if ($user->step == "admin-addbalance-enteruser" && isAdmin($user->login_username)) { $uname = trim($text); $query = " SELECT `username`, `balance` FROM `accounts` WHERE `username` = ? LIMIT 1 "; $stmt = $pdo->prepare($query); $stmt->execute([$uname]); $acc = $stmt->fetch(); if (!$acc) { sendMessage($from_id, "❌ کاربر پیدا نشد.\nدوباره نام کاربری را وارد کنید:"); die; } $balanceFormatted = number_format($acc->balance); sendMessage( $from_id, "✅ کاربر یافت شد.\n\n" . "👤 نام کاربری: `{$acc->username}`\n" . "💰 موجودی فعلی: `{$balanceFormatted}` تومان\n\n" . "لطفاً مقدار افزایش موجودی را وارد کنید:" ); setStep($from_id, "admin-addbalance-amount:$uname"); die; } if (strpos($user->step, "admin-addbalance-amount:") === 0 && isAdmin($user->login_username)) { $username = explode(":", $user->step)[1]; $amount = trim($text); if (!is_numeric($amount) || $amount <= 0) { sendMessage($from_id, "⚠️ مقدار نامعتبر است.\nدوباره وارد کنید:"); die; } $queryUpdate = " UPDATE `accounts` SET `balance` = `balance` + ? WHERE `username` = ? "; $stmt = $pdo->prepare($queryUpdate); $stmt->execute([$amount, $username]); $formatted = number_format($amount); sendMessage( $from_id, "✅ موجودی با موفقیت افزایش یافت.\n\n" . "👤 کاربر: `{$username}`\n" . "➕ مقدار: `{$formatted}` تومان" , $adminMainKeyboard ); setStep($from_id, "admin_panel"); die; } if ($text == "➖ کسر موجودی" && isAdmin($user->login_username)) { setStep($from_id, "admin-dedbalance-user"); sendMessage( $from_id, "👤 *کسر موجودی*\n\nنام کاربری را وارد کنید:" , $backToAdminKeyboard ); die; } if ($user->step == "admin-dedbalance-user" && isAdmin($user->login_username)) { $uname = trim($text); $stmt = $pdo->prepare(" SELECT username, balance FROM accounts WHERE username = ? LIMIT 1 "); $stmt->execute([$uname]); $acc = $stmt->fetch(); if (!$acc) { sendMessage($from_id, "❌ کاربر یافت نشد.\nدوباره وارد کنید:"); die; } $bal = number_format($acc->balance); sendMessage( $from_id, "👤 کاربر یافت شد.\n\nنام کاربری: `{$acc->username}`\n" . "💰 موجودی فعلی: `{$bal}` تومان\n\n" . "مقدار موردنظر برای *کسر موجودی* را ارسال کنید:" , $backToAdminKeyboard ); setStep($from_id, "admin-dedbalance-amount:$uname"); die; } if (strpos($user->step, "admin-dedbalance-amount:") === 0 && isAdmin($user->login_username)) { $username = explode(":", $user->step)[1]; $amount = trim($text); if (!is_numeric($amount) || $amount <= 0) { sendMessage($from_id, "⚠️ مقدار نامعتبر است.\nدوباره وارد کنید:"); die; } $stmt = $pdo->prepare("SELECT balance FROM accounts WHERE username=?"); $stmt->execute([$username]); $bal = (int) $stmt->fetch()->balance; if ($amount > $bal) { sendMessage($from_id, "❌ موجودی کافی نیست.\nموجودی فعلی: " . number_format($bal)); die; } $stmt = $pdo->prepare(" UPDATE accounts SET balance = balance - ? WHERE username = ? "); $stmt->execute([$amount, $username]); sendMessage( $from_id, "✅ کسر موجودی انجام شد.\n\n" . "👤 کاربر: `{$username}`\n" . "➖ مقدار کسر شده: `" . number_format($amount) . "` تومان" , $adminMainKeyboard ); setStep($from_id, "admin_panel"); die; } if ($text == "🔍 جستجوی تراکنش" && isAdmin($user->login_username)) { sendMessage( $from_id, "🔍 *جستجوی تراکنش*\n\nلطفاً *شناسه تراکنش* را وارد کنید:", $backToAdminKeyboard ); setStep($from_id, "admin:search-tx"); die; } if ($user->step == "admin:search-tx" && isAdmin($user->login_username)) { $txid = trim($text); if (preg_match("/^WD\-\d+$/", $txid)) { $stmt = $pdo->prepare("SELECT * FROM `withdrawals` WHERE `tracking_id` = ? LIMIT 1"); $stmt->execute([$txid]); $tx = $stmt->fetch(); if (!$tx) { sendMessage($from_id, "❌ هیچ تراکنش برداشتی با این شناسه پیدا نشد."); die; } $txDate = jdate("Y/m/d - H:i:s", strtotime(date($tx->created_at)), tr_num: 'en'); $statusText = $tx->status == "pending" ? "⏳ در صف انتظار" : ($tx->status == "sent" ? "🚚 درحال واریز" : ($tx->status == "done" ? "✅ تسویه شده" : ($tx->status == "rejected" ? "❌ رد شده" : "نامشخص"))); $msg = "🏧 *جزئیات تراکنش برداشت*\n\n" . "🔖 شناسه برداشت: `{$tx->withdraw_id}`\n" . "👤 کاربر: `{$tx->username}`\n" . "💳 کارت مقصد: `{$tx->card_number}`\n" . "💵 مبلغ: `" . number_format($tx->amount_irt) . "` تومان\n" . "📌 وضعیت: {$statusText}\n" . "🔢 کد پیگیری داخلی: `{$tx->tracking_id}`\n" . "⏱ زمان ثبت: {$txDate}"; sendMessage($from_id, $msg, $adminMainKeyboard); setStep($from_id, "admin_panel"); die; } if (preg_match("/^SELL\_[A-Za-z0-9]+$/", $txid)) { $stmt = $pdo->prepare("SELECT * FROM `transactions` WHERE `order_id` = ? LIMIT 1"); $stmt->execute([$txid]); $tx = $stmt->fetch(); if (!$tx) { sendMessage($from_id, "❌ هیچ تراکنش فروشی با این شناسه پیدا نشد."); die; } $statusText = $tx->status == "done" ? "✅ تایید شده" : ($tx->status == "pending" ? "⏳ در انتظار" : "❌ رد شده"); $msg = "💸 *جزئیات تراکنش فروش*\n\n" . "🆔 شناسه: `{$tx->order_id}`\n" . "👤 کاربر: `{$tx->username}`\n" . "💰 مقدار: {$tx->amount_usdt} USDT\n" . "💵 مبلغ: `" . number_format($tx->amount_irt) . "` تومان\n" . "📌 وضعیت: {$statusText}\n" . "⏱ زمان ثبت: {$tx->created_at}"; sendMessage($from_id, $msg, $adminMainKeyboard); setStep($from_id, "admin_panel"); die; } sendMessage( $from_id, "⚠️ شناسه تراکنش معتبر نیست.\n\nنمونه‌های صحیح:\n`WD-9067827`\n`SELL_69233f8833e2c`" ); die; }