espace-paie-odentas/migrations/add_salaires_par_date_column.sql
odentas 31459f3c10 feat: Ajout fonctionnalité salaires par date avec JSONB
 Nouvelle fonctionnalité
- Ajout mode 'Saisir le salaire par date' dans création de contrat
- Interface de saisie compacte et moderne par représentation/répétition/jour
- Stockage en JSONB dans colonne salaires_par_date
- Affichage détaillé dans contrats/[id] et staff/contrats/[id]

🗄️ Base de données
- Migration SQL : ajout colonne salaires_par_date JSONB
- Index GIN pour requêtes performantes sur JSONB
- Index partial sur le champ mode
- Fonction de validation validate_salaires_par_date()

🎨 Interface utilisateur
- Design en ligne (inline) au lieu de tableau traditionnel
- Labels courts (R1, R2 pour représentations, S1, S2 pour services)
- Cartes par catégorie avec codes couleur (indigo/purple/green)
- Calculatrice et Minima accessibles dans les deux modes
- Calculatrice désactivée en mode par_date (pas de champ unique)
- Minimum conventionnel retiré du menu déroulant en mode par_date
- Calcul automatique du total

💻 Code
- Types TypeScript : SalaireParDate avec interfaces complètes
- Fonction convertSalariesByDateToJSON() pour conversion formulaire → JSONB
- Validation adaptée selon le mode (global vs par_date)
- API /api/cddu-contracts : support du champ salaires_par_date
- API /api/contrats/[id] : retour du champ salaires_par_date
- Contournement temporaire de la RPC pour utiliser service_role

📝 Fichiers modifiés
- migrations/add_salaires_par_date_column.sql (nouveau)
- types/salaires.ts (nouveau)
- components/contrats/NouveauCDDUForm.tsx
- app/api/cddu-contracts/route.ts
- app/api/contrats/[id]/route.ts
- app/(app)/contrats/[id]/page.tsx
- components/staff/contracts/ContractEditor.tsx
2025-10-29 23:12:15 +01:00

56 lines
1.9 KiB
PL/PgSQL

-- Migration: Ajouter colonne salaires_par_date pour la saisie par date/représentation/répétition
-- Date: 2025-10-29
-- Description: Permet aux clients de saisir des salaires différenciés par date/événement
-- Ajouter la colonne JSONB
ALTER TABLE cddu_contracts
ADD COLUMN IF NOT EXISTS salaires_par_date JSONB;
-- Ajouter un commentaire explicatif
COMMENT ON COLUMN cddu_contracts.salaires_par_date IS
'Structure JSONB pour les salaires détaillés par date/représentation/répétition.
Format: {
"mode": "par_date",
"type_salaire": "Brut|Net avant PAS|Coût total employeur",
"representations": [{
"date": "2025-11-15",
"date_display": "15/11",
"items": [{"index": 1, "montant": 250.00}]
}],
"repetitions": [{
"date": "2025-11-10",
"date_display": "10/11",
"items": [{"index": 1, "montant": 150.00, "duree": 4}]
}],
"jours_travail": [{
"date": "2025-11-05",
"date_display": "05/11",
"montant": 180.00,
"heures": 8
}],
"total_calcule": 1130.00
}';
-- Créer un index GIN pour requêtes performantes sur le JSONB
CREATE INDEX IF NOT EXISTS idx_cddu_contracts_salaires_par_date
ON cddu_contracts USING GIN (salaires_par_date);
-- Créer un index partiel pour les contrats utilisant le mode par_date
CREATE INDEX IF NOT EXISTS idx_cddu_contracts_salaires_par_date_mode
ON cddu_contracts ((salaires_par_date->>'mode'))
WHERE salaires_par_date IS NOT NULL;
-- Fonction helper pour valider la structure JSONB (optionnel, pour validation future)
CREATE OR REPLACE FUNCTION validate_salaires_par_date(data JSONB)
RETURNS BOOLEAN AS $$
BEGIN
-- Vérifier que le mode existe
IF data ? 'mode' THEN
RETURN data->>'mode' IN ('global', 'par_date');
END IF;
RETURN TRUE; -- NULL est valide
END;
$$ LANGUAGE plpgsql IMMUTABLE;
COMMENT ON FUNCTION validate_salaires_par_date IS
'Valide la structure du JSONB salaires_par_date';