- Add database columns for last_employer_notification_at and last_employee_notification_at in cddu_contracts
- Update all email sending endpoints to record timestamps (remind-employer, relance-salarie, docuseal-signature, signature-salarie)
- Create smart reminder system with 24h cooldown to prevent spam
- Add progress tracking modal with real-time status (pending/sending/success/error)
- Display actual employer/employee email addresses in reminder modal
- Show notification timestamps in contracts grid with color coding (green/orange/red based on contract start date)
- Change employer email button URL from DocuSeal direct link to /signatures-electroniques
- Create /api/staff/organizations/emails endpoint for bulk email fetching
- Add retroactive migration script for historical email_logs data
- Update Contract TypeScript type and API responses to include new fields
- Remplace la colonne Actions par une colonne Notif. affichant les dernières notifications
- Affiche E: pour employeur et S: pour salarié avec date/heure
- Code couleur basé sur la date de début du contrat:
* Vert si début > 48h
* Orange si début < 48h
* Rouge si début aujourd'hui ou passé
- Utilise la table email_logs existante (aucune migration nécessaire)
- Récupération automatique via supabase client des emails de type signature-request
- Filtre par Déclarée FTS (Toutes/Oui/Non)
- Filtre par Type de prod (Tous/Spectacle vivant/Audiovisuelle/Phonographique/Administratif)
- Filtre par Année (années disponibles dans les données)
- Filtre par Mois (janvier à décembre)
- Compteur de filtres actifs dans le badge
- Réinitialisation de tous les filtres en un clic
- Layout responsive en grille 4 colonnes pour les filtres
- Tri par défaut : date de déclaration (plus récent au plus ancien)
- Colonnes triables : Nom, Numéro d'objet, Date déclaration
- Indicateurs visuels de tri (flèches haut/bas)
- Clic sur header de colonne pour trier/inverser
- Numéro d'objet : style monospace compact sur une seule ligne
- Hover sur headers cliquables pour meilleure UX
- Suppression de la génération automatique de faux numéros d'objet
- Le numéro d'objet reste null si non fourni (fourni par France Travail)
- Suppression de la date de déclaration automatique
- Ajout du champ 'Déclarée FTS' (Oui/Non) dans productions
- Ajout de la colonne 'Déclarée FTS' dans le tableau de gestion
- Ajout du select 'Déclarée FTS' dans les modals de création/modification
- Mise à jour des routes API pour gérer declared_fts
- Badge vert pour Oui, gris pour Non dans l'affichage
SQL à exécuter dans Supabase:
ALTER TABLE productions ADD COLUMN declared_fts BOOLEAN DEFAULT false;
UPDATE productions SET declared_fts = true WHERE created_at < '2025-10-01';
UPDATE productions SET declared_fts = false WHERE created_at >= '2025-10-01' OR created_at IS NULL;
- Ajout du type ProductionType avec 4 choix (Spectacle vivant, Production audiovisuelle, Production phonographique, Administratif)
- Ajout du champ prod_type dans le type Production
- Ajout du select Type de prod dans les modals de création/modification
- Ajout de la colonne Type de prod dans le tableau avec badges colorés
- Mise à jour des routes API POST et PATCH pour gérer prod_type
- Validation des types de production côté backend
- Renommage de Référence en Numéro d'objet
- organization_id -> org_id
- api_name -> name (puis slugification)
- Ajouter logs détaillés pour debug
- Améliorer la gestion des cas où org_id est null
- Création de l'API route /api/staff/contrats/[id]/upload-signed-pdf
- Accepte un fichier PDF via FormData
- Stocke le PDF dans S3 avec la clé contracts/<org-slug>/<contract_number>.pdf
- Met à jour contract_pdf_s3_key et contrat_signe='Oui' dans la BDD
- Création du composant ManualSignedContractUpload
- Modal avec drag & drop pour sélectionner un PDF
- Validation du type de fichier et de la taille (max 10 Mo)
- Feedback visuel de l'upload (loading, succès)
- Intégration dans ContractEditor
- Ajout du bouton d'upload dans la section Documents
- Invalidation de la query après upload pour rafraîchir automatiquement
- Affichage du contrat uploadé comme ceux signés via Docuseal
Permet de gérer les contrats signés reçus par email ou autre moyen externe
- Ajout colonne employee_docuseal_slug dans cddu_contracts
- Stockage automatique du slug lors de création signature DocuSeal
- Recherche directe par slug (+ rapide et fiable)
- Bypass mode maintenance en localhost
- Scripts de migration pour contrats existants (92 contrats migrés)
- Logs détaillés dans verify-birthdate et check-status
Fixes: Erreur 'Document introuvable' pour contrats anciens
Performance: O(n) -> O(1) avec index sur employee_docuseal_slug
- Ajouter type_de_contrat dans relance-salarie pour afficher CDDU/RG
- Récupérer nom organisation depuis DB plutôt que payload Lambda
- Éviter confusion entre productionName et organizationName
- Améliorer logs pour debugging
- Ajouter selectedOrgId à la dépendance du useEffect des listeners
- Éviter la réutilisation d'anciens handlers qui capturaient une valeur vide
- Les modales rechargent maintenant correctement les données avec l'orga sélectionnée
Le problème était que new Date(year, month, day) crée une date en heure locale,
tandis que minDate/maxDate viennent du serveur en UTC. Cela causait un décalage
d'un jour (ex: 02/10 en début, 04/10 en fin → affichait 03, 04, 05 en sélectionnables).
Solution: Utiliser Date.UTC() pour créer toutes les dates en UTC, ce qui garantit
la cohérence entre les comparaisons de dates ISO.
Affecte:
- handleDateClick() : utilise Date.UTC pour créer isoStr
- isDateSelected() : utilise Date.UTC
- isDateDisabled() : utilise Date.UTC
- Création de /lib/dateFormatter.ts avec utilities de parsing/formatting des dates
* Parsing format input (DD/MM) en ISO (YYYY-MM-DD)
* Groupement automatique des dates consécutives
* Formatage smart: 'le xx/xx' pour isolées, 'du xx/xx au xx/xx' pour plages
* Détection automatique du multi-mois
* Format pour PDFMonkey: 'le 12/10 ; du 14/10 au 17/10.'
- Création de /components/DatePickerCalendar.tsx
* Composant modal draggable et multi-select
* Prévisualisation du formatage PDFMonkey
* Limites de plage (minDate/maxDate)
* Warning multi-mois
* Retour des données au format input et pdfFormatted
- Intégration dans /components/contrats/NouveauCDDUForm.tsx
* Remplacement des inputs texte par calendriers pour dates_representations, dates_repetitions, jours_travail
* Auto-détection multi-mois et set isMultiMois = 'Oui' si >1 mois
* Pré-remplissage du calendrier lors de la duplication
* Affichage lisible du formatage smart
- Intégration dans /components/staff/contracts/ContractEditor.tsx
* Ajout du calendrier pour zone 'Dates travaillées'
* Affichage du format smart au lieu du texte brut
Closes #calendar-dates-picker
- Déplacer fetchEmployerEmails à l'intérieur du useEffect
- Éviter les problèmes de dépendances et de recréation de fonction
- Résoudre l'erreur React #310
- Modification des dépendances du useEffect pour éviter la boucle infinie
- Garder uniquement 'isOpen' comme dépendance pour éviter de re-charger à chaque changement de selectedContracts
- selectedContracts.length est vérifié dans le corps de l'effet
- Ajout du champ adresse_mail dans le type Contract
- Récupération des emails des salariés depuis la relation salaries
- Récupération des emails des employeurs via l'API /api/informations
- Affichage en temps réel des emails dans le modal avec couleur d'alerte si vide
- Amélioration de la vérification avant d'envoyer les signatures
- Suppression de la phrase redondante 'Envoyer un email à l'employeur et au salarié pour chaque contrat'
- Ajout d'une section récapitulatif des destinataires avec liste des contrats
- Affichage de l'adresse email du salarié et de l'employeur pour vérification
- Augmentation de la largeur du modal pour une meilleure lisibilité
- Design moderne et cohérent avec l'UI de l'Espace Paie
- Suppression de la réinitialisation automatique de la sélection au changement de données
- Conservation de la sélection après les modifications DPAE, État Contrat, État Paie, Saisir brut et e-signatures
- Permet à l'utilisateur d'effectuer plusieurs actions groupées sans devoir resélectionner les contrats
- La suppression continue de réinitialiser la sélection car les contrats supprimés n'existent plus
Le composant Th n'acceptait pas la prop onClick, empêchant l'activation
du tri lors du clic sur les headers. Correction: ajouter onClick à la
déstructuration et le passer à l'élément <th>.