import type { AbsenceBalance, AbsencePolicy, AbsencePolicyWrite, AbsencePreviewPayload, AbsencePreviewResult, AbsenceRequest, AbsenceRequestWrite, AbsenceStatus, AbsenceType, } from './dto/absence' import type { HydraCollection } from '~/utils/api' import { extractHydraMembers } from '~/utils/api' export type AbsenceRequestFilters = { status?: AbsenceStatus type?: AbsenceType year?: number user?: number } export function useAbsenceService() { const api = useApi() // --- Requests --- async function getRequests(filters: AbsenceRequestFilters = {}): Promise { const query: Record = {} if (filters.status) query.status = filters.status if (filters.type) query.type = filters.type if (filters.year) query.year = filters.year if (filters.user) query.user = `/api/users/${filters.user}` const data = await api.get>('/absence_requests', query) return extractHydraMembers(data) } async function getRequest(id: number): Promise { return api.get(`/absence_requests/${id}`) } async function create(payload: AbsenceRequestWrite): Promise { return api.post('/absence_requests', payload as Record, { toastSuccessKey: 'absences.toast.created', }) } async function preview(payload: AbsencePreviewPayload): Promise { return api.post('/absence_requests/preview', payload as Record, { toast: false, }) } async function approve(id: number): Promise { return api.patch(`/absence_requests/${id}/approve`, {}, { toastSuccessKey: 'absences.toast.approved', }) } async function reject(id: number, rejectionReason: string): Promise { return api.patch(`/absence_requests/${id}/reject`, { rejectionReason }, { toastSuccessKey: 'absences.toast.rejected', }) } async function cancel(id: number): Promise { return api.patch(`/absence_requests/${id}/cancel`, {}, { toastSuccessKey: 'absences.toast.cancelled', }) } async function uploadJustification(id: number, file: File): Promise { const form = new FormData() form.append('file', file) return api.post(`/absence_requests/${id}/justificatif`, form as unknown as Record, { toastSuccessKey: 'absences.toast.justificationUploaded', }) } // --- Balances --- async function getBalances(filters: { user?: number; period?: string; type?: AbsenceType } = {}): Promise { const query: Record = {} if (filters.user) query.user = `/api/users/${filters.user}` if (filters.period) query.period = filters.period if (filters.type) query.type = filters.type const data = await api.get>('/absence_balances', query) return extractHydraMembers(data) } async function adjustBalance(id: number, payload: { acquired?: number; acquiring?: number; taken?: number }): Promise { return api.patch(`/absence_balances/${id}`, payload as Record, { toastSuccessKey: 'absences.toast.balanceAdjusted', }) } // --- Policies --- async function getPolicies(): Promise { const data = await api.get>('/absence_policies') return extractHydraMembers(data) } async function updatePolicy(id: number, payload: AbsencePolicyWrite): Promise { return api.patch(`/absence_policies/${id}`, payload as Record, { toastSuccessKey: 'absences.toast.policyUpdated', }) } // --- Admin calendar --- async function getCalendar(from: string, to: string): Promise { return api.get('/admin/absences/calendar', { from, to }) } // --- Public holidays (computed server-side) --- async function getPublicHolidays(from: string, to: string): Promise> { return api.get>('/public_holidays', { from, to }, { toast: false }) } return { getRequests, getRequest, create, preview, approve, reject, cancel, uploadJustification, getBalances, adjustBalance, getPolicies, updatePolicy, getCalendar, getPublicHolidays, } }