# Contingent d'heures supplémentaires payées ## Objectif Suivre, par année civile (Janv–Déc), les heures supplémentaires payées de chaque employé non-forfait (chauffeurs inclus) face au plafond légal annuel. ## Règles - **Heures payées** = `base25 + base50` (en minutes), hors majoration (bonus). - **Plafond** : 350 h pour les chauffeurs (contrat courant `isDriver`), 220 h sinon. - **Périmètre** : non-forfait uniquement (FORFAIT exclus, ni RTT ni heures supp payées). ## Mapping exercice → année civile Les paiements RTT (`EmployeeRttPayment`) sont stockés par **exercice** (`year` = Juin N-1 → Mai N) + `month` (1–12). L'année civile d'un paiement : annéeCivile = month >= 6 ? exerciseYear - 1 : exerciseYear Donc l'année civile **Y** agrège : exercice `Y` (mois 1–5) + exercice `Y+1` (mois 6–12). ## Implémentation - Cœur partagé : `App\Service\WorkHours\OvertimePaidContingentCalculator` (pur). - Repo : `EmployeeRttPaymentRepository::findByEmployeesAndYears`. - Fiche employé : `GET /employees/{id}/overtime-contingent?year=YYYY` → encart header (`Total H.payés {année} : X h / plafond h`, rouge si dépassement, année civile courante). - Export PDF : `GET /overtime-contingent/print?year=&siteIds=` (`ROLE_USER`, périmètre `findScoped`), groupé par site (`displayOrder`), tri `displayOrder → nom → prénom`, colonnes Janv–Déc + colonne `Total payé / payable`. Builder `OvertimeContingentExportBuilder`, template `overtime-contingent/print.html.twig`. ## Hors périmètre / connu - Bug latent récap salaire : `SalaryRecapPrintProvider` requête `findByYearAndMonth` avec l'année civile alors que le stockage est par exercice (mauvais rattachement des paiements des mois Juin–Déc sur le récap mensuel). À corriger séparément.