feat(leave) : show presence days in header for non-forfait, bound to contract start
Non-forfait header now shows '{weeklyHours} heures ({presence} présence)'.
Presence (presenceDaysByMonth/presenceDaysToToday) is bounded to the employee's
contract start so business days before hire are not counted (Dylan CDD: 43.5,
was 246). No change for employees present before the exercise or for forfait
(already capped at phase start). Leave summary now eager-loaded for any employee
with a leave tab to feed the header.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -66,8 +66,9 @@ export const useEmployeeDetailPage = () => {
|
||||
await bonus.loadBonusData()
|
||||
} else if (activeTab.value === 'observation') {
|
||||
await observation.loadObservationData()
|
||||
} else if (isForfait.value && showLeaveTab.value) {
|
||||
// Eager load: needed for the "X jours restants" header label on forfait employees.
|
||||
} else if (showLeaveTab.value) {
|
||||
// Eager load: the header shows présence (et jours à travailler/restant pour le forfait),
|
||||
// qui proviennent du récap congés — nécessaire même quand on ouvre un autre onglet.
|
||||
await leave.loadLeaveData()
|
||||
}
|
||||
} finally {
|
||||
@@ -77,14 +78,21 @@ export const useEmployeeDetailPage = () => {
|
||||
|
||||
const contract = useEmployeeContract(employee, loadEmployee)
|
||||
const leave = useEmployeeLeave(employee, loadEmployee, phase.selectedPhase)
|
||||
const formatDays = (n: number) => (Number.isInteger(n) ? String(n) : (Math.round(n * 100) / 100).toFixed(2).replace('.', ','))
|
||||
// Forfait : « (présence · restant à travailler) ». restant = jours à travailler (prorata) − présence.
|
||||
const forfaitRemainingDaysLabel = computed(() => {
|
||||
if (!isForfait.value) return ''
|
||||
const presence = leave.leaveSummary.value?.presenceDaysToToday
|
||||
if (presence === undefined || presence === null) return ''
|
||||
const fmt = (n: number) => (Number.isInteger(n) ? String(n) : (Math.round(n * 100) / 100).toFixed(2).replace('.', ','))
|
||||
// restant à travailler = jours à travailler (prorata) − jours de présence déjà effectués
|
||||
const remaining = forfaitWorkTargetDays.value - presence
|
||||
return ` (${fmt(presence)} présence · ${fmt(remaining)} restants)`
|
||||
return ` (${formatDays(presence)} présence · ${formatDays(remaining)} restants)`
|
||||
})
|
||||
// Non-forfait : « (présence) » seul (pas de cible de jours à travailler).
|
||||
const nonForfaitPresenceLabel = computed(() => {
|
||||
if (isForfait.value) return ''
|
||||
const presence = leave.leaveSummary.value?.presenceDaysToToday
|
||||
if (presence === undefined || presence === null) return ''
|
||||
return ` (${formatDays(presence)} présence)`
|
||||
})
|
||||
const rtt = useEmployeeRtt(employee, loadEmployee, phase.selectedPhase)
|
||||
const mileage = useEmployeeMileage(employee, loadEmployee)
|
||||
@@ -135,6 +143,7 @@ export const useEmployeeDetailPage = () => {
|
||||
showRttTab,
|
||||
employeeContractWorkLabel,
|
||||
forfaitRemainingDaysLabel,
|
||||
nonForfaitPresenceLabel,
|
||||
...phase,
|
||||
...contract,
|
||||
...leave,
|
||||
|
||||
Reference in New Issue
Block a user