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

4.1 KiB

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 :

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)

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)

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 :

{
  "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

-- 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 :

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