- Nouvelle modale UploadSignedPdfModal avec drag & drop
- API route /api/staff/amendments/[id]/upload-signed-pdf
- Upload vers S3 avec pattern avenants/{ref}_avenant_signed_{timestamp}.pdf
- Mise à jour automatique statut → 'signed' et signature_status → 'signed'
- Validation du fichier (PDF uniquement, max 10MB)
- Bouton 'Ajouter PDF signé' sur page détail avenant
- Téléchargement des PDF depuis URLs Airtable
- Upload vers S3 avec pattern avenants/{reference}_avenant_{timestamp}.pdf
- Mise à jour de pdf_s3_key et pdf_url dans Supabase
- 91 PDF migrés avec succès
- Ajout de filtres sophistiqués : organisation, statut, type, signature, élément, dates
- Tri par colonne : date d'effet, date d'avenant, n° avenant, n° contrat
- Pagination avec 25/50/100 éléments par page
- Ordre par défaut : date d'effet décroissant (plus récent en premier)
- Compteur de filtres actifs avec bouton de réinitialisation
- Affichage du matricule salarié, n° avenant et type d'avenant dans le tableau
- Recherche étendue : inclut matricule, production et n° avenant
- Interface cohérente avec les pages staff/contrats et staff/payslips
- API rg-contracts passe maintenant type_de_contrat et type_d_embauche='Régime général'
- API cddu-contracts utilise les valeurs du body au lieu de forcer les valeurs CDDU
- Texte du formulaire adapté selon le régime (CDDU vs RG)
- Désactivation du remplissage automatique des dates en mode RG
- Rétablissement du filtre en_cours pour inclure contrats futurs
- Ajout d'un champ 'Nombre de représentations' pour les metteurs en scène dans les formulaires de contrat (création et édition)
- Les metteurs en scène peuvent maintenant avoir à la fois des heures de travail ET des cachets de représentation
- Mise à jour de la logique de sauvegarde pour préserver les représentations des metteurs en scène même en mode heures
- Les données sont correctement envoyées à PDFMonkey via le champ cachets.representations
- Interface utilisateur ajoutée dans NouveauCDDUForm et ContractEditor
- Email employeur: ajout code_employeur, correction structure détails document
- Email salarié: ajout matricule, type contrat, profession, date début
- Séparation PDF préliminaire/signé (signed_pdf_s3_key) pour éviter timing issues
- Correction UI: grammaire et libellés conditionnels (avenant/contrat)
- Standardisation source notes: 'Client' au lieu de 'Espace Paie'
- Ajout note automatique pour paniers repas avec détails
- Calcul automatique total heures depuis modale jours de travail
- Migration SQL: ajout colonne signed_pdf_s3_key + migration données existantes
- Créer API route pour relance employeur: /api/staff/avenants/[id]/remind-employer
- Créer API route pour relance salarié: /api/staff/avenants/relance-salarie
- Ajouter modales de relance intelligente (SmartReminderAvenantModal)
- Ajouter modales de relance individuelle (EmployeeReminderAvenantModal)
- Ajouter modale de relance en masse (BulkEmployeeReminderAvenantModal)
- Intégrer système de sélection multiple dans la page avenants
- Ajouter détection automatique des actions (employeur/salarié) selon signature_status
- Implémenter cooldown de 24h pour éviter les relances trop fréquentes
- Option forcer renvoi pour contourner le cooldown si nécessaire
- Mise à jour timestamps last_employer/employee_notification_at dans la DB
- Utilisation du système d'email universel (EmailConfigV2)
- Support du mode démo (envois bloqués)
- Interface utilisateur cohérente avec le système contrats existant
- Ajout sous-header total net à payer sur page virements-salaires
- Migration transfer_done_at pour tracking précis des virements
- Nouvelle page saisie tableau pour création factures en masse
- APIs bulk pour mise à jour dates signature et jours technicien
- API demande mandat SEPA avec email template
- Webhook DocuSeal pour signature contrats (mode TEST)
- Composants modaux détails et vérification PDF fiches de paie
- Upload/suppression/remplacement PDFs dans PayslipsGrid
- Amélioration affichage colonnes et filtres grilles contrats/paies
- Template email mandat SEPA avec sous-texte CTA
- APIs bulk facturation (création, update statut/date paiement)
- API clients sans facture pour période donnée
- Export SEPA des virements salaires
- Corrections calculs dates et montants avec auto-remplissage
Conflit résolu : conservation version main pour récupération nom client (fallback gracieux)
- Désactivation du bouton export SEPA avec tooltip 'Bientôt disponible'
- Suppression de la card informative SEPA (en attente tests élargis)
- Amélioration validation IBAN : ajout checksum modulo 97
- Ajout fichier d'audit complet SEPA_EXPORT_AUDIT.md
Raison : Système fonctionnel (testé avec succès sur Qonto) mais
nécessite tests avec autres banques avant activation production.
Le bouton 'Marquer comme payé' reste actif et fonctionnel.
- Ajout export fichier SEPA XML (norme ISO 20022 pain.001.001.03)
* Sélection multiple via checkboxes
* Génération XML pour virements bancaires groupés
* Validation IBAN et gestion des salariés sans RIB
* Modal de succès/avertissements
* Référence: Nom organisation - Période
- Ajout marquage groupé des paies comme payées
* Sélection multiple des paies
* Modal de confirmation
* Actualisation automatique sans refresh
- Nouvelle route API /api/virements-salaires/[id] (PATCH)
* Mise à jour transfer_done et transfer_done_at
- Amélioration UX
* Card informative pour clients non-Odentas
* Modal informatif dans 'En savoir plus'
* Messages clairs et cohérents
- Ajout sous-header total net à payer sur page virements-salaires
- Migration transfer_done_at pour tracking précis des virements
- Nouvelle page saisie tableau pour création factures en masse
- APIs bulk pour mise à jour dates signature et jours technicien
- API demande mandat SEPA avec email template
- Webhook DocuSeal pour signature contrats (mode TEST)
- Composants modaux détails et vérification PDF fiches de paie
- Upload/suppression/remplacement PDFs dans PayslipsGrid
- Amélioration affichage colonnes et filtres grilles contrats/paies
- Template email mandat SEPA avec sous-texte CTA
- APIs bulk facturation (création, update statut/date paiement)
- API clients sans facture pour période donnée
- Corrections calculs dates et montants avec auto-remplissage
- Programme de parrainage (referrals):
* Page /parrainage pour clients et staff
* API /api/referrals (GET, POST)
* Table referrals avec tracking complet
* Email template avec design orange/gradient
* Réductions: 30€ HT parrain, 20€ HT filleul
- Bannières promotionnelles (promo_banners):
* Page staff /staff/offres-promo pour gérer les bannières
* API /api/promo-banners (CRUD complet)
* Composant PromoBanner affiché en haut de l'espace
* Compte à rebours optionnel
* Customisation couleurs (gradient, texte, CTA)
- Déduplication des webhooks DocuSeal:
* Table webhook_events pour tracker les webhooks traités
* Helper checkAndMarkWebhookProcessed()
* Intégré dans docuseal-amendment et docuseal-amendment-completed
* Prévient les doublons d'emails
- Avenants signés:
* API GET /api/contrats/[id]/avenants
* Affichage des avenants signés dans DocumentsCard
* Génération d'URLs presignées S3
- Brouillons d'emails groupés:
* Table bulk_email_drafts pour sauvegarder les brouillons
* Template HTML bulk-email-template.html
- Améliorations ContractsGrid:
* Ajout filtre par production (dépendant de la structure)
* Tri par production
- Templates emails:
* referral-template.html (parrainage)
* bulk-email-template.html (emails groupés staff)
- Ajout filtres: vérifier template AVENANT + rôle Salarié
- Téléchargement du PDF signé depuis DocuSeal
- Upload du PDF sur S3 (bucket odentas-docs/avenants/)
- Mise à jour signature_status et statut à 'signed'
- Mise à jour pdf_s3_key avec le chemin S3
- Suppression code dupliqué
- Correction bucket S3 (odentas-docs au lieu de odentas-signatures)
- Header: Ajout 3ème ligne de statut (Caisses & orga.) avec descriptions détaillées
- Tooltips: Affichage riche avec titre, voyant coloré et contenu markdown formaté
- Éditeur markdown: Nouveau composant RichTextEditor avec toolbar (gras, italique, liens, listes)
- Modal staff: StatusEditModal étendu avec onglets et éditeur de descriptions
- Migration: Ajout colonnes status_*_description dans maintenance_status
- API: Routes GET/PUT enrichies pour gérer les 9 champs de statut
- Navigation: Redirection /compte/securite → /securite (nouvelle page centralisée)
- Breadcrumb: Support contrats RG/CDDU multi + labels dynamiques salariés
- UX Documents: Bouton 'Nouvel onglet / Télécharger' au lieu de téléchargement forcé
- Contrats staff: Pagination paies (6/page) pour RG et CDDU multi-mois avec vue compacte
- PayslipCard: Bouton cliquable 'Ouvrir le PDF' pour accès direct aux bulletins
- Tous les clients repliés par défaut à l'ouverture du modal
- Boutons 'Tout replier' / 'Tout déplier' pour gérer tous les clients
- Section factures repliable avec bouton Afficher/Masquer
- Affichage résumé facture sélectionnée quand section repliée
- Nouveau client déplié automatiquement pour faciliter la saisie
- Améliore la lisibilité pour NAA avec nombreux clients
- Labels CCN collés : CCNEAC, CCNPA, CCNSVP (au lieu de CCN EAC, etc.)
- Labels dynamiques : récupération automatique des noms de salariés, factures et tickets
- Badge Staff : icône Shield sur les routes /staff/* (visible sur liens et dernier segment)
- Hook useDynamicLabel pour charger les données en temps réel
- Amélioration de l'accessibilité avec aria-label
- Création du composant Breadcrumb.tsx avec mapping des routes
- Intégration dans le layout principal sous le Header
- Support des routes dynamiques (IDs, matricules)
- Responsive avec icône Home sur mobile
- Compatible mode démo et mode staff
- Suppression de DocuSealSignatureModal pour éviter problèmes de compatibilité
- Header fixed toujours visible avec instructions de signature
- Affichage du formulaire DocuSeal directement dans la page
- Iframe DocuSeal avec hauteur optimisée (70vh/500px min)
- Bouton de signature DocuSeal reste flottant en bas de fenêtre
- Amélioration UX et compatibilité tous navigateurs
✨ 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
- Ajout bouton calculatrice avec gradient bleu-indigo
- Ajout bouton Minima avec gradient émeraude-teal et lien vers /minima-ccn
- Correction focus trap : autoriser liens target=_blank
- Ajout champs conditionnels panier repas (nombre, CCN, montant personnalisé)
- DatePickerCalendar : initialisation sur date de début contrat si pas de dates sélectionnées
- DatesQuantityModal : option 'Ne pas appliquer...' pour tous types (repré/répét/heures)
- DatesQuantityModal : adaptation texte selon type (représentations/répétitions/heures)
- DatesQuantityModal : champ 'Appliquer à toutes les dates' pour saisie rapide
- DatesQuantityModal : reset quantités quand option 'Ne pas appliquer' cochée
- DatesQuantityModal : aperçu sans détails quand option cochée
- Intégration durée répétitions dans formatage dates (3h ou 4h, avec 'chacun' si >1)
- Notification paiement salaires : nouvel email 'salary-transfer-payment-confirmation'
- Notification paiement salaires : API route /api/staff/virements-salaires/[id]/notify-payment-sent
- Notification paiement salaires : modal NotifyPaymentSentModal avec détails paiement
- Notification paiement salaires : tracking avec payment_notification_sent/sent_at
- Notification paiement salaires : affichage statut dans modal virements
- Template email : support detailsCardDisclaimer pour mentions légales
- Page publique /verify/[id] affichant Odentas Seal, TSA, certificat
- API /api/signatures/create-verification pour créer preuves
- Générateur PDF de preuve avec QR code (jsPDF)
- Hook useSignatureProof() pour intégration facile
- Table Supabase signature_verifications avec RLS public
- Page de test /test-signature-verification
- Documentation complète du système
Les signataires peuvent scanner le QR code ou visiter l'URL pour vérifier l'authenticité et l'intégrité de leur document signé.
✨ Nouvelles fonctionnalités :
- Configuration des URLs Lambda PAdES et TSA dans .env
- Certificats Odentas Media SAS (CN=Odentas Seal, O=Odentas Media SAS)
- Ajout champs /Name, /Reason, /Location dans signature PDF
- Documentation complète des URLs Lambda (ODENTAS_SIGN_LAMBDA_URLS.md)
🔧 Améliorations :
- Gestion stricte des erreurs dans webhook completion
- Ne marque plus 'completed' si scellage échoue
- Vérification des variables LAMBDA_PADES_URL et LAMBDA_TSA_URL
- Build Docker multi-arch (ARM64 → AMD64) avec --platform
🔐 Certificats :
- CA Root: CN=Odentas Media SAS Root CA, O=Odentas Media SAS
- Certificat signature: CN=Odentas Seal, O=Odentas Media SAS, OU=Signature Electronique
- Chaîne complète uploadée sur S3 (s3://odentas-sign/certs/chain.pem)
✅ Tests :
- Lambda PAdES testée et fonctionnelle
- Lambda TSA testée et fonctionnelle
- Affichage 'Odentas Media SAS' dans Adobe Reader confirmé
⚠️ Niveau eIDAS actuel : SES (Signature Électronique Simple)
TODO: Améliorer conformité PAdES pour niveau AES (voir TODO_PADES_CONFORMITE.md)
- Ajouter useEffect pour charger filtres sauvegardés au démarrage dans ContractsGrid
- Compléter réinitialisation des filtres (signatureFilter, endFrom, endTo)
- Afficher 'CDI en cours' en italique pour date de fin 01/01/2099 dans virements-salaires
- Ajout type 'production-declared' dans système email universel V2
- Template email avec infoCard et detailsCard
- Endpoint API /api/staff/productions/[id]/notify
- Bouton notification dans page staff/gestion-productions
- Modal de confirmation d'envoi
- Emails depuis organization_details (email_notifs, email_notifs_cc)
- Gestionnaire en dur: Renaud BREVIERE-ABRAHAM
- Création du composant BulkPayslipModal avec tous les champs du PayslipModal
- Distinction entre Net avant PAS et Net à payer
- Zone de valeurs communes pour pré-remplir plusieurs contrats
- Ajout du bouton 'Ajout de paie' dans le menu Actions contrat
- Création de l'endpoint API /api/staff/payslips/bulk-create
- Validation et gestion d'erreurs par contrat
- Retrait du bypass mode test dans le webhook completion
- Appel des Lambdas pades-sign et tsaStamp pour toutes les demandes
- Workflow complet: signature → PAdES seal → TSA timestamp → archive
- Graceful degradation si Lambdas non disponibles (local)
- Evidence bundle mis à jour avec hash PDF et TSA metadata
- Script de test automatique test-complete-signature-flow.sh
- Documentation complète TEST_PADES_TSA.md