prepare($check_sql); $stmt->bind_param("s", $category_name); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $error = "Category '$category_name' already exists"; } else { // Insert $sql = "INSERT INTO expense_categories (category_name, description, status, created_at) VALUES (?, ?, 'active', NOW())"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $category_name, $description); if ($stmt->execute()) { logActivity($_SESSION['user_id'], 'CREATE', 'expense_categories', "Created category: $category_name"); $success = "Category '$category_name' created successfully!"; } else { $error = "Failed to create category: " . $stmt->error; } } } catch (Exception $e) { $error = "Database error: " . $e->getMessage(); } } } // Handle Add Subcategory if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add_subcategory') { $category_id = intval($_POST['category_id']); $subcategory_name = trim($_POST['subcategory_name']); $description = trim($_POST['description']); if ($category_id <= 0) { $error = "Please select a category"; } elseif (empty($subcategory_name)) { $error = "Subcategory name is required"; } else { try { $conn = getDbConnection(); // Check duplicate $check_sql = "SELECT subcategory_id FROM expense_subcategories WHERE category_id = ? AND subcategory_name = ?"; $stmt = $conn->prepare($check_sql); $stmt->bind_param("is", $category_id, $subcategory_name); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $error = "Subcategory '$subcategory_name' already exists in this category"; } else { // Insert $sql = "INSERT INTO expense_subcategories (category_id, subcategory_name, description, status, created_at) VALUES (?, ?, ?, 'active', NOW())"; $stmt = $conn->prepare($sql); $stmt->bind_param("iss", $category_id, $subcategory_name, $description); if ($stmt->execute()) { logActivity($_SESSION['user_id'], 'CREATE', 'expense_subcategories', "Created subcategory: $subcategory_name"); $success = "Subcategory '$subcategory_name' created successfully!"; } else { $error = "Failed to create subcategory: " . $stmt->error; } } } catch (Exception $e) { $error = "Database error: " . $e->getMessage(); } } } // Handle Toggle Status if (isset($_GET['toggle_category'])) { $cat_id = intval($_GET['toggle_category']); $conn = getDbConnection(); $sql = "UPDATE expense_categories SET status = IF(status = 'active', 'inactive', 'active') WHERE category_id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $cat_id); $stmt->execute(); $success = "Category status updated"; } if (isset($_GET['toggle_subcategory'])) { $sub_id = intval($_GET['toggle_subcategory']); $conn = getDbConnection(); $sql = "UPDATE expense_subcategories SET status = IF(status = 'active', 'inactive', 'active') WHERE subcategory_id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $sub_id); $stmt->execute(); $success = "Subcategory status updated"; } // Get all categories $categories = fetchAll("SELECT * FROM expense_categories ORDER BY category_name"); // Get all subcategories grouped by category $subcategories_by_category = []; $all_subcategories = fetchAll(" SELECT s.*, c.category_name FROM expense_subcategories s JOIN expense_categories c ON s.category_id = c.category_id ORDER BY c.category_name, s.subcategory_name "); foreach ($all_subcategories as $sub) { $subcategories_by_category[$sub['category_id']][] = $sub; } $page_title = 'Manage Categories'; require_once __DIR__ . '/../includes/header.php'; ?>

πŸ“‚ Manage Expense Categories

All Categories & Subcategories


subcategories β–Ό
πŸ“‚

No categories yet

Create your first expense category to get started

βž• Add New Category

βž• Add New Subcategory

No categories available.