import type { Ref } from 'vue' import type { Absence } from '~/services/dto/absence' import type { EmployeeLeaveSummary } from '~/services/dto/employee-leave-summary' import type { Employee } from '~/services/dto/employee' import { CONTRACT_TYPES } from '~/services/dto/contract' import { listAbsences } from '~/services/absences' import { getEmployeeLeaveSummary, updateFractionedDays } from '~/services/employee-leave-summary' import { listPublicHolidays } from '~/services/public-holidays' export const useEmployeeLeave = (employee: Ref, reloadEmployee: () => Promise) => { const employeeAbsences = ref([]) const leaveSummary = ref(null) const publicHolidays = ref>({}) const isLeaveLoading = ref(false) const leaveDataLoaded = ref(false) const getLeaveYear = () => { const now = new Date() const isForfait = employee.value?.contract?.type === CONTRACT_TYPES.FORFAIT return isForfait ? now.getFullYear() : (now.getMonth() >= 5 ? now.getFullYear() + 1 : now.getFullYear()) } const loadLeaveData = async () => { if (!employee.value || isLeaveLoading.value) return isLeaveLoading.value = true try { const isForfait = employee.value.contract?.type === CONTRACT_TYPES.FORFAIT const leaveYear = getLeaveYear() const from = isForfait ? `${leaveYear}-01-01` : `${leaveYear - 1}-06-01` const to = isForfait ? `${leaveYear}-12-31` : `${leaveYear}-05-31` const holidayYears = isForfait ? [leaveYear] : [leaveYear - 1, leaveYear] const [absences, summary, ...holidayResults] = await Promise.all([ listAbsences({ from, to, employeeId: employee.value.id }), getEmployeeLeaveSummary(employee.value.id, leaveYear), ...holidayYears.map((y) => listPublicHolidays('metropole', y)) ]) employeeAbsences.value = absences leaveSummary.value = summary publicHolidays.value = Object.assign({}, ...holidayResults) leaveDataLoaded.value = true } finally { isLeaveLoading.value = false } } const resetLoaded = () => { leaveDataLoaded.value = false } const submitFractionedDays = async (days: number) => { if (!employee.value) return const year = leaveSummary.value?.year ?? undefined await updateFractionedDays(employee.value.id, days, year) await reloadEmployee() } return { employeeAbsences, leaveSummary, publicHolidays, isLeaveLoading, leaveDataLoaded, loadLeaveData, resetLoaded, submitFractionedDays } }