# Guide de Test - Odentas Sign Ce guide vous permet de tester Odentas Sign **sans déclencher Odentas Seal**, pour valider le workflow complet de signature électronique en environnement de développement. ## 🧪 Mode Test Le système détecte automatiquement le **mode test** quand : - La référence du contrat commence par `TEST-` - Le PDF source est dans `source/test/` - Les emails contiennent `test@` ou `@example.com` En mode test : - ✅ Création de la demande de signature - ✅ Authentification OTP (code affiché dans les logs) - ✅ Capture et upload de la signature - ✅ Bundle de preuves (evidence) - ❌ **Scellage PAdES désactivé** - ❌ **Horodatage TSA désactivé** - ❌ **Archivage Object Lock désactivé** - ❌ **Envoi d'emails désactivé** ## 🚀 Étape 1 : Créer une demande de test ### Option A : Via l'API de test (recommandé) ```bash curl -X POST http://localhost:3000/api/odentas-sign/test/create-mock \ -H "Content-Type: application/json" \ -d '{ "title": "Contrat CDDU Test", "signerName": "Marie Test", "signerEmail": "marie.test@example.com" }' ``` **Réponse :** ```json { "success": true, "test_mode": true, "request": { "id": "xxx", "ref": "TEST-...", "title": "Contrat CDDU Test", "status": "pending" }, "signers": [ { "signerId": "yyy", "role": "Employeur", "name": "Jean Dupont (Test)", "email": "employeur-test@example.com", "signatureUrl": "http://localhost:3000/signer/xxx/yyy" }, { "signerId": "zzz", "role": "Salarié", "name": "Marie Test", "email": "marie.test@example.com", "signatureUrl": "http://localhost:3000/signer/xxx/zzz" } ] } ``` ### Option B : Via l'API normale avec un vrai contrat Si vous avez déjà un PDF uploadé dans S3 : ```bash curl -X POST http://localhost:3000/api/odentas-sign/requests/create \ -H "Content-Type: application/json" \ -d '{ "contractId": "votre-contract-id", "contractRef": "TEST-2025-0001", "pdfS3Key": "source/test/contrat-test.pdf", "title": "Contrat de travail CDDU", "signers": [ { "role": "Employeur", "name": "Votre Nom", "email": "vous-test@example.com" }, { "role": "Salarié", "name": "Salarié Test", "email": "salarie-test@example.com" } ], "positions": [ { "role": "Employeur", "page": 1, "x": 100, "y": 650, "w": 200, "h": 60 }, { "role": "Salarié", "page": 1, "x": 350, "y": 650, "w": 200, "h": 60 } ] }' ``` ## 🔐 Étape 2 : Tester le flux de signature ### 2.1. Ouvrir l'URL de signature Utilisez l'URL retournée dans `signers[].signatureUrl`. **Note :** L'interface frontend n'existe pas encore, donc pour l'instant on teste uniquement les APIs. ### 2.2. Demander un code OTP ```bash curl -X POST http://localhost:3000/api/odentas-sign/signers/[SIGNER_ID]/send-otp ``` **Réponse :** ```json { "success": true, "test_mode": true, "otp_code_in_logs": true, "message": "Mode test : le code OTP est affiché dans les logs serveur", "expires_at": "2025-10-27T15:30:00.000Z" } ``` **⚠️ Important :** Le code OTP apparaît dans les logs serveur (terminal où Next.js tourne) : ``` [OTP] 🧪 MODE TEST détecté [OTP] ======================================== [OTP] 🔐 CODE OTP POUR marie.test@example.com: [OTP] ➡️ 123456 [OTP] ======================================== ``` ### 2.3. Vérifier le code OTP ```bash curl -X POST http://localhost:3000/api/odentas-sign/signers/[SIGNER_ID]/verify-otp \ -H "Content-Type: application/json" \ -d '{"otp": "123456"}' ``` **Réponse :** ```json { "success": true, "sessionToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "signer": { "id": "xxx", "name": "Marie Test", "email": "marie.test@example.com", "role": "Salarié" }, "request": { "id": "yyy", "ref": "TEST-...", "title": "Contrat CDDU Test" } } ``` **Copiez le `sessionToken`** pour l'étape suivante. ### 2.4. Enregistrer la signature Créez une image de signature en base64 (pour tester, voici un petit carré rouge) : ```bash # Image 100x50 pixels, carré rouge simple SIGNATURE_B64="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAABmJLR0QA/wD/AP+gvaeTAAAAeklEQVR4nO3QMQEAAAjAMMC/52ECvlRA00ASAgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcNkFzQABOWLnlYwAAAAASUVORK5CYII=" curl -X POST http://localhost:3000/api/odentas-sign/signers/[SIGNER_ID]/sign \ -H "Content-Type: application/json" \ -H "Authorization: Bearer [SESSION_TOKEN]" \ -d "{ \"signatureImageBase64\": \"$SIGNATURE_B64\", \"consentText\": \"Je consens à signer électroniquement ce document.\" }" ``` **Réponse :** ```json { "success": true, "message": "Signature enregistrée avec succès", "signed_at": "2025-10-27T15:25:00.000Z", "all_signed": false, "signer": { "id": "xxx", "name": "Marie Test", "role": "Salarié" } } ``` ### 2.5. Signer avec le deuxième signataire Répétez les étapes 2.2 à 2.4 avec le deuxième `signerId`. Quand le dernier signataire signe, `"all_signed": true` et le webhook de completion est déclenché. ## 📊 Étape 3 : Vérifier les résultats ### 3.1. Vérifier le statut de la demande ```bash curl http://localhost:3000/api/odentas-sign/requests/[REQUEST_ID] ``` **Réponse :** ```json { "success": true, "request": { "id": "xxx", "ref": "TEST-...", "status": "completed", "progress": { "total": 2, "signed": 2, "percentage": 100 } }, "signers": [ { "id": "yyy", "role": "Employeur", "signed_at": "2025-10-27T15:20:00.000Z", "signature_image_s3": "signatures/xxx/yyy.png" }, { "id": "zzz", "role": "Salarié", "signed_at": "2025-10-27T15:25:00.000Z", "signature_image_s3": "signatures/xxx/zzz.png" } ] } ``` ### 3.2. Vérifier dans Supabase Allez dans Supabase et vérifiez les tables : **`sign_requests`** ```sql SELECT * FROM sign_requests WHERE ref LIKE 'TEST-%' ORDER BY created_at DESC; ``` **`signers`** ```sql SELECT * FROM signers WHERE request_id = '[REQUEST_ID]'; ``` **`sign_events`** ```sql SELECT * FROM sign_events WHERE request_id = '[REQUEST_ID]' ORDER BY ts ASC; ``` **`sign_assets`** ```sql SELECT * FROM sign_assets WHERE request_id = '[REQUEST_ID]'; ``` ### 3.3. Vérifier dans S3 Le bucket `odentas-sign` doit contenir : ``` odentas-sign/ ├── source/test/ │ └── TEST-xxx.pdf # PDF source de test ├── signatures/ │ └── [request_id]/ │ ├── [signer1_id].png # Signature employeur │ └── [signer2_id].png # Signature salarié └── evidence/ └── TEST-xxx.json # Bundle de preuves ``` ## 📋 Logs attendus Dans votre terminal Next.js, vous devriez voir : ``` [TEST] PDF de test créé: source/test/TEST-xxx.pdf [CREATE REQUEST] Création demande: TEST-xxx [OTP] 🧪 MODE TEST détecté [OTP] 🔐 CODE OTP POUR employeur-test@example.com: 123456 [OTP] ✅ Mode test - Code affiché dans les logs [SIGN] Enregistrement signature pour employeur-test@example.com... [SIGN] ✅ Image uploadée: signatures/xxx/yyy.png [SIGN] ✅ Signataire mis à jour [SIGN] 🎉 Tous les signataires ont signé ! [WEBHOOK COMPLETION] 🧪 MODE TEST détecté - scellage PAdES désactivé [WEBHOOK] 🧪 MODE TEST : Scellage PAdES/TSA/Archive SAUTE [WEBHOOK COMPLETION] ✅ Traitement terminé pour TEST-xxx (MODE TEST) ``` ## 🧹 Nettoyage après test Pour nettoyer les données de test : ```sql -- Supprimer les demandes de test (cascade sur signers, positions, events) DELETE FROM sign_requests WHERE ref LIKE 'TEST-%'; -- Supprimer les assets de test DELETE FROM sign_assets WHERE request_id IN ( SELECT id FROM sign_requests WHERE ref LIKE 'TEST-%' ); ``` Dans S3, supprimer manuellement : - `source/test/` - `signatures/[request_ids de test]/` - `evidence/TEST-*.json` ## 🎯 Checklist de validation - [ ] Création de demande de test réussie - [ ] Code OTP visible dans les logs - [ ] Vérification OTP réussie avec session token - [ ] Upload de la signature réussie - [ ] Images de signature présentes dans S3 - [ ] Statut `completed` après signature complète - [ ] Logs confirment le mode test (pas de scellage) - [ ] Evidence bundle créé dans S3 - [ ] Tables Supabase cohérentes - [ ] Événements d'audit enregistrés ## ⏭️ Prochaine étape Une fois les APIs validées, vous pourrez : 1. **Créer l'interface frontend** (`/app/signer/[requestId]/[signerId]/page.tsx`) 2. **Intégrer avec vos contrats existants** 3. **Créer la Lambda d'orchestration** pour le scellage 4. **Activer le mode production** (sans TEST-) ## 🐛 Dépannage ### Le code OTP n'apparaît pas dans les logs - Vérifiez que l'email contient `test@` ou `@example.com` - Ou que la ref commence par `TEST-` ### Erreur "Session invalide" - Le JWT expire après 30 minutes - Redemandez un OTP et re-vérifiez ### Erreur S3 - Vérifiez que le bucket `odentas-sign` existe - Vérifiez les credentials AWS dans `.env.local` ### Erreur Supabase - Vérifiez que les tables existent (voir définitions dans README) - Vérifiez les RLS policies --- **Dernière mise à jour :** 27 octobre 2025