diff --git a/DeskHub-Webseite/api/staff/v1/ticket.php b/DeskHub-Webseite/api/staff/v1/ticket.php index 8d33e9e1..943ecd8a 100644 --- a/DeskHub-Webseite/api/staff/v1/ticket.php +++ b/DeskHub-Webseite/api/staff/v1/ticket.php @@ -15,12 +15,19 @@ $ticket = api_find_ticket($pdo, $staff, $number); // in includes/functions.php): wird von einem anderen Mitarbeiter (Web oder App) gerade // frisch bearbeitet, wird das Ticket hier – anders als beim milderen Live-Chat-Lock // weiter unten – gar nicht erst geladen, genau wie im Web-Backend (ticket_view.php). +// Administratoren dürfen ein von anderen bearbeitetes Ticket trotzdem lesen und bearbeiten; die Sperre des anderen bleibt dabei +// bestehen, bis sie aufgehoben wird (api/staff/v1/ticket_unlock.php). Alle anderen bekommen wie bisher einen Hinweis. +$ticketLockedBy = null; if ($ticket['source'] !== 'chat') { $lockedByName = ticket_locked_by_other($ticket, (int) $staff['id'], $pdo); if ($lockedByName) { - api_error(409, 'TICKET_LOCKED', "Dieses Ticket wird gerade von \"$lockedByName\" bearbeitet und kann nicht gleichzeitig geöffnet werden."); + if ($staff['role'] !== 'admin') { + api_error(409, 'TICKET_LOCKED', "Dieses Ticket wird gerade von \"$lockedByName\" bearbeitet und kann nicht gleichzeitig geöffnet werden."); + } + $ticketLockedBy = $lockedByName; + } else { + ticket_acquire_lock((int) $ticket['id'], (int) $staff['id'], $pdo); } - ticket_acquire_lock((int) $ticket['id'], (int) $staff['id'], $pdo); } $threadStmt = $pdo->prepare( @@ -84,6 +91,8 @@ $summary['source'] = $ticket['source']; $summary['firstResponseDueAt'] = $ticket['first_response_due_at']; $summary['resolutionDueAt'] = $ticket['resolution_due_at']; $summary['lockedByOtherName'] = $lockedByOtherName; +$summary['lockedBy'] = $ticketLockedBy; // Name, wenn ein Administrator ein fremd gesperrtes Ticket geöffnet hat +$summary['canUnlock'] = $staff['role'] === 'admin'; // darf die Sperre eines anderen aufheben $summary['threads'] = $threads; // Rechte für GENAU dieses Ticket: gelten pro Abteilung (Rolle des Mitarbeiters in der Abteilung des Tickets) $summary['permissions'] = []; diff --git a/DeskHub-Webseite/api/staff/v1/ticket_unlock.php b/DeskHub-Webseite/api/staff/v1/ticket_unlock.php new file mode 100644 index 00000000..ed0ca7b2 --- /dev/null +++ b/DeskHub-Webseite/api/staff/v1/ticket_unlock.php @@ -0,0 +1,32 @@ + true, 'unlocked' => false]); +if ($holderId !== (int) $staff['id'] && $staff['role'] !== 'admin') { + api_error(403, 'FORBIDDEN', 'Nur Administratoren können die Sperre eines anderen Mitarbeiters aufheben.'); +} +$name = ''; +if ($holderId !== (int) $staff['id']) { + $n = $pdo->prepare('SELECT name FROM staff WHERE id = ?'); + $n->execute([$holderId]); + $name = (string) ($n->fetchColumn() ?: 'einem anderen Mitarbeiter'); +} +$pdo->prepare('UPDATE tickets SET locked_by = NULL, locked_at = NULL WHERE id = ?')->execute([$ticket['id']]); +log_activity($pdo, (int) $ticket['id'], (int) $staff['id'], $name !== '' ? "Sperre von \"{$name}\" durch Admin aufgehoben" : 'Sperre manuell aufgehoben'); +api_json(['ok' => true, 'unlocked' => true]);