query("SELECT * FROM menu_categories ORDER BY sort_order ASC, id ASC"); $categories = $catStmt->fetchAll() ?: []; $itemSql = "SELECT * FROM menu_items"; if ($availableOnly) { $itemSql .= " WHERE is_available = 1"; } $itemSql .= " ORDER BY sort_order ASC, id ASC"; $itemStmt = $pdo->query($itemSql); $items = $itemStmt->fetchAll() ?: []; // Group items by category_id $grouped = []; foreach ($categories as $cat) { $cat['items'] = []; $grouped[$cat['id']] = $cat; } foreach ($items as $item) { if (isset($grouped[$item['category_id']])) { $grouped[$item['category_id']]['items'][] = $item; } } return array_values($grouped); } function get_all_categories(): array { $pdo = get_db(); $stmt = $pdo->query("SELECT * FROM menu_categories ORDER BY sort_order ASC, id ASC"); return $stmt->fetchAll() ?: []; } function get_category_by_id(int $id): ?array { $pdo = get_db(); $stmt = $pdo->prepare("SELECT * FROM menu_categories WHERE id = ?"); $stmt->execute([$id]); $res = $stmt->fetch(); return $res ?: null; } function category_exists(int $id): bool { if ($id <= 0) { return false; } $pdo = get_db(); $stmt = $pdo->prepare("SELECT 1 FROM menu_categories WHERE id = ?"); $stmt->execute([$id]); return (bool)$stmt->fetchColumn(); } function save_category(array $data, ?int $id = null): int { $pdo = get_db(); $name = trim($data['name'] ?? ''); $description = trim($data['description'] ?? ''); $sortOrder = (int)($data['sort_order'] ?? 0); if ($id && $id > 0) { $stmt = $pdo->prepare("UPDATE menu_categories SET name = ?, description = ?, sort_order = ? WHERE id = ?"); $stmt->execute([$name, $description, $sortOrder, $id]); return $id; } else { $stmt = $pdo->prepare("INSERT INTO menu_categories (name, description, sort_order) VALUES (?, ?, ?)"); $stmt->execute([$name, $description, $sortOrder]); return (int)$pdo->lastInsertId(); } } function delete_category(int $id): bool { $pdo = get_db(); $stmt = $pdo->prepare("DELETE FROM menu_categories WHERE id = ?"); return $stmt->execute([$id]); } function get_menu_item_by_id(int $id): ?array { $pdo = get_db(); $stmt = $pdo->prepare("SELECT * FROM menu_items WHERE id = ?"); $stmt->execute([$id]); $res = $stmt->fetch(); return $res ?: null; } function save_menu_item(array $data, ?int $id = null): int { $pdo = get_db(); $categoryId = (int)($data['category_id'] ?? 0); $name = trim($data['name'] ?? ''); $description = trim($data['description'] ?? ''); $price = trim($data['price'] ?? ''); $badge = trim($data['badge'] ?? ''); $isAvailable = !empty($data['is_available']) ? 1 : 0; $sortOrder = (int)($data['sort_order'] ?? 0); if ($id && $id > 0) { $stmt = $pdo->prepare(" UPDATE menu_items SET category_id = ?, name = ?, description = ?, price = ?, badge = ?, is_available = ?, sort_order = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? "); $stmt->execute([$categoryId, $name, $description, $price, $badge, $isAvailable, $sortOrder, $id]); return $id; } else { $stmt = $pdo->prepare(" INSERT INTO menu_items (category_id, name, description, price, badge, is_available, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?) "); $stmt->execute([$categoryId, $name, $description, $price, $badge, $isAvailable, $sortOrder]); return (int)$pdo->lastInsertId(); } } function toggle_menu_item_availability(int $id): bool { $pdo = get_db(); $stmt = $pdo->prepare("UPDATE menu_items SET is_available = CASE WHEN is_available = 1 THEN 0 ELSE 1 END, updated_at = CURRENT_TIMESTAMP WHERE id = ?"); return $stmt->execute([$id]); } function delete_menu_item(int $id): bool { $pdo = get_db(); $stmt = $pdo->prepare("DELETE FROM menu_items WHERE id = ?"); return $stmt->execute([$id]); }