$category_name to $count expense(s)");
}
redirect();
}
if (isset($_POST['bulk_edit_expense_account'])) {
validateCSRFToken();
enforceUserPermission('module_financial', 2);
$account_id = intval($_POST['bulk_account_id']);
// Get Account name for logging and Notification
$account_name = escapeSql(getFieldById('accounts', $account_id, 'account_name'));
// Assign account to Selected Expenses
if (isset($_POST['expense_ids'])) {
// Get Selected Contacts Count
$count = count($_POST['expense_ids']);
foreach($_POST['expense_ids'] as $expense_id) {
$expense_id = intval($expense_id);
// Get Expense Details for Logging
$sql = mysqli_query($mysqli,"SELECT expense_description, expense_client_id FROM expenses WHERE expense_id = $expense_id");
$row = mysqli_fetch_assoc($sql);
$expense_description = escapeSql($row['expense_description']);
$client_id = intval($row['expense_client_id']);
if ($client_id) {
enforceClientAccess();
}
mysqli_query($mysqli,"UPDATE expenses SET expense_account_id = $account_id WHERE expense_id = $expense_id");
logAudit("Expense", "Edit", "$session_name assigned expense $expense_descrition to account $account_name", $client_id, $expense_id);
} // End Assign Loop
logAudit("Expense", "Bulk Edit", "$session_name assigned $count expense(s) to account $account_name");
flashAlert("You assigned account $account_name to $count expense(s)");
}
redirect();
}
if (isset($_POST['bulk_edit_expense_client'])) {
validateCSRFToken();
enforceUserPermission('module_financial', 2);
$client_id = intval($_POST['bulk_client_id']);
enforceClientAccess();
// Get Client name for logging and Notification
$client_name = escapeSql(getFieldById('clients', $client_id, 'client_name'));
// Assign Client to Selected Expenses
if (isset($_POST['expense_ids'])) {
// Get Selected Count
$count = count($_POST['expense_ids']);
foreach($_POST['expense_ids'] as $expense_id) {
$expense_id = intval($expense_id);
// Get Expense Details for Logging
$expense_description = escapeSql(getFieldById('expenses', $expense_id, 'expense_description'));
mysqli_query($mysqli,"UPDATE expenses SET expense_client_id = $client_id WHERE expense_id = $expense_id");
logAudit("Expense", "Edit", "$session_name assigned expense $expense_descrition to client $client_name", $client_id, $expense_id);
} // End Assign Loop
flashAlert("You assigned Client $client_name to $expense_count expenses");
}
redirect();
}
if (isset($_POST['bulk_delete_expenses'])) {
validateCSRFToken();
enforceUserPermission('module_financial', 3);
if (isset($_POST['expense_ids'])) {
// Get Selected Count
$count = count($_POST['expense_ids']);
// Cycle through array and delete each expense
foreach ($_POST['expense_ids'] as $expense_id) {
$expense_id = intval($expense_id);
$sql = mysqli_query($mysqli,"SELECT * FROM expenses WHERE expense_id = $expense_id");
$row = mysqli_fetch_assoc($sql);
$expense_description = escapeSql($row['expense_description']);
$expense_receipt = escapeSql($row['expense_receipt']);
$client_id = intval($row['expense_client_id']);
if ($client_id) {
enforceClientAccess();
}
unlink("../uploads/expenses/$expense_receipt");
mysqli_query($mysqli, "DELETE FROM expenses WHERE expense_id = $expense_id");
logAudit("Expense", "Delete", "$session_name deleted expense $expense_descrition", $client_id);
}
logAudit("Expense", "Bulk Delete", "$session_name deleted $count expense(s)");
flashAlert("Deleted $count expense(s)", 'error');
}
redirect();
}
if (isset($_POST['export_expenses'])) {
validateCSRFToken();
// Exports are reads - see CONTRIBUTING.md
enforceUserPermission('module_financial');
$format = resolveExportFormat($_POST['export_expenses']);
// Filters inherited from the expenses page - mirrors agent/expenses.php
$filter_summary = [];
$client_id = 0; // for Logging
$file_name_prepend = "$session_company_name-";
// Account Filter
if (!empty($_POST['account'])) {
$filter_account_id = intval($_POST['account']);
$account_query = "AND (expense_account_id = $filter_account_id)";
$filter_summary['Account'] = getFieldById('accounts', $filter_account_id, 'account_name');
} else {
// Default - any
$account_query = '';
}
// Vendor Filter
if (!empty($_POST['vendor'])) {
$filter_vendor_id = intval($_POST['vendor']);
$vendor_query = "AND (vendor_id = $filter_vendor_id)";
$filter_summary['Vendor'] = getFieldById('vendors', $filter_vendor_id, 'vendor_name');
} else {
// Default - any
$vendor_query = '';
}
// Category Filter
if (!empty($_POST['category'])) {
$filter_category_id = intval($_POST['category']);
$category_query = "AND (category_id = $filter_category_id)";
$filter_summary['Category'] = getFieldById('categories', $filter_category_id, 'category_name');
} else {
// Default - any
$category_query = '';
}
// Date Filter
$dtf = escapeSql(!empty($_POST['dtf']) ? $_POST['dtf'] : '1970-01-01');
$dtt = escapeSql(!empty($_POST['dtt']) ? $_POST['dtt'] : '2099-12-31');
$date_range = formatExportDateRange($dtf, $dtt);
if ($date_range) {
$filter_summary['Dated'] = $date_range;
}
// Search Filter
$q = escapeSql($_POST['q'] ?? '');
if (!empty($q)) {
$filter_summary['Search'] = $_POST['q'];
}
$sql = mysqli_query(
$mysqli,
"SELECT * FROM expenses
LEFT JOIN categories ON expense_category_id = category_id
LEFT JOIN vendors ON expense_vendor_id = vendor_id
LEFT JOIN accounts ON expense_account_id = account_id
LEFT JOIN clients ON expense_client_id = client_id
WHERE expense_vendor_id > 0
AND DATE(expense_date) BETWEEN '$dtf' AND '$dtt'
$vendor_query
$category_query
AND (vendor_name LIKE '%$q%' OR client_name LIKE '%$q%' OR category_name LIKE '%$q%' OR account_name LIKE '%$q%' OR expense_description LIKE '%$q%' OR expense_amount LIKE '%$q%')
$account_query
$access_permission_query
ORDER BY expense_date ASC"
);
$num_rows = mysqli_num_rows($sql);
if ($num_rows > 0) {
guardExportPdfRowCount($format, $num_rows);
$export = beginExport('expenses', $format, $file_name_prepend . 'Expenses', 'Expenses', summarizeExportFilters($filter_summary));
while ($row = mysqli_fetch_assoc($sql)) {
addExportRow($export, $row);
}
finishExport($export);
}
logAudit("Expense", "Export", "$session_name exported $num_rows expense(s) to a " . strtoupper($format) . " file", $client_id);
exit;
}