# 🎹 Odentas Sign - Interface de Signature (Phase 2) ## 📋 Vue d'ensemble L'interface de signature Odentas Sign offre une expĂ©rience moderne et fluide pour la signature Ă©lectronique de documents. Elle remplace complĂštement DocuSeal avec une solution souveraine et conforme eIDAS. ## 🎯 FonctionnalitĂ©s ### ✅ ImplĂ©mentĂ© - ✹ Design moderne avec Tailwind CSS et Framer Motion - 🔐 Authentification OTP Ă  6 chiffres - ✍ Canvas de signature HTML5 (souris, trackpad, tactile) - 📊 Barre de progression en temps rĂ©el - 🎉 Animation de cĂ©lĂ©bration (confetti) aprĂšs signature - đŸ“± Responsive mobile-first - 🔒 VĂ©rification de consentement obligatoire - ⏱ Countdown timer pour l'OTP (15 minutes) - đŸš« Limite de tentatives (3 maximum) - 📈 Affichage de la progression des signatures ### 🔄 À venir - 📄 Visualiseur PDF avec zones de signature surlignĂ©es - đŸ“„ TĂ©lĂ©chargement du document signĂ© - 📧 Notifications email amĂ©liorĂ©es ## đŸ—‚ïž Structure des fichiers ``` app/signer/[requestId]/[signerId]/ ├── page.tsx # Page principale avec routing └── components/ ├── ProgressBar.tsx # Barre de progression des Ă©tapes ├── OTPVerification.tsx # Écran de vĂ©rification OTP ├── SignatureCapture.tsx # Canvas de signature └── CompletionScreen.tsx # Écran de confirmation ``` ## 🎹 Flow utilisateur ### 1ïžâƒŁ Étape 1 : VĂ©rification OTP **URL:** `/signer/[requestId]/[signerId]` **Processus:** 1. L'utilisateur arrive sur la page avec son lien unique 2. Affichage de son nom et email prĂ©-remplis 3. Clic sur "Recevoir le code" 4. En **mode test** : OTP affichĂ© dans les logs serveur 5. En **mode production** : Email SES envoyĂ© 6. Saisie du code Ă  6 chiffres (auto-focus, auto-submit) 7. VĂ©rification du code → GĂ©nĂ©ration d'un JWT (30min) 8. Transition automatique vers l'Ă©tape signature **SĂ©curitĂ©:** - Code valide 15 minutes - Maximum 3 tentatives - Rate limiting 60 secondes entre envois - JWT avec expiration ### 2ïžâƒŁ Étape 2 : Signature **Processus:** 1. Canvas de signature responsive 2. Dessin avec souris/trackpad/doigt 3. Bouton "Recommencer" pour effacer 4. Checkbox de consentement obligatoire 5. Validation → Upload de l'image PNG 6. Enregistrement en base + S3 7. Si tous ont signĂ© → DĂ©clenchement webhook 8. Transition vers Ă©cran de confirmation **Canvas:** - Taille adaptative (devicePixelRatio) - Ligne fluide (lineCap: round) - Couleur noire (#1e293b) - Export PNG avec transparence - Support touch events ### 3ïžâƒŁ Étape 3 : Confirmation **Processus:** 1. 🎉 Animation de confetti 2. Affichage des dĂ©tails (date, rĂ©fĂ©rence) 3. Progression des signatures (X/Y signĂ©) 4. Message diffĂ©rent selon statut: - Tous signĂ©s → "Document finalisĂ©" - En attente → "Attente des autres" 5. Boutons (tĂ©lĂ©chargement dĂ©sactivĂ© pour l'instant) ## đŸ§Ș Test de l'interface ### PrĂ©requis ```bash # 1. CrĂ©er une demande de test node test-odentas-sign.js # 2. Lancer le serveur Next.js en dev npm run dev # 3. Utiliser le script de test interactif ./test-interface-signature.sh ``` ### Script de test Le script `test-interface-signature.sh` offre: 1. **Ouvrir l'interface Employeur** → Ouvre automatiquement le navigateur 2. **Ouvrir l'interface SalariĂ©** → Ouvre automatiquement le navigateur 3. **Afficher l'OTP Employeur** → Trigger l'envoi + instructions pour logs 4. **Afficher l'OTP SalariĂ©** → Trigger l'envoi + instructions pour logs 5. **VĂ©rifier le statut** → Affiche qui a signĂ©, progression 6. **Quitter** ### Mode test vs Production | Aspect | Mode Test | Mode Production | |--------|-----------|----------------| | **DĂ©tection** | Ref commence par `TEST-` | Ref normale | | **OTP** | Logs serveur | Email SES | | **Scellement** | SautĂ© | PAdES + TSA | | **Archive** | SautĂ©e | S3 Object Lock 10 ans | ## 🎹 Design System ### Couleurs ```css /* Gradients principaux */ from-indigo-600 to-purple-600 /* Header vĂ©rification */ from-green-500 to-teal-500 /* Confirmation success */ from-slate-50 via-blue-50 /* Background page */ /* Boutons */ bg-indigo-600 hover:bg-indigo-700 /* Primary action */ bg-slate-100 text-slate-400 /* Disabled */ border-slate-200 /* Secondary */ ``` ### Animations ```typescript // Transitions de page initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -20 }} // Progress bar fill initial={{ width: 0 }} animate={{ width: `${percentage}%` }} transition={{ duration: 1, ease: 'easeOut' }} // Confetti celebration confetti({ particleCount: 50, startVelocity: 30, spread: 360, colors: ['#6366f1', '#8b5cf6', '#ec4899'] }) ``` ### Composants rĂ©utilisables - `ProgressBar` : Étapes avec cercles et connecteurs - Icons de Lucide : `Shield`, `Check`, `Clock`, `Users`, `PenTool` - Modales animĂ©es avec `AnimatePresence` ## 🔐 SĂ©curitĂ© ### JWT Session Token ```typescript { signerId: string, requestId: string, role: string, iat: number, // Issued at exp: number, // Expiration (30 minutes) iss: 'odentas-sign' } ``` **Utilisation:** - GĂ©nĂ©rĂ© aprĂšs validation OTP - StockĂ© dans state React (pas de localStorage) - EnvoyĂ© dans header `Authorization: Bearer ` - VĂ©rifiĂ© cĂŽtĂ© serveur pour `/sign` ### Protection CSRF - Origin checking dans les API routes - Rate limiting sur `/send-otp` - Validation des inputs (OTP digits only) ### DonnĂ©es personnelles - Email affichĂ© mais non modifiable - IP et User-Agent enregistrĂ©s dans `sign_events` - Consentement explicite requis - Archivage 10 ans conforme RGPD (base lĂ©gale: contrat) ## 📊 Tracking des Ă©vĂ©nements Tous les Ă©vĂ©nements sont loggĂ©s dans `sign_events`: 1. `request_created` → CrĂ©ation demande 2. `otp_sent` → Envoi code 3. `otp_verified` → Code validĂ© 4. `otp_verification_failed` → Code invalide 5. `signed` → Signature enregistrĂ©e 6. `request_completed` → Tous ont signĂ© 7. `pdf_sealed` → PAdES appliquĂ© 8. `document_timestamped` → TSA horodatage 9. `archived` → Archive S3 ## 🌐 URLs ### Signature ``` /signer/[requestId]/[signerId] ``` **Exemple:** ``` /signer/75b4408d-1bbd-464f-a9ea-2b4e5075a817/95c4ccdc-1a26-4426-a56f-653758159b54 ``` ### API Endpoints utilisĂ©s ``` POST /api/odentas-sign/signers/[id]/send-otp POST /api/odentas-sign/signers/[id]/verify-otp POST /api/odentas-sign/signers/[id]/sign GET /api/odentas-sign/signers/[id]/status ``` ## đŸ“± Responsive Design ### Breakpoints ```css sm: 640px /* Tablettes portrait */ md: 768px /* Tablettes landscape */ lg: 1024px /* Desktop */ xl: 1280px /* Large screens */ ``` ### Canvas tactile ```typescript // Disable browser touch gestures style={{ touchAction: 'none' }} // Support touch events onTouchStart={startDrawing} onTouchMove={draw} onTouchEnd={stopDrawing} ``` ## 🎯 Prochaines Ă©tapes ### PDF Viewer intĂ©gration ```bash npm install react-pdf pdfjs-dist ``` **FonctionnalitĂ©s:** - Afficher le PDF dans `SignatureCapture` - Overlay semi-transparent sur zones de signature - Scroll automatique vers la zone du signataire - Zoom responsive ### Email notifications Templates Ă  crĂ©er: - `signature-completed.html` → EnvoyĂ© au signataire aprĂšs sa signature - `all-signatures-completed.html` → EnvoyĂ© Ă  tous quand finalisĂ© - Avec lien de tĂ©lĂ©chargement du PDF signĂ© ### Download du document ```typescript async function downloadSignedDocument() { const response = await fetch(`/api/odentas-sign/requests/${requestId}/download`); const blob = await response.blob(); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${documentRef}-signed.pdf`; a.click(); } ``` ## 🐛 Debugging ### Logs serveur ```bash npm run dev ``` Chercher dans les logs: ``` ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ MODE TEST - Code OTP ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ ``` ### Console navigateur ```javascript // État du composant React DevTools → SignerPage → state // Erreurs rĂ©seau Network tab → Filter: "odentas-sign" // JWT decode JSON.parse(atob(token.split('.')[1])) ``` ### Base de donnĂ©es ```sql -- Derniers Ă©vĂ©nements SELECT * FROM sign_events ORDER BY created_at DESC LIMIT 20; -- Statut des signataires SELECT sr.ref, s.name, s.role, s.has_signed, s.signed_at FROM signers s JOIN sign_requests sr ON s.request_id = sr.id ORDER BY sr.created_at DESC; ``` ## 🎉 Migration depuis DocuSeal ### Coexistence Les anciennes pages DocuSeal restent actives: - `/signatures-electroniques` → DocuSeal (employeur) - `/signature-salarie` → DocuSeal (salariĂ©) Nouvelles pages Odentas Sign: - `/signer/[requestId]/[signerId]` → Odentas Sign (tous rĂŽles) ### Migration progressive 1. **Phase 1** : Nouveaux contrats → Odentas Sign 2. **Phase 2** : Anciens contrats → Continuer DocuSeal 3. **Phase 3** : Quand tous migrĂ©s → Supprimer DocuSeal ### DĂ©tection automatique ```typescript // Dans le code de crĂ©ation de contrat const useOdentasSign = process.env.NEXT_PUBLIC_USE_ODENTAS_SIGN === 'true'; if (useOdentasSign) { // CrĂ©er via /api/odentas-sign/requests/create // Envoyer liens /signer/[requestId]/[signerId] } else { // CrĂ©er via DocuSeal // Envoyer liens DocuSeal } ``` ## 📚 Ressources - [Framer Motion Docs](https://www.framer.com/motion/) - [Tailwind CSS](https://tailwindcss.com) - [Lucide Icons](https://lucide.dev) - [Canvas Confetti](https://www.npmjs.com/package/canvas-confetti) - [eIDAS Regulation](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.L_.2014.257.01.0073.01.ENG) ## ✅ Checklist de production Avant mise en production: - [ ] Tester sur mobile (iOS Safari, Android Chrome) - [ ] VĂ©rifier accessibilitĂ© (contraste, keyboard navigation) - [ ] IntĂ©grer PDF viewer - [ ] Ajouter templates email de notification - [ ] Activer vraie signature PAdES (retirer test mode bypass) - [ ] Configurer monitoring (Sentry, logs CloudWatch) - [ ] Load testing (Artillery, k6) - [ ] Documentation utilisateur finale - [ ] Formation Ă©quipe support - [ ] Plan de rollback DocuSeal --- **Créé le:** $(date +%Y-%m-%d) **Version:** 2.0.0 **Auteur:** GitHub Copilot **Statut:** ✅ Phase 2 ComplĂšte