prepare("SELECT a.name as account_name FROM expense_categories c LEFT JOIN accounting_accounts a ON c.account_id = a.id WHERE c.id = ?"); $stmt_cat->execute([$category_id]); $cat_account = $stmt_cat->fetchColumn(); // 2. Get Payment Account (Default: Cash / النقدية) // Ideally, map Payment Method to Account. For now, defaulting to 'النقدية'. $pay_account = 'النقدية'; // Could be improved: if ($payment_method == 'Bank Transfer') $pay_account = 'Bank'; etc. if ($action === 'add') { // Create Expense $stmt = $db->prepare("INSERT INTO expenses (date, category_id, amount, description, reference, vendor, payment_method, receipt_file, user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$date, $category_id, $amount, $description, $reference, $vendor, $payment_method, $receipt_path, $_SESSION['user_id']]); $expense_id = $db->lastInsertId(); // Create Journal Entry if ($cat_account) { $entries = [ ['account' => $cat_account, 'debit' => $amount, 'credit' => 0], ['account' => $pay_account, 'debit' => 0, 'credit' => $amount] ]; $journal_desc = "Expense #$expense_id: " . ($vendor ? "$vendor - " : "") . $description; $jid = add_journal_entry($date, $journal_desc, $reference, $entries); if ($jid) { $db->prepare("UPDATE expenses SET journal_id = ? WHERE id = ?")->execute([$jid, $expense_id]); } } $_SESSION['success'] = 'تم إضافة المصروف بنجاح' . ($cat_account ? ' وتم إنشاء قيد محاسبي.' : ''); } else { // Update Expense // Get existing journal_id and file $stmt = $db->prepare("SELECT journal_id, receipt_file FROM expenses WHERE id = ?"); $stmt->execute([$id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); $journal_id = $row['journal_id'] ?? null; $old_file = $row['receipt_file'] ?? null; if (!$receipt_path) $receipt_path = $old_file; $stmt = $db->prepare("UPDATE expenses SET date=?, category_id=?, amount=?, description=?, reference=?, vendor=?, payment_method=?, receipt_file=? WHERE id=?"); $stmt->execute([$date, $category_id, $amount, $description, $reference, $vendor, $payment_method, $receipt_path, $id]); // Update Journal Entry if ($cat_account) { $entries = [ ['account' => $cat_account, 'debit' => $amount, 'credit' => 0], ['account' => $pay_account, 'debit' => 0, 'credit' => $amount] ]; $journal_desc = "Expense #$id: " . ($vendor ? "$vendor - " : "") . $description; if ($journal_id) { edit_journal_entry($journal_id, $date, $journal_desc, $reference, $entries); } else { // Create new if missing $jid = add_journal_entry($date, $journal_desc, $reference, $entries); if ($jid) { $db->prepare("UPDATE expenses SET journal_id = ? WHERE id = ?")->execute([$jid, $id]); } } } $_SESSION['success'] = 'تم تحديث المصروف بنجاح'; } redirect('expenses.php'); } catch (PDOException $e) { $error = 'حدث خطأ: ' . $e->getMessage(); } } } } if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id'])) { if (!canDelete('expenses')) redirect('expenses.php'); $id = $_GET['id']; $db = db(); // Get file and journal_id $stmt = $db->prepare("SELECT receipt_file, journal_id FROM expenses WHERE id = ?"); $stmt->execute([$id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); // Delete file if ($row && $row['receipt_file'] && file_exists($row['receipt_file'])) unlink($row['receipt_file']); // Delete Journal Entry if ($row && $row['journal_id']) { delete_journal_entry($row['journal_id']); } // Delete Expense $stmt = $db->prepare("DELETE FROM expenses WHERE id = ?"); $stmt->execute([$id]); $_SESSION['success'] = 'تم حذف المصروف بنجاح'; redirect('expenses.php'); } // Fetch Data for List $date_from = $_GET['date_from'] ?? date('Y-m-01'); $date_to = $_GET['date_to'] ?? date('Y-m-t'); $category_filter = $_GET['category_id'] ?? ''; $search = $_GET['search'] ?? ''; $sql = "SELECT e.*, c.name as category_name, u.username as created_by_name FROM expenses e LEFT JOIN expense_categories c ON e.category_id = c.id LEFT JOIN users u ON e.user_id = u.id WHERE e.date BETWEEN ? AND ?"; $params = [$date_from, $date_to]; if ($category_filter) { $sql .= " AND e.category_id = ?"; $params[] = $category_filter; } if ($search) { $sql .= " AND (e.description LIKE ? OR e.vendor LIKE ? OR e.reference LIKE ?)"; $params[] = "%$search%"; $params[] = "%$search%"; $params[] = "%$search%"; } $sql .= " ORDER BY e.date DESC, e.id DESC"; $stmt = db()->prepare($sql); $stmt->execute($params); $expenses = $stmt->fetchAll(PDO::FETCH_ASSOC); // Fetch Categories for Dropdown $categories = db()->query("SELECT * FROM expense_categories ORDER BY name")->fetchAll(PDO::FETCH_ASSOC); if (isset($_SESSION['success'])) { $success = $_SESSION['success']; unset($_SESSION['success']); } ?>