Commit graph

177 commits

Author SHA1 Message Date
08cf18d89b debug: Ajouter des logs pour le suivi des jours travail dans ContractEditor 2025-10-25 15:15:14 +02:00
fa7057f978 fix: Simplifier la prop dateType dans ContractEditor pour afficher l'option skip hours 2025-10-25 14:42:56 +02:00
81de11da7d feat: Ajouter option ne pas appliquer heures par jour dans staff/contrats/[id] 2025-10-25 14:35:33 +02:00
34334f01df feat: Renommer colonnes Contrat/Paie/DPAE en C/P/D pour gagner de la place 2025-10-25 14:19:16 +02:00
c8a12bc0a7 feat: Transformer états en icônes Lucide et ajouter colonne Profession dans staff/contrats 2025-10-25 13:57:40 +02:00
3740c6d4cf feat: Ajouter option ne pas appliquer heures par jour pour jours de travail 2025-10-25 13:45:31 +02:00
3aa4a56cb1 feat: Ajouter champs adresse, cp et ville dans staff/clients/[id] 2025-10-25 12:46:35 +02:00
62ee3d3995 debug: Ajouter logs pour identifier le champ date_signature du contrat 2025-10-24 20:03:38 +02:00
785bc30833 debug: Ajouter logs pour tracer le type d'avenant envoyé à PDFMonkey
- Ajouter logs frontend pour voir le type_avenant envoyé
- Ajouter logs backend pour voir le type_avenant reçu
- Ajouter logs pour voir la valeur annulation calculée
2025-10-24 19:55:54 +02:00
90d9f6b56f feat: Ajouter support des avenants d'annulation avec envoi à PDFMonkey
- Modifier NouvelAvenantPageClient pour gérer type_avenant annulation
- Désactiver la sélection d'éléments pour les annulations
- Ajouter message d'information pour les avenants d'annulation
- Adapter l'API generate-pdf pour envoyer annulation: Oui à PDFMonkey
- Modifier l'API create pour accepter les annulations sans éléments requis
- Ne pas mettre à jour le contrat pour les annulations
2025-10-24 19:50:30 +02:00
7e2a022bf0 fix: Rétablir dates_travaillees dans le payload
- Le template PDFMonkey utilise dates_travaillees, pas les champs détails
- Rétablissement du champ pour que les dates s'affichent à nouveau
2025-10-24 16:47:19 +02:00
d34055a761 fix: Supprimer dates_travaillees du payload pour éviter doublons
- Commenté le champ dates_travaillees qui causait l'affichage en double
- Le template PDFMonkey doit maintenant utiliser uniquement :
  - dates_representations_detail pour les représentations
  - dates_repetitions_detail pour les répétitions
