Aller au contenu

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_code est la clé primaire de country_attendance_config_defaults (une seule ligne par pays)
  • (country_code, band_code) est UNIQUE dans country_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' = 1
  • SELECT 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)