prepare("UPDATE orders SET status = ? WHERE id = ?"); $stmt->execute([$new_status, $order_id]); header("Location: orders.php?" . http_build_query($_GET)); // Keep filters exit; } // Handle stopping all promotions if (isset($_POST['action']) && $_POST['action'] === 'stop_promotions') { if (!has_permission('manage_products')) { header("Location: orders.php?error=permission_denied"); exit; } // Set promo_date_to to yesterday for all currently active promotions $stmt = $pdo->prepare("UPDATE products SET promo_date_to = DATE_SUB(CURDATE(), INTERVAL 1 DAY) WHERE (promo_date_to >= CURDATE() OR promo_date_to IS NULL) AND promo_discount_percent IS NOT NULL"); $stmt->execute(); header("Location: orders.php?success=promotions_stopped"); exit; } // Handle Delete Order if (isset($_GET['delete'])) { if (!has_permission('manage_orders')) { header("Location: orders.php?error=permission_denied"); exit; } $id = (int)$_GET['delete']; $pdo->beginTransaction(); try { $pdo->prepare("DELETE FROM order_items WHERE order_id = ?")->execute([$id]); $pdo->prepare("DELETE FROM orders WHERE id = ?")->execute([$id]); $pdo->commit(); header("Location: orders.php?success=order_deleted"); } catch (Exception $e) { $pdo->rollBack(); header("Location: orders.php?error=delete_failed"); } exit; } // Fetch Outlets for Filter $outlets = $pdo->query("SELECT id, name FROM outlets ORDER BY name")->fetchAll(PDO::FETCH_ASSOC); // Build Query with Filters $params = []; $where = []; // Filter: Outlet if (!empty($_GET['outlet_id'])) { $where[] = "o.outlet_id = :outlet_id"; $params[':outlet_id'] = $_GET['outlet_id']; } // Filter: Date Range if (!empty($_GET['start_date'])) { $where[] = "DATE(o.created_at) >= :start_date"; $params[':start_date'] = $_GET['start_date']; } if (!empty($_GET['end_date'])) { $where[] = "DATE(o.created_at) <= :end_date"; $params[':end_date'] = $_GET['end_date']; } // Filter: Search (Order No) if (!empty($_GET['search'])) { if (is_numeric($_GET['search'])) { $where[] = "o.id = :search"; $params[':search'] = $_GET['search']; } } $where_clause = !empty($where) ? 'WHERE ' . implode(' AND ', $where) : ''; // Calculate Total Sum for filtered orders $sum_query = "SELECT SUM(total_amount) as total_sum FROM orders o $where_clause"; $stmt_sum = $pdo->prepare($sum_query); $stmt_sum->execute($params); $total_sum = $stmt_sum->fetchColumn() ?: 0; // Main Query $query = "SELECT o.*, ot.name as outlet_name, pt.name as payment_type_name, (SELECT GROUP_CONCAT(CONCAT(p.name, ' x', oi.quantity) SEPARATOR ', ') FROM order_items oi JOIN products p ON oi.product_id = p.id WHERE oi.order_id = o.id) as items_summary FROM orders o LEFT JOIN outlets ot ON o.outlet_id = ot.id LEFT JOIN payment_types pt ON o.payment_type_id = pt.id $where_clause ORDER BY o.created_at DESC"; $orders_pagination = paginate_query($pdo, $query, $params); $orders = $orders_pagination['data']; // Add total sum to pagination object for rendering $orders_pagination['total_amount_sum'] = $total_sum; include 'includes/header.php'; ?>
| ID | Outlet | Customer | Type | Source | Items | Total | Payment | Status | Time | Actions |
|---|---|---|---|---|---|---|---|---|---|---|
| #= $order['id'] ?> | = htmlspecialchars($order['outlet_name'] ?? 'Unknown') ?> |
= htmlspecialchars((string)($order['customer_name'] ?? '')) ?>
= htmlspecialchars((string)($order['customer_phone'] ?? '')) ?>
Guest
|
'bg-info', 'takeaway' => 'bg-success', 'delivery' => 'bg-warning', 'drive-thru' => 'bg-primary', default => 'bg-secondary' }; ?> = ucfirst($order['order_type']) ?> | Table = htmlspecialchars((string)($order['table_number'] ?? '')) ?> = ucfirst($order['order_type']) ?> | = htmlspecialchars((string)($order['items_summary'] ?? '')) ?> | = format_currency($order['total_amount']) ?> | 'bg-success', 'credit card' => 'bg-primary', 'loyalty redeem' => 'bg-warning', 'unpaid' => 'bg-secondary', default => 'bg-secondary' }; ?> = htmlspecialchars((string)($payment_name ?? '')) ?> | = ucfirst($order['status']) ?> |
= date('M d', strtotime($order['created_at'])) ?>
= date('H:i', strtotime($order['created_at'])) ?>
|
|
| No active orders found matching your criteria. | ||||||||||