2025-10-24 16:34:48 +02:00
4c8b1959f2 fix: Autoriser n'importe quel nombre ≥1 pour les heures de répétition
- Modification validation dans DatesQuantityModal pour heures_repetitions
- Limite 1-3 maintenue pour représentations et services de répétition
- Retrait de la limite max pour les champs d'heures
- Mise à jour placeholder selon le type de saisie
2025-10-24 16:33:36 +02:00
44fc21c817 feat: Ajout saisie heures répétitions et correction PDF avenants
- Ajout champs heures totales et minutes pour répétitions dans AmendmentDureeForm
- Intégration DatesQuantityModal pour saisie heures par jour de répétition
- Ajout type 'heures_repetitions' dans dateFormatter et DatesQuantityModal
- Correction envoi precisions_salaire à PDFMonkey pour les avenants
- Ajout champs séparés dates_representations_detail et dates_repetitions_detail
- Correction logique dates_repetitions_heures pour éviter doublons dans PDF
2025-10-24 15:53:00 +02:00
3653dd6e77 fix: CRITIQUE - Récupérer submitters via API DocuSeal au lieu du payload
Webhook avenant completed:
- Le payload form.completed ne contient pas la liste complète des submitters
- Récupération via GET /api/docuseal/submissions/{id}
- Permet de vérifier que TOUS les submitters ont status='completed'
- Corrige le blocage où les emails finaux ne partaient jamais
2025-10-23 22:06:12 +02:00
6167b38d5c fix: Empêcher envoi email salarié en double lors de sa signature
Webhook docuseal-amendment:
- Vérifier le statut actuel avant de traiter
- Si déjà 'pending_employee' ou 'signed', ignorer le webhook
- Évite l'envoi en double de l'email d'invitation au salarié
- La Lambda appelle ce webhook à chaque signature, pas seulement employeur
2025-10-23 21:22:43 +02:00
4aabfc337f fix: Webhook avenant - n'accepter que form.completed et utiliser status 'signed'
Corrections webhook avenant completed:
- N'accepter QUE l'événement form.completed (envoyé une seule fois)
- Ignorer submission.completed (envoyé à chaque signature individuelle)
- Utiliser signature_status='signed' au lieu de 'completed'
- Corrige le problème d'email salarié envoyé en double
- Corrige l'affichage du statut dans l'interface
2025-10-23 21:05:26 +02:00
25b5f87c8b fix: Vérifier que tous les submitters ont signé avant emails finaux
Webhook avenant completed:
- Vérification du status de TOUS les submitters
- N'envoie les emails finaux que si status='completed' pour tous
- Évite l'envoi prématuré des emails de confirmation
- Log détaillé des statuts de signature
2025-10-23 20:57:49 +02:00
d7270f62ee fix: Utiliser employee_docuseal_slug stocké au lieu d'extraire depuis submission_url
Webhook avenant completed:
- Récupération du slug depuis avenant.employee_docuseal_slug
- Évite l'extraction incorrecte depuis submission_url
- Corrige le 404 sur /signature-salarie pour les avenants signés
2025-10-23 20:52:03 +02:00
e0fdf028af fix: Stocker employee_docuseal_slug dans avenants + corrections email employeur
Avenant signature:
- Stockage de employee_docuseal_slug lors de la signature employeur
- Permet au salarié d'accéder à la page signature-salarie

