73 lines
2.3 KiB
PHP
73 lines
2.3 KiB
PHP
<?php
|
||
/**
|
||
* staff/ticket_merge_search.php
|
||
* JSON-Endpunkt für die Ticket-Zusammenführen-Suche.
|
||
* Gibt max. 8 Tickets zurück die zur Suchanfrage passen.
|
||
*/
|
||
require_once __DIR__ . '/../includes/bootstrap.php';
|
||
$staff = require_staff_login();
|
||
$pdo = get_db();
|
||
|
||
header('Content-Type: application/json');
|
||
|
||
$q = trim($_GET['q'] ?? '');
|
||
$exclude = trim($_GET['exclude'] ?? '');
|
||
|
||
if (strlen($q) < 2) {
|
||
echo json_encode([]);
|
||
exit;
|
||
}
|
||
|
||
$myDeptIds = staff_department_ids($staff);
|
||
$like = '%' . $q . '%';
|
||
|
||
// Basis-Query: Ticket suchen (nicht geschlossene und nicht bereits zusammengeführte)
|
||
$sql = "SELECT t.ticket_number, t.subject, t.requester_name, t.requester_email,
|
||
t.status, t.created_at,
|
||
p.name AS priority_name,
|
||
d.name AS department_name,
|
||
s.name AS staff_name
|
||
FROM tickets t
|
||
JOIN priorities p ON p.id = t.priority_id
|
||
JOIN departments d ON d.id = t.department_id
|
||
LEFT JOIN staff s ON s.id = t.assigned_staff_id
|
||
WHERE t.merged_into IS NULL
|
||
AND t.status != 'closed'
|
||
AND (t.ticket_number LIKE ? OR t.subject LIKE ? OR t.requester_name LIKE ? OR t.requester_email LIKE ?)";
|
||
|
||
$params = [$like, $like, $like, $like];
|
||
|
||
// Ausschluss des aktuellen Tickets
|
||
if ($exclude !== '') {
|
||
$sql .= " AND t.ticket_number != ?";
|
||
$params[] = $exclude;
|
||
}
|
||
|
||
// Abteilungsfilter für Nicht-Admins
|
||
if ($myDeptIds !== null) {
|
||
$placeholders = implode(',', array_fill(0, count($myDeptIds), '?'));
|
||
$sql .= " AND t.department_id IN ($placeholders)";
|
||
$params = array_merge($params, $myDeptIds);
|
||
}
|
||
|
||
$sql .= " ORDER BY t.updated_at DESC LIMIT 8";
|
||
|
||
$stmt = $pdo->prepare($sql);
|
||
$stmt->execute($params);
|
||
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||
|
||
// Nur nötige Felder zurückgeben
|
||
$out = array_map(fn($t) => [
|
||
'ticket_number' => $t['ticket_number'],
|
||
'subject' => $t['subject'],
|
||
'requester_name' => $t['requester_name'],
|
||
'requester_email' => $t['requester_email'],
|
||
'status' => $t['status'],
|
||
'priority_name' => $t['priority_name'],
|
||
'department_name' => $t['department_name'],
|
||
'staff_name' => $t['staff_name'] ?? '–',
|
||
'created_at' => $t['created_at'],
|
||
], $results);
|
||
|
||
echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG);
|