"use server"; import { revalidatePath } from "next/cache"; import { currentUserId } from "@/lib/auth/session"; import { withUser } from "@/lib/db"; import { callFunction, runMutation, type ActionResult, type MutationFn } from "@/lib/db/rpc"; import type { CollectiveAgreement, NoteCategory, RelationshipType, Weekday, WorkerType } from "@/lib/supabase/types"; async function callRpc(fn: MutationFn, payload: Record, revalidate: string[]): Promise { const result = await runMutation(await currentUserId(), fn, payload); if (!result.success) return result; for (const path of revalidate) revalidatePath(path); return result; } export async function hireEmployee(payload: { first_name: string; last_name: string; title_prefix?: string[]; title_suffix?: string[]; gender: "m" | "w"; birth_date: string; sv_nummer?: string; phone?: string; position_id?: string; team_id?: string; job_title?: string; location_id: string; entry_date: string; contract_type?: "unbefristet" | "befristet"; contract_end_date?: string; employment_type?: "Vollzeit" | "Teilzeit"; weekly_hours?: number; paygrade?: "A" | "B" | "C" | "D" | "E" | "F"; source: "Intern" | "Extern"; worker_type?: WorkerType; collective_agreement?: CollectiveAgreement; work_days?: Weekday[]; is_betriebsrat?: boolean; has_dienstwagen?: boolean; is_laterale_fuehrung?: boolean; is_c_level?: boolean; }): Promise { // Einzige Mutation, deren Rückgabewert gebraucht wird: die neue // Personen-Kennung, damit die Oberfläche direkt auf die Akte springen kann. try { const employeeId = await withUser(await currentUserId(), (tx) => callFunction(tx, "hire_employee", payload as Record) ); revalidatePath("/employees"); revalidatePath("/"); revalidatePath("/positions"); return { success: true, employeeId: employeeId as string }; } catch (err) { return { success: false, error: err instanceof Error ? err.message : "Unbekannter Fehler." }; } } export async function terminateEmployee(payload: { employee_id: string; exit_date: string; exit_reason: string; note?: string; }): Promise { return callRpc("terminate_employee", payload, [`/employees/${payload.employee_id}`, "/employees", "/"]); } export async function transferEmployee(payload: { employee_id: string; effective_date: string; /** Die Zielplanstelle; Bereich, Abteilung und Team ergeben sich aus ihrer Einheit. */ target_position_id: string; }): Promise { return callRpc("transfer_employee", payload, [`/employees/${payload.employee_id}`, "/employees"]); } export async function promoteEmployee(payload: { employee_id: string; effective_date: string; new_title: string; new_paygrade?: "A" | "B" | "C" | "D" | "E" | "F"; }): Promise { return callRpc("promote_employee", payload, [`/employees/${payload.employee_id}`, "/employees"]); } export async function startKarenz(payload: { employee_id: string; karenz_start_date: string; planned_return_date: string; absence_type: string; note?: string; }): Promise { return callRpc("start_karenz", payload, [`/employees/${payload.employee_id}`, "/employees", "/"]); } export async function adjustKarenzReturn(payload: { employee_id: string; new_return_date: string; note?: string; }): Promise { return callRpc("adjust_karenz_return", payload, [`/employees/${payload.employee_id}`]); } export async function recordKarenzReturn(payload: { employee_id: string; return_date: string; employment_mode: "unverändert" | "Vollzeit" | "Teilzeit"; weekly_hours?: number; }): Promise { return callRpc("record_karenz_return", payload, [`/employees/${payload.employee_id}`, "/employees", "/"]); } export async function changeEmployeeData(payload: { employee_id: string; effective_date: string; person: Record; contract: Record; role: Record; }): Promise { return callRpc("change_employee_data", payload, [`/employees/${payload.employee_id}`, "/employees"]); } export async function rehireEmployee(payload: { employee_id: string; rehire_date: string }): Promise { return callRpc("rehire_employee", payload, [`/employees/${payload.employee_id}`, "/employees", "/"]); } export async function addEmployeeDependent(payload: { employee_id: string; first_name: string; last_name: string; relationship: RelationshipType; sv_nummer?: string; birth_date: string; effective_date: string; }): Promise { return callRpc("add_employee_dependent", payload, [`/employees/${payload.employee_id}`]); } export async function deleteEmployeeDependent(payload: { dependent_id: string; employee_id: string; effective_date: string; }): Promise { return callRpc("delete_employee_dependent", payload, [`/employees/${payload.employee_id}`]); } export async function addEmployeeNote(payload: { employee_id: string; category: NoteCategory; note_text: string; due_date?: string; }): Promise { return callRpc("add_employee_note", payload, [`/employees/${payload.employee_id}`, "/"]); } export async function completeEmployeeNote(payload: { note_id: string; employee_id: string }): Promise { return callRpc("complete_employee_note", payload, [`/employees/${payload.employee_id}`, "/"]); }