- 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>.
- Ajouter les états sortField et sortOrder au composant PageContrats
- Modifier le hook useContrats pour passer sort et order à l'API
- Adapter l'endpoint /api/contrats pour supporter les paramètres de tri dynamiques
- Rendre les headers 'Début' et 'Fin' cliquables avec indicateurs visuels (▲/▼)
- Tri par défaut: date de fin décroissante (contrats les plus proches d'expirer en premier)