✨ 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
56 lines
1.9 KiB
PL/PgSQL
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';
|