Zwei Nachtraege zur Rueckmeldung des Kunden. Das Fenster fuer den Notfallkontakt hatte ein Freitextfeld fuer das Verhaeltnis, waehrend der Einstellungsassistent und "Daten aendern" dieselbe Auswahlliste fuehren (EMERGENCY_RELATIONS). Freitext hiesse, dass "Gattin", "Ehefrau" und "Frau" nebeneinander stehen und sich nicht auswerten lassen -- genau der Grund, aus dem die Liste ueberhaupt existiert. Jetzt fuehren alle drei Stellen dieselbe. Und "Leitung vakant" stand im Organigramm weiterhin bei der obersten Einheit. Entfernt wurde es zuletzt nur im Druck; die Ansicht am Bildschirm hat ihre eigene Beschriftung. Die Gesellschaft wird nicht gefuehrt, sondern ist das Ganze -- der Vermerk las sich dort wie eine offene Stelle und faerbte den obersten Knoten obendrein als Vakanz ein. Ueberall sonst bleibt er.
114 lines
3.9 KiB
TypeScript
114 lines
3.9 KiB
TypeScript
"use client";
|
|
|
|
import { useRouter } from "next/navigation";
|
|
import { useState } from "react";
|
|
import { changeEmployeeData } from "@/actions/employees";
|
|
import { Button } from "@/components/ui/Button";
|
|
import { SelectField, TextField } from "@/components/ui/Field";
|
|
import { Modal } from "@/components/ui/Modal";
|
|
import { useToast } from "@/components/ui/Toast";
|
|
import { todayIso } from "@/lib/format";
|
|
import { EMERGENCY_RELATIONS } from "@/lib/types";
|
|
|
|
// Der Notfallkontakt, ohne den Umweg über „Daten ändern".
|
|
//
|
|
// Geschrieben wird über dieselbe Funktion wie dort: change_employee_data mit
|
|
// **nur** den drei Feldern im Abschnitt `person`. Das ist keine Abkürzung,
|
|
// sondern die Bedingung dafür, dass der Eintrag in der Historie und im
|
|
// Protokoll landet wie jede andere Stammdatenänderung. Die Datenbank fasst
|
|
// ausschliesslich die Felder an, die im Aufruf stehen — sie prüft auf das
|
|
// Vorhandensein des Schlüssels, nicht auf seinen Wert (Migration
|
|
// 20260917120000). Adresse, E-Mail und der Rest bleiben deshalb unberührt.
|
|
|
|
export type Notfallkontakt = {
|
|
name: string | null;
|
|
telefon: string | null;
|
|
verhaeltnis: string | null;
|
|
};
|
|
|
|
export function NotfallkontaktModal({
|
|
open,
|
|
onClose,
|
|
employeeId,
|
|
kontakt,
|
|
}: {
|
|
open: boolean;
|
|
onClose: () => void;
|
|
employeeId: string;
|
|
kontakt: Notfallkontakt;
|
|
}) {
|
|
const { showToast } = useToast();
|
|
const router = useRouter();
|
|
const [name, setName] = useState(kontakt.name ?? "");
|
|
const [telefon, setTelefon] = useState(kontakt.telefon ?? "");
|
|
const [verhaeltnis, setVerhaeltnis] = useState(kontakt.verhaeltnis ?? "");
|
|
const [effectiveDate, setEffectiveDate] = useState(todayIso());
|
|
const [pending, setPending] = useState(false);
|
|
|
|
const vorhanden = Boolean(kontakt.name);
|
|
|
|
async function handleSubmit() {
|
|
// Name und Telefonnummer gehören zusammen: ein Name ohne Nummer hilft im
|
|
// Ernstfall niemandem, eine Nummer ohne Namen sagt nicht, wen man dran
|
|
// hat.
|
|
if (!name.trim() || !telefon.trim()) {
|
|
showToast("Name und Telefonnummer sind nötig.", "error");
|
|
return;
|
|
}
|
|
setPending(true);
|
|
const result = await changeEmployeeData({
|
|
employee_id: employeeId,
|
|
effective_date: effectiveDate,
|
|
person: {
|
|
emergency_contact_name: name.trim(),
|
|
emergency_contact_phone: telefon.trim(),
|
|
emergency_contact_relation: verhaeltnis.trim(),
|
|
},
|
|
contract: {},
|
|
role: {},
|
|
});
|
|
setPending(false);
|
|
if (result.success) {
|
|
showToast(vorhanden ? "Notfallkontakt geändert." : "Notfallkontakt hinterlegt.");
|
|
router.refresh();
|
|
onClose();
|
|
} else {
|
|
showToast(result.error ?? "Fehler beim Speichern.", "error");
|
|
}
|
|
}
|
|
|
|
return (
|
|
<Modal
|
|
open={open}
|
|
onClose={onClose}
|
|
title={vorhanden ? "Notfallkontakt ändern" : "Notfallkontakt hinterlegen"}
|
|
footer={
|
|
<>
|
|
<Button variant="ghost" onClick={onClose}>
|
|
Abbrechen
|
|
</Button>
|
|
<Button onClick={handleSubmit} pending={pending}>
|
|
Speichern
|
|
</Button>
|
|
</>
|
|
}
|
|
>
|
|
<div className="flex flex-col gap-4">
|
|
<TextField label="Wirksam ab" required type="date" value={effectiveDate} onChange={setEffectiveDate} />
|
|
<TextField label="Name" required value={name} onChange={setName} />
|
|
<TextField label="Telefonnummer" required type="tel" value={telefon} onChange={setTelefon} />
|
|
{/* Dieselbe Liste wie im Einstellungsassistenten (EMERGENCY_RELATIONS)
|
|
und kein Freitext: sonst stünden „Gattin", „Ehefrau" und „Frau"
|
|
nebeneinander und liessen sich nicht auswerten. */}
|
|
<SelectField
|
|
label="Verhältnis"
|
|
value={verhaeltnis}
|
|
onChange={setVerhaeltnis}
|
|
placeholder="Bitte wählen…"
|
|
options={EMERGENCY_RELATIONS.map((r) => ({ value: r, label: r }))}
|
|
/>
|
|
</div>
|
|
</Modal>
|
|
);
|
|
}
|