"use client"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { adjustKarenzReturn, recordKarenzReturn, startKarenz } from "@/actions/employees"; 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 ( {!isOnKarenz && ( )} {isOnKarenz && mode === "adjust" && ( )} {isOnKarenz && mode === "return" && ( )} } > {!isOnKarenz && (
setKarenzStart(e.target.value)} className="w-full rounded border border-border px-3 py-2 text-sm" />
setPlannedReturn(e.target.value)} className="w-full rounded border border-border px-3 py-2 text-sm" />