- organization_id -> org_id - api_name -> name (puis slugification) - Ajouter logs détaillés pour debug - Améliorer la gestion des cas où org_id est null
5 KiB
5 KiB
Upload Manuel du Contrat Signé - Guide
Vue d'ensemble
Cette fonctionnalité permet au staff d'uploader manuellement le PDF d'un contrat signé lorsqu'il a été reçu par un moyen externe (email, courrier, etc.) au lieu de passer par le processus Docuseal.
Comment utiliser
Accès
- Aller sur la page
staff/contrats/[id]d'un contrat - Dans la section Documents, cliquer sur le bouton "Ajouter le contrat signé manuellement"
Upload
- Une modale s'ouvre avec une zone de dépôt de fichier
- Cliquer sur la zone ou glisser-déposer un fichier PDF
- Vérifications automatiques :
- Type de fichier : doit être un PDF
- Taille maximum : 10 Mo
- Cliquer sur "Uploader"
Après l'upload
- Le PDF est stocké dans S3 à la clé :
contracts/<org-slug>/<contract_number>.pdf - Le champ
contract_pdf_s3_keyest mis à jour dans la base de données - Le champ
contrat_signepasse à "Oui" - Le contrat apparaît dans la section Documents avec le même style qu'un contrat signé via Docuseal
Architecture technique
Fichiers créés
1. API Route : /app/api/staff/contrats/[id]/upload-signed-pdf/route.ts
- Méthode : POST
- Authentification : Staff uniquement
- Corps de la requête : FormData avec un champ
filecontenant le PDF - Traitement :
- Vérification des droits staff
- Validation du type de fichier (application/pdf)
- Récupération de l'organisation pour obtenir l'
api_name - Upload dans S3 avec la clé
contracts/<org-slug>/<contract_number>.pdf - Mise à jour du contrat :
contract_pdf_s3_keyetcontrat_signe = "Oui"
2. Composant : /components/staff/contracts/ManualSignedContractUpload.tsx
- Modal avec zone de dépôt de fichier
- Validation côté client (type, taille)
- États de chargement et de succès
- Callback
onSuccesspour rafraîchir les données après upload
3. Modifications : /components/staff/contracts/ContractEditor.tsx
- Import du composant
ManualSignedContractUploadet de l'icôneUpload - Ajout du state
isUploadModalOpen - Ajout du bouton d'upload dans la section Documents
- Invalidation de la query
signed-contract-pdfaprès upload pour rafraîchir automatiquement - Modification de la condition
enabledde la query pour toujours vérifier l'existence d'un contrat signé
Flux de données
1. Utilisateur clique sur "Ajouter le contrat signé manuellement"
↓
2. Modal s'ouvre → Sélection du fichier PDF
↓
3. Click sur "Uploader" → POST /api/staff/contrats/[id]/upload-signed-pdf
↓
4. API vérifie les droits → Récupère l'organization → Upload S3
↓
5. Mise à jour BDD (contract_pdf_s3_key, contrat_signe)
↓
6. Success → Invalidation de la query → Rafraîchissement automatique
↓
7. Le contrat signé apparaît dans la section Documents
Stockage S3
Le PDF uploadé est stocké exactement au même endroit que s'il avait été signé via Docuseal :
- Bucket :
odentas-docs(ou valeur deAWS_S3_BUCKET) - Clé :
contracts/<org-slug>/<contract_number>.pdf - ACL : Private
- ContentType : application/pdf
Cela garantit que :
- L'API
/api/staff/contrats/[id]/signed-pdffonctionne de la même manière - Les emails de notification peuvent récupérer le PDF
- La logique existante n'est pas perturbée
Cas d'usage
Quand utiliser cette fonctionnalité ?
- Contrat signé par courrier : Le salarié ou l'employeur a imprimé, signé et renvoyé le contrat par courrier
- Contrat signé par email : Le PDF signé a été renvoyé par email au lieu de passer par Docuseal
- Problème technique Docuseal : En cas de dysfonctionnement de Docuseal, permet de continuer le processus
- Migration de données : Upload de contrats historiques déjà signés
Points d'attention
- Le PDF doit être déjà signé par les deux parties
- L'upload marque automatiquement
contrat_signe = "Oui" - Si un contrat signé existe déjà, il sera remplacé
- La limite de 10 Mo est suffisante pour la plupart des contrats (quelques pages)
Sécurité
- Accès réservé au staff uniquement (vérification via
staff_users.is_staff) - Validation stricte du type MIME (
application/pdf) - Upload direct vers S3 avec ACL Private
- Pas d'exécution de code du PDF (simple stockage)
Tests
Pour tester la fonctionnalité :
- Se connecter en tant que staff
- Aller sur un contrat existant (ex:
/staff/contrats/123) - Cliquer sur "Ajouter le contrat signé manuellement"
- Uploader un PDF de test
- Vérifier que :
- Le PDF apparaît dans la section Documents
- Le statut du contrat passe à "signé"
- Le lien "Contrat CDDU signé" ouvre le bon fichier
- Le champ
contract_pdf_s3_keyest bien rempli dans la BDD
Notes techniques
- Utilise
@aws-sdk/client-s3pour l'upload (PutObjectCommand) - Utilise
useQueryClientpour invalider les queries React Query - Le modal utilise les composants shadcn/ui (
Dialog) - Compatible avec la logique existante de récupération des contrats signés