# Migration des Slugs DocuSeal des Salariés ## Contexte La page `/signature-salarie` utilise le paramètre `docuseal_id` (slug du salarié) pour identifier le contrat à signer. Avant cette migration, on devait scanner toutes les submissions DocuSeal (limité à 100) pour trouver le contrat, ce qui causait des erreurs "Document introuvable" pour les contrats plus anciens. ## Solution Stocker le slug DocuSeal du salarié directement dans la table `cddu_contracts` (colonne `employee_docuseal_slug`) pour permettre une recherche directe et rapide. ## Étapes de Migration ### 1. Créer la colonne dans Supabase Exécuter le script SQL dans Supabase : ```bash psql $DATABASE_URL < supabase_add_employee_docuseal_slug.sql ``` Ou via l'interface Supabase : 1. Aller dans SQL Editor 2. Copier le contenu de `supabase_add_employee_docuseal_slug.sql` 3. Exécuter ### 2. Migrer les contrats existants **Option A : Via script TypeScript (recommandé pour gros volumes)** ```bash npx tsx scripts/migrate-employee-docuseal-slugs.ts ``` Le script : - Récupère tous les contrats avec `docuseal_submission_id` mais sans `employee_docuseal_slug` - Pour chaque contrat, appelle l'API DocuSeal pour récupérer le slug du salarié - Met à jour la base de données - Affiche un résumé détaillé **Option B : Via API (pour petits volumes ou tests)** ```bash curl -X POST https://paie.odentas.fr/api/admin/migrate-employee-slugs \ -H "X-Admin-Key: VOTRE_CLE_ADMIN" \ -H "Content-Type: application/json" ``` Réponse : ```json { "success": true, "migrated": 45, "errors": 2, "total": 47, "errorDetails": [ { "contract": "CDDU-2024-001", "error": "Slug non trouvé dans DocuSeal" } ] } ``` **Note** : L'API traite maximum 100 contrats par appel. Si vous avez plus de contrats, exécutez plusieurs fois ou utilisez le script TypeScript. ### 3. Vérifier la migration ```sql -- Vérifier combien de contrats ont été migrés SELECT COUNT(*) FILTER (WHERE employee_docuseal_slug IS NOT NULL) as avec_slug, COUNT(*) FILTER (WHERE employee_docuseal_slug IS NULL AND docuseal_submission_id IS NOT NULL) as sans_slug, COUNT(*) as total FROM cddu_contracts WHERE docuseal_submission_id IS NOT NULL; ``` ## Contrats Futurs Les nouveaux contrats créés via `/api/docuseal-signature` auront automatiquement le `employee_docuseal_slug` renseigné lors de la création de la submission DocuSeal. ## Modifications Apportées ### Fichiers modifiés 1. **`app/api/docuseal-signature/route.ts`** - Extraction du slug du salarié depuis la réponse DocuSeal - Stockage dans `cddu_contracts.employee_docuseal_slug` 2. **`app/api/signature-salarie/check-status/route.ts`** - Recherche directe par `employee_docuseal_slug` au lieu de scanner toutes les submissions - Plus rapide et plus fiable 3. **`app/api/signature-salarie/verify-birthdate/route.ts`** - Même approche : recherche directe par slug 4. **`app/signature-salarie/page.tsx`** - Bypass du mode maintenance en localhost ### Nouveaux fichiers 1. **`supabase_add_employee_docuseal_slug.sql`** - Script SQL de création de colonne 2. **`scripts/migrate-employee-docuseal-slugs.ts`** - Script de migration batch 3. **`app/api/admin/migrate-employee-slugs/route.ts`** - API de migration ## Troubleshooting ### "Slug non trouvé dans DocuSeal" Cela peut arriver si : - La submission DocuSeal a été supprimée - Le contrat n'a jamais eu de signature électronique créée - L'API DocuSeal est temporairement indisponible **Solution** : Recréer la signature électronique pour ce contrat ### "Document introuvable" persiste Vérifier que le contrat a bien un `employee_docuseal_slug` : ```sql SELECT id, contract_number, employee_docuseal_slug, docuseal_submission_id FROM cddu_contracts WHERE contract_number = 'CDDU-XXXX-XXX'; ``` Si `employee_docuseal_slug` est NULL, relancer la migration pour ce contrat spécifique. ## Performance **Avant** : O(n) - Scan de toutes les submissions DocuSeal (max 100) **Après** : O(1) - Index sur `employee_docuseal_slug` pour recherche directe Gain de performance : ~50-100x plus rapide