Aller au contenu

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.md
  • docs/standards/api-guidelines.md
  • docs/standards/react-typescript-guidelines.md
  • docs/standards/offline-sync-guidelines.md

Exigences de test

Tests unitaires

  • RemoteWorkService.approve : définit status=APPROVED, DailyAttendance.status=TELETRAVAIL, minutes prévues créditées
  • RemoteWorkService.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}/approve avec un utilisateur non-manager → 403
  • POST /remote-work/{id}/reject sans 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 any en TypeScript, pas de types bruts en Java
  • [ ] Les réponses API respectent le format d'enveloppe standard
  • [ ] ./gradlew test est vert
  • [ ] ./gradlew spotlessApply réussit