espace-paie-odentas/STAFF_DOCUMENTS_FEATURE.md

207 lines
7.1 KiB
Markdown

# Feature: Affichage et gestion des documents salariés dans Staff
## 📝 Description
Cette fonctionnalité permet au staff de :
- Visualiser les documents up## 📦 Types de documents supportés
| Type | Label affiché |
|------|---------------|
| `piece_identite` | Pièce d'identité |
| `attestation_secu` | Attestation Sécurité Sociale |
| `rib` | RIB |
| `medecine_travail` | Médecine du travail |
| `contrat_travail` | Contrat de travail *(nouveau - staff uniquement)* |
| `diplome` | Diplôme *(nouveau - staff uniquement)* |
| `justificatif` | Justificatif *(nouveau - staff uniquement)* |
| `autre` | Autre document |r les salariés via la page d'auto-déclaration
- Télécharger ces documents
- **Uploader manuellement des documents pour un salarié**
Le tout accessible directement depuis l'interface `/staff/salaries`.
## 🔧 Fichiers modifiés/créés
### 1. `/app/api/staff/salaries/documents/route.ts` (NOUVEAU)
API qui récupère les documents d'un salarié depuis S3.
**Fonctionnalités :**
- Récupère tous les fichiers stockés dans S3 pour un matricule donné
- Génère des URLs pré-signées valides 1 heure pour le téléchargement sécurisé
- Détecte automatiquement le type de document (CNI, RIB, etc.) basé sur le nom du fichier
- Retourne les métadonnées (nom, type, taille, date de modification)
**Endpoint :** `GET /api/staff/salaries/documents?matricule={code_salarie}`
**Réponse :**
```json
{
"documents": [
{
"key": "justif-salaries/MAT001/piece-identite-1234567890.pdf",
"name": "piece-identite-1234567890.pdf",
"type": "Pièce d'identité",
"size": 245678,
"lastModified": "2025-10-12T10:30:00Z",
"downloadUrl": "https://odentas-docs.s3.eu-west-3.amazonaws.com/..."
}
],
"count": 1,
"matricule": "MAT001"
}
```
### 2. `/app/api/staff/salaries/documents/upload/route.ts` (NOUVEAU)
API qui permet au staff d'uploader des documents pour un salarié.
**Fonctionnalités :**
- Upload de fichiers (PDF, JPG, PNG) jusqu'à 10MB
- Vérification de l'existence du salarié
- Stockage dans S3 sous `justif-salaries/{matricule}/`
- Métadonnées incluant `uploaded-by: 'staff'` pour tracer l'origine
**Endpoint :** `POST /api/staff/salaries/documents/upload`
**Body (FormData) :**
- `file`: Le fichier à uploader
- `matricule`: Code salarié
- `type`: Type de document (piece_identite, rib, etc.)
**Types de documents supportés :**
- `piece_identite` - Pièce d'identité
- `attestation_secu` - Attestation Sécurité Sociale
- `rib` - RIB
- `medecine_travail` - Attestation médecine du travail
- `contrat_travail` - Contrat de travail
- `diplome` - Diplôme
- `justificatif` - Justificatif
- `autre` - Autre document
### 3. `/components/staff/UploadDocumentModal.tsx` (NOUVEAU)
Composant modal pour uploader des documents.
**Fonctionnalités :**
- Sélection du type de document via dropdown
- Upload par drag & drop ou clic
- Validation du type et de la taille de fichier
- Prévisualisation du fichier sélectionné
- Feedback visuel pendant l'upload
- Messages de succès/erreur avec toast
### 4. `/components/staff/SalariesGridSimple.tsx` (MODIFIÉ)
Composant principal de la page staff/salaries.
**Modifications :**
- Ajout du type `S3Document` pour typer les documents
- Ajout des états `documents`, `loadingDocuments` et `isUploadModalOpen`
- Ajout de la fonction `fetchSalarieDocuments()` qui appelle l'API
- Mise à jour du `useEffect` pour charger les documents lors de la sélection d'un salarié
- Refonte complète de la Card "Documents" pour afficher :
- Un loader pendant le chargement
- La liste des documents avec icône de téléchargement
- Le type, la date et la taille de chaque document
- Un message si aucun document n'est disponible
- **Un bouton "Ajouter un document" pour upload manuel**
- Intégration de `UploadDocumentModal` avec callback de rafraîchissement
## 🎨 Interface utilisateur
### Card Documents - États possibles
1. **Chargement** : Spinner animé
2. **Documents disponibles** :
- Liste cliquable avec :
- Icône de téléchargement
- Type de document (Pièce d'identité, RIB, etc.)
- Date d'upload et taille en Ko
- Fond bleu clair au hover
- Bouton "Ajouter un document" en bas
3. **Aucun document** :
- Message explicatif
- Bouton "Ajouter un document"
### Modale d'upload
La modale permet de :
1. Sélectionner le type de document (dropdown avec 8 types)
2. Uploader un fichier via :
- Drag & drop
- Clic pour ouvrir le sélecteur
3. Voir le fichier sélectionné avec sa taille
4. Valider ou annuler l'upload
### Exemple d'affichage
```
📄 Documents
────────────────────────
3 documents disponibles
[⬇️] Pièce d'identité
12/10/2025 • 245.7 Ko
[⬇️] Attestation Sécurité Sociale
12/10/2025 • 189.2 Ko
[⬇️] RIB
12/10/2025 • 102.3 Ko
[+ Ajouter un document]
```
## 🔒 Sécurité
- Les URLs de téléchargement sont pré-signées et expirent après 1 heure
- L'accès aux APIs est réservé au staff (vérification via `createSbServiceRole()`)
- Les fichiers sont stockés de manière isolée par matricule sur S3
- Les uploads par le staff sont tracés via la métadonnée `uploaded-by: 'staff'`
- Validation du type de fichier et de la taille (max 10MB)
- Vérification de l'existence du salarié avant upload
## 🔗 Intégration
La feature s'intègre avec le système d'auto-déclaration existant :
- Les salariés uploadent leurs documents via `/auto-declaration`
- **Le staff peut aussi uploader des documents manuellement via `/staff/salaries`**
- Les documents sont stockés dans S3 sous `justif-salaries/{matricule}/`
- Le staff peut les visualiser et télécharger via `/staff/salaries`
- Tous les documents (auto-déclaration + staff) sont mélangés dans la même liste
## 📦 Types de documents supportés
| Type | Label affiché |
|------|---------------|
| `piece-identite` | Pièce d'identité |
| `attestation-secu` | Attestation Sécurité Sociale |
| `rib` | RIB |
| `medecine-travail` | Médecine du travail |
| `autre` | Autre document |
## 🚀 Déploiement
Aucune configuration supplémentaire requise. La feature utilise les variables d'environnement AWS S3 existantes :
- `AWS_REGION`
- `AWS_ACCESS_KEY_ID`
- `AWS_SECRET_ACCESS_KEY`
- `AWS_S3_BUCKET`
## ✅ Tests recommandés
1. **Visualisation :**
- Sélectionner un salarié qui a uploadé des documents
- Vérifier que les documents s'affichent correctement
- Cliquer sur un document pour le télécharger
- Vérifier qu'un salarié sans document affiche le bon message
2. **Upload manuel par le staff :**
- Cliquer sur "Ajouter un document"
- Sélectionner un type de document
- Tester le drag & drop d'un fichier valide
- Tester l'upload avec un fichier trop volumineux (>10MB)
- Tester avec un type de fichier invalide (.txt, .doc)
- Vérifier que le document apparaît immédiatement après l'upload
- Vérifier qu'on peut télécharger le document uploadé
3. **Edge cases :**
- Salarié sans matricule (code_salarie null)
- Upload pendant qu'un autre est en cours
- Fermeture de la modale pendant l'upload