" . escapeHtml($name_input) . " created - now add its ticket templates"); redirect("project_template.php?project_template_id=$project_template_id"); } if (isset($_POST['edit_project_template'])) { validateCSRFToken(); $project_template_id = intval($_POST['project_template_id'] ?? 0); projectTemplateName($project_template_id); $name_input = trim((string) ($_POST['name'] ?? '')); if ($name_input === '') { flashAlert('A project template needs a name.', 'error'); redirect(); } $name = escapeSql(mb_substr($name_input, 0, 200)); $description = escapeSql(trim((string) ($_POST['description'] ?? ''))); mysqli_query($mysqli, "UPDATE project_templates SET project_template_name = '$name', project_template_description = '$description' WHERE project_template_id = $project_template_id"); logAudit("Project Template", "Edit", "$session_name edited project template $name", 0, $project_template_id); flashAlert("Project template " . escapeHtml($name_input) . " saved"); redirect(); } if (isset($_POST['edit_ticket_template_order'])) { validateCSRFToken(); $ticket_template_id = intval($_POST['ticket_template_id']); $project_template_id = intval($_POST['project_template_id']); $order = intval($_POST['order']); mysqli_query($mysqli, "UPDATE project_template_ticket_templates SET ticket_template_order = $order WHERE ticket_template_id = $ticket_template_id AND project_template_id = $project_template_id"); redirect(); } /** Ticket templates into a project template - at the end, in the order picked. */ if (isset($_POST['add_ticket_template_to_project_template'])) { validateCSRFToken(); $project_template_id = intval($_POST['project_template_id'] ?? 0); $name = escapeSql(projectTemplateName($project_template_id)); // ticket_template_id is what the single-pick form posted $ids = array_map('intval', (array) ($_POST['ticket_template_ids'] ?? [])); if (isset($_POST['ticket_template_id'])) { $ids[] = intval($_POST['ticket_template_id']); } $order = intval(mysqli_fetch_row(mysqli_query($mysqli, "SELECT COALESCE(MAX(ticket_template_order), 0) FROM project_template_ticket_templates WHERE project_template_id = $project_template_id"))[0]); $added = 0; foreach (array_unique(array_filter($ids)) as $ticket_template_id) { if (!mysqli_num_rows(mysqli_query($mysqli, "SELECT 1 FROM ticket_templates WHERE ticket_template_id = $ticket_template_id"))) { continue; } $order++; mysqli_query($mysqli, "INSERT IGNORE INTO project_template_ticket_templates SET project_template_id = $project_template_id, ticket_template_id = $ticket_template_id, ticket_template_order = $order"); $added += mysqli_affected_rows($mysqli) > 0 ? 1 : 0; } logAudit("Project Template", "Edit", "$session_name added $added ticket template" . ($added === 1 ? '' : 's') . " to project template $name", 0, $project_template_id); flashAlert("$added ticket template" . ($added === 1 ? '' : 's') . " added"); redirect(); } if (isset($_POST['remove_ticket_template_from_project_template'])) { validateCSRFToken(); $ticket_template_id = intval($_POST['ticket_template_id'] ?? 0); $project_template_id = intval($_POST['project_template_id'] ?? 0); $name = escapeSql(projectTemplateName($project_template_id)); mysqli_query($mysqli, "DELETE FROM project_template_ticket_templates WHERE project_template_id = $project_template_id AND ticket_template_id = $ticket_template_id"); logAudit("Project Template", "Edit", "$session_name removed a ticket template from project template $name", 0, $project_template_id); flashAlert("Ticket template taken out of the project template", 'error'); redirect(); } if (isset($_GET['archive_project_template']) || isset($_GET['restore_project_template'])) { validateCSRFToken(); $archive = isset($_GET['archive_project_template']); $project_template_id = intval($archive ? $_GET['archive_project_template'] : $_GET['restore_project_template']); $name = projectTemplateName($project_template_id); mysqli_query($mysqli, "UPDATE project_templates SET project_template_archived_at = " . ($archive ? 'NOW()' : 'NULL') . " WHERE project_template_id = $project_template_id"); logAudit("Project Template", $archive ? "Archive" : "Restore", "$session_name " . ($archive ? 'archived' : 'restored') . " project template " . escapeSql($name), 0, $project_template_id); flashAlert("Project template " . escapeHtml($name) . " " . ($archive ? 'archived - it is no longer offered on New Project' : 'restored'), $archive ? 'error' : 'success'); redirect(); } /** A copy, with the same ticket templates in the same order - for a variation on a plan. */ if (isset($_GET['duplicate_project_template'])) { validateCSRFToken(); $project_template_id = intval($_GET['duplicate_project_template']); $name = projectTemplateName($project_template_id); $copy_name = escapeSql(mb_substr("$name (copy)", 0, 200)); mysqli_query($mysqli, "INSERT INTO project_templates (project_template_name, project_template_description) SELECT '$copy_name', project_template_description FROM project_templates WHERE project_template_id = $project_template_id"); $copy_id = mysqli_insert_id($mysqli); mysqli_query($mysqli, "INSERT INTO project_template_ticket_templates (project_template_id, ticket_template_id, ticket_template_order) SELECT $copy_id, ticket_template_id, ticket_template_order FROM project_template_ticket_templates WHERE project_template_id = $project_template_id"); logAudit("Project Template", "Create", "$session_name duplicated project template " . escapeSql($name), 0, $copy_id); flashAlert("Project template " . escapeHtml($name) . " duplicated"); redirect("project_template.php?project_template_id=$copy_id"); } if (isset($_GET['delete_project_template'])) { validateCSRFToken(); $project_template_id = intval($_GET['delete_project_template']); $name = projectTemplateName($project_template_id); mysqli_query($mysqli, "DELETE FROM project_templates WHERE project_template_id = $project_template_id"); mysqli_query($mysqli, "DELETE FROM project_template_ticket_templates WHERE project_template_id = $project_template_id"); logAudit("Project Template", "Delete", "$session_name deleted project template " . escapeSql($name), 0, $project_template_id); flashAlert("Project template " . escapeHtml($name) . " deleted - its ticket templates stay", 'error'); // Its own page is gone redirect(strpos((string) ($_SERVER['HTTP_REFERER'] ?? ''), 'project_template.php') !== false ? 'project_templates.php' : null); }