- 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
134 lines
4.1 KiB
Markdown
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
|