"use client"; import { useActionState, useState } from "react"; import { Button } from "@/components/ui/button"; import { FELD } from "@/lib/formular"; import { mitarbeiterImportierenAktion, type AktionsErgebnis } from "@/server/actions/mitarbeiter"; /** * Personen aus einer CSV-Datei einspielen (#016). * * Die Datei wird **im Browser** gelesen und ihr Inhalt als Text mitgeschickt — * derselbe Weg wie beim Geraete- und Vorlagenimport, und dieselbe Begruendung: * das Format ist Text, die Dateien sind klein, und so gibt es einen Weg statt * zwei. * * Was ueber dem Feld steht, muss der Dienst auch halten. Deshalb stehen dort nur * Zusagen, die in `mitarbeiterImportieren` als Code nachzulesen sind: die * Obergrenze, die Spalten, die Wiedererkennung, und dass eine leere Zelle nichts * loescht. */ export function MitarbeiterImportieren({ hoechstZeilen, spalten, kunden, }: { hoechstZeilen: number; spalten: readonly string[]; kunden: readonly { readonly id: string; readonly name: string }[]; }) { const [ergebnis, aktion, laeuft] = useActionState( mitarbeiterImportierenAktion, {}, ); const [inhalt, setInhalt] = useState(""); const [leseFehler, setLeseFehler] = useState(null); async function dateiLesen(datei: File | undefined) { if (!datei) return; setLeseFehler(null); try { setInhalt(await datei.text()); } catch { setLeseFehler("Die Datei ließ sich nicht lesen."); } } return (

Spalten: {spalten.join(", ")}. Die deutschen Namen (Vorname, Nachname, Anzeigename, Abteilung, Titel) gehen genauso, Groß- und Kleinschreibung ist unerheblich. Trennzeichen darf Komma oder Semikolon sein. Höchstens {hoechstZeilen} Zeilen je Datei. Eine fehlerhafte Zeile bricht den Import nicht ab — sie wird unten mit ihrer Zeilennummer gemeldet.

  • Wiedererkannt wird eine Person über sam oder{" "} upn, sonst über den Anzeigenamen. Wer schon da ist, wird aktualisiert statt ein zweites Mal angelegt.
  • Eine leere Zelle löscht nichts: was in der Datei nicht steht, bleibt so, wie es ist. Fehlen{" "} givenName und sn, wird displayName am letzten Leerzeichen geteilt.
  • Personen aus dem Verzeichnis werden nicht überschrieben; solche Zeilen werden gemeldet. Was hier entsteht, gilt als von Hand angelegt und bleibt änderbar.
  • Eine deaktivierte Person wird erkannt und aktualisiert, aber nicht wieder aktiviert — dafür gibt es den Schalter auf ihrer Seite.
  • Abteilungen legt der Import nicht an — der Name wird nur bei der Person eingetragen. Als Abteilung mit Ziel-OU und Standardgruppen übernimmt sie ein Administrator.