espace-paie-odentas/SIGNATURE_SALARIE_UNIFIED_FEATURE.md

206 lines
7.8 KiB
Markdown

# 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** :
1. Cherche d'abord dans `cddu_contracts` via `employee_docuseal_slug`
2. Si non trouvé, cherche dans `avenants` via `employee_docuseal_slug`
-**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** :
1. Cherche d'abord dans `cddu_contracts`
2. Si non trouvé, cherche dans `avenants` avec jointure sur `cddu_contracts`
-**Récupération du salarié** :
- Utilise `employeeId` extrait du contrat ou de l'avenant
- Vérifie la date de naissance de manière identique pour les deux types
### 2. Composants UI
#### `SignatureSalarieContent.tsx`
-**État `signatureData` étendu** :
```typescript
{
contract: any;
signed_at: string | null;
downloadUrl: string | null;
documentType?: 'contrat' | 'avenant'; // Nouveau
}
```
-**Titre dynamique** :
- "Signature électronique - Contrat" ou "Signature électronique - Avenant"
-**Props transmis** :
- `AlreadySignedCard` et `ToSignCard` reçoivent `documentType`
#### `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
## 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 :**
```typescript
const { data: contract } = await supabase
.from('cddu_contracts')
.select('*')
.eq('employee_docuseal_slug', docuseal_id)
.maybeSingle();
```
**Recherche d'avenant :**
```typescript
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
1. ✅ Envoyer un contrat CDDU à un salarié
2. ✅ Le salarié reçoit un email avec lien `/signature-salarie/?docuseal_id=xxx`
3. ✅ La page affiche "Contrat" dans le titre
4. ✅ Le salarié signe
5. ✅ La page affiche "Contrat signé"
### Test 2 : Signature d'un avenant
1. ✅ Envoyer un avenant à un salarié (depuis l'interface Staff)
2. ✅ L'employeur signe l'avenant
3. ✅ Le salarié reçoit un email avec lien `/signature-salarie/?docuseal_id=xxx`
4. ✅ La page affiche "Avenant" dans le titre
5. ✅ Les textes sont adaptés ("Signer votre avenant")
6. ✅ Le salarié signe
7. ✅ La page affiche "Avenant signé"
### Test 3 : Vérification date de naissance
1. ✅ Pour un contrat : vérifie dans `cddu_contracts``salaries`
2. ✅ Pour un avenant : vérifie dans `avenants``cddu_contracts``salaries`
3. ✅ Date de naissance correcte : accès autorisé
4. ✅ Date de naissance incorrecte : accès refusé
## Avantages de l'approche unifiée
### ✅ Avantages
1. **UX cohérente** : Même expérience pour contrats et avenants
2. **Moins de code** : Pas de duplication de pages
3. **Maintenance simplifiée** : Une seule page à maintenir
4. **Évolutivité** : Facile d'ajouter d'autres types de documents
### ⚠️ Points d'attention
1. **TypeScript** : Vérifier que `documentType` est toujours défini
2. **Tests** : Tester les deux flux (contrat ET avenant)
3. **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
1. ✅ Tester le flux complet avec un avenant réel
2. ⏳ Ajouter des analytics PostHog pour tracker les signatures d'avenants
3. ⏳ Créer une page de liste des avenants signés (côté salarié)
4. ⏳ Ajouter des notifications push pour les avenants en attente
---
**Date de création** : $(date +%Y-%m-%d)
**Auteur** : GitHub Copilot
**Version** : 1.0