Commit graph

135 commits

Author SHA1 Message Date
d7bdb1ef08 feat: Add notification tracking system with smart reminders
- 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
2025-10-22 21:49:35 +02:00
807cb20456 feat: Ajouter colonne Notif. pour tracer les emails de signature électronique
- 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
2025-10-22 20:12:49 +02:00
d81a12de6e feat: Ajout de filtres avancés dans gestion productions
- 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
2025-10-22 19:17:38 +02:00
c87c11eb10 feat: Ajout du tri des colonnes dans gestion productions
- 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
2025-10-22 18:54:35 +02:00
fcbf745bf0 feat: Amélioration gestion productions - numéro d'objet et déclaration FTS
- 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;
2025-10-22 18:49:09 +02:00
0a509a0cdb feat: Ajout du champ Type de prod dans gestion des productions
- 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
2025-10-22 18:33:25 +02:00
a58d4982e6 fix: Corriger les noms de colonnes dans upload-signed-pdf
- 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
2025-10-22 18:10:34 +02:00
b0fea6813b feat: Ajout de l'upload manuel du contrat signé dans staff/contrats/[id]
- 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
2025-10-22 17:55:05 +02:00
542e0e963d feat: Stocker et utiliser employee_docuseal_slug pour signature-salarie
- 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
2025-10-22 17:35:50 +02:00
e23d9a17e9 Maintenance salarié 2025-10-22 17:18:59 +02:00
b648f6805f Cards signature salarié + correction modale signatures électroniques 2025-10-22 17:02:09 +02:00
389629201c fix: Corriger affichage nom organisation dans emails signature
- 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
2025-10-22 16:10:09 +02:00
eabc47c4ca Correction erreur build 2025-10-22 15:45:54 +02:00
95c826cbe7 feat(staff/contrats): Ajouter modale de confirmation pour relance salariés (liste emails) et neutraliser le texte d’e-mail pour envoi staff\n\n- Bulk: 'Relancer salariés' ouvre un modal listant les contrats et emails avant envoi\n- Single: bouton par ligne 'Relancer' inchangé (modale de confirmation)\n- Email: route staff utilise 'signature-request-salarie' (ne pas afficher 'rappel par employeur')\n- Build OK 2025-10-22 15:16:55 +02:00
511eac1155 Correction relance signature salarié 2025-10-22 12:55:01 +02:00
02df1062ad fix: Relance salarié (staff) — éviter les faux 'Contrat non trouvé' en ne filtrant pas par org_id/employer_id côté staff; supprimer le fallback du prénom (doit venir de salaries) 2025-10-22 12:29:33 +02:00
2030b2ad0f fix: rafraîchir les signatures après DocuSeal 2025-10-22 11:50:10 +02:00
7bddde0eb2 fix: Corriger désélection d'orga en quittant un modal de signature
- 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
2025-10-22 11:20:56 +02:00
ea06d4c982 WIP: modifs sur Mac Mini 2025-10-22 11:00:44 +02:00
74aa268603 Merge: résout les conflits et aligne main avec origin/main 2025-10-22 10:59:01 +02:00
8aadaaf024 Supabase realtime + modal confirmation Signatures électroniques 2025-10-22 10:50:41 +02:00
aa3c5838f3 feat: Ajouter système de relance salarié sur page staff/contrats 2025-10-22 10:36:03 +02:00
577c8d5938 refactor: Restructurer les menus d'actions contrats avec séparation E-signature 2025-10-22 10:25:20 +02:00
2e991eb185 feat(staff): allow clearing 'Dates travaillées' in contract editor and persist as null 2025-10-21 08:14:10 +02:00
f5c2417ff0 fix(api): force dynamic Node runtime on routes using cookies or request.url (pdf-diagnosis, documents/generaux, maintenance/status, staff/*, dl-contrat-signe) 2025-10-21 07:57:43 +02:00
ae4f91857a chore(vercel): installation silencieuse (npm ci --silent) en plus du build silencieux 2025-10-21 07:42:53 +02:00
2e2c7d06e9 chore(vercel): build silencieux via buildCommand (npm run --silent build); package.json sans flag non supporté 2025-10-21 07:40:24 +02:00
2fca0fcbf2 feat(calculator): afficher l’expression du calcul, arrondir à 2 décimales et réinitialiser la saisie après calcul; feat(form): forcer 2 décimales dans Montant quand on utilise la calculatrice; fix(tooltip): placement top au-dessus du trigger; embed(minima): runtime CSS en mode embed 2025-10-21 07:28:34 +02:00
b3b56a9b4e fix: Corriger envoi des dates de représentation à PDFMonkey et intégrer calendrier dans staff/contrats 2025-10-20 22:51:29 +02:00
ed08f3270c fix: Ajouter les icônes et manifests de favicon.io avec configuration complète 2025-10-20 22:37:53 +02:00
8e6534f1ab retry deploy 2025-10-20 21:47:37 +02:00
e8df1c1729 Force push 2025-10-20 21:35:51 +02:00
b81570f1d5 Force rebuild 2025-10-20 21:32:04 +02:00
551fb32aaa Force rebuild 2025-10-20 21:10:06 +02:00
a118d96cb1 Force rebuild 2025-10-20 20:41:48 +02:00
ba8170ee02 chore: Force commit 2025-10-20 20:31:31 +02:00
dcb58fbbc6 Trigger build 2025-10-20 20:09:28 +02:00
9b544f5590 chore: package-lock.json update 2025-10-20 19:44:06 +02:00
97c36724c7 fix: Corriger les décalages de fuseau horaire dans le calendrier des dates
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
2025-10-20 19:35:55 +02:00
8c99473fd0 feat: Ajout calendrier multi-mois avec formatage smart pour sélection des dates
- 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
2025-10-20 19:00:48 +02:00
d71ea55ca7 feat: Permettre à l'API informations de récupérer les emails d'employeurs via org_id 2025-10-20 16:51:05 +02:00
95d5eeb72a feat: Ajouter adresse_mail des salariés et org_id dans la recherche de contrats pour afficher les emails dans la modale e-signature 2025-10-20 16:44:00 +02:00
e5fa2579e1 fix: Déplacer l'early return après les hooks dans BulkESignConfirmModal 2025-10-20 16:38:15 +02:00
f7f29d3a04 fix: Simplifier et corriger la récupération des emails employeurs dans la modale e-signature 2025-10-20 16:32:21 +02:00
e24e3c76ca fix: Corriger la fonction fetchEmployerEmails dans useEffect
- 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
2025-10-20 16:23:03 +02:00
be51e95d73 fix: Corriger erreur React #310 - dépendance useEffect
- 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
2025-10-20 16:13:08 +02:00
c151a21cb9 feat: Afficher les adresses email réelles des salariés et employeurs
- 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
2025-10-20 16:10:36 +02:00
f68557c6d6 feat: Améliorer le modal de confirmation des e-signatures groupées
- 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
2025-10-20 16:06:33 +02:00
356f269b49 fix: Conserver la sélection des contrats après les actions groupées
- 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
2025-10-20 16:00:20 +02:00
0c332668ee fix: Passer la prop onClick au composant Th pour permettre le tri au clic
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>.
2025-10-20 15:03:42 +02:00