docs: Documentation page signature-salarie unifiée
This commit is contained in:
parent
58e8fa4584
commit
9e96008c1f
1 changed files with 206 additions and 0 deletions
206
SIGNATURE_SALARIE_UNIFIED_FEATURE.md
Normal file
206
SIGNATURE_SALARIE_UNIFIED_FEATURE.md
Normal file
|
|
@ -0,0 +1,206 @@
|
||||||
|
# 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
|
||||||
Loading…
Reference in a new issue