Devco1
Home
Console
Upload
New File
New Folder
Tools
Info
About
/
home
/
wifiyecu
/
www
/
admin
/
Filename :
orders.php
back
Copy
<?php session_start(); include '../includes/config.php'; // التحقق من صلاحيات المدير if (!isset($_SESSION['admin_logged_in'])) { header('Location: login.php'); exit; } // معالجة تحديث حالة الطلب if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_status'])) { $order_id = intval($_POST['order_id']); $new_status = $_POST['status']; // سجل البيانات المستلمة للتشخيص error_log("Updating order $order_id to status: $new_status"); try { $stmt = $pdo->prepare("UPDATE orders SET status = ?, updated_at = NOW() WHERE id = ?"); $result = $stmt->execute([$new_status, $order_id]); if ($result && $stmt->rowCount() > 0) { $_SESSION['message'] = [ 'text' => 'تم تحديث حالة الطلب بنجاح', 'type' => 'success' ]; error_log("Successfully updated order $order_id to $new_status"); } else { $_SESSION['message'] = [ 'text' => 'لم يتم العثور على الطلب أو لم يتغير أي شيء', 'type' => 'warning' ]; error_log("No rows affected for order $order_id"); } } catch (PDOException $e) { $_SESSION['message'] = [ 'text' => 'خطأ في تحديث حالة الطلب: ' . $e->getMessage(), 'type' => 'danger' ]; error_log("Error updating order: " . $e->getMessage()); } header('Location: orders.php'); exit; } // معالجة حذف الطلب if (isset($_GET['delete_id'])) { $order_id = intval($_GET['delete_id']); try { $pdo->beginTransaction(); // حذف تفاصيل الطلب أولاً $stmt = $pdo->prepare("DELETE FROM order_items WHERE order_id = ?"); $stmt->execute([$order_id]); // ثم حذف الطلب $stmt = $pdo->prepare("DELETE FROM orders WHERE id = ?"); $stmt->execute([$order_id]); $pdo->commit(); $_SESSION['message'] = [ 'text' => 'تم حذف الطلب بنجاح', 'type' => 'success' ]; } catch (PDOException $e) { $pdo->rollBack(); $_SESSION['message'] = [ 'text' => 'خطأ في حذف الطلب: ' . $e->getMessage(), 'type' => 'danger' ]; } header('Location: orders.php'); exit; } // الحصول على قائمة الطلبات try { $status_filter = $_GET['status'] ?? ''; $search = $_GET['search'] ?? ''; $date_from = $_GET['date_from'] ?? ''; $date_to = $_GET['date_to'] ?? ''; $sql = "SELECT o.*, COUNT(oi.id) as items_count, SUM(oi.quantity) as total_quantity FROM orders o LEFT JOIN order_items oi ON o.id = oi.order_id WHERE 1=1"; $params = []; if (!empty($status_filter)) { $sql .= " AND o.status = ?"; $params[] = $status_filter; } if (!empty($search)) { $sql .= " AND (o.customer_name LIKE ? OR o.customer_email LIKE ? OR o.customer_phone LIKE ? OR o.id = ?)"; $search_term = "%$search%"; $params[] = $search_term; $params[] = $search_term; $params[] = $search_term; // البحث برقم الطلب إذا كان رقماً if (is_numeric($search)) { $params[] = intval($search); } else { $params[] = 0; // قيمة غير موجودة } } if (!empty($date_from)) { $sql .= " AND DATE(o.created_at) >= ?"; $params[] = $date_from; } if (!empty($date_to)) { $sql .= " AND DATE(o.created_at) <= ?"; $params[] = $date_to; } $sql .= " GROUP BY o.id ORDER BY o.created_at DESC"; $stmt = $pdo->prepare($sql); $stmt->execute($params); $orders = $stmt->fetchAll(); // إحصائيات الطلبات $stats_stmt = $pdo->query(" SELECT status, COUNT(*) as count, SUM(total_amount) as total FROM orders GROUP BY status "); $order_stats = $stats_stmt->fetchAll(); $total_orders = array_sum(array_column($order_stats, 'count')); $total_revenue = array_sum(array_column($order_stats, 'total')); } catch (PDOException $e) { die("خطأ في قاعدة البيانات: " . $e->getMessage()); } // حالة الطلبات $statuses = [ 'pending' => ['label' => 'قيد الانتظار', 'color' => 'warning', 'icon' => 'clock'], 'processing' => ['label' => 'قيد المعالجة', 'color' => 'info', 'icon' => 'cog'], 'completed' => ['label' => 'مكتمل', 'color' => 'success', 'icon' => 'check'], 'cancelled' => ['label' => 'ملغى', 'color' => 'danger', 'icon' => 'times'] ]; ?> <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>إدارة الطلبات - لوحة التحكم</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> <style> .order-card { transition: all 0.3s ease; border-right: 4px solid; } .order-card:hover { transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0,0,0,0.1); } .status-badge { font-size: 0.75rem; } .customer-info { font-size: 0.9rem; } .table-actions { white-space: nowrap; } .order-id { font-family: monospace; background: #f8f9fa; padding: 2px 6px; border-radius: 3px; } .stat-card { transition: transform 0.3s ease; } .stat-card:hover { transform: translateY(-3px); } </style> </head> <body> <!-- شريط التنقل --> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container"> <a class="navbar-brand" href="index.php"> <i class="fas fa-cog"></i> لوحة التحكم </a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav me-auto"> <li class="nav-item"> <a class="nav-link" href="index.php"> <i class="fas fa-tachometer-alt"></i> الرئيسية </a> </li> <li class="nav-item"> <a class="nav-link" href="products.php"> <i class="fas fa-mobile-alt"></i> المنتجات </a> </li> <li class="nav-item"> <a class="nav-link active" href="orders.php"> <i class="fas fa-shopping-cart"></i> الطلبات </a> </li> </ul> <ul class="navbar-nav"> <li class="nav-item"> <span class="nav-link text-light"> <i class="fas fa-user"></i> <?php echo $_SESSION['admin_username']; ?> </span> </li> <li class="nav-item"> <a class="nav-link" href="logout.php"> <i class="fas fa-sign-out-alt"></i> تسجيل الخروج </a> </li> </ul> </div> </div> </nav> <div class="container-fluid mt-4"> <!-- رسائل التنبيه --> <?php if (isset($_SESSION['message'])): ?> <div class="alert alert-<?php echo $_SESSION['message']['type']; ?> alert-dismissible fade show" role="alert"> <?php echo $_SESSION['message']['text']; ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php unset($_SESSION['message']); ?> <?php endif; ?> <!-- رأس الصفحة --> <div class="row mb-4"> <div class="col-12"> <div class="d-flex justify-content-between align-items-center"> <div> <h2 class="mb-1"> <i class="fas fa-shopping-cart me-2"></i>إدارة الطلبات </h2> <p class="text-muted mb-0">إدارة وعرض جميع طلبات العملاء</p> </div> <div class="d-flex gap-2"> <a href="add_order.php" class="btn btn-success"> <i class="fas fa-plus me-2"></i>إضافة طلب جديد </a> <button class="btn btn-outline-primary" onclick="printOrders()"> <i class="fas fa-print me-2"></i>طباعة </button> <button class="btn btn-outline-success" onclick="exportToExcel()"> <i class="fas fa-download me-2"></i>تصدير </button> </div> </div> </div> </div> <!-- إحصائيات سريعة --> <div class="row mb-4"> <div class="col-md-2"> <div class="card stat-card bg-primary text-white"> <div class="card-body text-center"> <h4 class="mb-0"><?php echo $total_orders; ?></h4> <small>إجمالي الطلبات</small> </div> </div> </div> <?php foreach ($statuses as $status_key => $status_info): ?> <div class="col-md-2"> <div class="card stat-card bg-<?php echo $status_info['color']; ?> text-white"> <div class="card-body text-center"> <h4 class="mb-0"> <?php $count = 0; foreach ($order_stats as $stat) { if ($stat['status'] === $status_key) { $count = $stat['count']; break; } } echo $count; ?> </h4> <small><?php echo $status_info['label']; ?></small> </div> </div> </div> <?php endforeach; ?> <div class="col-md-2"> <div class="card stat-card bg-dark text-white"> <div class="card-body text-center"> <h4 class="mb-0">$<?php echo number_format($total_revenue, 2); ?></h4> <small>إجمالي الإيرادات</small> </div> </div> </div> </div> <!-- أدوات البحث والتصفية --> <div class="row mb-4"> <div class="col-12"> <div class="card"> <div class="card-body"> <form method="GET" class="row g-3"> <div class="col-md-3"> <div class="input-group"> <span class="input-group-text"> <i class="fas fa-search"></i> </span> <input type="text" class="form-control" name="search" placeholder="ابحث بالاسم، البريد، الهاتف أو رقم الطلب..." value="<?php echo htmlspecialchars($search); ?>"> </div> </div> <div class="col-md-2"> <select class="form-select" name="status"> <option value="">جميع الحالات</option> <?php foreach ($statuses as $key => $info): ?> <option value="<?php echo $key; ?>" <?php echo ($status_filter == $key) ? 'selected' : ''; ?>> <?php echo $info['label']; ?> </option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <input type="date" class="form-control" name="date_from" value="<?php echo htmlspecialchars($date_from); ?>" placeholder="من تاريخ"> </div> <div class="col-md-2"> <input type="date" class="form-control" name="date_to" value="<?php echo htmlspecialchars($date_to); ?>" placeholder="إلى تاريخ"> </div> <div class="col-md-2"> <button type="submit" class="btn btn-primary w-100"> <i class="fas fa-filter me-2"></i>تصفية </button> </div> <div class="col-md-1"> <a href="orders.php" class="btn btn-outline-secondary w-100" title="إعادة تعيين"> <i class="fas fa-refresh"></i> </a> </div> </form> </div> </div> </div> </div> <!-- جدول الطلبات --> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-header"> <h5 class="card-title mb-0"> <i class="fas fa-list me-2"></i>قائمة الطلبات <span class="badge bg-secondary"><?php echo count($orders); ?></span> </h5> </div> <div class="card-body"> <?php if (empty($orders)): ?> <div class="text-center py-5"> <i class="fas fa-shopping-cart fa-3x text-muted mb-3"></i> <h4 class="text-muted">لا توجد طلبات</h4> <p class="text-muted mb-4">لم يتم تقديم أي طلبات بعد</p> </div> <?php else: ?> <div class="table-responsive"> <table class="table table-hover" id="ordersTable"> <thead class="table-light"> <tr> <th>#</th> <th>رقم الطلب</th> <th>العميل</th> <th>عناصر الطلب</th> <th>المبلغ</th> <th>الحالة</th> <th>التاريخ</th> <th>الإجراءات</th> </tr> </thead> <tbody> <?php foreach ($orders as $index => $order): $status_info = $statuses[$order['status']]; ?> <tr class="order-row" data-order-id="<?php echo $order['id']; ?>"> <td><?php echo $index + 1; ?></td> <td> <strong class="order-id">#<?php echo str_pad($order['id'], 6, '0', STR_PAD_LEFT); ?></strong> </td> <td> <div class="customer-info"> <strong><?php echo htmlspecialchars($order['customer_name']); ?></strong> <br> <small class="text-muted"> <i class="fas fa-envelope me-1"></i> <?php echo htmlspecialchars($order['customer_email']); ?> </small> <br> <small class="text-muted"> <i class="fas fa-phone me-1"></i> <?php echo htmlspecialchars($order['customer_phone']); ?> </small> </div> </td> <td> <span class="badge bg-primary"> <?php echo $order['items_count']; ?> عنصر </span> <br> <small class="text-muted"> <?php echo $order['total_quantity']; ?> قطعة </small> </td> <td> <strong class="text-success">$<?php echo number_format($order['total_amount'], 2); ?></strong> </td> <td> <form method="POST" class="d-inline"> <input type="hidden" name="order_id" value="<?php echo $order['id']; ?>"> <select name="status" class="form-select form-select-sm status-select" onchange="this.form.submit()" style="width: 140px;"> <?php foreach ($statuses as $key => $info): ?> <option value="<?php echo $key; ?>" <?php echo ($order['status'] == $key) ? 'selected' : ''; ?>> <?php echo $info['label']; ?> </option> <?php endforeach; ?> </select> <button type="submit" name="update_status" class="d-none">تحديث</button> </form> <br> <span class="badge bg-<?php echo $status_info['color']; ?> status-badge"> <i class="fas fa-<?php echo $status_info['icon']; ?> me-1"></i> <?php echo $status_info['label']; ?> </span> </td> <td> <small class="text-muted"> <?php echo date('Y-m-d', strtotime($order['created_at'])); ?> <br> <?php echo date('H:i', strtotime($order['created_at'])); ?> </small> </td> <td> <div class="table-actions"> <button class="btn btn-sm btn-outline-primary view-order" data-order-id="<?php echo $order['id']; ?>" title="عرض التفاصيل"> <i class="fas fa-eye"></i> </button> <a href="order_details.php?id=<?php echo $order['id']; ?>" class="btn btn-sm btn-outline-info" title="تفاصيل كاملة"> <i class="fas fa-info-circle"></i> </a> <button class="btn btn-sm btn-outline-danger delete-order" data-order-id="<?php echo $order['id']; ?>" data-order-number="#<?php echo str_pad($order['id'], 6, '0', STR_PAD_LEFT); ?>" title="حذف الطلب"> <i class="fas fa-trash"></i> </button> </div> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <?php endif; ?> </div> </div> </div> </div> </div> <!-- نموذج عرض تفاصيل الطلب --> <div class="modal fade" id="orderDetailsModal" tabindex="-1"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">تفاصيل الطلب</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body" id="orderDetailsContent"> <!-- سيتم تحميل المحتوى هنا عبر AJAX --> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script> // عرض تفاصيل الطلب document.querySelectorAll('.view-order').forEach(btn => { btn.addEventListener('click', function() { const orderId = this.dataset.orderId; loadOrderDetails(orderId); }); }); // تأكيد حذف الطلب document.querySelectorAll('.delete-order').forEach(btn => { btn.addEventListener('click', function() { const orderId = this.dataset.orderId; const orderNumber = this.dataset.orderNumber; if (confirm(`هل أنت متأكد من حذف الطلب ${orderNumber}؟ هذا الإجراء لا يمكن التراجع عنه.`)) { window.location.href = `orders.php?delete_id=${orderId}`; } }); }); // تحميل تفاصيل الطلب عبر AJAX async function loadOrderDetails(orderId) { try { const response = await fetch(`ajax/get_order_details.php?order_id=${orderId}`); if (!response.ok) { throw new Error('Network response was not ok'); } const details = await response.text(); document.getElementById('orderDetailsContent').innerHTML = details; const modal = new bootstrap.Modal(document.getElementById('orderDetailsModal')); modal.show(); } catch (error) { console.error('Error:', error); alert('حدث خطأ أثناء تحميل تفاصيل الطلب'); } } // طباعة الطلبات function printOrders() { const table = document.getElementById('ordersTable').cloneNode(true); // إزالة الأزرار والأشياء غير ضرورية للطباعة const buttons = table.querySelectorAll('.table-actions, .status-select'); buttons.forEach(btn => btn.remove()); const printWindow = window.open('', '_blank'); printWindow.document.write(` <html> <head> <title>طباعة الطلبات - متجر الهواتف</title> <style> body { font-family: Arial, sans-serif; margin: 20px; direction: rtl; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } th, td { border: 1px solid #ddd; padding: 8px; text-align: right; } th { background-color: #f8f9fa; font-weight: bold; } .badge { padding: 4px 8px; border-radius: 4px; font-size: 12px; } .bg-success { background-color: #28a745 !important; color: white; } .bg-warning { background-color: #ffc107 !important; color: black; } .bg-danger { background-color: #dc3545 !important; color: white; } .bg-info { background-color: #17a2b8 !important; color: white; } h2 { color: #333; text-align: center; } </style> </head> <body> <h2>تقارير الطلبات - متجر الهواتف</h2> <p>تاريخ الطباعة: ${new Date().toLocaleDateString('ar-EG')}</p> ${table.outerHTML} </body> </html> `); printWindow.document.close(); printWindow.print(); } // تصدير إلى Excel function exportToExcel() { // يمكن تطوير هذه الدالة لتصدير إلى Excel alert('سيتم تطوير خاصية التصدير إلى Excel في الإصدارات القادمة'); // يمكن استخدام مكتبة مثل SheetJS لهذا الغرض } // البحث التلقائي document.addEventListener('DOMContentLoaded', function() { const searchInput = document.querySelector('input[name="search"]'); const statusSelect = document.querySelector('select[name="status"]'); const dateFrom = document.querySelector('input[name="date_from"]'); const dateTo = document.querySelector('input[name="date_to"]'); let searchTimeout; searchInput.addEventListener('input', function() { clearTimeout(searchTimeout); searchTimeout = setTimeout(() => { if (this.value.length >= 3 || this.value.length === 0) { this.form.submit(); } }, 500); }); [statusSelect, dateFrom, dateTo].forEach(element => { element.addEventListener('change', function() { this.form.submit(); }); }); }); </script> </body> </html>