"use client"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { adjustKarenzReturn, recordKarenzReturn, startKarenz } from "@/actions/employees"; import { Button } from "@/components/ui/Button"; import { SelectField, TextField, TextareaField } from "@/components/ui/Field"; import { SegmentedControl } from "@/components/ui/SegmentedControl"; import { SlideOver } from "@/components/ui/SlideOver"; import { useToast } from "@/components/ui/Toast"; import { fmtDate } from "@/lib/format"; import type { Database } from "@/lib/supabase/types"; type EmployeeRow = Database["public"]["Tables"]["employees"]["Row"]; type Mode = "adjust" | "return"; type EmploymentMode = "unverändert" | "Vollzeit" | "Teilzeit"; export function KarenzPanel({ open, onClose, employee }: { open: boolean; onClose: () => void; employee: EmployeeRow }) { const { showToast } = useToast(); const router = useRouter(); const isOnKarenz = employee.status === "Karenz"; const [mode, setMode] = useState("adjust"); const [pending, setPending] = useState(false); const [karenzStart, setKarenzStart] = useState(""); const [plannedReturn, setPlannedReturn] = useState(""); const [startNote, setStartNote] = useState(""); const [newReturnDate, setNewReturnDate] = useState(employee.karenz_return_date ?? ""); const [adjustNote, setAdjustNote] = useState(""); const [returnDate, setReturnDate] = useState(""); const [employmentMode, setEmploymentMode] = useState("unverändert"); const [weeklyHours, setWeeklyHours] = useState("20"); const diffDays = isOnKarenz && employee.karenz_return_date && newReturnDate ? Math.round((new Date(newReturnDate).getTime() - new Date(employee.karenz_return_date).getTime()) / 86400000) : 0; async function handleStart() { if (!karenzStart || !plannedReturn) { showToast("Bitte beide Daten angeben.", "error"); return; } setPending(true); const result = await startKarenz({ employee_id: employee.id, karenz_start_date: karenzStart, planned_return_date: plannedReturn, note: startNote }); setPending(false); if (result.success) { showToast("Karenz erfasst."); router.refresh(); onClose(); } else { showToast(result.error ?? "Fehler.", "error"); } } async function handleAdjust() { if (!newReturnDate || newReturnDate === employee.karenz_return_date) { showToast("Bitte ein neues Rückkehrdatum angeben.", "error"); return; } if (new Date(newReturnDate) <= new Date()) { showToast("Rückkehrdatum muss in der Zukunft liegen.", "error"); return; } setPending(true); const result = await adjustKarenzReturn({ employee_id: employee.id, new_return_date: newReturnDate, note: adjustNote }); setPending(false); if (result.success) { showToast("Rückkehrdatum angepasst."); router.refresh(); onClose(); } else { showToast(result.error ?? "Fehler.", "error"); } } async function handleReturn() { if (!returnDate) { showToast("Bitte Rückkehrdatum angeben.", "error"); return; } if (employmentMode === "Teilzeit" && (Number(weeklyHours) <= 0 || Number(weeklyHours) >= 38.5)) { showToast("Wochenstunden müssen zwischen 0 und 38,5 liegen.", "error"); return; } setPending(true); const result = await recordKarenzReturn({ employee_id: employee.id, return_date: returnDate, employment_mode: employmentMode, weekly_hours: employmentMode === "Teilzeit" ? Number(weeklyHours) : undefined, }); setPending(false); if (result.success) { showToast("Wiedereintritt erfasst."); router.refresh(); onClose(); } else { showToast(result.error ?? "Fehler.", "error"); } } return ( {/* Karenz keeps the warning tone it uses everywhere else. */} {!isOnKarenz && ( )} {isOnKarenz && mode === "adjust" && ( )} {isOnKarenz && mode === "return" && ( )} } > {!isOnKarenz && (
)} {isOnKarenz && (
value={mode} onChange={setMode} options={[ { value: "adjust", label: "Rückkehr anpassen" }, { value: "return", label: "Wiedereintritt erfassen" }, ]} /> {mode === "adjust" && ( <>

Aktuelles Rückkehrdatum: {fmtDate(employee.karenz_return_date)}

{diffDays !== 0 && (
0 ? "bg-warning-bg text-warning-text" : "bg-success-bg text-success-text"}`}> {diffDays > 0 ? `Verlängerung um ${diffDays} Tage` : `Verkürzung um ${Math.abs(diffDays)} Tage`}
)} )} {mode === "return" && ( <> setEmploymentMode(v as EmploymentMode)} options={[ { value: "unverändert", label: "unverändert" }, { value: "Vollzeit", label: "Vollzeit (38,5h)" }, { value: "Teilzeit", label: "Teilzeit-Elternteilzeit" }, ]} /> {employmentMode === "Teilzeit" && ( )} )}
)}
); }