espace-paie-odentas/test-odentas-sign.js
odentas 59749d481b feat: Migration Cloudinary vers Poppler pour conversion PDF→JPEG
- Remplacer Cloudinary (US) par solution 100% AWS eu-west-3
- Lambda odentas-sign-pdf-converter avec pdftoppm
- Lambda Layer poppler-utils v5 avec dépendances complètes
- Trigger S3 ObjectCreated pour conversion automatique
- Support multi-pages validé (PDF 3 pages)
- Stockage images dans S3 odentas-docs
- PDFImageViewer pour affichage images converties
- Conformité RGPD garantie (données EU uniquement)
2025-10-28 10:22:45 +01:00

184 lines
6.9 KiB
JavaScript
Executable file

#!/usr/bin/env node
/**
* Script de test Odentas Sign
*
* Upload un PDF local vers S3 et crée une demande de signature
*/
const fs = require('fs');
const path = require('path');
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
// Configuration
const PDF_PATH = path.join(__dirname, 'test-contrat.pdf');
const BUCKET = process.env.ODENTAS_SIGN_BUCKET || 'odentas-sign';
const REGION = process.env.AWS_REGION || 'eu-west-3';
const API_URL = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
// Emails pour le test
const EMPLOYEUR_EMAIL = 'paie@odentas.fr';
const SALARIE_EMAIL = 'renaud.breviere@gmail.com';
async function main() {
console.log('🚀 Odentas Sign - Script de test local\n');
// 1. Vérifier que le PDF existe
if (!fs.existsSync(PDF_PATH)) {
console.error(`❌ PDF introuvable: ${PDF_PATH}`);
process.exit(1);
}
const pdfBuffer = fs.readFileSync(PDF_PATH);
console.log(`✅ PDF chargé: ${PDF_PATH} (${(pdfBuffer.length / 1024).toFixed(1)} KB)\n`);
// 2. Upload vers S3
console.log('📤 Upload du PDF vers S3...');
const testRef = `TEST-${Date.now()}`;
const s3Key = `source/test/${testRef}.pdf`;
const s3Client = new S3Client({ region: REGION });
try {
await s3Client.send(new PutObjectCommand({
Bucket: BUCKET,
Key: s3Key,
Body: pdfBuffer,
ContentType: 'application/pdf',
Metadata: {
test: 'true',
uploaded_by: 'test-script',
original_name: 'test-contrat.pdf',
},
}));
console.log(`✅ PDF uploadé: s3://${BUCKET}/${s3Key}\n`);
} catch (error) {
console.error('❌ Erreur upload S3:', error.message);
console.error(' Vérifiez vos credentials AWS dans .env.local');
process.exit(1);
}
// 3. Créer la demande de signature via l'API
console.log('📝 Création de la demande de signature...');
const requestBody = {
contractId: `test-local-${Date.now()}`,
contractRef: testRef,
pdfS3Key: s3Key,
title: 'Contrat CDDU - Test Local',
signers: [
{
role: 'Employeur',
name: 'Odentas Paie',
email: EMPLOYEUR_EMAIL,
},
{
role: 'Salarié',
name: 'Renaud Breviere',
email: SALARIE_EMAIL,
},
],
positions: [
{
role: 'Employeur',
page: 3,
x: 20,
y: 260,
w: 150,
h: 60,
kind: 'signature',
label: 'Signature Employeur',
},
{
role: 'Salarié',
page: 3,
x: 180,
y: 260,
w: 150,
h: 60,
kind: 'signature',
label: 'Signature Employé',
},
],
};
try {
const response = await fetch(`${API_URL}/api/odentas-sign/requests/create`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestBody),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || `HTTP ${response.status}`);
}
const result = await response.json();
console.log('✅ Demande créée avec succès!\n');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log('📋 INFORMATIONS DE LA DEMANDE');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
console.log(`ID: ${result.request.id}`);
console.log(`Ref: ${result.request.ref}`);
console.log(`Titre: ${result.request.title}`);
console.log(`Statut: ${result.request.status}\n`);
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log('👥 SIGNATAIRES');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
result.signers.forEach((signer, index) => {
console.log(`${index + 1}. ${signer.role} - ${signer.name}`);
console.log(` Email: ${signer.email}`);
console.log(` ID: ${signer.signerId}`);
console.log(` URL: ${signer.signatureUrl}\n`);
});
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log('🧪 INSTRUCTIONS DE TEST');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
console.log('Étape 1: Demander un code OTP');
console.log('─────────────────────────────────\n');
result.signers.forEach((signer, index) => {
console.log(`${signer.role}:`);
console.log(`curl -X POST ${API_URL}/api/odentas-sign/signers/${signer.signerId}/send-otp\n`);
});
console.log('\n📧 Les codes OTP seront envoyés aux emails:');
console.log(` - ${EMPLOYEUR_EMAIL}`);
console.log(` - ${SALARIE_EMAIL}\n`);
console.log('⚠️ En mode TEST, les codes apparaissent aussi dans les logs serveur\n');
console.log('\nÉtape 2: Vérifier le code OTP');
console.log('─────────────────────────────────\n');
console.log(`curl -X POST ${API_URL}/api/odentas-sign/signers/[SIGNER_ID]/verify-otp \\`);
console.log(` -H "Content-Type: application/json" \\`);
console.log(` -d '{"otp": "123456"}'\n`);
console.log('\nÉtape 3: Enregistrer la signature');
console.log('─────────────────────────────────\n');
console.log(`curl -X POST ${API_URL}/api/odentas-sign/signers/[SIGNER_ID]/sign \\`);
console.log(` -H "Content-Type: application/json" \\`);
console.log(` -H "Authorization: Bearer [SESSION_TOKEN]" \\`);
console.log(` -d '{"signatureImageBase64": "data:image/png;base64,iVBORw0...", "consentText": "Je consens"}'\n`);
console.log('\n💡 Pour plus de détails, voir: ODENTAS_SIGN_TEST_GUIDE.md\n');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
// Sauvegarder les infos pour référence
const testInfoPath = path.join(__dirname, 'test-odentas-sign-info.json');
fs.writeFileSync(testInfoPath, JSON.stringify(result, null, 2));
console.log(`💾 Informations sauvegardées dans: ${testInfoPath}\n`);
} catch (error) {
console.error('❌ Erreur création demande:', error.message);
process.exit(1);
}
}
main().catch(console.error);