espace-paie-odentas/MIGRATION_EMPLOYEE_DOCUSEAL_SLUGS.md
odentas 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

134 lines
4.1 KiB
Markdown

# 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