Quelltext des aktuellen Standes
<?php
// PDF-Template – wird von ManualController::buildPdfHtml() per ob_start/include gerendert.
// Variablen: $modules (array), $appName (string), $date (string)
$mod = function(string $key) use ($modules): bool {
return !empty($modules[$key]);
};
$badge = function(bool $active): string {
return $active
? '<span style="background:#d4edda;color:#155724;border:1px solid #c3e6cb;padding:1px 6px;font-size:8pt;border-radius:3px;">Aktiv</span>'
: '<span style="background:#f8d7da;color:#721c24;border:1px solid #f5c6cb;padding:1px 6px;font-size:8pt;border-radius:3px;">Inaktiv</span>';
};
// Modul-Überschrift (h4) inkl. Aktiv-Badge.
$modHead = function(string $key, string $title) use ($mod, $badge): string {
return '<h4>' . $title . ' (' . htmlspecialchars($key) . ') — ' . $badge($mod($key)) . '</h4>';
};
?>
<!-- Deckblatt -->
<div style="text-align:center; margin-top:80px; margin-bottom:100px; page-break-after:always;">
<h1 style="font-size:30pt; color:#1a3a5c; border:none; margin-bottom:12px;">Systemhandbuch</h1>
<div style="font-size:18pt; color:#2c4a6e; margin-bottom:8px;"><?= htmlspecialchars($appName) ?></div>
<div style="font-size:11pt; color:#888; margin-top:40px;">Stand: <?= $date ?></div>
<div style="font-size:10pt; color:#aaa; margin-top:8px;">Vertraulich – Nur für internen Gebrauch</div>
</div>
<!-- Inhaltsverzeichnis -->
<div style="page-break-after:always;">
<h2>Inhaltsverzeichnis</h2>
<ol style="line-height:1.9;">
<li>Systemübersicht</li>
<li>Erste Schritte / Inbetriebnahme</li>
<li>Kernsystem (immer aktiv)</li>
<li>Module
<ol style="margin-top:4px;">
<li>Inventar & Beschaffung
<ol><li>Bestellboard</li><li>Budget</li><li>Inventar</li><li>Lager</li><li>Lizenzverwaltung</li><li>Software-Inventar</li></ol>
</li>
<li>Service & Support
<ol><li>Aufgabenliste</li><li>Geräteausleihe</li><li>IT-Servicekatalog</li><li>Kanban-Board</li><li>Ticketsystem</li><li>Wartungskalender</li></ol>
</li>
<li>Netzwerk & Infrastruktur
<ol><li>Backup-Übersicht</li><li>IP-Adressmanagement</li><li>Monitoring</li><li>Netzwerkpläne</li><li>SSL-Zertifikate</li><li>UniFi-Integration</li><li>Virtualisierung</li></ol>
</li>
<li>Organisation & Kommunikation
<ol><li>Kontakte & Unternehmen</li><li>Telefonbuch</li><li>Vertragsmanagement</li><li>Anträge & Genehmigungen</li><li>Statusseite</li></ol>
</li>
<li>Sicherheit & Nachvollziehbarkeit
<ol><li>CVE-Sicherheitsmeldungen</li><li>XDR-Sicherheitswarnungen</li><li>Konfigurationslog</li><li>Passwort-Tresor</li></ol>
</li>
<li>Dokumentation & KI
<ol><li>Datei-Explorer</li><li>KI-Chat</li><li>API-Auto</li></ol>
</li>
</ol>
</li>
<li>Modulabhängigkeiten</li>
<li>Anwendungsszenarien (modulübergreifend)</li>
<li>Administrationsbereiche</li>
<li>Systemeinstellungen</li>
<li>E-Mail-Versand & OAuth (Microsoft 365 / Google)</li>
<li>Sicherheit & Compliance</li>
<li>Scheduler & Hintergrundaufgaben</li>
<li>Authentifizierung, Benutzer & Rollen</li>
<li>Troubleshooting & häufige Fragen</li>
<li>Glossar & Pflege</li>
</ol>
</div>
<!-- 1. Systemübersicht -->
<h2>1. Systemübersicht</h2>
<p>
<strong>OpenNIT</strong> ist eine selbst gehostete PHP-Webanwendung für revisionssichere IT-Dokumentation
und Asset-Management. Das System ist modular aufgebaut – jedes Modul kann separat aktiviert oder deaktiviert werden.
</p>
<p>
Kernmerkmal ist ein unveränderlicher Audit-Log mit kryptografischer Hash-Chain, der alle Änderungen
nachvollziehbar dokumentiert und für Compliance-Anforderungen (ISO 27001, BSI-Grundschutz, SOC 2) geeignet ist.
</p>
<table>
<thead><tr><th scope="col">Eigenschaft</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>Technologie</td><td>PHP (OOP), MariaDB/MySQL, HTML/CSS/JS</td></tr>
<tr><td>Authentifizierung</td><td>Lokal, LDAP, Azure AD (OAuth2/PKCE), Keycloak, WebAuthn/FIDO2, TOTP</td></tr>
<tr><td>Verschlüsselung</td><td>AES-256-GCM (Vault, sensible Felder), Argon2id (Passwörter)</td></tr>
<tr><td>E-Mail</td><td>SMTP/IMAP mit Passwort oder OAuth2 (Microsoft 365 Graph/XOAUTH2, Google Workspace)</td></tr>
<tr><td>PDF-Export</td><td>Dompdf (Seiten, ZIP-Exporte, Handbuch)</td></tr>
<tr><td>Editor / Diagramme</td><td>TinyMCE (Rich-Text), draw.io (Netzwerkpläne, selbst gehostet)</td></tr>
<tr><td>Audit-Log</td><td>Hash-Chain (SHA-256), 10 Jahre Aufbewahrung</td></tr>
</tbody>
</table>
<!-- 2. Kernsystem -->
<h2 style="page-break-before:always;">2. Erste Schritte / Inbetriebnahme</h2>
<p>Empfohlene Reihenfolge der Grundeinrichtung nach der Installation. <strong>Wichtig:</strong> Ohne den Scheduler (Schritt 6) laufen keine Hintergrundaufgaben (Erinnerungen, Ticket-Abruf, Prüfungen).</p>
<ol>
<li><strong>Anmelden</strong> unter <code>/login</code> mit dem Installations-Admin.</li>
<li><strong>Grunddaten</strong> (<code>/admin/settings</code>): App-Name, Logo/Favicon, Zeitzone, Icon-Stil.</li>
<li><strong>Module aktivieren</strong> (<code>/admin/settings</code> → Module): nur die benötigten einschalten.</li>
<li><strong>Stammdaten</strong>: Standorte (<code>/admin/locations</code>) und ggf. Tags (<code>/admin/tags</code>).</li>
<li><strong>Rollen & Benutzer</strong>: erst Rollen (<code>/admin/roles</code>), dann Benutzer (<code>/admin/users</code>) mit Geltungsbereich (global/Themengebiet/Standort).</li>
<li><strong>Scheduler-Crontab</strong> (Pflicht): <code>* * * * * php bin/scheduler.php …</code>, danach <code>/admin/cronjobs</code> prüfen.</li>
<li><strong>E-Mail-Versand</strong> (<code>/admin/settings/email</code>): SMTP oder OAuth, Test-Mail.</li>
<li><strong>Anmeldung & Sicherheit</strong> (optional): SSO und unter <code>/admin/settings/security</code> Passwort-Richtlinie/Lockout/MFA; Web-Push via VAPID (<code>/admin/settings/pwa</code>).</li>
<li><strong>Loslegen</strong>: aktive Module mit ersten Daten füllen; vor dem Produktivgang die Produktions-Checkliste (Kapitel 10) abarbeiten.</li>
</ol>
<h2 style="page-break-before:always;">3. Kernsystem (immer aktiv)</h2>
<p>Folgende Funktionen sind fest im System integriert und können nicht deaktiviert werden:</p>
<h3>Dokumentation: Seiten & Themengebiete</h3>
<p>Das Kernstück von OpenNIT. Inhalte werden in einer Hierarchie aus Themengebieten (Topics) und Seiten (Pages) organisiert. Jede Seite hat eine vollständige Versionshistorie.</p>
<ul>
<li>Rich-Text-Editor (TinyMCE) für Seiteninhalte</li>
<li>Vollständige Versionshistorie mit Diff-Anzeige und Wiederherstellung</li>
<li>Verantwortlichkeiten: technisch und fachlich verantwortliche Personen pro Seite</li>
<li>Review-Fälligkeiten mit konfigurierbaren Prüfintervallen</li>
<li>Ansprechpartner-Verlinkung (Kontakt, Unternehmen, Benutzer, Verzeichnisperson)</li>
<li>Dateianhänge und Tags pro Seite</li>
<li>PDF-Export einzelner Seiten; ZIP-Export ganzer Themengebiete</li>
<li>Archivierung und Wiederherstellung von Seiten</li>
<li>Seitenvorlagen für standardisierte Dokumentation</li>
</ul>
<h3>Volltext- & modulübergreifende Suche</h3>
<p>Systemweite Suche über alle Dokumentationsseiten (Titel und Inhalt). Zusätzlich eine modulübergreifende Suche – gruppiertes Live-Dropdown in der Kopfzeile und Vollseite unter <code>/search</code> – über Inventar, Tickets, Verträge, Lizenzen, Leihgeräte, Lager, SSL und Bestellungen (nur berechtigte Ergebnisse).</p>
<h3>Benachrichtigungen</h3>
<p>In-App- und E-Mail-Benachrichtigungen für Seitenänderungen, Ticketupdates, Ausleihvorgänge und weitere Ereignisse. Vorlagen sind durch Administratoren anpassbar. Optional: Browser-Push über PWA.</p>
<h3>Audit-Log</h3>
<p>Alle schreibenden Operationen werden unveränderlich protokolliert. Hash-Chain gegen Manipulation. Einsehbar unter <code>/admin/audit</code>, exportierbar als CSV. Aufbewahrung: 10 Jahre.</p>
<!-- 3. Module -->
<h2 style="page-break-before:always;">4. Module</h2>
<p>Der Status in Klammern gibt an, ob das Modul in der aktuellen Konfiguration aktiviert ist. Die Module sind in sechs thematische Gruppen sortiert.</p>
<!-- 3.1 Inventar & Beschaffung -->
<h3>4.1 Inventar & Beschaffung</h3>
<?= $modHead('orders', 'Bestellboard') ?>
<p>Board-Ansicht für Bestellungen mit Statusverlauf (Offen → Eingetroffen → optional Abholbereit → Archiviert) und klickbaren KPI-Kacheln je Status. Karten mit Artikel, Menge, Preis, Lieferant und Bestelldatum; optionale Verknüpfung zu Budgetpositionen. Server-seitige Suche (inkl. vollständigem Archiv) über Titel, Referenz, Empfänger und Lieferant, dazu Sortierung und Prioritäts-Filter. Optionale Teil-Lieferung (stückgenauer Fortschritt), Weiterleiten per E-Mail (mit Anhangauswahl, Empfänger im Verzeichnis suchbar), CSV-Export und – ab Status „Eingetroffen" – Anlegen von Inventar-Geräten aus der Bestellung. Aus Tickets per Schnellaktion erstellte Bestellungen sind mit dem Ursprungs-Ticket rückverknüpft.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: Budget, Tickets (Schnellaktion & Rückverknüpfung), Assets (Geräte aus Bestellung)</div>
<?= $modHead('budget', 'Budget') ?>
<p>Budgetverwaltung für IT-Ausgaben mit Jahresbudgets und Einzelpositionen. Belege werden über einen Dialog mit Bezeichnung, Lieferant, Rechnungsnummer und Datum angelegt, lassen sich nachträglich bearbeiten und direkt im Fenster als Vorschau öffnen (PDF/Bilder). Pro Beleg sind Brutto- und Netto-Betrag erfassbar (MwSt-Satz berechnet den jeweils anderen Wert automatisch). Soll-Ist-Vergleich mit Restbudget-Anzeige.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: Orders</div>
<?= $modHead('assets', 'Inventar') ?>
<p>Zentrale Verwaltung aller IT-Assets. Jedes Asset hat Stammdaten, Standort, Kategorie, Hersteller, Seriennummer, Kaufdatum, Garantie und benutzerdefinierte Felder.</p>
<ul>
<li>Kategorien, Typen und Hersteller frei konfigurierbar; benutzerdefinierte Felder pro Kategorie</li>
<li>Erweiterte Filter und gespeicherte Ansichten; CSV-Export der gefilterten Liste</li>
<li>Datei-Anhänge pro Gerät (Rechnungen, Lieferscheine, Fotos …)</li>
<li>Übergabeprotokoll mit digitaler Unterschrift (Tablet)</li>
<li>Etikettendruck via DYMO-Drucker (inkl. QR-Code zur Geräteseite)</li>
<li>Automatischer Asset-Sync via PowerShell-Agent (Rate-Limit & Replay-Schutz)</li>
<li>Relution MDM-Sync (mobile Geräte); GLPI-Import</li>
<li>Garantieabfragen Dell/HP/HPE (Dell gestaffelt per Scheduler, vorab gespeichert)</li>
<li><strong>Wert & Nutzungsdauer</strong> (optional, <code>/admin/assets/valuation</code>): Nutzungsdauer, Abschreibung und Restwert sind <em>einzeln</em> zuschaltbar und setzen einander nicht voraus. Die Nutzungsdauer kommt ohne Anschaffungswert aus und liefert Nutzungsende, Filter und eine Kachel für die Ersatzplanung; Abschreibung und Restwert rechnen linear (monatsgenau oder in vollen Jahren) aus Anschaffungswert und Nutzungsdauer. Je Kategorie lässt sich eine übliche Nutzungsdauer vorbelegen. Ab Werk sind alle drei aus.</li>
</ul>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Kategorien (<code>/admin/assets/categories</code>) mit Nummernformat & eigenen Feldern; Hersteller (<code>/admin/assets/manufacturers</code>) inkl. Garantie-API; Modelle (<code>/admin/assets/types</code>).</li>
<li>Automatische Inventarisierung: PowerShell-Agent (<code>/admin/inventory/sync</code>), Intune (<code>/admin/inventory/intune</code>), Relution (<code>/admin/inventory/relution</code>) oder GLPI-Import.</li>
<li>Optional: Garantie (Dell <code>/admin/settings/dell</code>, HP <code>/admin/settings/hp</code>), Wert & Nutzungsdauer (<code>/admin/assets/valuation</code>), Übergabe-Vorlagen (<code>/admin/assets/handover-settings</code>), Etiketten (<code>/admin/settings/label-print</code>).</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Standorte (Stammdaten); optional: Tickets, Loans, Stock</div>
<?= $modHead('stock', 'Lager') ?>
<p>Lagerverwaltung für IT-Verbrauchsmaterial und Ersatzteile. Der Bestand ändert sich ausschließlich über Ein- und Ausgangsbuchungen (mit Grund/Empfänger) – jede Buchung wird protokolliert und je Artikel als Historie gezeigt. KPI-Kacheln (gesamt, geringer Bestand, nicht vorrätig), farbcodierte Mengen-Badges mit Mindestmengenwarnung, Kategorien mit Icon. Artikel: Kategorie, Name, Modell/Artikel-Nr., Beschreibung, Mindestmenge, Lagerort.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine</div>
<?= $modHead('licenses', 'Lizenzverwaltung') ?>
<p>Verwaltung von Software-Lizenzen mit automatischem Microsoft 365 / Entra ID-Sync, Ablaufüberwachung und Vertragszuordnung. Sync-Intervall per Cron konfigurierbar. Lizenzen lassen sich Geräten und Personen zuordnen.</p>
<p>Bei Microsoft-Lizenzen übernimmt der Abgleich standardmäßig die Zahl der belegten Plätze; optional (<em>Administration → Lizenz-Sync → Platzhalter</em>, benötigt <code>User.Read.All</code>) auch, <em>wer</em> einen Platz hält. Übernommene Zuordnungen werden bei jedem Lauf ersetzt, von Hand gepflegte bleiben unangetastet.</p>
<p><strong>Abgleich mit dem Software-Inventar</strong> (bei aktivem Modul): Jede Lizenz lässt sich mit dem zugehörigen Programm verbinden – die Zuordnung wird vorgeschlagen, aber von Hand bestätigt, weil Lizenz- und Programmname auseinandergehen. Unter <code>/licenses/abgleich</code> stehen dann gekaufte Plätze und tatsächliche Installation nebeneinander (<em>frei</em>, <em>genau ausgelastet</em>, <em>mehr installiert als lizenziert</em>), dazu die Programme ohne Lizenzzuordnung. Eine Lizenz ohne Platzbegrenzung gilt nie als überzogen.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: Contracts, Microsoft 365 / Entra ID, Software-Inventar (Abgleich)</div>
<?= $modHead('software', 'Software-Inventar') ?>
<p>Welche Programme auf welchem Gerät installiert sind. Erfasst wird über die beiden Wege, die ohnehin Gerätedaten holen: den <strong>Inventar-Agenten</strong> (Windows, PowerShell, Registry HKLM) und den <strong>Intune-Abgleich</strong> (<code>detectedApps</code>). <strong>Beide Quellen sind einzeln einzuschalten und im Auslieferungszustand aus</strong> (<code>/admin/software/settings</code>); ohne eingeschaltete Quelle wird nichts gelesen und nichts gespeichert. Nach dem Einschalten der Agenten-Erfassung muss das PowerShell-Skript einmal neu heruntergeladen werden.</p>
<p>Gelesen wird nur, was maschinenweit installiert ist; was einzelne Anmeldenamen für sich installiert haben, bleibt außen vor. Gleiche Programme fallen zusammen (32-/64-Bit, abweichende Schreibweise); die Version steht an der Installation. Updates, Laufzeitumgebungen, Treiber und Sprachpakete werden als Systembestandteile erkannt und ausgeblendet – je Programm korrigierbar. Meldet eine Quelle ein Programm nicht mehr, verschwindet es, ohne die andere Quelle zu berühren. Übersicht unter <code>/software</code>, je Gerät im Reiter <em>Software</em>. Berechtigungen <code>view_software</code>/<code>manage_software</code>.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Assets; mindestens eine Quelle (Inventar-Agent oder Intune); optional: Lizenzen (Abgleich), CVE (betroffene Geräte)</div>
<!-- 3.2 Service & Support -->
<h3 style="page-break-before:always;">4.2 Service & Support</h3>
<?= $modHead('todos', 'Aufgabenliste') ?>
<p>Private Aufgabenliste pro Benutzer (nur für den jeweiligen Benutzer sichtbar). Aufgaben mit Fälligkeitsdatum/-uhrzeit, Priorität, frei wählbarer Kategorie, Wiederholung (täglich/wöchentlich/monatlich/jährlich, beim Abhaken wird automatisch die nächste Instanz erzeugt) und Unteraufgaben mit Fortschritt. KPI-Kacheln (Offen/Heute fällig/Überfällig), Suche/Filter/Sortierung (auch manuell per Drag & Drop). Erinnerung pro Aufgabe (Tage vorher) per Scheduler (<code>todo_due_reminder</code>).</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine</div>
<?= $modHead('teamboard', 'Notizbrett') ?>
<p>Gemeinsames Brett für kurze Zurufe im Team – „ich habe gestern X umgestellt, falls Y auffällt". Neueste Notiz oben, jeweils mit Namen und Zeitpunkt; jede Person erscheint durchgehend in einer eigenen, aus ihrem Konto abgeleiteten Farbe. Klartext bis 4.000 Zeichen, Suche im Text, Filter nach Person, Dashboard-Widget mit den letzten Einträgen. Eigene Einträge lassen sich bearbeiten und löschen (als „bearbeitet" gekennzeichnet), fremde nur mit <code>manage_teamboard</code>.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine</div>
<?= $modHead('loans', 'Geräteausleihe') ?>
<p>Verwaltung von Leihgeräten mit digitalem Übergabeprotokoll und Unterschrift sowie Leih-/Rückgabeschein als PDF. Workflow: (Self-Service-Anfrage → Bestätigung/Ablehnung durch das IT-Team →) Reservierung → Übergabe → Rückgabe. Self-Service-Anfragen über Portal/API können wahlweise bestätigungspflichtig oder direkt fest reserviert sein (Einstellung unter /admin/api).</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: Assets (Gerätekatalog), E-Mail-Versand; Self-Service über WordPress-Plugin / REST-API</div>
<?= $modHead('services', 'IT-Servicekatalog') ?>
<p>Start-Board mit verlinkten IT-Diensten und Web-Oberflächen (Controller, NAS, Firewall …) als anklickbare Kacheln, gruppiert nach Kategorie und mit Erreichbarkeits-Kennzeichnung (intern/extern). Icons per Upload oder automatischem Favicon-Abruf. Services lassen sich pro Benutzer anpinnen (Bereich „Meine Pins"); die ersten Pins (1–15) erscheinen optional als Schnellzugriff-Icons in der Kopfzeile (Desktop, je Benutzer schaltbar).</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine</div>
<?= $modHead('kanban', 'Kanban-Board') ?>
<p>Gemeinsames, spaltenbasiertes Team-Board im Kanban-Stil mit Drag & Drop. Frei konfigurierbare Spalten (Name, Farbe, optionales WIP-Limit), Aufgabenkarten mit Priorität, Label, Fälligkeitsdatum und mehreren Bearbeitern; Filter nach Suche/Priorität/Label.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine</div>
<?= $modHead('tickets', 'Ticketsystem') ?>
<p>Internes Helpdesk-Ticketsystem mit E-Mail-Eingang (IMAP oder OAuth – Microsoft 365 / Google), konfigurierbaren Kategorien, Prioritäten und automatischen Benachrichtigungen.</p>
<p><strong>Grundfunktionen:</strong></p>
<ul>
<li>E-Mail-Eingang zur automatischen Ticket-Erstellung</li>
<li>Ticket-Zustände: Neu, In Bearbeitung, Warteschlange, Gelöst, Geschlossen</li>
<li>Prioritäten (Kritisch / Normal / Niedrig), Fälligkeitsdaten</li>
<li><strong>Wiedervorlage (Snooze):</strong> „Wiedervorlage bis"-Datum setzen – das Ticket verschwindet bis dahin aus „Mein Bereich" (Tab <em>Wiedervorlage</em>) und erscheint am hinterlegten Tag automatisch wieder</li>
<li>Verlinkung zu Assets, Kontakten und Standorten</li>
<li>E-Mail-Queue, Statistiken und Auswertungen</li>
<li>Antwortvorlagen (Canned Responses) mit Platzhalter-Ersetzung</li>
<li>Livesuche in der Ticketliste: Betreff, Melder-Name/-E-Mail und Ticketnummer (z. B. <code>#123</code>)</li>
<li><strong>Sammelstörung:</strong> Wird ein Vorfall mehrfach gemeldet, führt ein Ticket den Vorfall und die übrigen Meldungen hängen daran. Ein Haken bei <em>Allen</em> gibt dieselbe Antwort in jeder angehängten Meldung aus – jeder Melder erhält sie in seinem eigenen Ticket; <em>Mitschließen</em> setzt alle offenen Meldungen in einem Zug auf Gelöst oder Geschlossen, bereits abgeschlossene bleiben unberührt. Die Hierarchie ist eine Ebene tief.</li>
<li><strong>Wiederkehrende Tickets:</strong> Regelmäßige Arbeiten (Rückspiel-Test, Quartalsprüfung) als Vorlage unter <em>Administration → Tickets → Wiederkehrende Tickets</em>; Takt täglich bis jährlich, jeweils auch „alle N". Der Monatstakt bleibt im Monat; ein aufgelaufener Rückstand wird übersprungen statt nachgeholt. Setzt eine eingerichtete Zeitsteuerung voraus.</li>
</ul>
<p><strong>Schnellaktionen in der Sidebar</strong> (je nach aktivierten Modulen/Berechtigungen): <em>Bestellung aus Ticket erstellen</em> (mit Rückverknüpfung Bestellung ↔ Ticket), <em>Änderung aus Ticket erstellen</em> (ConfigLog), <em>UniFi-Voucher erstellen</em> (Voucher wird in die Antwort übernommen) und <em>Leihgerät reservieren</em> (Gerät aus dem Leihgeräte-Modul reservieren/ausgeben; Ausleiher aus dem Ticket-Anforderer vorbefüllt, interne Notiz verlinkt auf den Verleihvorgang). Verknüpfte Assets öffnen per Klick eine <em>Asset-Schnellansicht</em> als Modal.</p>
<p><strong>Ticket-Detailseite:</strong></p>
<ul>
<li>Verlauf direkt am Ticket sichtbar: Zuweisungen und Statuswechsel als kompakte System-Zeilen zwischen den Chat-Bubbles; ein Uhr-Icon im Header öffnet ein Modal mit der vollständigen Audit-Historie inkl. Metadaten- und Asset-Änderungen.</li>
<li>SLA-Pill im Header: Vor der ersten Antwort Countdown bis Frist, danach gemessene Reaktionszeit. Schwellenwerte pro Priorität konfigurierbar (Defaults: P1=60min, P2=240min, P3=1440min) — Override via <code>config/runtime.php</code>, Schlüssel <code>tickets.sla_targets</code>.</li>
<li>Relative Zeitangaben in Bubbles und Verlauf („vor 5 Minuten“), absoluter Zeitstempel im Tooltip.</li>
<li>„Erledigt — wartet auf Rückmeldung“ vs. „Endgültig schließen“: getrennte Aktionen mit Bestätigungsmodal, das den Unterschied erklärt.</li>
</ul>
<p><strong>Antwortvorlagen:</strong> Global gepflegt unter <em>Administration → Antwortvorlagen</em>. Platzhalter werden serverseitig ersetzt: <code>{{ticket.id}}</code>, <code>{{ticket.subject}}</code>, <code>{{customer.name}}</code>, <code>{{assignee.name}}</code>.</p>
<p><strong>Tastenkürzel auf der Ticket-Detailseite:</strong> <kbd>R</kbd> Antwort, <kbd>N</kbd> Interne Notiz, <kbd>V</kbd> Vorlage einfügen, <kbd>S</kbd> Erledigt, <kbd>C</kbd> Endgültig schließen, <kbd>E</kbd> Wieder öffnen, <kbd>Strg</kbd>+<kbd>Enter</kbd> Absenden, <kbd>?</kbd> Hilfe.</p>
<p><strong>Audit-Log für Zuweisungen:</strong> Änderungen werden mit Vor-/Nach-Snapshots geloggt (<code>old_value_json</code> / <code>new_value_json</code>). Wer entfernt und wer hinzugefügt wurde, ist exakt rekonstruierbar — auch beim KI-Chat-Pfad.</p>
<p><strong>Verknüpfte Tickets (Linked Tickets):</strong> Drei Typen direkt in der Sidebar — <em>Verknüpft mit</em> (symmetrisch), <em>Duplikat von</em>, <em>Blockiert</em>. Das jeweils andere Ticket zeigt die inverse Beschriftung automatisch. Mit dem Header-Button <em>„⇿ Zusammenführen“</em> lassen sich Tickets vollständig mergen: Antworten und Anhänge wandern ins Ziel, die Quelle wird als Duplikat verlinkt und still geschlossen.</p>
<p><strong>Automatische Zuweisung (optional):</strong> Unter <em>Administration → Tickets → Automatisierung</em>. <em>Kategorie-Zuweisung</em> (Standard-Bearbeiter je Kategorie) und/oder <em>Round-Robin</em> (gleichmäßige Verteilung auf aktive, als verfügbar markierte Bearbeiter mit Berechtigung <code>manage_tickets</code>). Greift bei manuell, per E-Mail und per WordPress-API erstellten Tickets ohne Bearbeiter.</p>
<p><strong>SLA-Pause bei „Warteschlange“ (optional):</strong> Stoppt die SLA-Uhr bei Status <em>Warteschlange</em>, läuft beim Verlassen weiter; Pausenzeit wird von Countdown und gemessener Reaktionszeit abgezogen.</p>
<p><strong>Geschäftszeiten-Kalender (optional):</strong> Die SLA-Uhr rechnet nur innerhalb definierter Arbeitszeiten (Wochenplan + Feiertage, unter <em>Features & SLA</em>). Außerhalb der Geschäftszeiten und an Feiertagen zählt die Frist nicht.</p>
<p><strong>SLA-Eskalation (optional):</strong> Der Cron-Task <code>sla_escalation</code> (Verwaltung unter <em>/admin/cronjobs</em>) markiert überfällige Tickets ohne Erstreaktion sichtbar als „Eskaliert“, hebt ihre Priorität an und benachrichtigt die Bearbeiter (bzw. Ticket-Admins bei unzugewiesenen Tickets).</p>
<p><strong>Benachrichtigungen an Bearbeiter (optional):</strong> In-App- und Web-Push-Hinweise (sobald VAPID konfiguriert ist) bei Zuweisung, neuer Kundenantwort und SLA-Eskalation. Pro Ereignis unter <em>Features & SLA</em> abschaltbar; davon getrennt steuerbar sind die E-Mail-Benachrichtigungen an den Melder.</p>
<p><strong>Eigene Felder / Custom Fields (optional):</strong> Unter <em>Administration → Tickets → Eigene Felder</em>. Global oder pro Kategorie, sechs Feldtypen (Text, mehrzeilig, Zahl, Datum, Auswahlliste, Ja/Nein), optional als Pflichtfeld. Bearbeitbar in der Sidebar der Ticket-Detailseite.</p>
<p><strong>Aufwandserfassung (optional):</strong> Zwei Wege parallel. <em>Stoppuhr</em> in der Sidebar startet pro Ticket, misst sekundengenau, pausiert automatisch in Warteschlange, stoppt automatisch beim Lösen. Eine globale Pill rechts oben ist über alle Module sichtbar; ein Bearbeiter hat höchstens einen laufenden Timer. Bei > 4h Laufzeit fragt das System beim Stop nach (Korrektur für vergessene Timer). Alternativ <em>manuell</em>: Minutenfeld im Reply-Formular für nachträgliche Erfassung. Summe (beide Quellen) als Pill im Header, Einzelwerte als Badges.</p>
<p><strong>CSAT-Bewertung (optional):</strong> Beim endgültigen Schließen automatische E-Mail an den Melder mit Link zu öffentlicher 1–5-Sterne-Seite. Titel, Intro, Dankestext, Logo unter <em>Features & SLA</em> komplett anpassbar; dort lässt sich die Bewertungsseite auch als Vorschau öffnen (ohne echte Bewertung). Auswertung mit Durchschnitt, Rücklauf und Verteilung unter <em>CSAT-Bewertungen</em>.</p>
<p><strong>Konfiguration:</strong> SLA-Schwellen und Feature-Toggles unter <em>Administration → Ticketsystem → Features & SLA</em>. Änderungen greifen sofort.</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Postfach (<code>/admin/tickets/settings</code>): Verfahren wählen (SMTP/Passwort, M365 Graph oder XOAUTH2), Daten eintragen, „Verbindung testen" bzw. „Mit Microsoft/Google verbinden", Aktion nach Abruf festlegen.</li>
<li>Kategorien (<code>/admin/tickets/categories</code>), optional Automatik (<code>/admin/tickets/automation</code>).</li>
<li>SLA & Features (<code>/admin/tickets/features</code>): Reaktionszeiten, SLA-Pause, Geschäftszeiten, CSAT, Benachrichtigungen. Eigene Felder unter <code>/admin/tickets/custom-fields</code>.</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> E-Mail (SMTP/IMAP/OAuth), Standorte; optional: Assets, Contacts, Loans (Schnellaktion „Leihgerät reservieren"), AI-Chat (für KI-Vorschläge)</div>
<?= $modHead('maintenance', 'Wartungskalender') ?>
<p>Monatskalender für geplante Wartungsfenster, ergänzt um automatisch eingeblendete Ablauf-/Fälligkeitstermine aus anderen Modulen (SSL-Zertifikate, Asset-Garantien, Vertragsenden + Kündigungsfristen, Lizenzabläufe, geplante Changes – jeweils nur lesend). Manuelle Termine mit Kategorie und optionalem Schalter „Auf öffentlicher Statusseite anzeigen". Die Kategorien sind im Backend pflegbar (Administration → Terminkategorien): Neben den mitgelieferten (Wartung, Überprüfung, Erneuerung, Sonstiges) lassen sich eigene mit eigener Farbe anlegen – etwa Urlaub oder Schulung. Abschalten nimmt eine Kategorie aus der Auswahl, ohne vorhandene Termine zu verändern. Termine lassen sich als Serie anlegen – mit Intervall (täglich, wöchentlich, monatlich, vierteljährlich, jährlich, jeweils auch „jedes N-te") und optionalem Serienende; das Löschen einer Serie entfernt alle zugehörigen Termine. Auf dem Smartphone werden die Ereignisse des Monats als antippbare Terminliste statt als Kalender-Raster angezeigt.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine zwingend; blendet Termine aus SSL, Assets, Contracts, Licenses und ConfigLog ein (sofern aktiv)</div>
<?= $modHead('deadlines', 'Fristen-Cockpit') ?>
<p>Modulübergreifende Übersicht aller anstehenden Termine und Fristen an einer Stelle (Frontend, Bereich Werkzeuge): SSL-Zertifikate, Verträge & Kündigungsfristen, Lizenzen, Asset-Garantien, Leihgeräte-Rückgaben, Wartungstermine, ISMS-Reviews und geplante Changes – mit direkten Links zum jeweiligen Eintrag. Filter nach Zeitraum (7/30/90 Tage, 1 Jahr) und Bereich, Schalter „Überfällige ausblenden" (pro Benutzer gemerkt) sowie Kennzahlen (überfällig / ≤ 7 / ≤ 30 Tage / später). Jeder Nutzer sieht nur Fristen aus Modulen, auf die er Lese-Zugriff hat. Optionaler wöchentlicher <strong>Fristen-Digest</strong> per E-Mail an frei wählbare Empfänger (Versandtag/Zeitraum/Empfänger im Backend, standardmäßig deaktiviert).</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> zeigt Fristen aus den jeweils aktiven Modulen; Digest-Versand: E-Mail + Scheduler. Cockpit <code>/deadlines</code>, Digest <code>/admin/deadlines/settings</code>, Berechtigung <code>view_deadlines</code></div>
<!-- 3.3 Netzwerk & Infrastruktur -->
<h3 style="page-break-before:always;">4.3 Netzwerk & Infrastruktur</h3>
<?= $modHead('backup', 'Backup-Übersicht') ?>
<p>Schreibgeschützte Übersicht über Backup-Jobs aus <strong>Veeam Backup & Replication</strong> und <strong>Proxmox Backup Server (PBS)</strong>: Status, Laufzeit, Datenmenge. Mehrere Backup-Server parallel anbindbar (<code>/admin/backup/servers</code>), automatischer Abgleich per Cron (<code>backup_sync</code>). Standardmäßig deaktiviert.</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Modul aktivieren (Admin → Einstellungen → Module).</li>
<li>Unter <code>/admin/backup/servers</code> Server anlegen: Typ Veeam (Port 9419, Benutzer/Passwort, VBR-Version) oder Proxmox PBS (Port 8007, API-Token <code>user@realm!name</code>+Secret oder Benutzer/Passwort, Node-Name).</li>
<li>Server-URL eintragen, „Verbindung testen", speichern. Abgleich per Cron <code>backup_sync</code>.</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Veeam Backup & Replication oder Proxmox Backup Server (extern)</div>
<?= $modHead('ipam', 'IP-Adressmanagement (IPAM)') ?>
<p>Verwaltung von IP-Netzwerken, Subnetzen, IP-Adressen und VLANs. VLAN-Sync zum UniFi-Controller möglich; Ping-/Verfügbarkeitsstatus.</p>
<p><strong>Netzwerk-Scan:</strong> Zwei Wege. (1) <em>Scan-Knopf</em> in der Subnetz-Ansicht: Der Webserver scannt das Subnetz und erfasst Hostname, Antwortzeit, OS-Vermutung, offene Ports, HTTP-/SSH-Banner, MAC (direkt angeschlossene Netze) und Gerätetyp-Vermutung; Import legt neue IPs an und aktualisiert bestehende. (2) <em>Remote-Scan-Agent</em> (<code>/admin/ipam-scan-agent</code>) für Netze, die der Webserver nicht erreicht – als Linux-Script (Bash, Cron) oder Windows-Script (PowerShell, Aufgabenplanung), mit zusätzlicher SNMP-/NetBIOS-Erkennung. Beide Wege schlagen ein <strong>Gateway</strong> pro Subnetz vor („Scan-Vorschlag" mit „Übernehmen"-Knopf); ein manuell gepflegtes Gateway wird nie überschrieben.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: UniFi (VLAN-Sync)</div>
<?= $modHead('dns', 'DNS-Zonen') ?>
<p>Importiert DNS-Zonen ueber einen Agenten (Scope <code>dns_import</code>) und zeigt Zonen sowie Records (A/AAAA/CNAME/MX/TXT/SRV/PTR/NS/SOA) mit globaler Suche. Angebunden sind Windows-DNS (PowerShell), BIND und PowerDNS (je ein Python-3-Agent) – alle liefern an denselben Endpunkt, die Herkunft steht an der Zone. Jeder Import haelt fest, was sich gegenueber dem letzten Stand geaendert hat (Aenderungsverlauf je Zone, Aufbewahrung einstellbar). Bei aktivem IPAM-Modul stellt <code>/dns/ipam-check</code> DNS und IP-Verwaltung gegenueber. Einrichtung unter <code>/admin/dns-agent</code>. Standardmaessig deaktiviert.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> DNS-Server + Agent (extern); optional IPAM-Modul fuer den Abgleich</div>
<?= $modHead('monitoring', 'Monitoring') ?>
<p>Integration mit Zabbix-Monitoring: Anzeige aktueller Probleme, Webhook-Eingang, Verlinkung von Hosts zu Dokumentationsseiten.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Zabbix-Server (extern), Konfiguration unter /admin/monitoring/settings</div>
<?= $modHead('netdiagram', 'Netzwerkpläne') ?>
<p>Erstellung und Verwaltung von Netzwerk-, Topologie- und Infrastrukturplänen mit einem selbst gehosteten draw.io-Editor. Plan-Übersicht als Kachel-Grid mit automatisch erzeugter SVG-Vorschau; Import von <code>.drawio</code>/<code>.xml</code>, Umbenennen, Löschen; eigene Gerätetypen pflegbar. draw.io wird über den Admin-Bereich installiert/aktualisiert.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> draw.io-Installation (über /admin/netdiagram/drawio)</div>
<?= $modHead('ssl', 'SSL-Zertifikate') ?>
<p>Überwachung von TLS-Endpunkten (direktes TLS sowie STARTTLS für SMTP/IMAP/POP3) auf Ablauf und Sicherheit. Das Zertifikat wird ausgelesen und als Schulnote (A/B/C/F) bewertet (Vertrauenskette, Hostname, TLS-Version, Schlüsselstärke, Restlaufzeit); KPI-Kacheln, Status- und Sicherheits-Pills, Detailseite mit Prüf-Verlauf. Prüfung einzeln, „Alle prüfen" oder automatisch per Cron mit Ablauf-Erinnerungen.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Netzwerkzugriff auf die zu prüfenden Hosts; E-Mail-Versand für Erinnerungen</div>
<?= $modHead('unifi', 'UniFi-Integration') ?>
<p>Integration mit Ubiquiti UniFi Controller: Geräte, Netzwerke und Clients (Auto-Sync per Cron <code>unifi_sync</code>), Topologie mit Filtern, Gäste-Voucher (anlegen/löschen/drucken), Inventar-Anlage aus UniFi sowie VLAN-/IPAM-Sync. Standardmäßig deaktiviert.</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Unter <code>/admin/settings/unifi</code> Controller-URL (inkl. Port), Typ (UniFi OS 11443 oder Legacy 8443), Benutzer/Passwort eintragen.</li>
<li>„Verbindung testen" (listet Sites), speichern – Modul aktiviert sich automatisch.</li>
<li>Auto-Sync per Cron <code>unifi_sync</code>; Voucher und Inventar-Abgleich im Modul (<code>/unifi</code>).</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> UniFi Network Controller (extern); optional: IPAM, Inventar</div>
<?= $modHead('vms', 'Virtualisierung') ?>
<p>Inventarisierung virtueller Maschinen, physischer Hosts und Cluster mit Auslastungs-Kennzahlen. VMs lassen sich manuell pflegen oder ueber Hypervisor-APIs einlesen (Proxmox VE, VMware vSphere/ESXi, Microsoft Hyper-V, KVM/QEMU, Xen/XCP-ng). Im Hypervisor entfernte VMs werden als „nicht mehr gefunden“ gekennzeichnet und lassen sich unter <code>/vms/missing</code> gesammelt aufraeumen – geloescht wird nichts von selbst. Snapshots je VM (Proxmox, Hyper-V) mit Warnung ab einer einstellbaren Zahl von Tagen, die einzelnen Speicherorte je Host (Proxmox, VMware, Hyper-V) mit Belegung, sowie Gastinformationen aus den Gast-Tools. Verbindungstest und manueller Sync je Host; IPs wandern automatisch ins IPAM. Einrichtung unter <code>/admin/vms/hypervisor</code>.</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Modul aktivieren; Host anlegen unter <code>/vms/hosts/create</code> (Typ Proxmox/VMware/Hyper-V/KVM/Xen).</li>
<li>Am Host „Sync-Einstellungen" (<code>/admin/vms/hosts/{id}/sync-settings</code>): API-URL, Benutzer/Passwort oder API-Token, Node-ID, SSL.</li>
<li>Speichern, „Verbindung testen", „Jetzt synchronisieren" (Sync wird manuell ausgelöst – kein automatischer Cron; jeder Lauf wird im Sync-Verlauf protokolliert). Übersicht: <code>/admin/vms/hypervisor</code>.</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> mindestens ein Hypervisor (Proxmox, VMware, Hyper-V, KVM/QEMU oder Xen, extern); optional: IPAM</div>
<!-- 3.4 Organisation & Kommunikation -->
<h3 style="page-break-before:always;">4.4 Organisation & Kommunikation</h3>
<?= $modHead('contacts', 'Kontakte & Unternehmen') ?>
<p>Adressbuch für externe Firmen und ihre Ansprechpartner (Karten-/Listenansicht, Suche, Sortierung). Dynamische Kontaktkanäle (Telefon/E-Mail/Website als klickbare Chips), Bild-Upload (EXIF-Strip), Papierkorb (Soft-Delete mit Wiederherstellen/endgültig löschen) sowie Import/Export per CSV und vCard. Wird als Ansprechpartner-/Lieferanten-Referenz in Tickets, Verträgen, Inventar und Seiten genutzt.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Wird von Tickets, Contracts, Inventar und Seiten genutzt</div>
<?= $modHead('phonebook', 'Telefonbuch') ?>
<p>Internes Telefonbuch für Mitarbeiter und Abteilungen. Synchronisierbar mit dem internen Verzeichnis (Active Directory). Manuell angelegte Einträge lassen sich direkt in der Übersicht bearbeiten und löschen (Berechtigung „Telefonbuch verwalten"); synchronisierte Einträge bleiben unverändert.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: Verzeichnis & Personen (AD-Sync)</div>
<?= $modHead('contracts', 'Vertragsmanagement') ?>
<p>Verwaltung aller IT-Verträge mit Dateianhängen, Laufzeiten, Verlängerungsoptionen und automatischen Fälligkeitsbenachrichtigungen (vor Beginn der Kündigungsfrist). <strong>Automatische Verlängerung:</strong> Läuft die Kündigungsfrist ohne Kündigung ab, rollen Enddatum und Termine um die Verlängerungsdauer nach vorn (Feld „Verlängerung um (Monate)", Standard 12) und der Status geht zurück auf „Aktiv". In der Liste werden die Kosten – unabhängig vom Intervall (monatlich/quartalsweise/jährlich/einmalig) – einheitlich als Betrag pro Monat angezeigt, mit der tatsächlichen Zahlweise als Zusatzzeile.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional: Contacts, Licenses</div>
<?= $modHead('workflows', 'Anträge & Genehmigungen') ?>
<p>Modularer Baukasten für Genehmigungsprozesse (Mobiles Arbeiten, Software-Einführung, Onboarding, Offboarding, Employee Change). Eine Engine, beliebig viele <strong>Vorlagen</strong> (Felder + Stationen + Genehmiger-Regeln, gepflegt unter <code>/admin/workflows</code>). Ein <strong>Antrag</strong> erhält beim Start eine eingefrorene Kopie der Vorlage und läuft durch sequenzielle Stufen (innerhalb parallel) mit Regeln „einer reicht / N von M / alle". Genehmiger werden über eine Fallback-Kette ermittelt (fester Nutzer, Capability, Abteilung, Vorgesetzter – ohne Konto automatisch als externe Magic-Link-Einladung – oder externe E-Mail per Magic-Link unter <code>/approval/{token}</code>, ohne Login). Formulare unterstützen Abschnitte, bedingte Sichtbarkeit und Validierung. Aufgaben-Stationen erzeugen Tickets/Kanban-Aufgaben und schließen sich, sobald diese erledigt sind. Mit wertbasierter Verzweigung, Funktionstrennung (4-Augen), Kommentar-Thread, Ad-hoc-Weiterleitung, Auto-Eskalation an Vorgesetzte, Sammelaktionen, neuen Feldtypen (Betrag/Lookup/Liste) mit Auto-Vorbelegung, persönlichen Webhooks je Nutzer, Rückfrage, Entwurf, Korrigieren & erneut einreichen, Stellvertretung, Fristen/Eskalation, Verwaltungs-Übersicht mit Kennzahlen und CSV-Export, duplizierbaren Vorlagen, PDF-Nachweis sowie Anonymisierung und DSGVO-Betroffenenauskunft. Standardmäßig deaktiviert. Berechtigungen <code>view_workflows</code>, <code>manage_workflows</code>.</p>
<p><strong>Einrichtung:</strong> 1) Modul unter <em>Einstellungen → Module</em> aktivieren. 2) Berechtigungen vergeben: <code>view_workflows</code> (Nutzung; jede Rolle automatisch) und <code>manage_workflows</code> (Verwaltung; einer Rolle unter <em>Rollen & Berechtigungen</em> zuweisen, globale Admins automatisch). 3) Vorlage unter <code>/admin/workflows</code> anlegen, Felder & Stationen ergänzen, dann aktivieren. Für das Resolver-Verfahren „Capability" eine eigene Berechtigung (z. B. <code>approve_it_requests</code>) einer Rolle zuweisen und in der Station als Genehmiger-Wert eintragen; „Genehmigen" selbst braucht keine eigene Capability.</p>
<p><strong>Schnittstelle:</strong> Portal-/REST-API mit Scope <code>workflows</code> – offene Genehmigungen (<code>GET /api/ex/my-approvals</code>), eigene Anträge (<code>GET /api/ex/my-requests</code>) und Entscheidungen (<code>POST /api/ex/approvals/{id}/decide</code>); Doku unter <code>/admin/api</code>.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional Tickets/Kanban (Fulfillment), Verzeichnis-Sync (Vorgesetzter), E-Mail-Versand (extern/Erinnerungen). Scheduler: <code>workflow_escalation</code>, <code>workflow_anonymization</code></div>
<?= $modHead('statuspage', 'Statusseite') ?>
<p>Öffentliche, ohne Anmeldung erreichbare Statusseite (<code>/status</code>, iframe-fähig über <code>/status/embed</code>) für den Betriebsstatus der IT-Dienste, Störungsmeldungen mit Verlaufs-Updates und geplante Wartungen. Dienste mit vier Status-Stufen, optionaler Gruppierung und optionalem 90-Tage-Uptime-Verlauf. Gepflegt unter <code>/status/manage</code>, Darstellung unter <code>/admin/statuspage/settings</code> (Berechtigung <code>manage_statuspage</code>). Standardmäßig deaktiviert.</p>
<p>Optionale Kopplung an Wartungskalender und Konfigurationslog (je bei aktivem Modul): anstehende Wartungen bzw. freigegebene geplante Änderungen erscheinen automatisch (max. 10 Tage im Voraus, ohne Doppelungen) als geplante Wartung. Ein geplanter Konfigurationslog-Eintrag kann zudem einen Dienst während der Maßnahme (ab geplanter Uhrzeit für 8 Stunden) auf einen Status schalten und nach „Erledigt" automatisch wieder freigeben.</p>
<p><strong>Besucher benachrichtigen</strong> (optional, standardmäßig aus): Besucher tragen ihre E-Mail-Adresse ein und erhalten je Vorfall zwei Nachrichten – beim Melden und beim Beheben. Eine Adresse gilt erst nach dem Klick im Bestätigungsschreiben; unbestätigte Eintragungen werden nach sieben Tagen verworfen, jede Nachricht enthält einen Abmeldelink. Der Versand läuft über die Zeitsteuerung (Aufgabe <code>status_notify</code>).</p>
<p><strong>Störungen aus dem Monitoring</strong> (optional, bei aktivem Monitoring-Modul): Offene Alarme ab einem einstellbaren Schweregrad erscheinen in der Verwaltung als Vorschlag. Übernehmen füllt den Melden-Dialog vor; betroffene Dienste und Wortlaut bleiben eine Entscheidung. Verworfene Vorschläge kehren nicht zurück.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine (Logo/Name aus den App-Einstellungen); optional: Monitoring (Störungsvorschläge), Scheduler + E-Mail (Besucher-Benachrichtigungen)</div>
<!-- 3.5 Sicherheit & Nachvollziehbarkeit -->
<h3 style="page-break-before:always;">4.5 Sicherheit & Nachvollziehbarkeit</h3>
<?= $modHead('isms', 'Informationssicherheit (ISMS)') ?>
<p>ISMS nach ISO/IEC 27001:2022: Risikoregister (5×5-Bewertung, inhärentes Risiko & Restrisiko, Wiedervorlage), Maßnahmenplan mit vier Behandlungsoptionen, Risikomatrix & Risiko-Trend sowie Annex-A-Controlkatalog (93 Controls) mit Statement of Applicability. Risiken lassen sich mit Assets, CVE-Meldungen und Verträgen verknüpfen; dazu Risikoakzeptanz-Nachweis und Management-Review. Export (Risiken/SoA als CSV, Bericht als PDF), CSV-Import und Automatisierungen (CVE-Risikovorschläge, Wiedervorlage, Gesundheitscheck, Monatsbericht). Berechtigungen <code>view_isms</code>/<code>manage_isms</code>. Standardmäßig deaktiviert.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional Assets, CVE, Verträge, Dokumentation; Scheduler für die Automatisierungen</div>
<?= $modHead('cve', 'CVE-Sicherheitsmeldungen') ?>
<p>Überwachung relevanter CVEs für konfigurierte Produkte. Automatischer Abruf per Cron, CVSS-Score-Anzeige, Status-Tracking und Benachrichtigungen bei kritischen Einträgen.</p>
<p><strong>Betroffene Geräte</strong> (bei aktivem Software-Inventar): Einem erfassten Programm lässt sich seine CPE-Kennung der NVD hinterlegen (<code>hersteller:produkt</code>, z. B. <code>adobe:acrobat_reader</code>); Vorschläge kommen aus den bereits abgerufenen Meldungen. Danach steht am Programm, welche Meldungen es betreffen – und damit, welche Geräte. Zugeordnet wird je Programm, nicht je Meldung: einmal hinterlegt, trifft jede neue Meldung automatisch die richtigen Geräte. Ohne Kennung bleibt es bei der Stichwortsuche.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Internetzugang, Cron-Job; optional: Software-Inventar (betroffene Geräte)</div>
<?= $modHead('xdr', 'XDR-Sicherheitswarnungen') ?>
<p>Zentrales Board für Sicherheitswarnungen aus XDR-/EDR-Plattformen, unabhängig von einer Asset-Zuordnung. Angebunden sind <strong>Trend Vision One</strong> und <strong>Microsoft Defender XDR</strong> – wahlweise einzeln oder gemeinsam im selben Board. Automatische Zuordnung über Endpoint-GUID, Hostname oder MAC; getrennter Anbieter-/Triage-Status; Benachrichtigung bei kritischen sowie nicht zuordenbaren Warnungen; optional Ticket-Erstellung. Regeln unter <code>/admin/xdr/rules</code> behandeln neu eingehende Warnungen nach Muster automatisch: verwerfen, einer Person zuweisen oder in ein Ticket überführen. Einrichtung unter <code>/admin/xdr/settings</code> – Trend Vision One mit Region und API-Key (<em>Administration → API Keys</em>), Defender mit App-Registrierung in Entra ID und der Anwendungsberechtigung <code>SecurityAlert.Read.All</code>. Alle Zugangsdaten werden verschlüsselt gespeichert. Abgleich per Cron <code>xdr_sync</code>, Aufräumen per <code>xdr_prune</code>.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> XDR-/EDR-Plattform (extern: Trend Vision One und/oder Microsoft Defender XDR), Cron-Job; optional Tickets-Modul</div>
<?= $modHead('configlog', 'Konfigurationslog') ?>
<p>Protokoll aller Konfigurationsänderungen an IT-Systemen (Router, Switches, Server) mit Dashboard, geplanten Änderungen samt Fälligkeits-Erinnerung (Cron <code>configlog_due_reminder</code>), Verknüpfung mit Assets/Tickets/VMs und CSV-Export. Bei aktivem Statusseite-Modul lässt sich eine geplante Änderung öffentlich als Wartung anzeigen und ein betroffener Dienst hinterlegen, der während der Maßnahme automatisch umgeschaltet wird.</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> optional Assets, Tickets, VMs (Verknüpfung), Statusseite</div>
<?= $modHead('vault', 'Passwort-Tresor') ?>
<p>Verschlüsselter Passwort-Tresor (AES-256-GCM) für persönliche und Team-Zugangsdaten. Chrome-Extension-API für Browser-Autofill vorhanden. Automatische Leerlauf-Sperre nach 15 Minuten ohne Tresor-Aktivität – clientseitig und zusätzlich serverseitig erzwungen (greift auch bei Hintergrund-Tabs/Standby).</p>
<div class="dep-box"><strong>Abhängigkeiten:</strong> APP_KEY in der Konfiguration (32-Zeichen-Verschlüsselungsschlüssel)</div>
<!-- 3.6 Dokumentation & KI -->
<h3 style="page-break-before:always;">4.6 Dokumentation & KI</h3>
<?= $modHead('files', 'Datei-Explorer') ?>
<p>Vollwertiger Dateimanager mit Ordnerstruktur, Listen-/Kachelansicht und Thumbnails. Funktionen: Datei-Versionierung (Verlauf, Wiederherstellen), Papierkorb mit Soft-Delete und automatischer Bereinigung per Cron, ordnerbasierte Berechtigungen (ACL: Ansehen/Hochladen/Verwalten für Benutzer und Rollen, mit Vererbung), Drag-&-Drop-Verschieben, Inline-Vorschau für Bilder/PDFs, ZIP-Download (Ordner und Mehrfachauswahl), chunked/resumable Upload, geteilte öffentliche Links (optional mit Passwort/Ablauf), Zugriffs-Report je Datei sowie optionaler Virenscan via ClamAV.</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Modul aktivieren; im Explorer (<code>/files</code>) Ordner anlegen und je Ordner ACL vergeben (Ansehen/Hochladen/Verwalten, vererbbar; Berechtigung <code>manage_file_folders</code>).</li>
<li>Unter <code>/admin/files</code> Papierkorb-Aufbewahrung (Tage) setzen (Cron <code>file_trash_purge</code>).</li>
<li>Optional Virenscan: aktivieren, clamd-Socket (<code>tcp://127.0.0.1:3310</code>), Fehlerverhalten, „Verbindung testen".</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> keine; optional ClamAV (<code>clamd</code>) für den Virenscan. Verwaltung: /admin/files</div>
<?= $modHead('ai_chat', 'KI-Chat') ?>
<p>Integrierter KI-Assistent (Anthropic, OpenAI, DeepSeek oder OpenAI-kompatibel) für kontextbezogene Antworten aus Dokumentation, Tickets und Stammdaten – als Vollbild-Seite (<code>/assistant</code>) oder Chat-Panel. Funktionen: semantische Doku-Suche über Embeddings (Cron <code>ai_embedding_index</code>), Aktions-Registry mit Berechtigungsprüfung und Dry-Run-Vorschau, Datenschutz-/Anonymisierungs-Modus, Dokument-ACL, Kosten-Budget sowie Nutzungs-/Feedback-Auswertung. Optionaler Website-Bot über das WordPress-Plugin (abgesicherte API <code>POST /api/ex/assistant</code>).</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Modul aktivieren; unter <code>/admin/settings/ai-chat</code> Anbieter wählen (OpenAI/Anthropic/DeepSeek/OpenAI-kompatibel) und API-Key (bzw. Server-URL) eintragen.</li>
<li>Funktionen freischalten, Modell wählen, „Verbindung testen".</li>
<li>Datenschutz-Modus & Budget setzen; optional semantische Suche aktivieren und „Seiten jetzt indizieren" (Cron <code>ai_embedding_index</code>); optional Website-Bot aktivieren.</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> API-Schlüssel eines KI-Anbieters; nutzt Tickets, Seiten & Stammdaten als Kontext</div>
<?= $modHead('api_auto', 'API-Auto') ?>
<p><strong>Standardmäßig deaktiviert.</strong> Bindet externe REST-APIs ohne eigenen Code an: Der Nutzer beschreibt das Ziel in natürlicher Sprache, lädt oder ermittelt die API-Spezifikation, und die KI (Anthropic/Claude) leitet daraus eine deklarative Zuordnung ab. Eine feste Engine ruft die Daten ab und befüllt vorhandene Module über eine Whitelist (Assets, Unternehmen, Kontakte, Verzeichnis, IPAM, Lizenzen, Monitoring, SSL, Lager, Tickets). Funktionen: Spec-Discovery, optionale Web-Suche, inkrementeller Sync, Pagination, Limits, Wert-Transformationen, Umgang mit Löschungen, Test/Duplizieren, Vorschau, Kostenerfassung und Fehler-E-Mail.</p>
<div class="setup-box"><div class="setup-title">Einrichtung</div><ol>
<li>Voraussetzung: KI-Chat mit Anbieter Anthropic eingerichtet; Modul <code>api_auto</code> aktivieren.</li>
<li>Verbindung anlegen (<code>/admin/api-auto/new</code>): Richtung, API-Beschreibung/URL oder Spec-Upload, Intent.</li>
<li>„KI analysieren lassen" → Auth ergänzen (auch Login/Token-Exchange) → „Übernehmen & bereitstellen" → „Verbindung testen" → „Vorschau (Dry-Run)" (Pflicht) → „Jetzt ausführen". Optional Zeitplan (Cron <code>api_auto_dispatch</code>).</li>
</ol></div>
<div class="dep-box"><strong>Abhängigkeiten:</strong> Anthropic-API (KI-Integration); externe Ziel-API. Backend-Oberfläche: /admin/api-auto, Status: /admin/settings/api-auto, Web-Suche unter /admin/settings/ai-chat</div>
<!-- 4. Modulabhängigkeiten -->
<h2 style="page-break-before:always;">5. Modulabhängigkeiten</h2>
<table>
<thead><tr><th scope="col">Modul</th><th scope="col">Benötigt / genutzt von</th><th scope="col">Art der Abhängigkeit</th></tr></thead>
<tbody>
<tr><td>Contacts</td><td>Tickets, Contracts, Seiten</td><td>Verlinkung als Ansprechpartner / Vertragspartner</td></tr>
<tr><td>Assets</td><td>Loans, Stock, Tickets</td><td>Loan-Geräte und Lagerartikel referenzieren Asset-Typen; Tickets verknüpfen Assets</td></tr>
<tr><td>Contracts</td><td>Licenses</td><td>Lizenzen können einem Vertrag zugeordnet werden</td></tr>
<tr><td>Locations (Stammdaten)</td><td>Assets, Tickets, IPAM</td><td>Standorte in Assets, Tickets und Netzwerksegmenten</td></tr>
<tr><td>IPAM</td><td>UniFi</td><td>VLAN-Sync zum UniFi-Controller</td></tr>
<tr><td>VMs</td><td>Monitoring, Backup</td><td>Status aus Zabbix und Veeam</td></tr>
<tr><td>Licenses</td><td>Microsoft 365 / Entra ID</td><td>Lizenzsync über die Graph API</td></tr>
<tr><td>AI Chat</td><td>Tickets, Seiten</td><td>Kontext für KI-Antworten</td></tr>
<tr><td>Directory / Personen</td><td>Phonebook, Seiten, Asset-Übergabe</td><td>AD-Sync-Personen als Ansprechpartner</td></tr>
<tr><td>Budget</td><td>Orders</td><td>Bestellungen optional Budgetpositionen zugeordnet</td></tr>
<tr><td>E-Mail-Versand</td><td>Tickets, Loans, Contracts, Notifications, SSL, CVE</td><td>Alle Benachrichtigungs-E-Mails (SMTP-Passwort oder OAuth)</td></tr>
</tbody>
</table>
<div class="info-box">Externe Dienste (Zabbix, Veeam, UniFi, Entra ID, Google Workspace) müssen separat betrieben und deren Zugangsdaten hinterlegt werden. Die Module zeigen nur Daten an – sie steuern externe Systeme nicht.</div>
<!-- 5. Administrationsbereiche -->
<h2 style="page-break-before:always;">6. Anwendungsszenarien (modulübergreifend)</h2>
<p>Durchgängige Abläufe, die das Zusammenspiel mehrerer Module zeigen (nur tatsächlich vorhandene Funktionen).</p>
<ul>
<li><strong>Beschaffung → Inventar:</strong> Ticket (Bedarf) → Schnellaktion „Bestellung aus Ticket" → Bestellboard pflegen → ab „Eingetroffen" als Inventar-Geräte übernehmen → Übergabe mit Unterschrift. <em>(Tickets · Bestellboard · Inventar · Budget)</em></li>
<li><strong>Verträge & Lizenzen fristgerecht steuern:</strong> Verträge/Lizenzen mit Ablauf pflegen → erscheinen automatisch im Wartungskalender und Fristen-Cockpit → wöchentlicher Digest → Auto-Verlängerung ohne Kündigung. <em>(Verträge · Lizenzen · Wartung · Fristen-Cockpit)</em></li>
<li><strong>Sicherheitswarnung bis Nachweis:</strong> Monitoring-/XDR-/CVE-Alarm → optional automatisch Ticket → Maßnahme im Konfigurationslog → Risiko im ISMS ableiten → alles revisionssicher im Audit-Log. <em>(Monitoring/XDR/CVE · Tickets · ConfigLog · ISMS · Audit)</em></li>
<li><strong>Onboarding/Offboarding als Antrag:</strong> Workflow-Antrag → Genehmigungen → Aufgaben-Stationen erzeugen Tickets/Kanban → Geräteausgabe (Leihgeräte/Inventar), Vault-Zugänge → beim Offboarding rückwärts; DSGVO-Anonymisierung nach Frist. <em>(Workflows · Tickets/Kanban · Leihgeräte/Inventar · Vault · Lizenzen)</em></li>
<li><strong>Geplante Wartung kommunizieren:</strong> Eintrag im Konfigurationslog/Wartungskalender als öffentlich markieren → erscheint auf der Statusseite → Dienst während der Maßnahme herabgestuft, nach „Erledigt" automatisch freigegeben. <em>(ConfigLog/Wartung · Statusseite)</em></li>
</ul>
<h2 style="page-break-before:always;">7. Administrationsbereiche</h2>
<p>Der Administrationsbereich (<code>/admin</code>) ist nur für Benutzer mit entsprechenden Berechtigungen zugänglich.</p>
<table>
<thead><tr><th scope="col">Bereich</th><th scope="col">URL</th><th scope="col">Funktion</th></tr></thead>
<tbody>
<tr><td>Dashboard</td><td>/admin</td><td>Übersicht: Benutzer, Seiten, fällige Reviews, Aktivitäten, Systemstatus</td></tr>
<tr><td>Statistiken</td><td>/admin/statistics</td><td>Inhalte, Benutzeraktivität, Modulnutzung</td></tr>
<tr><td>System-Health</td><td>/admin/system-health</td><td>DB, Dateisystem, Schreibrechte, Verschlüsselung, E-Mail/OAuth (Live-Token-Check)</td></tr>
<tr><td>Benutzer / Rollen</td><td>/admin/users, /admin/roles, /admin/permissions</td><td>Benutzer, Rollen und Berechtigungsmatrix (RBAC)</td></tr>
<tr><td>Stammdaten</td><td>/admin/locations, /admin/directory</td><td>Standorte; Verzeichnis & Personen (AD/LDAP-Sync)</td></tr>
<tr><td>Kommunikation & Inhalte</td><td>/admin/email, /admin/notifications, /admin/tickets/templates, /admin/tickets/canned-responses, /admin/page-templates, /admin/tags, /admin/archived-pages</td><td>E-Mail-/Benachrichtigungs-/Antwort-/Seitenvorlagen, Tags, archivierte Seiten</td></tr>
<tr><td>Ticketsystem</td><td>/admin/tickets/settings, /categories, /stats, /csat, /mail-queue, /service-reports</td><td>E-Mail-Eingang/-Versand, Features & SLA, Kategorien, Statistiken, CSAT, Mail-Queue, Leistungsnachweise aus der Zeiterfassung</td></tr>
<tr><td>Inventar</td><td>/admin/assets/categories, /manufacturers, /admin/inventory/sync, /unmatched-devices, /import/glpi, /admin/inventory/relution, /admin/inventory/intune, /admin/assets/handover-settings, /admin/settings/dell, /hp, /label-print</td><td>Kategorien, Hersteller, Sync, Importe (GLPI, Relution, Intune), Übergabe, Garantie-APIs, Etiketten</td></tr>
<tr><td>Externe Integrationen</td><td>/admin/monitoring/settings, /admin/backup/servers, /admin/settings/unifi, /admin/vms/hypervisor, /admin/ipam-scan-agent, /admin/licenses/sync, /admin/settings/ai-chat, /admin/settings/api-auto, /admin/api</td><td>Zabbix, Backup (Veeam/PBS), UniFi, Hypervisor (Proxmox/VMware/Hyper-V/KVM/Xen), IPAM-Scan-Agent, M365-Lizenzsync, KI, API-Auto, API-Token</td></tr>
<tr><td>Editor & Diagramme</td><td>/admin/netdiagram/drawio, /admin/tinymce</td><td>draw.io- und TinyMCE-Installation/-Update</td></tr>
<tr><td>System</td><td>/admin/cronjobs, /admin/logs, /admin/image-optimization, /admin/settings/signature, /admin/update, /admin/audit, /admin/compliance</td><td>Scheduler, Log-Viewer, Bild-Optimierung, Signatur-Tablet (IP-Freigabe), System-Update (inkl. Changelog-Anzeige, Composer-Update aus dem Backend und Datenbank-Migrationen), Audit-Log, Audit-/Compliance-Bericht (ISO/BSI/DSGVO/GoBD)</td></tr>
</tbody>
</table>
<!-- 6. Systemeinstellungen -->
<h2 style="page-break-before:always;">8. Systemeinstellungen</h2>
<h3>Allgemeine Einstellungen (/admin/settings)</h3>
<table>
<thead><tr><th scope="col">Einstellung</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>Anwendungsname</td><td>Anzeigename in Oberfläche und E-Mails (Standard: „OpenNIT")</td></tr>
<tr><td>Logo / Favicon / Login-Hintergrund</td><td>Eigene Grafiken für Marke und Anmeldeseite</td></tr>
<tr><td>Anwendungs-URL</td><td>Öffentliche Basis-URL (QR-Codes, E-Mail-Links, OAuth-Redirect-URIs)</td></tr>
<tr><td>Zeitzone / Review-Intervall</td><td>Systemzeitzone und Standard-Prüfintervall für Seiten</td></tr>
<tr><td>Währung & Zahlenformat</td><td>Gilt für die gesamte Installation: Währungscode, Zeichen und dessen Stellung sowie die Trennzeichen für Dezimal- und Tausenderstellen. Wirkt überall, wo Beträge erscheinen oder eingegeben werden, ebenso in PDF- und CSV-Ausgaben. Umgerechnet wird nichts – die Einstellung sagt nur, wie ein gespeicherter Betrag zu lesen und zu schreiben ist</td></tr>
<tr><td>Sprache der Oberfläche</td><td>Vorgabe für alle Benutzer (Deutsch/Englisch); jede Person kann im Benutzermenü davon abweichen. Übersetzt sind Seitenrahmen, Anmeldung, Fehlerseiten und Dashboard; die Modulseiten folgen</td></tr>
<tr><td>Lokaler Login / Flash / Icon-Stil</td><td>Lokale Anmeldung, Einblend-Meldungen, Icon-Umschaltung Font Awesome ↔ Emoji (wirkt im gesamten Frontend; Standard Font Awesome)</td></tr>
<tr><td>Tab „Sicherheit"</td><td>Eigener Tab (<code>/admin/settings/security</code>): Sitzungen & Limits (Session-/CSRF-Lebensdauer, Rate-Limit, max. Upload), Anmeldesicherheit (Passwort-Richtlinie, Account-Lockout, MFA-Erzwingung) sowie Audit-Log & SIEM (Aufbewahrung/Purge, SIEM-Weiterleitung, Integritätsprüfung) — gespeichert in <code>config/runtime.php</code></td></tr>
<tr><td>Tab „Anmeldung"</td><td>Microsoft 365, Keycloak und Active Directory Login unter einem Tab mit Unter-Navigation</td></tr>
<tr><td>Module</td><td>Einzelne Module aktivieren/deaktivieren</td></tr>
</tbody>
</table>
<div class="info-box">Harte Sicherheits-Schalter (SESSION_SECURE, HSTS, CSP, Verschlüsselungsschlüssel) bleiben in <code>.env</code>/<code>config/security.php</code>.</div>
<h3>E-Mail-Einstellungen (/admin/settings/email)</h3>
<table>
<thead><tr><th scope="col">Einstellung</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>Verbindungsverfahren</td><td>SMTP mit Passwort, Microsoft 365 (Graph API, empfohlen), Microsoft 365 (SMTP/XOAUTH2) oder Google Workspace/Gmail (XOAUTH2)</td></tr>
<tr><td>SMTP-Host / Port / Verschlüsselung</td><td>Ausgehender Mailserver (587 STARTTLS, 465 SSL) – nur bei „SMTP mit Passwort"</td></tr>
<tr><td>SMTP-Benutzer / Passwort</td><td>Zugangsdaten für SMTP-Authentifizierung</td></tr>
<tr><td>OAuth: Anbieter / Tenant / Client-ID / Secret / Postfach</td><td>App-Registrierungsdaten; Secret-Ablaufdatum optional (Warnung 30 Tage vorher)</td></tr>
<tr><td>OAuth: „Verbinden"</td><td>Holt den Refresh-Token per Consent-Flow (delegiert)</td></tr>
<tr><td>Absenderadresse / Absendername</td><td>From-Adresse und Anzeigename für alle Systemmails</td></tr>
</tbody>
</table>
<p>Details siehe Abschnitt 7. Das Ticket-Postfach wird separat unter <em>/admin/tickets/settings</em> konfiguriert.</p>
<h3>Microsoft 365 / Azure AD SSO-Login (/admin/settings/m365)</h3>
<table>
<thead><tr><th scope="col">Einstellung</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>Tenant-ID</td><td>Azure AD / Entra ID Tenant-ID (für den OAuth2/PKCE-Login)</td></tr>
<tr><td>Client-ID / Client-Secret</td><td>App-Registrierung in Entra ID</td></tr>
<tr><td>Redirect-URI</td><td>Rückruf-URL (muss in Entra ID registriert sein)</td></tr>
</tbody>
</table>
<p>Betrifft ausschließlich die Benutzer-Anmeldung (SSO) – unabhängig vom E-Mail-Versand.</p>
<h3>Keycloak SSO (/admin/settings/keycloak)</h3>
<table>
<thead><tr><th scope="col">Einstellung</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>Keycloak URL / Realm</td><td>Basis-URL und Realm-Name des Keycloak-Servers</td></tr>
<tr><td>Client-ID / Client-Secret</td><td>Zugangsdaten der Keycloak-Client-Konfiguration</td></tr>
</tbody>
</table>
<h3>LDAP-Authentifizierung (/admin/settings/ldap-auth)</h3>
<table>
<thead><tr><th scope="col">Einstellung</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>LDAP-Server / Port</td><td>Hostname und Port (389 / 636 für LDAPS)</td></tr>
<tr><td>Bind-DN / Bind-Passwort</td><td>Service-Account für LDAP-Abfragen</td></tr>
<tr><td>Such-Basis (Base DN)</td><td>LDAP-Pfad für Benutzersuche</td></tr>
<tr><td>Benutzerfilter</td><td>LDAP-Filter zur Einschränkung berechtigter Benutzer</td></tr>
</tbody>
</table>
<h3>Progressive Web App (/admin/settings/pwa)</h3>
<table>
<thead><tr><th scope="col">Einstellung</th><th scope="col">Beschreibung</th></tr></thead>
<tbody>
<tr><td>Push-Benachrichtigungen</td><td>Browser-Push aktivieren (erfordert VAPID-Schlüsselpaar)</td></tr>
<tr><td>VAPID-Schlüssel</td><td>Werden automatisch generiert; öffentlicher Schlüssel für die Browser-Registrierung</td></tr>
</tbody>
</table>
<!-- 7. E-Mail-Versand & OAuth -->
<h2 style="page-break-before:always;">9. E-Mail-Versand & OAuth (Microsoft 365 / Google)</h2>
<p>Microsoft und Google haben die Basic-Authentifizierung (Passwort) für IMAP/SMTP abgekündigt. Für diese
Postfächer wird daher OAuth2 genutzt. Für <strong>Microsoft 365</strong> wählbar als <strong>Graph API</strong>
(empfohlen, Versand & Abruf über HTTPS) oder <strong>IMAP/SMTP mit XOAUTH2</strong>; für
<strong>Google Workspace (Gmail)</strong> über XOAUTH2 (<code>imap.gmail.com</code>/<code>smtp.gmail.com</code>).
Eingestellt wird das Verfahren für den globalen Versand unter <em>/admin/settings/email</em> und für das
Ticket-Postfach unter <em>/admin/tickets/settings</em>; im OAuth-Block wird der <strong>Anbieter</strong> umgeschaltet.</p>
<div class="info-box">
<strong>Microsoft 365:</strong> App-Registrierung in Entra ID mit Application-Berechtigungen
(<code>Mail.ReadWrite</code>/<code>Mail.Send</code> bzw. <code>IMAP.AccessAsApp</code>/<code>SMTP.SendAsApp</code>)
und Administrator-Consent; läuft App-only ohne interaktiven Login.
<strong>Google:</strong> OAuth-Client in der Google Cloud Console (Gmail-API, Scope <code>https://mail.google.com/</code>);
nur delegierter Refresh-Token-Flow.
</div>
<div class="info-box">
<strong>Delegiert verbinden:</strong> Der Refresh-Token wird per Klick auf „Verbinden" über den Consent-Flow geholt
(keine manuelle Eingabe). Die Redirect-URI <code>/admin/settings/mail-oauth/callback</code> muss in der
App-Registrierung bzw. Cloud Console hinterlegt sein.
<strong>Diagnose:</strong> Secret-Ablauf-Warnung (30 Tage vorher) und Live-Token-Check unter <em>/admin/system-health</em>.
Ausführliche Anleitungen: <code>docs/m365-oauth-email.md</code> und <code>docs/google-oauth-email.md</code>.
</div>
<!-- 8. Sicherheit -->
<h2 style="page-break-before:always;">10. Sicherheit & Compliance</h2>
<table>
<thead><tr><th scope="col">Merkmal</th><th scope="col">Konfiguration</th></tr></thead>
<tbody>
<tr><td>Session-Lebensdauer</td><td>8 Stunden; automatische Regenerierung alle 30 Minuten</td></tr>
<tr><td>Cookie-Flags</td><td>HttpOnly, SameSite=Lax</td></tr>
<tr><td>Passwort-Hashing</td><td>Argon2id (Memory: 64 MB, Iterationen: 4, Threads: 3)</td></tr>
<tr><td>CSRF-Schutz</td><td>Aktiviert, pro Formular, 8 Stunden Lebensdauer</td></tr>
<tr><td>Rate Limiting (Login)</td><td>15 Versuche pro 60 Sekunden</td></tr>
<tr><td>Max. Upload-Größe</td><td>50 MB; ausführbare Dateierweiterungen geblockt</td></tr>
<tr><td>HTTP Security Headers</td><td>HSTS (1 Jahr), X-Frame-Options: SAMEORIGIN, X-Content-Type-Options: nosniff, Referrer-/Permissions-Policy, CSP (maßgeblich für XSS-Schutz)</td></tr>
<tr><td>Verschlüsselung (Vault)</td><td>AES-256-GCM</td></tr>
<tr><td>Audit-Log</td><td>Hash-Chain (SHA-256/HMAC), 10 Jahre Aufbewahrung (konfigurierbar), sensible Felder maskiert</td></tr>
<tr><td>MFA</td><td>TOTP und WebAuthn/FIDO2 pro Benutzer aktivierbar; optional erzwingbar (Admins/alle lokalen Konten)</td></tr>
</tbody>
</table>
<p style="margin-top:6px;"><strong>Optionale Schutzfunktionen</strong> (Administration → Einstellungen → Sicherheit; standardmäßig deaktiviert, nur lokale Konten):
Passwort-Richtlinie (Mindestlänge/Zeichentypen), Account-Lockout (temporäre Sperre nach Fehl-Logins), MFA-Erzwingung,
Audit-Aufbewahrungs-Purge (revisionssicher via Anker), SIEM-/Log-Weiterleitung (Webhook/Syslog) und periodische
Hash-Ketten-Integritätsprüfung. Abhängigkeiten werden zusätzlich per <code>composer audit</code> in der CI geprüft.</p>
<div class="warn-box">
<strong>Produktions-Checkliste:</strong>
APP_DEBUG=false setzen • install.php löschen • Storage außerhalb des Webroots •
HTTPS erzwingen • Datenbank-Backups einrichten • Cron-Job konfigurieren
</div>
<!-- 9. Scheduler -->
<h2 style="page-break-before:always;">11. Scheduler & Hintergrundaufgaben</h2>
<p>Einziger erforderlicher Cron-Eintrag:</p>
<p><code>* * * * * /usr/bin/php /pfad/zu/bin/scheduler.php >> /pfad/zu/storage/logs/scheduler.log 2>&1</code></p>
<p>Alle Tasks sind über <code>/admin/cronjobs</code> konfigurierbar (Intervall, Aktiv, Hintergrund) und manuell ausführbar. <strong>Modul-Tasks laufen nur bei aktivem Modul.</strong> Standardmäßig aktiv – außer den beiden mit „aus" markierten.</p>
<table>
<thead><tr><th scope="col">Task</th><th scope="col">Zweck</th><th scope="col">Std.</th></tr></thead>
<tbody>
<tr><td colspan="3"><strong>Kern & modulübergreifend</strong></td></tr>
<tr><td>review_notifications</td><td>Benachrichtigt bei erreichtem Review-Datum einer Seite</td><td>an</td></tr>
<tr><td>review_status_refresh</td><td>Berechnet den Review-Status aller Seiten neu</td><td>an</td></tr>
<tr><td>contract_reminders</td><td>Warnt vor ablaufenden Verträgen/Kündigungsfristen</td><td>an</td></tr>
<tr><td>ssl_check / ssl_reminder</td><td>Prüft TLS-Zertifikate bzw. erinnert vor Ablauf</td><td>an</td></tr>
<tr><td>todo_due_reminder</td><td>Erinnert vor Fälligkeit eigener To-dos</td><td>an</td></tr>
<tr><td>configlog_due_reminder</td><td>Erinnert an fällige geplante Änderungen</td><td>an</td></tr>
<tr><td>budget_threshold_alert</td><td>Warnt bei Erreichen der Budget-Auslastungsschwelle</td><td>an</td></tr>
<tr><td>loan_overdue_reminder / loan_status_reconcile</td><td>Überfälligkeits-Mail bzw. Leih-Status-Abgleich</td><td>an</td></tr>
<tr><td>service_favicon_fetch</td><td>Lädt Favicons für Dienste ohne Icon nach</td><td>an</td></tr>
<tr><td>status_service_snapshot</td><td>Schreibt täglich den Dienst-Status fort (90-Tage-Uptime)</td><td>an</td></tr>
<tr><td>deadline_digest</td><td>Wöchentliche gebündelte Fristen-E-Mail</td><td><strong>aus</strong></td></tr>
<tr><td>file_trash_purge / image_optimize</td><td>Papierkorb endgültig leeren bzw. Bilder komprimieren</td><td>an</td></tr>
<tr><td>email_queue / mail_secret_expiry</td><td>E-Mail-Warteschlange senden bzw. vor OAuth-Secret-Ablauf warnen</td><td>an</td></tr>
<tr><td>update_check</td><td>Prüft auf neue OpenNIT-Version</td><td>an</td></tr>
<tr><td>dell_warranty_refresh</td><td>Holt gestaffelt Dell-Garantiedaten (Tageslimit)</td><td>an</td></tr>
<tr><td colspan="3"><strong>Tickets</strong></td></tr>
<tr><td>ticket_fetch / ticket_mail_queue</td><td>Mails abrufen bzw. Ticket-Mails versenden</td><td>an</td></tr>
<tr><td>ticket_auto_close / ticket_resume_snooze</td><td>Gelöste Tickets schließen bzw. Wiedervorlagen reaktivieren</td><td>an</td></tr>
<tr><td>sla_escalation</td><td>Eskaliert SLA-überfällige Tickets</td><td>an</td></tr>
<tr><td>ticket_sentiment</td><td>KI-Stimmungsanalyse der ersten Ticket-Nachricht</td><td>an</td></tr>
<tr><td>alert_to_ticket</td><td>Erstellt Tickets aus Monitoring/XDR/CVE/SSL (je Quelle schaltbar)</td><td>an</td></tr>
<tr><td colspan="3"><strong>Verzeichnis, MDM & Lizenzen</strong></td></tr>
<tr><td>directory_sync / relution_sync / intune_sync</td><td>Personen aus Entra/LDAP bzw. Geräte aus Relution/Intune</td><td>an</td></tr>
<tr><td>entra_license_sync</td><td>Lädt Microsoft-365-Lizenzen aus dem Tenant</td><td>an</td></tr>
<tr><td colspan="3"><strong>CVE, XDR, UniFi, Backup</strong></td></tr>
<tr><td>cve_refresh / cve_prune</td><td>CVEs von NVD/BSI holen bzw. veraltete entfernen</td><td>an</td></tr>
<tr><td>xdr_sync / xdr_prune</td><td>XDR-Warnungen holen/zuordnen bzw. erledigte entfernen</td><td>an</td></tr>
<tr><td>unifi_sync / backup_sync</td><td>UniFi-Cache bzw. Veeam/PBS-Jobs abgleichen</td><td>an</td></tr>
<tr><td colspan="3"><strong>Audit & Compliance</strong> (nur wirksam, wenn in den Sicherheitseinstellungen aktiviert)</td></tr>
<tr><td>audit_retention_purge</td><td>Löscht Audit-Einträge nach Aufbewahrungsfrist (Hash-Kette via Anker prüfbar)</td><td>an*</td></tr>
<tr><td>audit_siem_forward</td><td>Leitet Audit-Ereignisse an ein SIEM weiter</td><td>an*</td></tr>
<tr><td>audit_integrity_check</td><td>Prüft die Hash-Kette und alarmiert bei Bruch</td><td>an*</td></tr>
<tr><td colspan="3"><strong>ISMS</strong></td></tr>
<tr><td>isms_review_reminder / isms_cve_risk_suggestion</td><td>Risiko-Wiedervorlagen bzw. CVE-Risiko-Vorschläge</td><td>an</td></tr>
<tr><td>isms_register_health / isms_soa_derive</td><td>Registerqualität bzw. SoA-Status ableiten</td><td>an</td></tr>
<tr><td>isms_monthly_report / isms_metrics_snapshot</td><td>Monatsbericht bzw. Kennzahlen-Trend</td><td>an</td></tr>
<tr><td colspan="3"><strong>Workflows, API-Auto & KI</strong></td></tr>
<tr><td>workflow_escalation / workflow_anonymization / workflow_webhooks</td><td>Eskalation, DSGVO-Anonymisierung, Webhook-Zustellung</td><td>an</td></tr>
<tr><td>api_auto_dispatch</td><td>Führt fällige API-Auto-Verbindungen aus</td><td>an</td></tr>
<tr><td>ai_embedding_index</td><td>Indiziert die Doku für die semantische KI-Suche</td><td><strong>aus</strong></td></tr>
</tbody>
</table>
<p style="font-size:9px;color:#666;">* Task ist aktiv, tut aber nichts, solange die jeweilige Funktion (Purge / SIEM / Integritätsprüfung) unter <code>/admin/settings/security</code> nicht eingeschaltet ist.</p>
<!-- 10. Authentifizierung -->
<h2 style="page-break-before:always;">12. Authentifizierung, Benutzer & Rollen</h2>
<table>
<thead><tr><th scope="col">Methode</th><th scope="col">Beschreibung</th><th scope="col">Konfiguration</th></tr></thead>
<tbody>
<tr><td>Lokale Anmeldung</td><td>Benutzername/Passwort in OpenNIT-Datenbank</td><td>Kann deaktiviert werden</td></tr>
<tr><td>Azure AD / M365</td><td>OAuth2/PKCE-Login über Microsoft</td><td>/admin/settings/m365</td></tr>
<tr><td>Keycloak SSO</td><td>OAuth2-Login über Keycloak</td><td>/admin/settings/keycloak</td></tr>
<tr><td>LDAP / Active Directory</td><td>Direkte LDAP-Bind-Authentifizierung</td><td>/admin/settings/ldap-auth</td></tr>
<tr><td>MFA</td><td>TOTP, WebAuthn/FIDO2 (Passkeys) und Backup-Codes (Notfall-Login)</td><td>Pro Benutzer unter /account/mfa</td></tr>
</tbody>
</table>
<p>OpenNIT verwendet RBAC (rollenbasierte Zugangskontrolle). Administratoren erstellen Rollen mit Capabilities und weisen Benutzern Rollen zu – jede Zuweisung hat einen <strong>Geltungsbereich</strong>: global, ein Themengebiet (Doku) oder ein Standort (Tickets/Inventar), jeweils inkl. Unterebenen. Berechtigungen folgen dem Muster <code>view_*</code> (lesen), <code>manage_*</code>/<code>edit_*</code> (bearbeiten), <code>admin_*</code> (Modul-Einstellungen). Rechte-Eskalation ist ausgeschlossen (man kann nur eigene Rechte weitergeben). Benutzer können deaktiviert (Login gesperrt, Daten erhalten) werden; MFA-Reset durch Admins ist möglich.</p>
<!-- 13. Troubleshooting -->
<h2 style="page-break-before:always;">13. Troubleshooting & häufige Fragen</h2>
<p><strong>Niemals den APP_KEY nachträglich ändern</strong> – sonst sind Vault, verschlüsselte Zugangsdaten/Lizenzschlüssel und die Audit-Kette unlesbar/nicht prüfbar.</p>
<table>
<thead><tr><th scope="col">Symptom</th><th scope="col">Ursache</th><th scope="col">Lösung</th></tr></thead>
<tbody>
<tr><td>„Sitzung abgelaufen" beim Absenden</td><td>CSRF-Token (<code>_csrf</code>) fehlt/abgelaufen</td><td>Neu laden & anmelden; Session/CSRF unter /admin/settings/security</td></tr>
<tr><td>Keine Erinnerungen, Tickets werden nicht abgerufen</td><td>Scheduler läuft nicht</td><td>Crontab für bin/scheduler.php einrichten; /admin/cronjobs prüfen (als Web-User, nicht root)</td></tr>
<tr><td>E-Mails kommen nicht an</td><td>Mail falsch konfiguriert / Queue hängt / OAuth-Secret abgelaufen</td><td>Test-Mail (/admin/settings/email); Queue (/admin/email); Secret erneuern</td></tr>
<tr><td>Mails werden nicht zu Tickets</td><td>Postfach/ticket_fetch inaktiv</td><td>/admin/tickets/settings testen; ticket_fetch in /admin/cronjobs aktiv</td></tr>
<tr><td>/login oder Unterseiten „Not Found"</td><td>URL-Rewriting nicht aktiv</td><td>mod_rewrite/.htaccess bzw. nginx-Regel auf public/index.php</td></tr>
<tr><td>Menüpunkt/Knopf fehlt</td><td>Modul inaktiv / Capability fehlt / Scope schränkt ein</td><td>Modul aktivieren; Rolle prüfen (/admin/permissions/matrix); Geltungsbereich kontrollieren</td></tr>
<tr><td>Rate-Limit greift hinter Proxy nicht</td><td>TRUSTED_PROXIES nicht gesetzt</td><td>Proxy-/LB-IPs in .env eintragen</td></tr>
<tr><td>„Interner Fehler" auf bestimmten Seiten nach Update</td><td>Migration fehlgeschlagen (fehlende Spalte)</td><td>Migrationen unter /admin/update ausführen/wiederholen; /admin/logs prüfen</td></tr>
<tr><td>MFA-Aussperrung</td><td>Zweites Gerät verloren</td><td>Admin-Reset unter /admin/users/{id} (nur lokale Konten)</td></tr>
<tr><td>Vault/Lizenzschlüssel unlesbar</td><td>APP_KEY geändert/fehlt</td><td>Ursprünglichen APP_KEY wiederherstellen</td></tr>
<tr><td>Signatur-Tablet ungesichert</td><td>Keine IP-Allowlist für /signature</td><td>Erlaubte IPs unter /admin/settings/signature</td></tr>
</tbody>
</table>
<!-- 14. Glossar -->
<h2 style="page-break-before:always;">14. Glossar & Pflege</h2>
<table>
<thead><tr><th scope="col">Begriff</th><th scope="col">Bedeutung</th></tr></thead>
<tbody>
<tr><td>Modul</td><td>Optionaler, unter /admin/settings schaltbarer Funktionsbereich</td></tr>
<tr><td>Capability / Rolle</td><td>Einzelrecht bzw. benannte Sammlung von Capabilities (das „Was")</td></tr>
<tr><td>Geltungsbereich (Scope)</td><td>Das „Wo": global, Themengebiet (Doku) oder Standort (Tickets/Inventar), inkl. Unterebenen</td></tr>
<tr><td>SLA</td><td>Reaktionszeit-Vorgabe je Ticket-Priorität (mit Geschäftszeiten/Pause/Eskalation)</td></tr>
<tr><td>ISMS / SoA</td><td>Managementsystem nach ISO 27001 bzw. Statement of Applicability (Control-Anwendbarkeit)</td></tr>
<tr><td>Audit-Log / Hash-Chain</td><td>Unveränderliches Protokoll, kryptografisch verkettet und per Trigger geschützt</td></tr>
<tr><td>MFA / TOTP / WebAuthn</td><td>Zwei-Faktor: App-Code bzw. Hardware-Schlüssel/Passkey</td></tr>
<tr><td>SSO / IdP / OAuth/OIDC</td><td>Single Sign-on über einen Identity-Provider (M365, Keycloak, AD-LDAP)</td></tr>
<tr><td>VAPID / Web-Push</td><td>Schlüssel/Verfahren für Browser-Push der PWA</td></tr>
<tr><td>Scheduler / Cron-Task</td><td>Hintergrundaufgaben, von bin/scheduler.php fällig ausgeführt</td></tr>
<tr><td>IPAM / CVE / XDR</td><td>IP-Verwaltung · bekannte Schwachstelle · Extended Detection & Response</td></tr>
<tr><td>Vault / Magic-Link</td><td>Verschlüsselter Passwort-Tresor · Einmal-Link ohne Login (externe Genehmiger)</td></tr>
</tbody>
</table>
<p style="font-size:9px;color:#666;">Pflege: Dieses Handbuch (HTML <code>index.php</code>, PDF <code>pdf.php</code>) bei funktionalen Änderungen mitziehen – nur dokumentieren, was tatsächlich existiert. Versionsverlauf im Backend unter „Changelog".</p>