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';
?>
| Name |
Symbol |
Type |
Status |
Actions |
|
|
|
|
|
| Category Name |
Description |
Status |
Actions |
|
|
|
|
| Main Category |
Subcategory |
Description |
Status |
Actions |
|
|
|
|
|
| Name |
Type |
Unit |
Rate (₹) |
Description |
Status |
Actions |
|
|
|
₹ |
|
|
|