- Ajout de 2 nouveaux champs de texte dans ContractEditor.tsx
- Sauvegarde des champs autreprecision_duree et autreprecision_salaire dans Supabase
- Mise à jour des types ContratCDDUData avec les nouveaux champs
- Envoi des données à PDFMonkey via generate-pdf et generate-pdf-test
- Les champs sont disponibles dans l'interface staff/contrats/[id]
- Ajouter import HelpCircle depuis lucide-react
- Afficher petite icône ? (3x3px) à droite de chaque ligne avec description
- Icône visible uniquement sur les lignes avec tooltip disponible
- Design discret (text-slate-400) sans augmenter la hauteur du header
- Suppression de /app/api/pdf-proxy/route.ts (endpoint inutilisé avec CORS *)
- Suppression de /app/api/pdf-clean/route.ts (endpoint inutilisé avec CORS *)
- Mise à jour du rapport d'audit de sécurité
- Les PDFs sont désormais affichés via URLs présignées S3 directes
- Ajout vérification queryToken/queryType avant traitement ancien format
- Détection des erreurs dans le hash (lien expiré, access_denied, etc.)
- Message clair si lien expiré : affiche error_description du hash
- Évite 'Type d'activation non supporté: null'
- Message fallback si aucun paramètre valide trouvé
- Condition modifiée : accepte access_token + refresh_token sans vérifier type='invite'
- Ajout log pour afficher le type détecté
- Corrige le problème où l'activation tournait dans le vide
- Supprimé le bloc de vérification hasHashTokens/hasQueryTokens qui causait l'erreur
- Le code essaie maintenant directement les deux méthodes sans pré-validation
- Délai augmenté à 500ms pour lecture du hash fragment
- Les erreurs ne s'affichent que si les méthodes échouent réellement
- Plus de message 'Paramètres manquants' avant même de tenter l'activation
- Vérification unique au début : hasHashTokens OU hasQueryTokens
- Suppression des vérifications redondantes dans le code
- Erreur affichée seulement si AUCUN format valide trouvé
- Plus de message d'erreur temporaire lors de l'activation avec hash fragment
- Délai de 100ms → 300ms pour lecture hash fragment
- Condition modifiée : erreur seulement si AUCUN paramètre (ni hash ni query)
- Fix TypeScript : vérification queryToken non-null avant verifyOtp
- Évite message d'erreur temporaire lors de l'activation
- Créé sendInvitationWithActivationEmail() pour unifier les invitations
- Modifié /api/staff/users/invite pour utiliser generateLink + email
- Modifié /api/access/nouveau pour envoyer email d'activation
- Modifié /api/access POST pour remplacer pending_invites par système direct
- Template account-activation mis à jour :
* Titre 'Activez votre compte'
* Encart avec infos : invitant (statut), organisation, niveau d'accès
* Message de contact formaté comme autres emails
* Renommage 'Odentas Paie' → 'Espace Paie Odentas'
- Fix page /activate : délai 100ms pour hash fragment + redirection 1s
- Liens d'activation forcés vers paie.odentas.fr (tests depuis localhost)
- Messages UI cohérents : 'Invitation envoyée' au lieu de 'Compte créé'
- Réorganiser la logique de sécurité pour distinguer staff/client
- Staff: accepter employer_id fourni et vérifier existence de l'org
- Client: utiliser l'org associée et bloquer toute tentative cross-org
- Améliorer les logs pour identifier le type d'utilisateur
- Corriger le retour no_organization inapproprié pour les staff
- Ajout checkbox dans modal de modification cotisation
- Création entrée dans contribution_notifications si marquée
- Invalidation cache notifications après update
- Support flag mark_as_notified dans API PATCH
- Message plus personnalisé pour factures studio en virement
- Mention 'hébergement' pour renouvellement
- Ajout contact WhatsApp avec lien cliquable (07 80 978 000)
- Formulation plus chaleureuse et professionnelle
- Factures studio en virement: message avec RIB (comme paie)
- Factures studio en SEPA: message avec date prélèvement
- Message complet au lieu de juste le nom du site
- Cohérence avec les factures paie
- Route /notify utilisait ctaUrl hardcodé vers /signin
- Appliquer même logique que /launch: lien téléchargement pour studio
- Ajouter siteName dans les données d'email
- Amélioration: factures paie pointent vers /facturation au lieu de /signin
- Créer route publique /api/public/invoices/[id]/download pour générer liens S3 à la volée
- Supprimer code employeur de l'infoCard pour factures studio
- Adapter texte bouton CTA (Télécharger vs Voir la facture)
- Rediriger vers page de téléchargement au lieu de l'Espace Paie pour clients studio
- Lien pré-signé S3 valable 15 minutes (suffisant pour téléchargement)
- Ajout endpoint API /api/signatures-electroniques/pending-count (COUNT() Supabase)
- Ajout hook usePendingSignatures avec polling 30s et pause en background
- Badge rouge animé dans Sidebar pour signatures employeur en attente
- Optimisé pour ne pas surcharger Supabase (cache 30s, refetch au focus)
- Désactivé en mode démo et pour staff
- Ajout bouton Edit dans les actions de chaque ligne
- Nouvelle modale EditPeriodModal pour éditer période, échéance et statut
- Nouvel endpoint API /api/staff/cotisations/bulk-update pour mise à jour groupée
- Les modifications s'appliquent à toutes les caisses d'une période en une fois
- Ajoute import cleanEnv dans les routes GoCardless
- Remplace process.env par cleanEnv() pour GOCARDLESS_ACCESS_TOKEN et GOCARDLESS_ENVIRONMENT
- Corrige le bug des tokens cassés sur plusieurs lignes dans Vercel
- Routes corrigées: gocardless, launch, bulk-gocardless
- Créer le composant BulkNotifyModal avec aperçu détaillé
- Afficher les statistiques (avec/sans cotisations, déjà notifiées, emails manquants)
- Grouper les périodes par organisation
- Afficher les destinataires des emails pour chaque organisation
- Indiquer les organisations sans email configuré
- Afficher un aperçu du contenu de l'email
- Gérer les re-notifications avec badge
- Envoyer les notifications en parallèle avec gestion d'erreurs
- Afficher un résumé des succès/erreurs après envoi
- Désélectionner automatiquement les périodes après notification
- Ajouter un filtre par mois dans les filtres avancés
- Détecter automatiquement les mois disponibles dans les périodes
- Supporter les noms de mois complets et abrégés (Janvier/Jan, Février/Fév, etc.)
- Sauvegarder le filtre mensuel dans localStorage
- Passer la grille de filtres à 4 colonnes pour inclure le nouveau filtre
- Mettre à jour le compteur de résultats filtrés
- Afficher le code employeur au lieu du nom complet de l'organisation
- Réduire la taille de police du tableau (text-xs au lieu de text-sm)
- Réduire les paddings des cellules (px-2 py-2 au lieu de px-3 py-3)
- Ajouter whitespace-nowrap sur les badges de statut pour tenir sur une ligne
- Réduire la taille de la ligne 'Payé' (text-[10px])
- Ajouter title sur la colonne organisation pour voir le nom complet au survol
- Modifier l'API /api/staff/organizations pour inclure le code_employeur
- Mettre à jour les types Organization et PeriodRow
- Créer le composant CotisationsGrid.tsx moderne
- Ajouter tri par colonnes (organisation, période, échéance, statut, total)
- Ajouter filtres avancés (organisation, statut, année)
- Ajouter sélection multiple avec checkboxes
- Ajouter actions groupées (notification, suppression)
- Ajouter indicateurs visuels pour les statuts
- Ajouter badge de notification avec date
- Ajouter persistance des filtres dans localStorage
- Ajouter subscription realtime pour les mises à jour
- Améliorer l'UX avec hover effects et transitions
- Rendre cohérent avec les autres grilles (PayslipsGrid, ContractsGrid, etc.)
- Utilisation de email_signature au lieu de email_notifs
- Suppression du CC pour les notifications de signature électronique
- Cohérence avec le système de signature (email distinct des autres notifs)
- Ajout de l'affichage de l'email de l'employeur dans le modal de confirmation e-signature
- Récupération de l'email_signature depuis organization_details
- Clarification que cet email est utilisé pour les notifications de signature
- Correction du bucket S3 de 'odentas-documents' à 'odentas-docs' dans upload-signed-pdf
- Ajout du drag & drop dans UploadSignedPdfModal pour faciliter l'upload
- Validation du fichier centralisée pour éviter la duplication de code
- Nouvelle route /staff/avenants/[id]/modifier
- Composant ModifierAvenantPageClient qui pré-remplit les données
- API PATCH /api/staff/amendments/[id] pour mise à jour
- Restriction: seuls les avenants 'draft' sont modifiables
- Bouton 'Modifier' fonctionnel sur page détail avenant
- Pré-remplissage des formulaires avec données existantes
- Régénération PDF possible après modification