"use server"; import { revalidatePath } from "next/cache"; import { createClient } from "@/lib/supabase/server"; import type { Database } from "@/lib/supabase/types"; type ActionResult = { success: boolean; error?: string }; type MutationFn = keyof Database["public"]["Functions"]; async function callRpc(fn: MutationFn, payload: Record, revalidate: string[]): Promise { const supabase = await createClient(); const { error } = await supabase.rpc(fn, { payload }); if (error) return { success: false, error: error.message }; for (const path of revalidate) revalidatePath(path); return { success: true }; } export async function hireEmployee(payload: { first_name: string; last_name: 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; monthly_salary_gross: number; paygrade?: "A" | "B" | "C" | "D" | "E" | "F"; source: "Intern" | "Extern"; }): Promise { const supabase = await createClient(); const { data, error } = await supabase.rpc("hire_employee", { payload }); if (error) return { success: false, error: error.message }; revalidatePath("/employees"); revalidatePath("/"); revalidatePath("/positions"); return { success: true, employeeId: data as string }; } 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; new_team_id: string; new_title?: 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_salary: number; 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; 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; person: Record; contract: 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", "/"]); }