Email employeur avenant:
- Prénom depuis organization_details.prenom_signataire
- Email vers organization_details.email_signature
- Message: 'Le document est disponible dans la fiche contrat'
2025-10-23 20:43:18 +02:00
32570ec92a fix: Mise à jour statut avenant et contrat lors de la signature finale
- Ajout mise à jour cddu_contracts.avenant_signe = true
- Ajout cddu_contracts.avenant_signe_date avec timestamp
- Correction emails avenants (profession, infoCard employeur, URL salarié)
- Extraction docuseal_id depuis submission_url pour lien salarié
2025-10-23 20:32:23 +02:00
594f2996c4 feat: Afficher net à payer au lieu de net avant PAS dans staff/payslips
- Changement de net_amount vers net_after_withholding
- Mise à jour titre colonne: 'Net' → 'Net à payer'
- Tri et affichage corrigés
2025-10-23 20:24:42 +02:00
2d49024088 fix: Récupérer code_employeur depuis organization_details
- Retrait de code_employeur du select organizations (colonne inexistante)
- Ajout requête organization_details pour récupérer code_employeur
- Correction erreur SQL 'column organizations_2.code_employeur does not exist'
2025-10-23 20:09:59 +02:00
44976a401a fix: Accepter event_type form.completed de DocuSeal
- Ajout de form.completed en plus de submission.completed
- DocuSeal envoie form.completed pour les avenants
2025-10-23 20:05:19 +02:00
2520a73602 feat: Migration Lambda avenant completion vers Next.js API
- Créé route /api/webhooks/docuseal-amendment-completed
- Ajouté templates emails amendment-completed-employer et amendment-completed-employee
- Intégration système emails universel v2 (Handlebars)
- Logging dans Supabase email_logs (plus d'Airtable)
- Types ajoutés à EmailTypeV2 et EmailType
- Documentation complète dans LAMBDA_MIGRATION_AVENANT_COMPLETION.md
- Script SQL migration dans MIGRATION_SQL_EMAIL_TYPES.md

Migration complète AWS Lambda → Next.js cdg1 (RGPD compliant)
2025-10-23 19:39:38 +02:00
4292041f40 fix: webhook avenant - corriger nom du champ date (start_date) 2025-10-23 18:59:10 +02:00
584af5450d fix: webhook avenant - utiliser données Supabase + logs emails
- Webhook avenant: utiliser les données du contrat depuis Supabase quand Lambda envoie 'Non spécifié'
- Ajout des types d'emails manquants dans EmailType (signature-request-employee-amendment, etc.)
- Les emails d'avenant seront maintenant loggés correctement dans email_logs

Note: Exécuter dans Supabase SQL:
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'signature-request-employee-amendment';
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'signature-request-salarie';
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'contribution-notification';
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'support-reply';
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'support-ticket-created';
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'support-ticket-reply';
ALTER TYPE email_type ADD VALUE IF NOT EXISTS 'contact-support';
2025-10-23 18:56:29 +02:00
d396d323c1 fix: webhook avenant - recherche par submissionId au lieu de numero
Le webhook avenant échouait avec 'multiple rows returned' car plusieurs avenants
pouvaient avoir le même numero_avenant (tests). Utilisation du docuseal_submission_id
unique pour identifier l'avenant correctement.
2025-10-23 18:37:02 +02:00
e1d89ab765 feat: RGPD 100% + UX improvements staff contrats
- Audit RGPD: confirmation PDFMonkey (100% services conformes EU)
- Staff contrats: reset tous filtres lors filtres rapides (recherche, org, type)
- Staff contrats: ajout colonne Production (production_name)
- Signature salarie: message info scroll pour signature
2025-10-23 18:24:41 +02:00
8cb366ee53 chore: RGPD compliance audit & cleanup + UX signature salarie
- Audit RGPD complet: création RGPD_AUDIT_LOCALISATION_DONNEES.md
- Suppression complète intégration n8n (API route, hooks, env vars)
- Suppression variables Airtable (env vars)
- Confirmation GoCardless: serveurs EEE + SCC
- 8/9 services confirmés UE (89% compliance)
- Ajout message info dans modale signature salarie (scroll down)
2025-10-23 17:32:56 +02:00
d992e339d7 fix: Email avenant employeur redirige vers /signatures-electroniques 2025-10-23 16:11:53 +02:00
9e96008c1f docs: Documentation page signature-salarie unifiée 2025-10-23 16:08:34 +02:00
58e8fa4584 feat: Page signature-salarie adaptée pour contrats et avenants
- check-status: cherche dans cddu_contracts ET avenants
- verify-birthdate: cherche dans les deux tables
- Retourne documentType ('contrat' ou 'avenant')
- UI adaptée: AlreadySignedCard et ToSignCard affichent le type
- Titre dynamique: 'Contrat' ou 'Avenant' selon le document
- Textes adaptés: 'Voir et signer votre avenant/contrat'
2025-10-23 15:59:45 +02:00
3af6db788b fix: Améliorer formatage dates et fallbacks pour profession dans emails avenants 2025-10-23 15:44:57 +02:00
d2a04d38c6 fix: Nettoyer DOCUSEAL_TOKEN pour éviter caractères invalides dans headers 2025-10-23 15:38:07 +02:00
5b72941777 feat: Système complet de gestion des avenants avec signatures électroniques
 Nouvelles fonctionnalités
- Page de gestion des avenants (/staff/avenants)
- Page de détail d'un avenant (/staff/avenants/[id])
- Création d'avenants (objet, durée, rémunération)
- Génération automatique de PDF d'avenant
- Signature électronique via DocuSeal (employeur puis salarié)
- Changement manuel du statut d'un avenant
- Suppression d'avenants

🔧 Routes API
- POST /api/staff/amendments/create - Créer un avenant
- POST /api/staff/amendments/generate-pdf - Générer le PDF
- POST /api/staff/amendments/[id]/send-signature - Envoyer en signature
- POST /api/staff/amendments/[id]/change-status - Changer le statut
- POST /api/webhooks/docuseal-amendment - Webhook après signature employeur
- GET /api/signatures-electroniques/avenants - Liste des avenants en signature

📧 Système email universel v2
- Migration vers le système universel v2 pour les emails d'avenants
- Template 'signature-request-employee-amendment' pour salariés
- Insertion automatique dans DynamoDB pour la Lambda
- Mise à jour automatique du statut dans Supabase

🗄️ Base de données
- Table 'avenants' avec tous les champs (objet, durée, rémunération)
- Colonnes de notification (last_employer_notification_at, last_employee_notification_at)
- Liaison avec cddu_contracts

🎨 Composants
- AvenantDetailPageClient - Détail complet d'un avenant
- ChangeStatusModal - Changement de statut manuel
- SendSignatureModal - Envoi en signature
- DeleteAvenantModal - Suppression avec confirmation
- AvenantSuccessModal - Confirmation de création

📚 Documentation
- AVENANT_EMAIL_SYSTEM_MIGRATION.md - Guide complet de migration

🐛 Corrections
- Fix parsing défensif dans Lambda AWS
- Fix récupération des données depuis DynamoDB
- Fix statut MFA !== 'verified' au lieu de === 'unverified'
2025-10-23 15:30:11 +02:00
34b3464132 fix: Utiliser categorie_pro du contrat pour déterminer employee_catpro dans avenants
- Correction de la détection artiste/technicien dans génération PDF avenant
- Utilisation de contract.categorie_pro au lieu de déduction depuis type_de_contrat
- Permet l'affichage correct des heures pour les techniciens dans le PDF
2025-10-22 23:59:25 +02:00
0083976034 feat: Système complet de gestion des avenants aux contrats
- Création page staff/avenants avec tableau et recherche
- Modal moderne de création d'avenant avec recherche de contrat
- Formulaires dynamiques pour objet, durée et rémunération
- Pré-remplissage automatique des données du contrat d'origine
- Sélection multi-éléments à avenanter
- Calendriers de dates avec modal de quantités
- Génération PDF via PDFMonkey (template BC5E26D6-4A3B-45F8-8376-25F83C17A413)
- Stockage PDF dans S3 (bucket odentas-docs, préfixe avenants/)
- Gestion z-index pour modals imbriqués (z-100+)
- Support CDDU/RG et Artiste/Technicien
- Design cohérent avec le reste du site
2025-10-22 23:09:27 +02:00
a17e8f1c88 feat: Update signature button text to 'Voir et signer votre contrat'
- Change from 'Signer électroniquement le contrat' to more user-friendly text
- Emphasizes that users can view the contract before signing
2025-10-22 22:20:42 +02:00
abf970ee6a fix: Display emails and actions correctly when forceResend is checked
- Update getActionBadge to accept contract and check forcedAction when forceResend is enabled
- Update getEmailForAction to use forcedAction when forceResend is checked
- Dynamically calculate totalToSend based on forceResend state
- Show correct action badges (employer/employee) instead of 'skip' when forcing resend
2025-10-22 22:14:25 +02:00
ad6d5ab418 feat: Add force resend option to bypass 24h cooldown in smart reminders
- Add checkbox in SmartReminderModal to force sending reminders despite 24h cooldown
- Track contracts skipped due to cooldown separately
- Store forcedAction attribute for contracts in cooldown period
- Apply forced actions when forceResend option is enabled
- Show warning message with count of contracts excluded due to cooldown
- Update modal signature to accept forceResend parameter
2025-10-22 22:05:46 +02:00
776b779172 fix: Keep smart reminder modal open after sending to show results
- Remove automatic modal close after sending reminders
- Change 'Annuler' button to 'Fermer' once all reminders are sent
- Hide 'Envoyer' button when sending is complete
- Allow users to review the full summary with success/error status
2025-10-22 21:57:15 +02:00
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