Story CP-001bis : Données de référence pays — Defaults Configuration Présence + Tranches Heures Supplémentaires¶
@assignee: @angeisaac-ui
Module : control-plane Slice : Platform DB reference data (hors architecture initiale — ajout post-décomposition) Contexte de la marque : [LES DEUX] Papillon HR Suite + ALTARYS ENTERPRISE HR Suite Priorité : 1bis (immédiatement après CP-001 — données fondationnelles requises avant toute activation de module) Dépend de : CP-001 (Platform DB initialisée, Flyway opérationnel) Peut être développé en parallèle avec : CP-002, CP-003, CP-004 Complexité estimée : S
Objectif¶
Créer dans la Platform DB les deux tables de référence pays nécessaires à l'initialisation
du module QR Attendance lors de son activation.
Ces tables sont lues par AttendanceModuleActivationListener (QR-004b) au moment de l'événement
ModuleActivated pour seeder les tables tenant correspondantes.
Aucune logique applicative dans ce story : uniquement des migrations Flyway + données de référence CI.
Portée du backend¶
Migrations Flyway (Platform DB uniquement)¶
V003__country_attendance_config_defaults.sql :
-- Valeurs par défaut de configuration du module de présence par pays.
-- Lues par AttendanceModuleActivationListener lors de ModuleActivated(QRCONTR).
-- Copiées dans attendance_module_config (tenant DB) à l'activation.
-- Voir ADR-26.
CREATE TABLE country_attendance_config_defaults (
country_code VARCHAR(3) PRIMARY KEY,
default_late_tolerance_minutes INTEGER NOT NULL DEFAULT 10,
overtime_week_start_day SMALLINT NOT NULL DEFAULT 1,
min_remote_work_advance_days INTEGER NOT NULL DEFAULT 2,
max_remote_work_per_week INTEGER,
max_remote_work_per_month INTEGER,
auto_close_time TIME NOT NULL DEFAULT '23:59:00',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
-- CI defaults (temporairement validés — TV-QR-002, OQ-12)
-- Réf : Code du travail ivoirien
INSERT INTO country_attendance_config_defaults
(country_code, default_late_tolerance_minutes, overtime_week_start_day,
min_remote_work_advance_days, max_remote_work_per_week, max_remote_work_per_month, auto_close_time)
VALUES ('CI', 10, 1, 2, 3, 10, '23:59:00');
V004__country_overtime_band_defaults.sql :
-- Tranches d'heures supplémentaires de référence par pays.
-- Lues par OvertimeBandsInitializer lors de ModuleActivated(QRCONTR).
-- Copiées dans attendance_overtime_config (tenant DB) à l'activation.
-- Voir ADR-26.
CREATE TABLE country_overtime_band_defaults (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
country_code VARCHAR(3) NOT NULL,
band_code VARCHAR(20) NOT NULL,
weekly_threshold_start DECIMAL,
weekly_threshold_end DECIMAL,
night_start_time TIME,
night_end_time TIME,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE(country_code, band_code)
);
-- CI overtime bands (temporairement validés — TV-QR-002, OQ-12)
-- Réf : Code du travail ivoirien, Art. 21.2-21.3
INSERT INTO country_overtime_band_defaults
(country_code, band_code, weekly_threshold_start, weekly_threshold_end, night_start_time, night_end_time)
VALUES
('CI', 'BAND_1', 40, 46, null, null),
('CI', 'BAND_2', 46, 48, null, null),
('CI', 'BAND_3', 48, null, null, null),
('CI', 'NIGHT', null, null, '21:00', '05:00'),
('CI', 'SUNDAY_HOLIDAY', null, null, null, null);
Entités (Platform DB — lecture seule pour les modules applicatifs)¶
Ces tables sont dans la Platform DB et accédées via @Qualifier("platformJdbcClient").
Elles ne sont pas modifiables par les tenants.
Aucune entité Java dans ce story — les records de lecture sont définis dans QR-004b.
Composants frontend¶
Aucun — story purement infrastructure.
Critères d'acceptation¶
AC-001: Tables créées dans la Platform DB
Given the application starts with Flyway configured with locations("classpath:db/migration")
When V003 and V004 migrations are applied
Then country_attendance_config_defaults table exists in platform DB
And country_overtime_band_defaults table exists in platform DB
AC-002: Seed CI présent et correct pour country_attendance_config_defaults
Given V003 migration is applied
When SELECT * FROM country_attendance_config_defaults WHERE country_code = 'CI'
Then row exists with:
default_late_tolerance_minutes = 10
overtime_week_start_day = 1 (Monday)
min_remote_work_advance_days = 2
max_remote_work_per_week = 3
max_remote_work_per_month = 10
auto_close_time = '23:59:00'
AC-003: Seed CI présent et correct pour country_overtime_band_defaults
Given V004 migration is applied
When SELECT * FROM country_overtime_band_defaults WHERE country_code = 'CI' ORDER BY band_code
Then exactly 5 rows exist:
BAND_1: weekly_threshold_start=40, weekly_threshold_end=46
BAND_2: weekly_threshold_start=46, weekly_threshold_end=48
BAND_3: weekly_threshold_start=48, weekly_threshold_end=null
NIGHT: night_start_time='21:00', night_end_time='05:00'
SUNDAY_HOLIDAY: all thresholds null
AC-004: Idempotence Flyway
Given migrations V003 and V004 are applied
When application restarts
Then no error (Flyway checksum validation passes)
And no duplicate data
Règles de validation¶
country_codeest la clé primaire decountry_attendance_config_defaults(une seule ligne par pays)(country_code, band_code)est UNIQUE danscountry_overtime_band_defaults- Ces tables sont en lecture seule pour les modules applicatifs — aucun endpoint de modification exposé dans ce story
- L'ajout d'un nouveau pays (BJ, CM) = nouvelle ligne dans chaque table via migration Flyway dédiée (pas de modification de code)
Considérations relatives au multi-tenant¶
- Tables dans la Platform DB uniquement — pas de tenant_id, pas d'isolation nécessaire
- Données partagées entre tous les tenants (référentiel plateforme)
- Accédées via
@Qualifier("platformJdbcClient")dans les modules applicatifs (ADR-09) - Respecte ADR-03 (Platform DB + Tenant DB separation)
Exigences de test¶
Tests de migration¶
- Flyway applique V003 sans erreur sur une base vide
- Flyway applique V004 sans erreur sur une base vide
- Application redémarre sans erreur après les deux migrations (idempotence Flyway)
Tests d'intégration¶
SELECT COUNT(1) FROM country_attendance_config_defaults WHERE country_code = 'CI'= 1SELECT COUNT(1) FROM country_overtime_band_defaults WHERE country_code = 'CI'= 5- Contrainte UNIQUE respectée : tentative d'INSERT d'un doublon (CI, BAND_1) → erreur SQL
Hors du périmètre¶
- Listener d'initialisation du module attendance (QR-004b)
- Configuration éditable par le tenant (QR-004)
- UI de gestion des données de référence pays (futur — admin console CP-029)
- Ajout des données BJ, CM (Month 9 — expansion pays)
Définition de « Terminé »¶
- [ ] Migration V003 (
country_attendance_config_defaults) appliquée et vérifiée - [ ] Migration V004 (
country_overtime_band_defaults) appliquée et vérifiée - [ ] Seed CI correct pour les deux tables
- [ ] Tests de migration verts (Flyway idempotent, contraintes SQL respectées)
- [ ] Aucun changement de code Java (story 100% SQL)
- [ ] PR mergée avant QR-004b (dependency satisfaite)