diff --git a/frontend/composables/useHoursPage.ts b/frontend/composables/useHoursPage.ts index 6ec531b..6b99f95 100644 --- a/frontend/composables/useHoursPage.ts +++ b/frontend/composables/useHoursPage.ts @@ -138,19 +138,17 @@ export const useHoursPage = () => { return true } - const canCreateValidationRowFromAbsence = (employeeId: number) => { + const canCreateEmptyValidationRow = (employeeId: number) => { const row = rows.value[employeeId] if (row?.workHourId) return false + if (!hasContractAtSelectedDate(employeeId)) return false const dayRow = dayContextByEmployeeId.value.get(employeeId) - return !!dayRow?.absenceLabel && hasContractAtSelectedDate(employeeId) + return !!dayRow?.absenceLabel || is4hContract(employeeId) } - const canCreateSiteValidationRowFromAbsence = (employeeId: number) => { - const row = rows.value[employeeId] - if (row?.workHourId) return false - const dayRow = dayContextByEmployeeId.value.get(employeeId) - return !!dayRow?.absenceLabel && hasContractAtSelectedDate(employeeId) - } + const canCreateValidationRowFromAbsence = (employeeId: number) => canCreateEmptyValidationRow(employeeId) + + const canCreateSiteValidationRowFromAbsence = (employeeId: number) => canCreateEmptyValidationRow(employeeId) const bulkValidatableEmployeeIds = computed(() => { return visibleEmployees.value @@ -347,6 +345,10 @@ export const useHoursPage = () => { const isPresenceTracking = (employee: Employee) => employee.contract?.trackingMode === TRACKING_MODES.PRESENCE const isTimeTracking = (employee: Employee) => !isPresenceTracking(employee) + const is4hContract = (employeeId: number) => { + const employee = employees.value.find((e) => e.id === employeeId) + return employee?.contract?.weeklyHours === 4 + } const isRowLocked = (employeeId: number) => { const row = rows.value[employeeId] if (!row) return false @@ -692,13 +694,8 @@ export const useHoursPage = () => { options: { toast?: boolean } = {} ) => { const row = rows.value[employeeId] - const dayRow = dayContextByEmployeeId.value.get(employeeId) if (!row?.workHourId && checked) { - const employee = employees.value.find((item) => item.id === employeeId) - const hasAbsence = !!dayRow?.absenceLabel - const canCreateFromAbsence = !!employee && hasAbsence && hasContractAtSelectedDate(employeeId) - - if (canCreateFromAbsence) { + if (canCreateEmptyValidationRow(employeeId)) { await bulkUpsertWorkHours({ workDate: selectedDate.value, entries: [{ @@ -746,13 +743,8 @@ export const useHoursPage = () => { options: { toast?: boolean } = {} ) => { const row = rows.value[employeeId] - const dayRow = dayContextByEmployeeId.value.get(employeeId) if (!row?.workHourId && checked) { - const employee = employees.value.find((item) => item.id === employeeId) - const hasAbsence = !!dayRow?.absenceLabel - const canCreateFromAbsence = !!employee && hasAbsence && hasContractAtSelectedDate(employeeId) - - if (canCreateFromAbsence) { + if (canCreateEmptyValidationRow(employeeId)) { await bulkUpsertWorkHours({ workDate: selectedDate.value, entries: [{ diff --git a/src/State/WorkHourBulkUpsertProcessor.php b/src/State/WorkHourBulkUpsertProcessor.php index 5c6f9ec..97f447c 100644 --- a/src/State/WorkHourBulkUpsertProcessor.php +++ b/src/State/WorkHourBulkUpsertProcessor.php @@ -134,13 +134,15 @@ final readonly class WorkHourBulkUpsertProcessor implements ProcessorInterface continue; } + $is4hContract = 4 === $contract->getWeeklyHours(); + if ($this->isEntryEmpty($normalized)) { // Convention choisie: une ligne vide supprime l'enregistrement existant. if ($existing) { $this->entityManager->remove($existing); ++$result->deleted; - } elseif (($absenceByEmployeeId[$employeeId] ?? false) === true) { - // Si une absence existe ce jour, on garde une ligne technique pour pouvoir valider la journée. + } elseif (($absenceByEmployeeId[$employeeId] ?? false) === true || $is4hContract) { + // Si une absence existe ce jour ou contrat 4h, on garde une ligne technique pour pouvoir valider la journée. $workHour = new WorkHour() ->setEmployee($employee) ->setWorkDate($workDate)