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

## 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:
2026-06-02 06:26:40 +00:00
committed by Autin
parent 8b34a429cc
commit a41bd632cf
21 changed files with 933 additions and 42 deletions
@@ -411,6 +411,35 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface
return null !== $balance ? $balance->getPaidLeaveDays() : 0.0;
}
/**
* Budget N-1 = nombre de jours de congé pris imputés sur le stock de l'année précédente,
* pour l'exercice de l'année donnée. Reproduit exactement la dérivation de provide()
* (phase courante + recalcul avec les jours payés) afin que les consommateurs externes
* (ex. récap salaire) voient le même budget que la fiche employé. 0 si non supporté.
*/
public function resolvePreviousYearTakenDays(Employee $employee, int $year): float
{
$phase = $this->resolveCurrentPhase($employee);
if (null === $phase) {
return 0.0;
}
$summary = $this->computeYearSummary($employee, $year, 0.0, null, $phase);
if (null === $summary) {
return 0.0;
}
$paidLeaveDays = $this->resolvePaidLeaveDays($employee, $summary['ruleCode'], $year);
if ($paidLeaveDays > 0.0) {
$summary = $this->computeYearSummary($employee, $year, $paidLeaveDays, null, $phase);
if (null === $summary) {
return 0.0;
}
}
return (float) $summary['previousYearTakenDays'];
}
private function resolveEffectivePeriodStart(
Employee $employee,
DateTimeImmutable $from,