# 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
