" . escapeHtml($fields['name']) . " saved");
} else {
mysqli_query($mysqli, "INSERT INTO contract_templates SET $set");
$contract_template_id = mysqli_insert_id($mysqli);
logAudit("Contract Template", "Create", "$session_name created contract template $name (" . escapeSql(contractTypeLabel($fields['type'])) . ")", 0, $contract_template_id);
flashAlert("Contract template " . escapeHtml($fields['name']) . " created");
}
redirect();
}
if (isset($_GET['copy_contract_template'])) {
validateCSRFToken();
$row = contractTemplatePostRow($_GET['copy_contract_template']);
$contract_template_id = intval($row['contract_template_id']);
// "Name (copy)", then "Name (copy 2)" and on - a name not already taken
$base = mb_substr($row['contract_template_name'], 0, 240);
$new_name = "$base (copy)";
for ($n = 2; mysqli_num_rows(mysqli_query($mysqli, "SELECT 1 FROM contract_templates WHERE contract_template_name = '" . escapeSql($new_name) . "'")); $n++) {
$new_name = "$base (copy $n)";
}
$columns = ['description', 'type', 'rate_standard', 'rate_after_hours', 'net_terms', 'support_hours', 'details',
'term_months', 'auto_renew', 'notice_days', 'sla_low_id', 'sla_medium_id', 'sla_high_id', 'sla_urgent_id'];
if (contractHoursReady()) {
array_push($columns, 'monthly_hours', 'hours_alert');
}
$columns = implode(', ', array_map(function ($column) { return "contract_template_$column"; }, $columns));
mysqli_query($mysqli, "INSERT INTO contract_templates (contract_template_name, $columns)
SELECT '" . escapeSql($new_name) . "', $columns FROM contract_templates WHERE contract_template_id = $contract_template_id");
$new_id = mysqli_insert_id($mysqli);
logAudit("Contract Template", "Create", "$session_name copied contract template " . escapeSql($row['contract_template_name']) . " as " . escapeSql($new_name), 0, $new_id);
flashAlert("Contract template " . escapeHtml($row['contract_template_name']) . " copied as " . escapeHtml($new_name) . "");
redirect();
}
if (isset($_GET['archive_contract_template']) || isset($_GET['restore_contract_template'])) {
validateCSRFToken();
$archive = isset($_GET['archive_contract_template']);
$row = contractTemplatePostRow($archive ? $_GET['archive_contract_template'] : $_GET['restore_contract_template']);
$contract_template_id = intval($row['contract_template_id']);
// Archived, it isn't offered on a new contract; contracts started from it are unchanged
mysqli_query($mysqli, "UPDATE contract_templates SET contract_template_archived_at = " . ($archive ? 'NOW()' : 'NULL') . " WHERE contract_template_id = $contract_template_id");
logAudit("Contract Template", $archive ? "Archive" : "Restore", "$session_name " . ($archive ? 'archived' : 'restored') . " contract template " . escapeSql($row['contract_template_name']), 0, $contract_template_id);
flashAlert("Contract template " . escapeHtml($row['contract_template_name']) . " " . ($archive ? 'archived' : 'restored'), $archive ? 'error' : 'success');
redirect();
}
if (isset($_GET['delete_contract_template'])) {
validateCSRFToken();
$row = contractTemplatePostRow($_GET['delete_contract_template']);
$contract_template_id = intval($row['contract_template_id']);
// Contracts started from it keep their terms - only the link back goes
mysqli_query($mysqli, "UPDATE contracts SET contract_template_id = 0 WHERE contract_template_id = $contract_template_id");
mysqli_query($mysqli, "DELETE FROM contract_templates WHERE contract_template_id = $contract_template_id");
logAudit("Contract Template", "Delete", "$session_name deleted contract template " . escapeSql($row['contract_template_name']), 0, $contract_template_id);
flashAlert("Contract template " . escapeHtml($row['contract_template_name']) . " deleted", 'error');
redirect();
}