query('SELECT id, name FROM staff WHERE is_active = 1 ORDER BY name')->fetchAll(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { verify_csrf(); $action = $_POST['action'] ?? ''; if ($action === 'create') { $title = trim($_POST['title'] ?? ''); $desc = trim($_POST['description'] ?? ''); $assignTo = ($_POST['assigned_to'] ?? '') !== '' ? (int)$_POST['assigned_to'] : null; $dueAt = trim($_POST['due_at'] ?? '') ?: null; $ticketId = ($_POST['ticket_id'] ?? '') !== '' ? (int)$_POST['ticket_id'] : null; if ($title === '') $errors[] = 'Bitte einen Titel angeben.'; if (!$errors) { $pdo->prepare('INSERT INTO tasks (ticket_id,title,description,assigned_to,due_at,created_by,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?)') ->execute([$ticketId, $title, $desc ?: null, $assignTo, $dueAt, $staff['id'], db_now(), db_now()]); flash('success', 'Aufgabe erstellt.'); if ($ticketId) { $tn = $pdo->prepare('SELECT ticket_number FROM tickets WHERE id=?'); $tn->execute([$ticketId]); redirect('/staff/ticket_view.php?n=' . urlencode($tn->fetchColumn())); } redirect('/staff/tasks.php'); } } if ($action === 'update_status') { $id = (int) $_POST['id']; $status = in_array($_POST['status']??'', ['open','in_progress','done']) ? $_POST['status'] : 'open'; $pdo->prepare('UPDATE tasks SET status=?, updated_at=? WHERE id=?')->execute([$status, db_now(), $id]); // Kein open redirect: Referer nur wenn er auf /staff/ zeigt $ref = $_SERVER['HTTP_REFERER'] ?? ''; $safePath = (parse_url($ref, PHP_URL_HOST) === ($_SERVER['HTTP_HOST'] ?? '') && strpos(parse_url($ref, PHP_URL_PATH) ?? '', '/staff/') === 0) ? $ref : '/staff/tasks.php'; redirect($safePath); } if ($action === 'delete') { $pdo->prepare('DELETE FROM tasks WHERE id=?')->execute([(int)$_POST['id']]); flash('success', 'Aufgabe gelöscht.'); redirect('/staff/tasks.php'); } } $filter = $_GET['filter'] ?? 'my'; // my, all, open, done $where = []; $params = []; if ($filter === 'my') { $where[] = 'ta.assigned_to = ?'; $params[] = $staff['id']; } elseif ($filter === 'open') { $where[] = "ta.status != 'done'"; } elseif ($filter === 'done') { $where[] = "ta.status = 'done'"; } $sql = 'SELECT ta.*, s.name AS assigned_name, s2.name AS creator_name, t.ticket_number, t.subject AS ticket_subject FROM tasks ta LEFT JOIN staff s ON s.id = ta.assigned_to LEFT JOIN staff s2 ON s2.id = ta.created_by LEFT JOIN tickets t ON t.id = ta.ticket_id' . ($where ? ' WHERE ' . implode(' AND ', $where) : '') . ' ORDER BY ta.due_at IS NULL, ta.due_at ASC, ta.created_at DESC LIMIT 200'; $stmt = $pdo->prepare($sql); $stmt->execute($params); $tasks = $stmt->fetchAll(); $statusLabels = ['open'=>'Offen','in_progress'=>'In Arbeit','done'=>'Erledigt']; $statusColors = ['open'=>'#2563eb','in_progress'=>'#d97706','done'=>'#16a34a']; $pageTitle = 'Aufgaben'; $activePage = 'tasks'; require __DIR__ . '/_header.php'; ?>

Aufgaben

'Meine','all'=>'Alle','open'=>'Offen','done'=>'Erledigt'] as $f=>$lbl): ?>
AufgabeVerknüpftes TicketZugewiesenFälligStatus

#
–
Keine Aufgaben gefunden.