diff --git a/frontend/components/employees/LeaveTab.vue b/frontend/components/employees/LeaveTab.vue index a9d3350..af701a7 100644 --- a/frontend/components/employees/LeaveTab.vue +++ b/frontend/components/employees/LeaveTab.vue @@ -1,35 +1,54 @@ -
Jours de présence : {{ summary?.presenceDaysByMonth?.[month.monthKey] ?? 0 }}
+
Jours de présence : + {{ summary?.presenceDaysByMonth?.[month.monthKey] ?? 0 }} +
@@ -118,7 +139,7 @@ const emit = defineEmits<{ }>() const isFractionedDrawerOpen = ref(false) -const fractionedForm = reactive({ days: 0 }) +const fractionedForm = reactive({days: 0}) const openFractionedDrawer = () => { fractionedForm.days = props.summary?.fractionedDays ?? 0 @@ -151,6 +172,11 @@ const weekDayLabels = ['L', 'M', 'M', 'J', 'V', 'S', 'D'] as const const isForfaitRule = computed(() => props.summary?.ruleCode === 'FORFAIT_218') +const currentYearTakenDays = computed(() => { + if (!props.summary) return null + return props.summary.takenDays - (props.summary.previousYearTakenDays ?? 0) +}) + const displayedYear = computed(() => { if (props.summary?.year) return props.summary.year const today = new Date() @@ -282,15 +308,15 @@ const getDayStyle = (day: { leave: DayLeaveState | null; isHoliday: boolean }) = if (day.leave) { const color = day.leave.colors[0] ?? '#222783' if (day.leave.am && day.leave.pm) { - return { backgroundColor: color } + return {backgroundColor: color} } const colorFaded = `${color}60` const backgroundImage = day.leave.am ? `linear-gradient(180deg, ${color} 0 50%, ${colorFaded} 50% 100%)` : `linear-gradient(180deg, ${colorFaded} 0 50%, ${color} 50% 100%)` - return { backgroundImage, backgroundColor: 'transparent' } + return {backgroundImage, backgroundColor: 'transparent'} } - if (day.isHoliday) return { backgroundColor: 'rgb(179, 229, 252)' } + if (day.isHoliday) return {backgroundColor: 'rgb(179, 229, 252)'} return undefined } diff --git a/frontend/services/dto/employee-leave-summary.ts b/frontend/services/dto/employee-leave-summary.ts index a36cdd2..fe9bfd2 100644 --- a/frontend/services/dto/employee-leave-summary.ts +++ b/frontend/services/dto/employee-leave-summary.ts @@ -10,6 +10,9 @@ export type EmployeeLeaveSummary = { takenSaturdays: number fractionedDays: number accruingDays: number + previousYearAcquiredDays: number + previousYearTakenDays: number + previousYearRemainingDays: number presenceDaysByMonth: Record } diff --git a/src/ApiResource/EmployeeLeaveSummary.php b/src/ApiResource/EmployeeLeaveSummary.php index 95a4173..cd44a40 100644 --- a/src/ApiResource/EmployeeLeaveSummary.php +++ b/src/ApiResource/EmployeeLeaveSummary.php @@ -20,17 +20,20 @@ use App\State\EmployeeLeaveSummaryProvider; )] final class EmployeeLeaveSummary { - public int $year = 0; - public bool $isSupported = false; - public string $ruleCode = ''; - public float $acquiredDays = 0.0; - public float $remainingDays = 0.0; - public float $takenDays = 0.0; - public float $acquiredSaturdays = 0.0; - public float $remainingSaturdays = 0.0; - public float $takenSaturdays = 0.0; - public float $fractionedDays = 0.0; - public float $accruingDays = 0.0; + public int $year = 0; + public bool $isSupported = false; + public string $ruleCode = ''; + public float $acquiredDays = 0.0; + public float $remainingDays = 0.0; + public float $takenDays = 0.0; + public float $acquiredSaturdays = 0.0; + public float $remainingSaturdays = 0.0; + public float $takenSaturdays = 0.0; + public float $fractionedDays = 0.0; + public float $accruingDays = 0.0; + public float $previousYearAcquiredDays = 0.0; + public float $previousYearTakenDays = 0.0; + public float $previousYearRemainingDays = 0.0; /** @var array YYYY-MM => count (0.5 for half-days) */ public array $presenceDaysByMonth = []; diff --git a/src/State/EmployeeLeaveSummaryProvider.php b/src/State/EmployeeLeaveSummaryProvider.php index 99c9332..0f02251 100644 --- a/src/State/EmployeeLeaveSummaryProvider.php +++ b/src/State/EmployeeLeaveSummaryProvider.php @@ -91,16 +91,19 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface $fractionedDays = $this->resolveFractionedDays($employee, $yearSummary['ruleCode'], $year); - $summary->isSupported = true; - $summary->ruleCode = $yearSummary['ruleCode']; - $summary->acquiredDays = $yearSummary['acquiredDays'] + $fractionedDays; - $summary->acquiredSaturdays = $yearSummary['acquiredSaturdays']; - $summary->fractionedDays = $fractionedDays; - $summary->accruingDays = $yearSummary['accruingDays']; - $summary->takenDays = $yearSummary['takenDays']; - $summary->takenSaturdays = $yearSummary['takenSaturdays']; - $summary->remainingDays = $yearSummary['remainingDays'] + $fractionedDays; - $summary->remainingSaturdays = $yearSummary['remainingSaturdays']; + $summary->isSupported = true; + $summary->ruleCode = $yearSummary['ruleCode']; + $summary->acquiredDays = $yearSummary['acquiredDays'] + $fractionedDays; + $summary->acquiredSaturdays = $yearSummary['acquiredSaturdays']; + $summary->fractionedDays = $fractionedDays; + $summary->accruingDays = $yearSummary['accruingDays']; + $summary->takenDays = $yearSummary['takenDays']; + $summary->takenSaturdays = $yearSummary['takenSaturdays']; + $summary->remainingDays = $yearSummary['remainingDays'] + $fractionedDays; + $summary->remainingSaturdays = $yearSummary['remainingSaturdays']; + $summary->previousYearAcquiredDays = $yearSummary['previousYearAcquiredDays']; + $summary->previousYearTakenDays = $yearSummary['previousYearTakenDays']; + $summary->previousYearRemainingDays = $yearSummary['previousYearRemainingDays']; [$periodFrom, $periodTo] = $this->resolvePeriodBounds($employee, $year); $summary->presenceDaysByMonth = $this->computePresenceDaysByMonth($employee, $periodFrom, $periodTo); @@ -117,7 +120,10 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface * takenDays: float, * takenSaturdays: float, * remainingDays: float, - * remainingSaturdays: float + * remainingSaturdays: float, + * previousYearAcquiredDays: float, + * previousYearTakenDays: float, + * previousYearRemainingDays: float * } */ private function computeYearSummary(Employee $employee, int $targetYear): ?array @@ -214,6 +220,10 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface $takenDays += $openingBalance->getTakenDays(); $takenSaturdays += $openingBalance->getTakenSaturdays(); } + $previousYearAcquired = 0.0; + $previousYearTaken = 0.0; + $previousYearRemaining = 0.0; + if (LeaveRuleCode::CDI_CDD_NON_FORFAIT->value === $leavePolicy['ruleCode']) { $availableAcquired = max(0.0, $carryDays); $takenFromAcquired = min($availableAcquired, $takenDays); @@ -238,26 +248,37 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface } else { // Forfait: no "en cours d'acquisition" counter, all rights are in acquired. // Suspensions do not impact forfait 218 leave calculation. - $acquiredDays = $carryDays + $leavePolicy['acquiredDays']; + // Taken days are first deducted from N-1 carry, then from current year. + $previousYearAcquired = $carryDays; + $takenFromPrevious = min(max(0.0, $previousYearAcquired), $takenDays); + $previousYearTaken = $takenFromPrevious; + $takenFromCurrent = $takenDays - $takenFromPrevious; + + $previousYearRemaining = max(0.0, $previousYearAcquired - $takenFromPrevious); + + $acquiredDays = $leavePolicy['acquiredDays']; $accruingDays = 0.0; - $remainingDays = max(0.0, $acquiredDays - $takenDays); + $remainingDays = max(0.0, $acquiredDays - $takenFromCurrent); $acquiredSaturdays = 0.0; $remainingSaturdays = 0.0; - $previousRemainingDays = $remainingDays; + $previousRemainingDays = $previousYearRemaining + $remainingDays; $previousRemainingSaturdays = 0.0; } if ($year === $targetYear) { $targetSummary = [ - 'ruleCode' => $leavePolicy['ruleCode'], - 'acquiredDays' => $acquiredDays, - 'acquiredSaturdays' => $acquiredSaturdays, - 'accruingDays' => $accruingDays, - 'takenDays' => $takenDays, - 'takenSaturdays' => $takenSaturdays, - 'remainingDays' => $remainingDays, - 'remainingSaturdays' => $remainingSaturdays, + 'ruleCode' => $leavePolicy['ruleCode'], + 'acquiredDays' => $acquiredDays, + 'acquiredSaturdays' => $acquiredSaturdays, + 'accruingDays' => $accruingDays, + 'takenDays' => $takenDays, + 'takenSaturdays' => $takenSaturdays, + 'remainingDays' => $remainingDays, + 'remainingSaturdays' => $remainingSaturdays, + 'previousYearAcquiredDays' => $previousYearAcquired, + 'previousYearTakenDays' => $previousYearTaken, + 'previousYearRemainingDays' => $previousYearRemaining, ]; } }