Przejdź do głównej zawartości

30. System incydentów IT

System incydentów IT

Aplikacja do zarządzania incydentami technicznymi w szkole lub firmie: zgłaszanie problemów (np. brak internetu, awaria drukarki), śledzenie statusu rozwiązania, przypisywanie do technika i pełna historia.

  • Projektowania systemu ticketowego (helpdesk)
  • Modelu eskalacji — priorytet wpływa na kolejność
  • Pracy z datami i obliczania czasu rozwiązania
  • Filtrowania i sortowania po wielu kryteriach
  • Eksportu raportów do CSV
  1. Formularz zgłoszenia — tytuł, opis, kategoria, priorytet, lokalizacja
  2. Panel incydentów — lista z priorytetem, statusem i czasem od zgłoszenia
  3. Przypisanie do technika — wybranie osoby odpowiedzialnej
  4. Zmiana statusu — z komentarzem rozwiązania
  5. Historia incydentu — pełny log zmian statusu
{
"incidents": [
{
"id": 1,
"title": "Brak dostępu do internetu w sali B14",
"description": "Od rana brak sieci, uczniowie nie mogą pracować",
"category": "siec",
"priority": "critical",
"location": "Sala B14",
"status": "open",
"assignee": "mgr Kowalski",
"reported_by": "mgr Nowak",
"created_at": "2026-02-10 08:30:00",
"resolved_at": null,
"resolution_note": null,
"history": [
{"status": "open", "note": "Zgłoszono", "changed_at": "2026-02-10 08:30:00"}
]
}
]
}

Wymagane funkcje:

  • Formularz zgłoszenia incydentu
  • Lista incydentów z priorytetem i statusem
  • Zmiana statusu (otwarty/w trakcie/zamknięty)
  • Walidacja pól wymaganych, zapis do JSON
Ocena: 3.0
  • Folderincydenty/
    • index.php
    • zglos.php
    • incydent.php
    • zmien-status.php
    • dashboard.php
    • Folderincludes/
      • functions.php
      • auth.php
      • priority.php
    • Folderdata/
      • incidents.json
    • Foldercss/
      • style.css

Sortowanie po priorytecie:

$priorityOrder = ['critical' => 0, 'high' => 1, 'medium' => 2, 'low' => 3];
usort($incidents, function ($a, $b) use ($priorityOrder) {
$pA = $priorityOrder[$a['priority']] ?? 99;
$pB = $priorityOrder[$b['priority']] ?? 99;
if ($pA !== $pB) return $pA <=> $pB;
return strcmp($a['created_at'], $b['created_at']);
});

Czas od zgłoszenia:

function timeAgo(string $datetime): string {
$seconds = time() - strtotime($datetime);
if ($seconds < 3600) return floor($seconds / 60) . ' min temu';
if ($seconds < 86400) return floor($seconds / 3600) . ' godz. temu';
return floor($seconds / 86400) . ' dni temu';
}

Czas rozwiązania:

function getResolutionTime(string $createdAt, ?string $resolvedAt): ?string {
if ($resolvedAt === null) return null;
$seconds = strtotime($resolvedAt) - strtotime($createdAt);
$hours = floor($seconds / 3600);
$minutes = floor(($seconds % 3600) / 60);
return "{$hours}h {$minutes}min";
}