Cas QR-015 :¶
Module d'approbation du télétravail + gestion du statut du jour : qr-attendance Tranche : QR-T4-002 (partiel : approbation + statut du jour) Contexte de la marque : [LES DEUX] Papillon HR Suite + ALTARYS ENTERPRISE HR Suite Priorité : 15 Dépend de : QR-014 (les demandes existent) Peut être développé en parallèle avec : QR-013 Ordre de fusion : Après QR-014 Complexité estimée : M PRD User Stories : US-QR-007 (AC-004, AC-005)
Objectif¶
Mettre en œuvre le workflow d'approbation par le responsable/les RH pour les demandes de télétravail et la logique de gestion du statut le jour même. Lorsqu'une demande de télétravail est approuvée, le statut DailyAttendance de l'employé est défini sur TELETRAVAIL et les heures prévues sont automatiquement créditées (aucun scan QR n'est attendu). Si une demande est toujours en attente (PENDING) lorsque le jour arrive, l'employé est marqué de manière prudente comme ABSENT_PENDING. Une approbation rétroactive corrige le statut avec une piste d'audit complète.
Portée du backend¶
Entités et enregistrements¶
Aucune nouvelle table. Étend RemoteWorkService et DailyAttendanceService des stories précédentes.
Migrations Flyway¶
Aucune.
Couche de référentiel¶
Aucun nouveau repository. Utilise les référentiels existants RemoteWorkRepository et DailyAttendanceRepository.
Couche de service¶
RemoteWorkService.approve(id, approverId) :
- Définit status=APPROVED, approvedBy, approvedAt
- Appelle DailyAttendanceService pour définir le statut de la journée = TELETRAVAIL
- Crédite automatiquement les heures prévues (pas d'heures supplémentaires)
- Aucun scan QR prévu pour la journée
- Envoie une notification à l'employé : « Votre demande de télétravail a été approuvée. »
RemoteWorkService.reject(id, rejecterId, reason) :
- Définit status=REJECTED, rejectionReason
- Envoie une notification à l'employé avec le motif du refus : « Votre demande de télétravail a été refusée. Motif : {reason} »
Gestion du statut du jour (intégration par lots avec NoShowDetectionService de QR-009) :
- Si télétravail APPROUVÉ pour la date → DailyAttendance.status = TELETRAVAIL, minutes prévues créditées
- Si EN ATTENTE le jour même → DailyAttendance.status = ABSENT_PENDING (« Absent en attente de validation »)
- Si l'approbateur approuve rétroactivement après le jour → le statut passe de ABSENT_PENDING à TELETRAVAIL, les heures sont créditées
- Envoie une notification à l'approbateur lorsque la demande est en retard (request_date = aujourd'hui et statut toujours PENDING)
Endpoints API¶
| Method | Path | Request Body | Response | Auth |
|---|---|---|---|---|
| POST | /api/v1/qrcontr/remote-work/{id}/approve |
— | ApiResponse<RemoteWorkResponse> |
Manager (N+1), HR |
| POST | /api/v1/qrcontr/remote-work/{id}/reject |
{reason: string} |
ApiResponse<RemoteWorkResponse> |
Manager (N+1), HR |
| ### DTO |
Réutilise RemoteWorkResponse de QR-014.
RejectRemoteWorkRequest
:
- reason (chaîne de caractères, obligatoire)
Règles de validation¶
- Approuver/refuser : uniquement les demandes en attente (PENDING)
- Refuser : le motif est obligatoire
- Seuls le responsable (N+1 de l'employé) ou les RH peuvent approuver/refuser
- Approbation rétroactive : autorisée — la correction du statut fait l'objet d'un audit
Considérations multi-tenant¶
Toutes les requêtes sont filtrées par tenant_id. Le responsable ne peut approuver/rejeter que les demandes de ses subordonnés directs. Les RH peuvent approuver/rejeter toute demande au sein du tenant.
Portée du frontend¶
Pages et routes¶
Aucune nouvelle route. Étend la page d'approbation de QR-012.
Composants¶
TeletravailApprovalCard
:
- Affiché dans la liste des approbations sous l'onglet « Télétravail »
- Affiche : nom de l'employé, date, motif (si fourni), avertissement de limite (le cas échéant)
- Boutons Approuver/Rejeter
- Indicateur de retard : badge orange « ! Demande pour aujourd’hui » sur les fiches où request_date = aujourd’hui
. Prolonge ApprovalPage
(de QR-012) :
- Ajoute un onglet/filtre « Télétrois » à côté des demandes de régularisation
TeletravailCalendar
(de QR-014) :
- Les demandes approuvées sont désormais signalées par des points verts (au lieu de l’icône orange « en attente »)
États de l’interface utilisateur¶
| State | Behavior | French Copy |
|---|---|---|
| Loading | Skeleton cards | — |
| Empty | No pending teletravail requests | "Aucune demande de teletravail en attente." |
| Error | Inline retry | "Impossible de charger les demandes. Reessayez." |
| Offline | Cached requests, approve/reject queued | "Actions sauvegardees — seront synchronisees." |
| Success (approve) | Green flash → card slides out | "Teletravail approuve pour {date}." |
| Success (reject) | Red flash → card slides out | "Demande refusee." |
Comportement adaptatif¶
Identique à la page de validation QR-012 : - 360px : cartes de validation en pleine largeur, gestes de balayage - 768px : cartes avec plus de détails - 1024px et plus : affichage en deux volets avec liste et panneau de détails
Interactions¶
- Mêmes gestes de balayage pour approuver/refuser que pour la régularisation (QR-012)
- Le refus nécessite une justification dans une boîte de dialogue contextuelle
- Annuler : fenêtre contextuelle de 5 secondes après l'approbation/le refus
- Indicateur de retard : badge orange sur les cartes où request_date = aujourd'hui
Critères d'acceptation¶
```gherkin AC-001: Approved teletravail credits hours Given my teletravail request is approved When the day arrives Then my status on the dashboard is "Teletravail", no QR scan is expected, and scheduled hours are credited automatically
AC-002: Pending teletravail on day-of marks absent pending Given my request is still PENDING when the day arrives When the system evaluates my status Then I am marked as "Absent en attente de validation" (conservative approach) ```---
OHADA et règles réglementaires¶
- Une approche prudente (ABSENT_PENDING) préserve l'intégrité du registre des présences de l'employeur
- L'approbation rétroactive corrige le statut avec une piste d'audit complète
- Tous les changements de statut sont consignés à des fins de conformité réglementaire
Normes et conventions¶
docs/standards/java-spring-guidelines.mddocs/standards/api-guidelines.mddocs/standards/react-typescript-guidelines.mddocs/standards/offline-sync-guidelines.md
Exigences de test¶
Tests unitaires¶
RemoteWorkService.approve: définit status=APPROVED, DailyAttendance.status=TELETRAVAIL, minutes prévues créditéesRemoteWorkService.reject: définit status=REJECTED, notification envoyée avec la raison- Traitement le jour même : PENDING le jour même → ABSENT_PENDING
- Approbation rétroactive : ABSENT_PENDING → TELETRAVAIL, heures créditées
- Notification de retard : déclenchée lorsque request_date = aujourd'hui et status = PENDING
Tests d'intégration¶
- POST
/remote-work/{id}/approve→ 200 APPROVED, DailyAttendance mis à jour - POST
/remote-work/{id}/reject→ 200 REJETÉ avec justification - POST
/remote-work/{id}/approveavec un utilisateur non-manager → 403 - POST
/remote-work/{id}/rejectsans justification → 400 - Approbation rétroactive : le statut de DailyAttendance change correctement
- Isolation des tenants vérifiée
Ce que le contrôle qualité va valider¶
- Flux d'approbation complet : demande → approuver → le tableau de bord affiche TÉLÉTRAVAIL
- Flux de rejet : demande → rejeter → l'employé est informé avec la raison
- Vérifier le statut du tableau de bord pour le télétravail approuvé (aucun scan QR attendu)
- Vérifier ABSENT_PENDING pour les demandes en attente le jour même
- L'approbation rétroactive corrige le statut
- Gestes de balayage pour approuver/rejeter sur mobile
- Annuler la fenêtre contextuelle (5 secondes)
- Hors ligne : approbation/rejet mis en file d'attente et synchronisés
Hors périmètre¶
- Création de la demande (QR-014)
- Intégration au tableau de bord du nombre de télétravails (déjà dans QR-009)
- Approbation groupée (V2)
Définition de « Terminé »¶
- [ ] Endpoints d'approbation/rejet implémentés et renvoyant des réponses correctes
- [ ] Statut DailyAttendance mis à jour correctement lors de l'approbation
- [ ] Heures planifiées créditées lors de l'approbation (pas d'heures supplémentaires)
- [ ] ABSENT_PENDING défini pour les demandes en attente le jour même
- [ ] L'approbation rétroactive corrige le statut avec piste d'audit
- [ ] Cartes d'approbation affichées sur la page d'approbation sous l'onglet télétravail
- [ ] Les 5 états de l'interface utilisateur sont implémentés (chargement, vide, erreur, hors ligne, succès)
- [ ] Le micro-copy en français correspond exactement aux spécifications de conception
- [ ] Tous les critères d'acceptation sont validés manuellement
- [ ] Les tests unitaires sont écrits et réussis
- [ ] Les tests d'intégration sont écrits et réussis
- [ ] Isolation multi-tenant vérifiée
- [ ] Hors ligne : approbation/rejet mis en file d'attente et synchronisés
- [ ] Entrées de piste d'audit pour toutes les actions d'approbation/de rejet
- [ ] 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