Cas pratique QR-017 : Rapport mensuel de présence +¶
module d'exportation : qr-attendance Tranche : QR-T5-002 + QR-T5-004 Contexte de marque : [LES DEUX] Papillon HR Suite + ALTARYS ENTERPRISE HR Suite Priorité : 17 Dépend de : QR-012 (informations de régularisation dans les rapports) Peut être développé en parallèle avec : QR-018 Ordre de fusion : Avant QR-018 (service d'exportation partagé) Complexité estimée : M PRD User Stories : US-QR-011
Objectif¶
Créer le rapport mensuel de présence pour les employés individuels et les résumés au niveau des services, avec des capacités d'exportation vers Excel (.xlsx) et CSV. Le rapport mensuel des employés présente les détails quotidiens (heures prévues vs heures effectives, statut, heures supplémentaires, anomalies, régularisations) ainsi qu'une ligne de synthèse. Le résumé du service regroupe les statistiques de tous les employés. Les fichiers d'exportation utilisent les conventions de formatage françaises (dates au format JJ/MM/AAAA, heures au format HH:MM, virgule comme séparateur décimal, UTF-8 avec BOM pour le CSV).
Portée du backend¶
Entités et enregistrements¶
Aucune nouvelle table. Utilise les tables existantes DailyAttendance, Clock, RegularizationRequest.
Migrations Flyway¶
Aucune.
Couche de référentiel¶
Aucun nouveau repository. Étend les requêtes existantes sur DailyAttendance.
Couche de service¶
MonthlyAttendanceReportService :
- generateEmployeeReport(tenantId, employeeId, month) :
- Renvoie MonthlyEmployeeReport
- Par ligne (une par jour ouvré) : date, jourDeLaSemaine, débutPrévu, finPrévue, heureD'arrivéeRéelle, heureDeDépartRéelle, minutesTravaillées, statut, minutesDeHeuresSupplémentaires, minutesDeDépartAnticipé, anomalies, régularisationsAppliquées
- Résumé : totalWorkedHours, totalScheduledHours, totalOvertime (par tranche), totalLateCount+minutes, totalEarlyDepartureCount+minutes, totalAbsences, totalTeletravailDays, totalHolidays
DepartmentSummaryReportService :
- generateDepartmentSummary(tenantId, departmentId, month) :
- Renvoie DepartmentSummaryReport
- Par ligne (une par employé) : nom, totalWorkedHours, totalOvertime, totalLateCount, totalEarlyDepartureCount, totalAbsences, totalTeletravail, attendanceRate (%)
ExcelExportService :
- Utilise Apache POI pour générer des fichiers .xlsx
- Format de date français : JJ/MM/AAAA, heure : HH:MM, séparateur décimal : virgule
- En-tête de l'entreprise + titre du rapport dans les premières lignes
- En-têtes stylisées, colonnes à taille automatique
- Entreprise : inclut une ligne de signature en bas
CsvExportService:
- UTF-8 avec BOM (pour la compatibilité Excel avec les caractères français)
- Mêmes conventions de format que Excel (JJ/MM/AAAA, HH:MM, virgule comme séparateur décimal)
- Séparateur point-virgule (norme CSV française)
Endpoints de l'API¶
| Method | Path | Request Body | Response | Auth |
|---|---|---|---|---|
| GET | /api/v1/qrcontr/reports/monthly-attendance |
?employeeId=&month=2026-03 |
ApiResponse<MonthlyEmployeeReport> |
HR, Comptable |
| GET | /api/v1/qrcontr/reports/department-summary |
?departmentId=&month=2026-03 |
ApiResponse<DepartmentSummaryReport> |
HR, Manager (own dept) |
| GET | /api/v1/qrcontr/reports/export |
?type=monthly-attendance&employeeId=&month=&format=xlsx\|csv |
File download (Content-Disposition) | HR, Comptable |
| ### DTO |
« MonthlyEmployeeReport »
:
- « employeeId » (UUID), « employeeName » (chaîne de caractères), « month » (année-mois)
- summary (ReportSummary) : totalWorkedHours, totalScheduledHours, totalOvertimeByBand (Mapdays (List
DepartmentSummaryReport
:
- departmentId (UUID), departmentName (Chaîne), month (AnnéeMois)
- employees (List
Règles de validation¶
- Format
month: AAAA-MM (obligatoire) employeeIdobligatoire pour le rapport de présence mensueldepartmentIdrequis pour le rapport récapitulatif par serviceformatdoit êtrexlsxoucsvpour l'endpoint d'exportation- Le responsable ne peut accéder qu'au récapitulatif de son propre service
Considérations multi-tenant¶
Toutes les requêtes de rapport sont filtrées par tenant_id. Le responsable est limité à son propre service. Les RH et le comptable voient tout ce qui se trouve au sein de la location.
Portée du frontend¶
Pages et routes¶
/qrcontr/reports— Centre des rapports/qrcontr/reports/monthly— Affichage du rapport de présence mensuel/qrcontr/reports/department— Affichage du résumé par service
Composants¶
ReportHubPage
(maquette de conception 3.13) :
- Liens vers le rapport de présence mensuel et le rapport d'heures supplémentaires (QR-018)
MonthlyReportPage
:
- Sélecteur d'employés, sélecteur de mois, fiches récapitulatives, tableau quotidien
DepartmentSummaryPage
:
- Sélecteur de service, sélecteur de mois, tableau récapitulatif des employés
ExportButtons
:
- Boutons d'action flottants « Exporter vers Excel » + « Exporter vers CSV »
- Déclenche le téléchargement dans le navigateur au clic
ReportTable
:
- Tableau défilable avec en-têtes fixes
- Première colonne fixe (date ou nom de l'employé) lors du défilement horizontal
États de l'interface utilisateur¶
| State | Behavior | French Copy |
|---|---|---|
| Loading | Skeleton summary + table | — |
| Empty | No data for period | "Aucune donnee pour la periode selectionnee." |
| Error | Inline retry | "Impossible de generer le rapport. Reessayez." |
| Offline | Cached summaries only, full report requires server | "Rapport complet disponible en ligne uniquement." |
| Success | Summary cards + detailed table | — |
Comportement adaptatif¶
- 360px : tableau à défilement horizontal (3 colonnes visibles), boutons d'exportation en bas
- 768px : 5 colonnes visibles, boutons d'exportation en bas
- 1024px+ : tableau complet avec toutes les colonnes, boutons d'exportation dans la barre d'outils
Interactions¶
- Sélecteurs d'employé/service/mois : composants de menu déroulant/sélecteur
- Tableau : défilement horizontal sur mobile, première colonne fixe
- Exportation : déclenche le téléchargement dans le navigateur. Indicateur de chargement sur le bouton pendant la génération.
- Entreprise : le fichier Excel inclut l'en-tête de l'entreprise et la ligne de signature
Critères d'acceptation¶
```gherkin AC-001: Monthly employee attendance sheet Given I select an employee and a month When I generate the report Then I see for each day: scheduled hours, actual clock-in, actual clock-out, worked hours, status, overtime hours, early departures, anomalies, regularizations applied And a summary row with: total worked hours, total overtime (by band), total late arrivals (count + minutes), total early departures, total absences, total teletravail days
AC-002: Department summary report Given I select a department and a month When I generate a department summary Then I see aggregated stats across all employees in that department
AC-003: Report export to Excel and CSV Given I generate any report When I click export Then I can download it as Excel (.xlsx) or CSV (.csv) with French date/time/decimal formatting ```---
OHADA et règles réglementaires¶
- FR-QR-113 : encodage CSV UTF-8 avec BOM, dates au format JJ/MM/AAAA, heures au format HH:MM, décimales séparées par une virgule
- Les rapports respectent l'obligation de conservation pendant 10 ans (TV-QR-003)
- Les rapports alimentent le rapprochement de la paie (accès comptable)
- Les registres de présence constituent une preuve légale en cas de litige du travail
Normes et conventions¶
docs/standards/java-Spring-guidelines.mddocs/standards/api-guidelines.mddocs/standards/react-typescript-guidelines.md
Exigences de test¶
Tests unitaires¶
MonthlyAttendanceReportService: calcul du rapport mensuel (totaux récapitulatifs, enregistrements journaliers)DepartmentSummaryReportService: agrégation par service (statistiques par employé, taux de présence)ExcelExportService: format de date français (JJ/MM/AAAA), format d'heure (HH:MM), séparateur décimal par virguleCsvExportService: présence d'un BOM UTF-8, délimiteur point-virgule, formatage français
Tests d'intégration¶
- GET
/reports/monthly-attendance?employeeId=&month=→ données du rapport correctes - GET
/reports/department-summary?departmentId=&month=→ résumé correct - GET
/reports/export?type=monthly-attendance&format=xlsx→ téléchargement du fichier avec le type de contenu correct - GET
/reports/export?type=monthly-attendance&format=csv→ téléchargement du fichier avec BOM - Non-RH/Comptable → 403
- Manager accédant à un autre service → 403
- Isolation des locataires vérifiée
Ce que l'assurance qualité va valider¶
- Générer le rapport mensuel, vérifier l'exactitude des données par rapport aux données de présence connues
- Générer le résumé du service, vérifier l'agrégation
- Télécharger le fichier Excel, l'ouvrir dans Excel, vérifier la mise en forme en français
- Télécharger le fichier CSV, l'ouvrir dans Excel, vérifier que les caractères français s'affichent correctement (BOM)
- Comportement réactif du tableau à tous les points de rupture
- Hors ligne : affichage du résumé mis en cache, le rapport complet affiche un message « en ligne uniquement »
Hors périmètre¶
- Rapport sur les heures supplémentaires (QR-018)
- Exportation au format PDF (Enterprise V2)
- Rapports cumulés depuis le début de l'année (V2)
- Envoi par e-mail/planification de rapports (V2)
Définition de « Terminé »¶
- [ ] Les endpoints de génération de rapports renvoient des données correctes
- [ ] L'exportation vers Excel avec Apache POI fonctionne correctement
- [ ] L'exportation CSV avec BOM UTF-8 fonctionne correctement
- [ ] Mise en forme française appliquée (JJ/MM/AAAA, HH:MM, décimales séparées par une virgule)
- [ ] La page centrale des rapports contient des liens vers tous les types de rapports
- [ ] L'affichage des rapports s'adapte à tous les points de rupture (360px, 768px, 1024px)
- [ ] Les 5 états de l'interface utilisateur sont implémentés (chargement, vide, erreur, hors ligne, succès)
- [ ] Les micro-textes en français correspondent exactement aux spécifications de conception
- [ ] Tous les critères d'acceptation sont satisfaits manuellement
- [ ] Tests unitaires écrits et réussis
- [ ] Tests d'intégration écrits et réussis
- [ ] Isolation multi-tenant vérifiée
- [ ] Pas de
anyen TypeScript, pas de types bruts en Java - [ ] Les réponses API respectent le format d'enveloppe standard
- [ ]
./gradlew testest vert - [ ]
./gradlew spotlessApplyréussit