Story QR-001 : Squelette du module + Infrastructure de test +¶
@assignee: @m-kouassi
Module d'événements partagés : qr-attendance
Tranche : QR-T0-001 + QR-T0-003.
Contexte de marque : [LES DEUX] Papillon HR Suite + ALTARYS ENTERPRISE HR Suite.
Priorité : 1.
Dépend de : Plan de contrôle (TenantContext, gating des modules).
Peut être développé en parallèle avec : Aucun.
Ordre de fusion : Avant toutes les autres stories QR.
Complexité estimée : S.
PRD User Stories : N/A — Story technique.
Objectif¶
Créer la structure du module Spring Modulith com.altarys.papillon.modules.attendance :
- ajouter les dépendances requises (ZXing pour la génération de QR, Apache POI pour l'exportation vers Excel),
- mettre en place l'infrastructure de test (TestContainers, beans de simulation, fixtures de test)
- et définir des contrats d'événements partagés pour la communication inter-modules.
Il s'agit de la base sur laquelle s'appuieront toutes les stories QR-attendance suivantes.
Portée du backend¶
Entités et enregistrements¶
Enregistrements d'événements partagés (dans com.altarys.papillon.events.attendance) :
// AttendanceRecorded.java
public record AttendanceRecorded(
UUID tenantId,
UUID employeeId,
LocalDate attendanceDate,
String status, // PRESENT, RETARD, ABSENT, etc.
int workedMinutes,
int overtimeMinutes,
OffsetDateTime recordedAt
) {}
// WeeklyOvertimeComputed.java
public record WeeklyOvertimeComputed(
UUID tenantId,
UUID employeeId,
LocalDate weekStartDate,
LocalDate weekEndDate,
int totalWorkedMinutes,
int band1Minutes,
int band2Minutes,
int band3Minutes,
int nightMinutes,
int sundayHolidayMinutes,
int totalOvertimeMinutes,
OffsetDateTime computedAt
) {}
Enregistrement d'événement partagé
(dans com.altarys.papillon.events.holiday) :
// PublicHolidayUpdated.java
public record PublicHolidayUpdated(
String countryCode,
int year,
OffsetDateTime updatedAt
) {}
Migrations Flyway¶
Aucune — cette entité ne crée aucune table de base de données.
Couche de repository¶
Aucune.
Couche de service¶
Aucune — uniquement la structure des paquets et la configuration.
Endpoints API¶
Aucun.
Règles de validation¶
Aucune.
Considérations relatives à la multi-location¶
La classe de configuration du module doit déclarer la limite du module de présence pour Spring Modulith.
Tous les futurs services au sein de ce module accèdent au contexte de tenant via TenantContextHolder.current().
Portée du front-end¶
Aucune — facilitateur technique, backend uniquement.
Critères d'acceptation¶
AC-001: Module compiles and Spring Modulith verifies module boundaries
Given the attendance module package structure is created
When the application starts with `./gradlew bootRun`
Then Spring Modulith detects the attendance module without boundary violations
And the module is registered as an Application Plane module
AC-002: Test infrastructure runs successfully
Given TestContainers is configured for attendance tests
When `./gradlew test` is executed
Then the AttendanceModuleIntegrationTest passes
And shared event records can be instantiated and serialized
¶
AC-001: Module compiles and Spring Modulith verifies module boundaries
Given the attendance module package structure is created
When the application starts with `./gradlew bootRun`
Then Spring Modulith detects the attendance module without boundary violations
And the module is registered as an Application Plane module
AC-002: Test infrastructure runs successfully
Given TestContainers is configured for attendance tests
When `./gradlew test` is executed
Then the AttendanceModuleIntegrationTest passes
And shared event records can be instantiated and serialized
OHADA et règles réglementaires¶
Aucune pour cette épicopée technique.
Normes et conventions¶
docs/standards/java-spring-guidelines.md— Structure des paquets, conventions Spring Modulithdocs/standards/database-guidelines.md— Modèles de conception multi-tenant (référencé pour les épicopées futures)
Exigences de test¶
Tests unitaires¶
- Vérifier que tous les enregistrements d'événements partagés peuvent être instanciés avec des données valides
- Vérifier la sérialisation/désérialisation des enregistrements d'événements (aller-retour JSON)
Tests d'intégration¶
AttendanceModuleIntegrationTest: le contexte Spring se charge avec le module de présence- Test de vérification des limites du module Spring Modulith
- TestContainers PostgreSQL démarre et est accessible
Ce que l'assurance qualité va valider¶
- Sans objet (aucune fonctionnalité destinée aux utilisateurs).
Hors du périmètre¶
- Pas de tables de base de données (chaque story crée ses propres tables)
- Pas d’endpoints API
- Pas de code front-end
- Pas de logique métier
- [ ] Dépendance ZXing ajoutée à
backend/build.gradle - [ ] Dépendance Apache POI ajoutée à
backend/build.gradle - [ ] Enregistrements d'événements partagés créés dans
com.altarys.papillon.events.attendanceetcom.altarys.papillon.events.holiday - [ ]
AttendanceModuleIntegrationTestréussi - [ ] Classe d'aide
AttendanceTestFixturescréée - [ ] La vérification des limites Spring Modulith réussit
- [ ]
./gradlew testest vert - [ ]
./gradlew spotlessApplyréussit