requireLogin(); $page_title = 'Settings'; $success_message = ''; $error_message = ''; // Handle form submissions if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { switch ($_POST['action']) { case 'create_unit': $unit_name = trim($_POST['unit_name'] ?? ''); $unit_symbol = trim($_POST['unit_symbol'] ?? ''); $unit_type = $_POST['unit_type'] ?? ''; if (empty($unit_name) || empty($unit_symbol) || empty($unit_type)) { $error_message = 'All fields are required for unit creation.'; } else { $stmt = $pdo->prepare("SELECT id FROM units WHERE unit_name = ? OR unit_symbol = ?"); $stmt->execute([$unit_name, $unit_symbol]); if ($stmt->fetch()) { $error_message = 'Unit name or symbol already exists.'; } else { $stmt = $pdo->prepare("INSERT INTO units (unit_name, unit_symbol, unit_type, created_by) VALUES (?, ?, ?, ?)"); if ($stmt->execute([$unit_name, $unit_symbol, $unit_type, $_SESSION['user_id']])) { $_SESSION['success_message'] = 'Unit created successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to create unit.'; } } } break; case 'edit_unit': $unit_id = $_POST['unit_id'] ?? 0; $unit_name = trim($_POST['unit_name'] ?? ''); $unit_symbol = trim($_POST['unit_symbol'] ?? ''); $unit_type = $_POST['unit_type'] ?? ''; if (empty($unit_name) || empty($unit_symbol) || empty($unit_type)) { $error_message = 'All fields are required for unit update.'; } else { $stmt = $pdo->prepare("SELECT id FROM units WHERE (unit_name = ? OR unit_symbol = ?) AND id != ?"); $stmt->execute([$unit_name, $unit_symbol, $unit_id]); if ($stmt->fetch()) { $error_message = 'Unit name or symbol already exists.'; } else { $stmt = $pdo->prepare("UPDATE units SET unit_name = ?, unit_symbol = ?, unit_type = ? WHERE id = ?"); if ($stmt->execute([$unit_name, $unit_symbol, $unit_type, $unit_id])) { $_SESSION['success_message'] = 'Unit updated successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to update unit.'; } } } break; case 'delete_unit': $unit_id = $_POST['unit_id'] ?? 0; // Check if unit is being used by any products/services $stmt = $pdo->prepare("SELECT COUNT(*) FROM products_services WHERE unit_id = ?"); $stmt->execute([$unit_id]); $usage_count = $stmt->fetchColumn(); if ($usage_count > 0) { $error_message = 'Cannot delete unit. It is being used by ' . $usage_count . ' product(s)/service(s).'; } else { $stmt = $pdo->prepare("DELETE FROM units WHERE id = ?"); if ($stmt->execute([$unit_id])) { $_SESSION['success_message'] = 'Unit deleted successfully.'; } else { $_SESSION['error_message'] = 'Failed to delete unit.'; } header("Location: settings.php"); exit(); } break; case 'create_expense_category': $category_name = trim($_POST['category_name'] ?? ''); $description = trim($_POST['description'] ?? ''); if (empty($category_name)) { $error_message = 'Category name is required.'; } else { $stmt = $pdo->prepare("SELECT id FROM expense_categories WHERE category_name = ?"); $stmt->execute([$category_name]); if ($stmt->fetch()) { $error_message = 'Category already exists.'; } else { $stmt = $pdo->prepare("INSERT INTO expense_categories (category_name, description, created_by) VALUES (?, ?, ?)"); if ($stmt->execute([$category_name, $description, $_SESSION['user_id']])) { $_SESSION['success_message'] = 'Expense category created successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to create category.'; } } } break; case 'edit_expense_category': $category_id = $_POST['category_id'] ?? 0; $category_name = trim($_POST['category_name'] ?? ''); $description = trim($_POST['description'] ?? ''); if (empty($category_name)) { $error_message = 'Category name is required.'; } else { $stmt = $pdo->prepare("SELECT id FROM expense_categories WHERE category_name = ? AND id != ?"); $stmt->execute([$category_name, $category_id]); if ($stmt->fetch()) { $error_message = 'Category name already exists.'; } else { $stmt = $pdo->prepare("UPDATE expense_categories SET category_name = ?, description = ? WHERE id = ?"); if ($stmt->execute([$category_name, $description, $category_id])) { $_SESSION['success_message'] = 'Category updated successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to update category.'; } } } break; case 'delete_expense_category': $category_id = $_POST['category_id'] ?? 0; // Check if category has subcategories $stmt = $pdo->prepare("SELECT COUNT(*) FROM expense_subcategories WHERE category_id = ?"); $stmt->execute([$category_id]); $subcategory_count = $stmt->fetchColumn(); if ($subcategory_count > 0) { $error_message = 'Cannot delete category. It has ' . $subcategory_count . ' subcategory/subcategories.'; } else { $stmt = $pdo->prepare("DELETE FROM expense_categories WHERE id = ?"); if ($stmt->execute([$category_id])) { $_SESSION['success_message'] = 'Category deleted successfully.'; } else { $_SESSION['error_message'] = 'Failed to delete category.'; } header("Location: settings.php"); exit(); } break; case 'create_expense_subcategory': $category_id = $_POST['category_id'] ?? 0; $subcategory_name = trim($_POST['subcategory_name'] ?? ''); $description = trim($_POST['description'] ?? ''); if (empty($subcategory_name) || empty($category_id)) { $error_message = 'Subcategory name and category are required.'; } else { $stmt = $pdo->prepare("SELECT id FROM expense_subcategories WHERE category_id = ? AND subcategory_name = ?"); $stmt->execute([$category_id, $subcategory_name]); if ($stmt->fetch()) { $error_message = 'Subcategory already exists in this category.'; } else { $stmt = $pdo->prepare("INSERT INTO expense_subcategories (category_id, subcategory_name, description, created_by) VALUES (?, ?, ?, ?)"); if ($stmt->execute([$category_id, $subcategory_name, $description, $_SESSION['user_id']])) { $_SESSION['success_message'] = 'Expense subcategory created successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to create subcategory.'; } } } break; case 'edit_expense_subcategory': $subcategory_id = $_POST['subcategory_id'] ?? 0; $category_id = $_POST['category_id'] ?? 0; $subcategory_name = trim($_POST['subcategory_name'] ?? ''); $description = trim($_POST['description'] ?? ''); if (empty($subcategory_name) || empty($category_id)) { $error_message = 'Subcategory name and category are required.'; } else { $stmt = $pdo->prepare("SELECT id FROM expense_subcategories WHERE category_id = ? AND subcategory_name = ? AND id != ?"); $stmt->execute([$category_id, $subcategory_name, $subcategory_id]); if ($stmt->fetch()) { $error_message = 'Subcategory already exists in this category.'; } else { $stmt = $pdo->prepare("UPDATE expense_subcategories SET category_id = ?, subcategory_name = ?, description = ? WHERE id = ?"); if ($stmt->execute([$category_id, $subcategory_name, $description, $subcategory_id])) { $_SESSION['success_message'] = 'Subcategory updated successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to update subcategory.'; } } } break; case 'delete_expense_subcategory': $subcategory_id = $_POST['subcategory_id'] ?? 0; $stmt = $pdo->prepare("DELETE FROM expense_subcategories WHERE id = ?"); if ($stmt->execute([$subcategory_id])) { $_SESSION['success_message'] = 'Subcategory deleted successfully.'; } else { $_SESSION['error_message'] = 'Failed to delete subcategory.'; } header("Location: settings.php"); exit(); break; case 'create_product_service': $name = trim($_POST['name'] ?? ''); $type = $_POST['type'] ?? ''; $description = trim($_POST['description'] ?? ''); $unit_id = $_POST['unit_id'] ?? 0; $unit_rate = $_POST['unit_rate'] ?? 0; if (empty($name) || empty($type) || empty($unit_id)) { $error_message = 'Name, type, and unit are required.'; } elseif (!is_numeric($unit_rate) || $unit_rate < 0) { $error_message = 'Please enter a valid unit rate.'; } else { $stmt = $pdo->prepare("SELECT id FROM products_services WHERE name = ?"); $stmt->execute([$name]); if ($stmt->fetch()) { $error_message = 'Product/Service name already exists.'; } else { $stmt = $pdo->prepare("INSERT INTO products_services (name, type, description, unit_id, unit_rate, created_by) VALUES (?, ?, ?, ?, ?, ?)"); if ($stmt->execute([$name, $type, $description, $unit_id, $unit_rate, $_SESSION['user_id']])) { $_SESSION['success_message'] = ucfirst($type) . ' created successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to create ' . $type . '.'; } } } break; case 'edit_product_service': $ps_id = $_POST['ps_id'] ?? 0; $name = trim($_POST['name'] ?? ''); $type = $_POST['type'] ?? ''; $description = trim($_POST['description'] ?? ''); $unit_id = $_POST['unit_id'] ?? 0; $unit_rate = $_POST['unit_rate'] ?? 0; if (empty($name) || empty($type) || empty($unit_id)) { $error_message = 'Name, type, and unit are required.'; } elseif (!is_numeric($unit_rate) || $unit_rate < 0) { $error_message = 'Please enter a valid unit rate.'; } else { $stmt = $pdo->prepare("SELECT id FROM products_services WHERE name = ? AND id != ?"); $stmt->execute([$name, $ps_id]); if ($stmt->fetch()) { $error_message = 'Product/Service name already exists.'; } else { $stmt = $pdo->prepare("UPDATE products_services SET name = ?, type = ?, description = ?, unit_id = ?, unit_rate = ? WHERE id = ?"); if ($stmt->execute([$name, $type, $description, $unit_id, $unit_rate, $ps_id])) { $_SESSION['success_message'] = 'Product/Service updated successfully.'; header("Location: settings.php"); exit(); } else { $error_message = 'Failed to update product/service.'; } } } break; case 'delete_product_service': $ps_id = $_POST['ps_id'] ?? 0; $stmt = $pdo->prepare("DELETE FROM products_services WHERE id = ?"); if ($stmt->execute([$ps_id])) { $_SESSION['success_message'] = 'Product/Service deleted successfully.'; } else { $_SESSION['error_message'] = 'Failed to delete product/service.'; } header("Location: settings.php"); exit(); break; case 'toggle_unit_status': $unit_id = $_POST['unit_id'] ?? 0; $status = $_POST['status'] ?? 'active'; $stmt = $pdo->prepare("UPDATE units SET status = ? WHERE id = ?"); if ($stmt->execute([$status, $unit_id])) { $_SESSION['success_message'] = 'Unit status updated successfully.'; } else { $_SESSION['error_message'] = 'Failed to update unit status.'; } header("Location: settings.php"); exit(); break; case 'toggle_category_status': $category_id = $_POST['category_id'] ?? 0; $status = $_POST['status'] ?? 'active'; $stmt = $pdo->prepare("UPDATE expense_categories SET status = ? WHERE id = ?"); if ($stmt->execute([$status, $category_id])) { $_SESSION['success_message'] = 'Category status updated successfully.'; } else { $_SESSION['error_message'] = 'Failed to update category status.'; } header("Location: settings.php"); exit(); break; case 'toggle_product_status': $product_id = $_POST['product_id'] ?? 0; $status = $_POST['status'] ?? 'active'; $stmt = $pdo->prepare("UPDATE products_services SET status = ? WHERE id = ?"); if ($stmt->execute([$status, $product_id])) { $_SESSION['success_message'] = 'Product/Service status updated successfully.'; } else { $_SESSION['error_message'] = 'Failed to update status.'; } header("Location: settings.php"); exit(); break; } } catch (PDOException $e) { $error_message = 'Database error: ' . $e->getMessage(); } } // Get edit data if editing $edit_unit = null; $edit_category = null; $edit_subcategory = null; $edit_ps = null; if (isset($_GET['edit_unit'])) { $stmt = $pdo->prepare("SELECT * FROM units WHERE id = ?"); $stmt->execute([$_GET['edit_unit']]); $edit_unit = $stmt->fetch(PDO::FETCH_ASSOC); } if (isset($_GET['edit_category'])) { $stmt = $pdo->prepare("SELECT * FROM expense_categories WHERE id = ?"); $stmt->execute([$_GET['edit_category']]); $edit_category = $stmt->fetch(PDO::FETCH_ASSOC); } if (isset($_GET['edit_subcategory'])) { $stmt = $pdo->prepare("SELECT * FROM expense_subcategories WHERE id = ?"); $stmt->execute([$_GET['edit_subcategory']]); $edit_subcategory = $stmt->fetch(PDO::FETCH_ASSOC); } if (isset($_GET['edit_ps'])) { $stmt = $pdo->prepare("SELECT * FROM products_services WHERE id = ?"); $stmt->execute([$_GET['edit_ps']]); $edit_ps = $stmt->fetch(PDO::FETCH_ASSOC); } // Fetch data for display try { // Fetch units $stmt = $pdo->prepare("SELECT * FROM units ORDER BY unit_type, unit_name"); $stmt->execute(); $units = $stmt->fetchAll(PDO::FETCH_ASSOC); // Fetch expense categories $stmt = $pdo->prepare("SELECT * FROM expense_categories ORDER BY category_name"); $stmt->execute(); $categories = $stmt->fetchAll(PDO::FETCH_ASSOC); // Fetch expense subcategories with category names $stmt = $pdo->prepare(" SELECT es.*, ec.category_name FROM expense_subcategories es JOIN expense_categories ec ON es.category_id = ec.id ORDER BY ec.category_name, es.subcategory_name "); $stmt->execute(); $subcategories = $stmt->fetchAll(PDO::FETCH_ASSOC); // Fetch products/services with unit info $stmt = $pdo->prepare(" SELECT ps.*, u.unit_name, u.unit_symbol FROM products_services ps JOIN units u ON ps.unit_id = u.id ORDER BY ps.type, ps.name "); $stmt->execute(); $products_services = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $error_message = 'Failed to fetch data: ' . $e->getMessage(); $units = $categories = $subcategories = $products_services = []; } include 'includes/header.php'; ?>

Cancel
Name Symbol Type Status Actions
Edit

Cancel
Category Name Description Status Actions
Edit

Cancel
Main Category Subcategory Description Status Actions
Edit

Cancel
Name Type Unit Rate (₹) Description Status Actions
Edit