diff --git a/DeskHub-Webseite/api/staff/v1/common.php b/DeskHub-Webseite/api/staff/v1/common.php index 3979ce46..9d4ad87c 100644 --- a/DeskHub-Webseite/api/staff/v1/common.php +++ b/DeskHub-Webseite/api/staff/v1/common.php @@ -297,6 +297,14 @@ function api_is_following(int $ticketId): bool return isset($mine[$ticketId]); } +/** Cc-Empfänger eines Tickets für die Apps. */ +function api_ticket_collaborators(PDO $pdo, int $ticketId): array +{ + $s = $pdo->prepare('SELECT id, email, name FROM ticket_collaborators WHERE ticket_id = ? ORDER BY created_at, id'); + $s->execute([$ticketId]); + return array_map(fn($r) => ['id' => (int) $r['id'], 'email' => (string) $r['email'], 'name' => (string) ($r['name'] ?? '')], $s->fetchAll()); +} + function api_add_ticket_message(PDO $pdo, array $staff, array $ticket, string $type, string $rawMessage, ?string $setStatus, ?string $signatureChoice = null): int { $permission = $type === 'note' ? 'post_note' : 'reply_ticket'; diff --git a/DeskHub-Webseite/api/staff/v1/csat.php b/DeskHub-Webseite/api/staff/v1/csat.php new file mode 100644 index 00000000..76bc0981 --- /dev/null +++ b/DeskHub-Webseite/api/staff/v1/csat.php @@ -0,0 +1,23 @@ + 0, 'answered' => 0, 'avg' => null, 'rate' => null, 'dist' => [1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0], 'byStaff' => [], 'recent' => []]; +} +$stats['dist'] = array_map(fn($k, $v) => ['rating' => $k, 'count' => $v], array_keys($stats['dist']), $stats['dist']); +api_json(['enabled' => csat_enabled(), 'days' => $days, 'stats' => $stats]); diff --git a/DeskHub-Webseite/api/staff/v1/status.php b/DeskHub-Webseite/api/staff/v1/status.php new file mode 100644 index 00000000..15ef98cb --- /dev/null +++ b/DeskHub-Webseite/api/staff/v1/status.php @@ -0,0 +1,42 @@ + status_summary($pdo)] + ['canManage' => $staff['role'] === 'admin']); diff --git a/DeskHub-Webseite/api/staff/v1/ticket.php b/DeskHub-Webseite/api/staff/v1/ticket.php index ecb9f29d..0dcc0fcc 100644 --- a/DeskHub-Webseite/api/staff/v1/ticket.php +++ b/DeskHub-Webseite/api/staff/v1/ticket.php @@ -126,4 +126,13 @@ try { } catch (Throwable $e) { $summary['similar'] = ['articles' => [], 'tickets' => []]; } +// Cc-Empfänger, Beobachter und Bewertung des Kunden +try { + $summary['collaborators'] = api_ticket_collaborators($pdo, (int) $ticket['id']); + $summary['followers'] = array_map(fn($f) => ['id' => (int) $f['id'], 'name' => (string) $f['name']], ticket_followers($pdo, (int) $ticket['id'])); + $__csat = csat_for_ticket($pdo, (int) $ticket['id']); + $summary['csat'] = $__csat ? ['rating' => $__csat['rating'] !== null ? (int) $__csat['rating'] : null, 'comment' => (string) ($__csat['comment'] ?? ''), 'sentAt' => $__csat['sent_at'], 'answeredAt' => $__csat['answered_at']] : null; +} catch (Throwable $e) { + $summary += ['collaborators' => [], 'followers' => [], 'csat' => null]; +} api_json(['ticket' => $summary]); diff --git a/DeskHub-Webseite/api/staff/v1/ticket_collaborators.php b/DeskHub-Webseite/api/staff/v1/ticket_collaborators.php new file mode 100644 index 00000000..e7545c2d --- /dev/null +++ b/DeskHub-Webseite/api/staff/v1/ticket_collaborators.php @@ -0,0 +1,46 @@ +prepare('SELECT COUNT(*) FROM ticket_collaborators WHERE ticket_id = ? AND LOWER(email) = LOWER(?)'); + $dup->execute([$ticket['id'], $email]); + if ((int) $dup->fetchColumn() === 0) { + $pdo->prepare('INSERT INTO ticket_collaborators (ticket_id, email, name, added_by, created_at) VALUES (?,?,?,?,?)') + ->execute([$ticket['id'], $email, $name !== '' ? $name : null, $staff['id'], db_now()]); + log_activity($pdo, (int) $ticket['id'], (int) $staff['id'], "Kollaborator hinzugefügt: {$email}"); + } + } elseif ($action === 'remove') { + $s = $pdo->prepare('SELECT email FROM ticket_collaborators WHERE id = ? AND ticket_id = ?'); + $s->execute([(int) ($body['id'] ?? 0), $ticket['id']]); + $email = $s->fetchColumn(); + if ($email !== false) { + $pdo->prepare('DELETE FROM ticket_collaborators WHERE id = ? AND ticket_id = ?')->execute([(int) $body['id'], $ticket['id']]); + log_activity($pdo, (int) $ticket['id'], (int) $staff['id'], "Kollaborator entfernt: {$email}"); + } + } else { + api_error(422, 'UNKNOWN_ACTION', 'Unbekannte Aktion.'); + } +} +api_json(['collaborators' => api_ticket_collaborators($pdo, (int) $ticket['id'])]); diff --git a/DeskHub-Webseite/api/staff/v1/ticket_templates.php b/DeskHub-Webseite/api/staff/v1/ticket_templates.php new file mode 100644 index 00000000..cb9039cd --- /dev/null +++ b/DeskHub-Webseite/api/staff/v1/ticket_templates.php @@ -0,0 +1,19 @@ + $list]);