Taxes) - rates, the parts they are made of, and how new
* lines are taxed. The work is in functions/tax.php.
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_tax'])) {
validateCSRFToken();
[$fields, $error] = taxFromInput($_POST);
if ($error !== '') {
flashAlert($error, 'error');
redirect();
}
$tax_id = taxCreate($fields);
$label = taxLabel(taxRow($tax_id));
if (!empty($_POST['make_default']) && !taxSettings()['default_id']) {
taxSetDefault($tax_id);
}
logAudit("Tax", "Create", "$session_name created tax " . escapeSql($label), 0, $tax_id);
flashAlert("Tax " . escapeHtml($label) . " created");
redirect();
}
if (isset($_POST['edit_tax'])) {
validateCSRFToken();
$tax_id = intval($_POST['tax_id'] ?? 0);
$row = taxRow($tax_id);
if (!$row) {
flashAlert("That tax is gone", 'error');
redirect();
}
[$fields, $error] = taxFromInput($_POST);
if ($error !== '') {
flashAlert($error, 'error');
redirect();
}
if ($row['tax_archived_at'] && !taxSameRate($row, $fields) && taxBilled($tax_id)) {
flashAlert("An archived tax keeps the rate it was billed at - restore it, or make a new tax", 'error');
redirect();
}
$before = taxLabel($row);
$move_drafts = empty($_POST['drafts_asked']) || !empty($_POST['move_drafts']);
$saved = taxUpdate($tax_id, $fields, $move_drafts);
$after = taxLabel(taxRow($saved['id']));
$moved = taxMovedText($saved['moved']);
if ($saved['replaced']) {
logAudit("Tax", "Edit", "$session_name changed tax " . escapeSql($before) . " to " . escapeSql($after) . " - a new rate, the old one archived", 0, $saved['id']);
flashAlert("" . escapeHtml($after) . " takes over from " . escapeHtml($before) . " from now on" . ($moved !== '' ? " - $moved moved to it" : '') . ". What was already billed keeps the old rate.");
} else {
logAudit("Tax", "Edit", "$session_name edited tax " . escapeSql($after), 0, $tax_id);
flashAlert("Tax " . escapeHtml($after) . " saved" . ($moved !== '' ? " - $moved worked out again" : ''));
}
redirect();
}
if (isset($_POST['archive_tax'])) {
validateCSRFToken();
$tax_id = intval($_POST['tax_id'] ?? 0);
$row = taxRow($tax_id);
if (!$row || $row['tax_archived_at']) {
redirect();
}
$move_to = intval($_POST['move_to'] ?? 0);
$done = taxArchive($tax_id, $move_to);
$label = taxLabel($row);
$moved = taxMovedText($done['moved']);
$to = $done['moved'] ? taxLabel(taxRow($move_to)) : '';
logAudit("Tax", "Archive", "$session_name archived tax " . escapeSql($label) . ($to !== '' ? ", moving what used it to " . escapeSql($to) : ''), 0, $tax_id);
flashAlert("Tax " . escapeHtml($label) . " archived"
. ($moved !== '' ? " - $moved moved to " . escapeHtml($to) : '')
. ($done['was_default'] ? ". There is no default rate now" : ''), 'error');
redirect();
}
if (isset($_GET['restore_tax'])) {
validateCSRFToken();
$tax_id = intval($_GET['restore_tax']);
$row = taxRow($tax_id);
if (!$row) {
redirect();
}
taxRestore($tax_id);
$label = taxLabel($row);
logAudit("Tax", "Restore", "$session_name restored tax " . escapeSql($label), 0, $tax_id);
flashAlert("Tax " . escapeHtml($label) . " restored");
redirect();
}
if (isset($_GET['default_tax'])) {
validateCSRFToken();
$tax_id = intval($_GET['default_tax']);
if (!taxSetDefault($tax_id)) {
flashAlert("Only a current tax can be the default", 'error');
redirect();
}
$label = taxLabel(taxRow($tax_id));
logAudit("Tax", "Edit", "$session_name made " . escapeSql($label) . " the default tax", 0, $tax_id);
flashAlert("" . escapeHtml($label) . " is the default for new lines");
redirect();
}
if (isset($_GET['delete_tax'])) {
validateCSRFToken();
$tax_id = intval($_GET['delete_tax']);
$row = taxRow($tax_id);
if (!$row) {
redirect();
}
$label = taxLabel($row);
if (!taxDelete($tax_id)) {
flashAlert("" . escapeHtml($label) . " has been used, so it stays - archive it instead", 'error');
redirect();
}
logAudit("Tax", "Delete", "$session_name deleted tax " . escapeSql($label));
flashAlert("Tax " . escapeHtml($label) . " deleted", 'error');
redirect();
}
if (isset($_POST['edit_tax_settings'])) {
validateCSRFToken();
$default_id = intval($_POST['default_tax_id'] ?? 0);
$time = intval(!empty($_POST['tax_time']));
$trips = intval(!empty($_POST['tax_trips']));
$expenses = intval(!empty($_POST['tax_expenses']));
$discount_before = intval(!empty($_POST['tax_discount_before']));
if (!taxSetDefault($default_id)) {
$default_id = taxSettings()['default_id'];
}
mysqli_query($mysqli, "UPDATE settings SET config_tax_time = $time, config_tax_trips = $trips, config_tax_expenses = $expenses,
config_tax_discount_before = $discount_before WHERE company_id = 1");
logAudit("Settings", "Edit", "$session_name edited the tax settings");
flashAlert("Tax settings saved");
redirect();
}