im UI eingeklappt). $byTaskId = []; foreach ($assignments as $a) { $byTaskId[(int) ($a['task_id'] ?? 0)][] = $a; } $assignments = []; foreach ($byTaskId as $taskAssignments) { $active = []; $completed = []; foreach ($taskAssignments as $a) { if (in_array($a['status'] ?? '', $completedStatuses, true)) { $completed[] = $a; } else { $active[] = $a; } } if ($active !== []) { usort($active, static function (array $a, array $b): int { $aDue = strtotime((string) ($a['due_at'] ?? '9999-12-31')); $bDue = strtotime((string) ($b['due_at'] ?? '9999-12-31')); return $aDue <=> $bDue; }); foreach ($active as $a) { $assignments[] = $a; } } if ($completed !== []) { usort($completed, static function (array $a, array $b): int { return strtotime((string) ($b['completed_at'] ?? '0')) - strtotime((string) ($a['completed_at'] ?? '0')); }); foreach ($completed as $a) { $assignments[] = $a; } } } $formatDateShort = static function ($value): string { $value = trim((string) $value); if ($value === '') { return ''; } try { return (new DateTimeImmutable($value))->format('d.m.Y'); } catch (Throwable $throwable) { return $value; } }; $getCardMeta = static function (array $assignment) use ($formatDateShort): string { $parts = []; $dueAt = trim((string) ($assignment['due_at'] ?? '')); if ($dueAt !== '') { $parts[] = 'Fällig bis ' . $formatDateShort($dueAt); } else { $parts[] = 'Kein Fälligkeitsdatum'; } // Zyklus-Zeitraum nur anzeigen, wenn die Aufgabe wiederkehrend ist // (bei 'once' irrelevant). So versteht der User bei Rückständen, // welcher Zyklus welcher Karte zugeordnet ist. $cycleKey = (string) ($assignment['cycle_key'] ?? ''); $cycleStart = trim((string) ($assignment['cycle_start_at'] ?? '')); $cycleEnd = trim((string) ($assignment['cycle_end_at'] ?? '')); $showCyclePeriod = (int) ($assignment['show_cycle_period'] ?? 0) === 1; if ($showCyclePeriod && $cycleKey !== '' && $cycleKey !== 'once' && $cycleStart !== '' && $cycleEnd !== '') { $parts[] = 'Zeitraum ' . $formatDateShort($cycleStart) . '–' . $formatDateShort($cycleEnd); } return implode(' · ', $parts); }; $isAssignmentOverdueByDate = static function (array $assignment, DateTimeImmutable $now): bool { $status = (string) ($assignment['status'] ?? ''); if ($status === 'completed') { return false; } $dueAt = trim((string) ($assignment['due_at'] ?? '')); if ($dueAt === '') { return false; } try { return (new DateTimeImmutable($dueAt)) < $now; } catch (Throwable $throwable) { return false; } }; $groupedAssignments = []; $categoryOrder = []; foreach ($assignments as $assignment) { $categoryName = trim((string) ($assignment['task_category_name'] ?? '')); if ($categoryName === '') { $categoryName = 'Allgemein'; } if (!array_key_exists($categoryName, $groupedAssignments)) { $groupedAssignments[$categoryName] = []; $categoryOrder[] = $categoryName; } $groupedAssignments[$categoryName][] = $assignment; } ?>
Zurücksetzen
Keine Aufgaben mit Status „“ vorhanden. Aktuell sind keine Aufgaben vorhanden.

offen 0 ? ', ' . $completedCount . ' abgeschlossen' : ''; ?>
0; $cardClasses = [ 'task-cert-user-task-card', 'status-' . $status, ]; if ($isOverdueByDate) { $cardClasses[] = 'is-overdue-date'; } if ($isEscalated) { $cardClasses[] = 'is-escalated'; } ?>
abgeschlossene Aufgabe anzeigen
Keine Aufgaben in dieser Kategorie.