import { redirect } from "next/navigation"; import { AlertTriangle, CheckCircle2, Clock, Server } from "lucide-react"; import { Betriebsmodus } from "@/generated/prisma/enums"; import { JetztAbgleichen } from "@/components/verzeichnis/jetzt-abgleichen"; import { QuelleFormular } from "@/components/verzeichnis/quelle-formular"; import { VerbindungTesten } from "@/components/verzeichnis/verbindung-testen"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { betriebsmodus } from "@/server/mandant"; import { abgleichLog, type AbgleichLogZeile, quellenListe } from "@/server/queries/verzeichnis"; import type { QuellenSicht } from "@/server/services/verzeichnis"; /** * Admin → Verzeichnis (#016). * * Nur im Modus INTERN: dort hat das Haus **ein** Active Directory, aus dem seine * Leute kommen. Im Modus DIENSTLEISTUNG gäbe es Verzeichnisse fremder Kunden, * und die bindet diese Anwendung ausdrücklich nicht an (#008) — die Seite leitet * dann um, nicht nur der Reiter verschwindet. * * Die Reihenfolge auf der Seite ist die Reihenfolge der Arbeit: erst sehen, was * da ist und wie der letzte Abgleich lief, dann prüfen, dann anlegen. */ const ZEITPUNKT = new Intl.DateTimeFormat("de-DE", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }); function Status({ quelle }: { quelle: QuellenSicht }) { if (quelle.letzterAbgleichAm === null) { return (
Noch nie abgeglichen. „Verbindung testen“ zeigt, was ankäme, ohne etwas zu schreiben.
); } const gescheitert = quelle.letzterAbgleichStatus === "FEHLER"; return ({gescheitert ? ( ) : ( )} {gescheitert ? "Letzter Abgleich gescheitert" : "Zuletzt abgeglichen"} am{" "} {ZEITPUNKT.format(quelle.letzterAbgleichAm)}
{quelle.letzterAbgleichFehler ? ({quelle.letzterAbgleichFehler}
) : null}Noch kein Lauf. Hier steht danach, was jeder Abgleich getan hat.
); } return ({zeile.gescheitert ? ( ) : ( )} {ZEITPUNKT.format(zeile.zeitpunkt)} {/* Ohne Menschen war es der Zeitplan – das ist der Regelfall und keine Lücke. */} {zeile.durch === null ? "Zeitplan" : zeile.durch}
{zeile.gelesen} gelesen {zeile.angelegt} angelegt {zeile.uebernommen > 0 ? {zeile.uebernommen} übernommen : null} {zeile.aktualisiert} aktualisiert {zeile.deaktiviert} deaktiviert {zeile.uebersprungen > 0 ? ( {zeile.uebersprungen} übersprungen ) : null}
{zeile.fehler ? ({zeile.fehler}
) : null}Die Personen der eigenen Firma kommen aus dem Active Directory, damit beim Start eines Laufs nichts abgetippt werden muss. Wer dort verschwindet oder deaktiviert wird, wird hier inaktiv{" "} — gelöscht wird nie, sonst verlöre die Historie ihre Namen.
{quellen.length === 0 ? (Es ist keine Quelle eingerichtet. Personen lassen sich auch von Hand anlegen oder aus einer CSV-Datei einlesen — ein Verzeichnis nimmt nur die Arbeit ab.
) : ({quelle.url} · {quelle.basisDn}
Ein Dienstkonto mit Leserechten genügt. Laufzettel schreibt nie ins Verzeichnis und speichert nur die zugeordneten Felder — keine Passwörter, keine Gruppenmitgliedschaften.