Retour RH: vue jour par date, RTT mi-semaine, récap salaire & exports, panier de nuit (#21)
Auto Tag Develop / tag (push) Successful in 11s
Auto Tag Develop / tag (push) Successful in 11s
## Correctifs RH (branche fix/retour-rh) ### Vue Jour (Heures) - Mode saisie/présence, libellé de contrat et sauvegarde résolus **à la date affichée** (et non au contrat courant). Corrige les salariés passés 39h/35h → Forfait. ### RTT — heures supplémentaires - Proratisation du **plafond 25%/50%** pour les embauches en milieu de semaine (la bande +25% se décale au lieu de rester bloquée à 43h). Témoin Dylan : 4h à 25% + 3h à 50%. ### Récap salaire (PDF mensuel) - Forfait : congés imputés **N-1** non affichés et comptés en présence. - Colonne « Heures payés » **scindée 25% / 50%** (en-tête fusionné). - **Exclusion des salariés sans contrat** sur le mois (ex. Marine, contrat terminé). ### Exports heures annuelles (par salarié + tous) - **Tous les jours sous contrat** affichés, même vides/non saisis (corrige les lignes manquantes). - Samedis/dimanches en **gris plus foncé**. ### Panier de nuit - **Ne s'applique pas aux conducteurs** (vue semaine + récap salaire). ## Tests - 11 tests ajoutés. Suite verte hors un test legacy pré-existant dépendant de la date (`EmployeeRttSummaryProviderTest::testNoQueryParamsKeepsLegacyYearDefaulting`, non modifié par cette branche). ## À noter (hors scope) - L'export heures annuelles *tous salariés* peut dépasser `memory_limit=256M` (Dompdf) — limitation **pré-existante**, non corrigée ici. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #21 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #21.
This commit is contained in:
@@ -350,11 +350,30 @@ export const useHoursPage = () => {
|
||||
updatedAt: null
|
||||
})
|
||||
|
||||
const isPresenceTracking = (employee: Employee) => employee.contract?.trackingMode === TRACKING_MODES.PRESENCE
|
||||
// Résout le contrat à la date affichée (ligne du jour), avec repli sur le contrat courant.
|
||||
const resolveDayContract = (employee: Employee) => {
|
||||
const dayRow = dayContextByEmployeeId.value.get(employee.id)
|
||||
if (dayRow?.hasContractAtDate) {
|
||||
return {
|
||||
trackingMode: dayRow.trackingMode ?? null,
|
||||
weeklyHours: dayRow.weeklyHours ?? null,
|
||||
type: dayRow.contractType ?? null,
|
||||
name: dayRow.contractName ?? ''
|
||||
}
|
||||
}
|
||||
return {
|
||||
trackingMode: employee.contract?.trackingMode ?? null,
|
||||
weeklyHours: employee.contract?.weeklyHours ?? null,
|
||||
type: employee.contract?.type ?? null,
|
||||
name: employee.contract?.name ?? ''
|
||||
}
|
||||
}
|
||||
|
||||
const isPresenceTracking = (employee: Employee) => resolveDayContract(employee).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
|
||||
return employee ? resolveDayContract(employee).weeklyHours === 4 : false
|
||||
}
|
||||
const isRowLocked = (employeeId: number) => {
|
||||
const row = rows.value[employeeId]
|
||||
@@ -365,8 +384,8 @@ export const useHoursPage = () => {
|
||||
}
|
||||
|
||||
const contractLabel = (employee: Employee) => {
|
||||
const contract = employee.contract
|
||||
if (!contract) return '-'
|
||||
const contract = resolveDayContract(employee)
|
||||
if (!contract.type && !contract.name) return '-'
|
||||
if (contract.type === CONTRACT_TYPES.INTERIM) {
|
||||
return contract.name
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user