diff --git a/index.php b/index.php index 3d1bf6a..1195feb 100644 --- a/index.php +++ b/index.php @@ -107,6 +107,72 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['action'])) { } if ($_SERVER['REQUEST_METHOD'] === 'POST') { + // --- Expense Categories Handlers --- + if (isset($_POST['add_expense_category'])) { + $name_en = $_POST['name_en'] ?? ''; + $name_ar = $_POST['name_ar'] ?? ''; + if ($name_en && $name_ar) { + $stmt = db()->prepare("INSERT INTO expense_categories (name_en, name_ar) VALUES (?, ?)"); + $stmt->execute([$name_en, $name_ar]); + $message = "Expense Category added successfully!"; + } + } + if (isset($_POST['edit_expense_category'])) { + $id = (int)$_POST['id']; + $name_en = $_POST['name_en'] ?? ''; + $name_ar = $_POST['name_ar'] ?? ''; + if ($id && $name_en && $name_ar) { + $stmt = db()->prepare("UPDATE expense_categories SET name_en = ?, name_ar = ? WHERE id = ?"); + $stmt->execute([$name_en, $name_ar, $id]); + $message = "Expense Category updated successfully!"; + } + } + if (isset($_POST['delete_expense_category'])) { + $id = (int)$_POST['id']; + if ($id) { + $stmt = db()->prepare("DELETE FROM expense_categories WHERE id = ?"); + $stmt->execute([$id]); + $message = "Expense Category deleted successfully!"; + } + } + + // --- Expenses Handlers --- + if (isset($_POST['add_expense'])) { + $category_id = (int)$_POST['category_id']; + $amount = (float)$_POST['amount']; + $date = $_POST['expense_date'] ?: date('Y-m-d'); + $desc = $_POST['description'] ?? ''; + $ref = $_POST['reference_no'] ?? ''; + + if ($category_id && $amount > 0) { + $stmt = db()->prepare("INSERT INTO expenses (category_id, amount, expense_date, description, reference_no) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([$category_id, $amount, $date, $desc, $ref]); + $message = "Expense recorded successfully!"; + } + } + if (isset($_POST['edit_expense'])) { + $id = (int)$_POST['id']; + $category_id = (int)$_POST['category_id']; + $amount = (float)$_POST['amount']; + $date = $_POST['expense_date'] ?: date('Y-m-d'); + $desc = $_POST['description'] ?? ''; + $ref = $_POST['reference_no'] ?? ''; + + if ($id && $category_id && $amount > 0) { + $stmt = db()->prepare("UPDATE expenses SET category_id = ?, amount = ?, expense_date = ?, description = ?, reference_no = ? WHERE id = ?"); + $stmt->execute([$category_id, $amount, $date, $desc, $ref, $id]); + $message = "Expense updated successfully!"; + } + } + if (isset($_POST['delete_expense'])) { + $id = (int)$_POST['id']; + if ($id) { + $stmt = db()->prepare("DELETE FROM expenses WHERE id = ?"); + $stmt->execute([$id]); + $message = "Expense deleted successfully!"; + } + } + if (isset($_POST['add_customer'])) { $name = $_POST['name'] ?? ''; $email = $_POST['email'] ?? ''; @@ -1224,6 +1290,51 @@ switch ($page) { $data['transactions'] = $transactions; } break; + case 'expense_categories': + $data['expense_categories'] = db()->query("SELECT * FROM expense_categories ORDER BY name_en ASC")->fetchAll(); + break; + case 'expenses': + $where = ["1=1"]; + $params = []; + if (!empty($_GET['category_id'])) { + $where[] = "e.category_id = ?"; + $params[] = $_GET['category_id']; + } + if (!empty($_GET['start_date'])) { + $where[] = "e.expense_date >= ?"; + $params[] = $_GET['start_date']; + } + if (!empty($_GET['end_date'])) { + $where[] = "e.expense_date <= ?"; + $params[] = $_GET['end_date']; + } + $whereSql = implode(" AND ", $where); + $stmt = db()->prepare("SELECT e.*, c.name_en as cat_en, c.name_ar as cat_ar + FROM expenses e + LEFT JOIN expense_categories c ON e.category_id = c.id + WHERE $whereSql + ORDER BY e.expense_date DESC, e.id DESC"); + $stmt->execute($params); + $data['expenses'] = $stmt->fetchAll(); + $data['expense_categories'] = db()->query("SELECT * FROM expense_categories ORDER BY name_en ASC")->fetchAll(); + break; + case 'expense_report': + $start_date = $_GET['start_date'] ?? date('Y-m-01'); + $end_date = $_GET['end_date'] ?? date('Y-m-d'); + + $stmt = db()->prepare("SELECT c.name_en, c.name_ar, SUM(e.amount) as total + FROM expenses e + JOIN expense_categories c ON e.category_id = c.id + WHERE e.expense_date BETWEEN ? AND ? + GROUP BY c.id + ORDER BY total DESC"); + $stmt->execute([$start_date, $end_date]); + $data['report_by_category'] = $stmt->fetchAll(); + + $stmt = db()->prepare("SELECT SUM(amount) FROM expenses WHERE expense_date BETWEEN ? AND ?"); + $stmt->execute([$start_date, $end_date]); + $data['total_expenses'] = $stmt->fetchColumn() ?: 0; + break; default: $data['customers'] = db()->query("SELECT * FROM customers WHERE type = 'customer' ORDER BY id DESC LIMIT 5")->fetchAll(); // Dashboard stats @@ -1297,8 +1408,22 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; Quotations - - Expenses + + + + +
+ + Categories + + + Expenses List + + + Expense Report
@@ -3099,6 +3224,333 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; + +
+
+
Expense Categories
+ +
+
+ + + + + + + + + + + + + + + + + + + +
IDName (EN)Name (AR)Actions
+
+ +
+ + +
+
+ + + +
+
+
+ + + + + +
+
+
Expenses List
+ +
+ +
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
DateReferenceCategoryDescriptionAmountActions
OMR +
+ +
+ + +
+
+ + + +
+
+
+ + + + + +
+
+
Expense Report
+ +
+ +
+
+ +
+ + +
+
+ + +
+
+ +
+
+
+ +
+
+
+
+
Total Expenses
+

OMR

+ Period: to +
+
+
+
+ +
+ + + + + + + + + + + + + 0 ? ($row['total'] / $data['total_expenses'] * 100) : 0; + ?> + + + + + + + + +
CategoryTotal Amount% of Total
No expenses found for this period.
+
+ +
OMR %
+
+
+