7.8 KiB
7.8 KiB
Page Signature Salarié Unifiée - Contrats et Avenants
Résumé
La page /signature-salarie a été adaptée pour gérer à la fois les contrats CDDU et les avenants, offrant une expérience unifiée au lieu de créer deux pages séparées.
Modifications réalisées
1. API Routes
/api/signature-salarie/check-status (route.ts)
- ✅ Recherche dans les deux tables :
- Cherche d'abord dans
cddu_contractsviaemployee_docuseal_slug - Si non trouvé, cherche dans
avenantsviaemployee_docuseal_slug
- Cherche d'abord dans
- ✅ Nouveau champ retourné :
documentType('contrat' ou 'avenant') - ✅ Gestion des données :
- Pour les contrats : utilise directement les champs du contrat
- Pour les avenants : utilise les données du contrat parent via la relation
- ✅ Variables unifiées :
employeeId,orgId,docusealSubmissionId,pdfS3Key,documentId- Permet de gérer les deux types de documents avec le même code
/api/signature-salarie/verify-birthdate (route.ts)
- ✅ Recherche dans les deux tables :
- Cherche d'abord dans
cddu_contracts - Si non trouvé, cherche dans
avenantsavec jointure surcddu_contracts
- Cherche d'abord dans
- ✅ Récupération du salarié :
- Utilise
employeeIdextrait du contrat ou de l'avenant - Vérifie la date de naissance de manière identique pour les deux types
- Utilise
2. Composants UI
SignatureSalarieContent.tsx
- ✅ État
signatureDataétendu :{ contract: any; signed_at: string | null; downloadUrl: string | null; documentType?: 'contrat' | 'avenant'; // Nouveau } - ✅ Titre dynamique :
- "Signature électronique - Contrat" ou "Signature électronique - Avenant"
- ✅ Props transmis :
AlreadySignedCardetToSignCardreçoiventdocumentType
AlreadySignedCard.tsx
- ✅ Nouveau prop :
documentType?: 'contrat' | 'avenant' - ✅ Textes adaptés :
- Header : "Contrat signé" → "Avenant signé" (selon le type)
- Message : "Vous avez signé électroniquement ce contrat." → "...cet avenant."
ToSignCard.tsx
- ✅ Nouveau prop :
documentType?: 'contrat' | 'avenant' - ✅ Textes adaptés :
- Alerte : "Contrat en attente de signature" → "Avenant en attente..."
- Instructions : "...prendre connaissance du contrat..." → "...de l'avenant..."
- Section : "Détails du contrat" → "Détails de l'avenant"
- Bouton : "Voir et signer votre contrat" → "Voir et signer votre avenant"
3. Webhook
/api/webhooks/docuseal-amendment (route.ts)
- ✅ Lien de signature :
- Redirige vers :
https://paie.odentas.fr/signature-salarie/?docuseal_id=xxx - Utilise la même page que les contrats
- Redirige vers :
Architecture
┌─────────────────────────────────────────────────┐
│ /signature-salarie/?docuseal_id=xxx │
└─────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ SignatureSalarieContent.tsx │
│ - Vérifie le statut │
│ - Affiche modal de vérification │
└────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ /api/signature-salarie/ │
│ check-status │
│ │
│ 1. Cherche dans cddu_contracts │
│ 2. Sinon cherche dans avenants │
│ 3. Retourne documentType │
└────────────────────────────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ AlreadySignedCard│ │ ToSignCard │
│ + documentType │ │ + documentType │
│ │ │ │
│ "Avenant signé" │ │ "Signer avenant" │
└──────────────────┘ └──────────────────┘
Base de données
Tables impliquées
cddu_contracts
- Champ utilisé :
employee_docuseal_slug - Contient : Les contrats CDDU classiques
avenants
- Champ utilisé :
employee_docuseal_slug - Relation :
cddu_contracts(foreign key) - Contient : Les avenants aux contrats existants
Requêtes Supabase
Recherche de contrat :
const { data: contract } = await supabase
.from('cddu_contracts')
.select('*')
.eq('employee_docuseal_slug', docuseal_id)
.maybeSingle();
Recherche d'avenant :
const { data: avenant } = await supabase
.from('avenants')
.select(`
*,
cddu_contracts!inner (
employee_id,
contract_number,
...
)
`)
.eq('employee_docuseal_slug', docuseal_id)
.maybeSingle();
Tests à effectuer
Test 1 : Signature d'un contrat classique
- ✅ Envoyer un contrat CDDU à un salarié
- ✅ Le salarié reçoit un email avec lien
/signature-salarie/?docuseal_id=xxx - ✅ La page affiche "Contrat" dans le titre
- ✅ Le salarié signe
- ✅ La page affiche "Contrat signé"
Test 2 : Signature d'un avenant
- ✅ Envoyer un avenant à un salarié (depuis l'interface Staff)
- ✅ L'employeur signe l'avenant
- ✅ Le salarié reçoit un email avec lien
/signature-salarie/?docuseal_id=xxx - ✅ La page affiche "Avenant" dans le titre
- ✅ Les textes sont adaptés ("Signer votre avenant")
- ✅ Le salarié signe
- ✅ La page affiche "Avenant signé"
Test 3 : Vérification date de naissance
- ✅ Pour un contrat : vérifie dans
cddu_contracts→salaries - ✅ Pour un avenant : vérifie dans
avenants→cddu_contracts→salaries - ✅ Date de naissance correcte : accès autorisé
- ✅ Date de naissance incorrecte : accès refusé
Avantages de l'approche unifiée
✅ Avantages
- UX cohérente : Même expérience pour contrats et avenants
- Moins de code : Pas de duplication de pages
- Maintenance simplifiée : Une seule page à maintenir
- Évolutivité : Facile d'ajouter d'autres types de documents
⚠️ Points d'attention
- TypeScript : Vérifier que
documentTypeest toujours défini - Tests : Tester les deux flux (contrat ET avenant)
- Logs : Vérifier que les logs distinguent bien contrat/avenant
Commit
feat: Page signature-salarie adaptée pour contrats et avenants
- check-status: cherche dans cddu_contracts ET avenants
- verify-birthdate: cherche dans les deux tables
- Retourne documentType ('contrat' ou 'avenant')
- UI adaptée: AlreadySignedCard et ToSignCard affichent le type
- Titre dynamique: 'Contrat' ou 'Avenant' selon le document
- Textes adaptés: 'Voir et signer votre avenant/contrat'
Hash : 58e8fa4
Prochaines étapes suggérées
- ✅ Tester le flux complet avec un avenant réel
- ⏳ Ajouter des analytics PostHog pour tracker les signatures d'avenants
- ⏳ Créer une page de liste des avenants signés (côté salarié)
- ⏳ Ajouter des notifications push pour les avenants en attente
Date de création : $(date +%Y-%m-%d) Auteur : GitHub Copilot Version : 1.0