Allow selecting client SLA assignments on client create/edit

This commit is contained in:
johnnyq
2026-07-29 00:21:13 -04:00
parent dd45a0f4f1
commit d5ed05017b
3 changed files with 109 additions and 0 deletions

View File

@@ -159,6 +159,34 @@ ob_start();
</div>
</div>
<?php
// Ticket SLA assignments - only offered when active SLAs exist
$sla_options = [];
$sla_options_sql = mysqli_query($mysqli, "SELECT sla_id, sla_name FROM slas WHERE sla_archived_at IS NULL ORDER BY sla_name ASC");
while ($sla_option_row = mysqli_fetch_assoc($sla_options_sql)) {
$sla_options[intval($sla_option_row['sla_id'])] = $sla_option_row['sla_name'];
}
if ($config_module_enable_ticketing && !empty($sla_options)) { ?>
<div class="form-group">
<label>Ticket SLAs</label>
<div class="form-row">
<?php foreach (['Low', 'Medium', 'High'] as $sla_priority) { ?>
<div class="col-4">
<small class="text-secondary"><?= $sla_priority ?></small>
<select class="form-control" name="client_sla_<?= strtolower($sla_priority) ?>">
<option value="default">Default</option>
<option value="0">None</option>
<?php foreach ($sla_options as $sla_option_id => $sla_option_name) { ?>
<option value="<?= $sla_option_id ?>"><?= escapeHtml($sla_option_name) ?></option>
<?php } ?>
</select>
</div>
<?php } ?>
</div>
<small class="text-muted">Default follows the global SLA assignment for each priority.</small>
</div>
<?php } ?>
</div>
<div class="tab-pane fade" id="pills-location">

View File

@@ -24,6 +24,13 @@ $client_notes = escapeHtml($row['client_notes']);
$client_created_at = escapeHtml($row['client_created_at']);
$client_archived_at = escapeHtml($row['client_archived_at']);
// Client SLA assignments
$client_sla_assignments = [];
$sql_client_slas = mysqli_query($mysqli, "SELECT sla_assignment_priority, sla_assignment_sla_id FROM sla_assignments WHERE sla_assignment_client_id = $client_id");
while ($client_sla_row = mysqli_fetch_assoc($sql_client_slas)) {
$client_sla_assignments[$client_sla_row['sla_assignment_priority']] = intval($client_sla_row['sla_assignment_sla_id']);
}
// Client Tags
$client_tag_id_array = array();
$sql_client_tags = mysqli_query($mysqli, "SELECT tag_id FROM client_tags WHERE client_id = $client_id");
@@ -186,6 +193,34 @@ ob_start();
</div>
</div>
<?php
// Ticket SLA assignments - only offered when active SLAs exist
$sla_options = [];
$sla_options_sql = mysqli_query($mysqli, "SELECT sla_id, sla_name FROM slas WHERE sla_archived_at IS NULL ORDER BY sla_name ASC");
while ($sla_option_row = mysqli_fetch_assoc($sla_options_sql)) {
$sla_options[intval($sla_option_row['sla_id'])] = $sla_option_row['sla_name'];
}
if ($config_module_enable_ticketing && !empty($sla_options)) { ?>
<div class="form-group">
<label>Ticket SLAs</label>
<div class="form-row">
<?php foreach (['Low', 'Medium', 'High'] as $sla_priority) { $sla_current = $client_sla_assignments[$sla_priority] ?? 'default'; ?>
<div class="col-4">
<small class="text-secondary"><?= $sla_priority ?></small>
<select class="form-control" name="client_sla_<?= strtolower($sla_priority) ?>">
<option value="default" <?php if ($sla_current === 'default') { echo "selected"; } ?>>Default</option>
<option value="0" <?php if ($sla_current === 0) { echo "selected"; } ?>>None</option>
<?php foreach ($sla_options as $sla_option_id => $sla_option_name) { ?>
<option value="<?= $sla_option_id ?>" <?php if ($sla_current === $sla_option_id) { echo "selected"; } ?>><?= escapeHtml($sla_option_name) ?></option>
<?php } ?>
</select>
</div>
<?php } ?>
</div>
<small class="text-muted">Default follows the global SLA assignment for each priority.</small>
</div>
<?php } ?>
</div>
<?php if ($config_module_enable_accounting) { ?>

View File

@@ -244,6 +244,17 @@ if (isset($_POST['add_client'])) {
}
}
// Ticket SLA assignments (fields only rendered when active SLAs exist)
if (isset($_POST['client_sla_low'])) {
foreach (['Low', 'Medium', 'High'] as $sla_priority) {
$sla_value = strval($_POST['client_sla_' . strtolower($sla_priority)] ?? 'default');
if ($sla_value !== 'default') {
$client_sla_id = intval($sla_value);
mysqli_query($mysqli, "INSERT INTO sla_assignments SET sla_assignment_client_id = $client_id, sla_assignment_priority = '$sla_priority', sla_assignment_sla_id = $client_sla_id");
}
}
}
logAudit("Client", "Create", "$session_name created client $name$extended_log_description", $client_id, $client_id);
flashAlert("Client <strong>$name</strong> created");
@@ -322,6 +333,41 @@ if (isset($_POST['edit_client'])) {
}
}
// Ticket SLA assignments (fields only rendered when active SLAs exist)
if (isset($_POST['client_sla_low'])) {
// Compare with current state so an unrelated client edit doesn't
// restamp tickets (restamping clobbers manual per-ticket SLA pins)
$current_sla_assignments = [];
$sql_current_slas = mysqli_query($mysqli, "SELECT sla_assignment_priority, sla_assignment_sla_id FROM sla_assignments WHERE sla_assignment_client_id = $client_id");
while ($current_sla_row = mysqli_fetch_assoc($sql_current_slas)) {
$current_sla_assignments[$current_sla_row['sla_assignment_priority']] = strval(intval($current_sla_row['sla_assignment_sla_id']));
}
$sla_assignments_changed = false;
foreach (['Low', 'Medium', 'High'] as $sla_priority) {
$sla_value = strval($_POST['client_sla_' . strtolower($sla_priority)] ?? 'default');
$sla_current = $current_sla_assignments[$sla_priority] ?? 'default';
if ($sla_value === $sla_current) {
continue;
}
$sla_assignments_changed = true;
mysqli_query($mysqli, "DELETE FROM sla_assignments WHERE sla_assignment_client_id = $client_id AND sla_assignment_priority = '$sla_priority'");
if ($sla_value !== 'default') {
$client_sla_id = intval($sla_value);
mysqli_query($mysqli, "INSERT INTO sla_assignments SET sla_assignment_client_id = $client_id, sla_assignment_priority = '$sla_priority', sla_assignment_sla_id = $client_sla_id");
}
}
if ($sla_assignments_changed) {
// Re-resolve this client's open tickets against the new assignments
$sql_sla_tickets = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_client_id = $client_id AND ticket_closed_at IS NULL AND ticket_archived_at IS NULL");
while ($sla_ticket_row = mysqli_fetch_assoc($sql_sla_tickets)) {
applyTicketSla($sla_ticket_row['ticket_id']);
}
}
}
logAudit("Client", "Edit", "$session_name edited client $name", $client_id, $client_id);
flashAlert("Client <strong>$name</strong> updated");