espace-paie-odentas/app/api/signature-salarie/verify-birthdate/route.ts
odentas 542e0e963d feat: Stocker et utiliser employee_docuseal_slug pour signature-salarie
- Ajout colonne employee_docuseal_slug dans cddu_contracts
- Stockage automatique du slug lors de création signature DocuSeal
- Recherche directe par slug (+ rapide et fiable)
- Bypass mode maintenance en localhost
- Scripts de migration pour contrats existants (92 contrats migrés)
- Logs détaillés dans verify-birthdate et check-status

Fixes: Erreur 'Document introuvable' pour contrats anciens
Performance: O(n) -> O(1) avec index sur employee_docuseal_slug
2025-10-22 17:35:50 +02:00

152 lines
4.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { createSbServiceRole } from '@/lib/supabaseServer';
/**
* POST /api/signature-salarie/verify-birthdate
*
* Vérifie la date de naissance d'un salarié avant de lui permettre d'accéder à la signature
*
* Body: {
* docuseal_id: string,
* birthdate: string (format YYYY-MM-DD)
* }
*/
export async function POST(request: NextRequest) {
console.log('=== API Vérification Date de Naissance Salarié ===');
console.log('Request URL:', request.url);
console.log('Request method:', request.method);
try {
console.log('Parsing request body...');
const body = await request.json();
console.log('Body reçu:', JSON.stringify(body, null, 2));
const { docuseal_id, birthdate } = body;
// Validation des paramètres
if (!docuseal_id || !birthdate) {
console.error('Paramètres manquants:', { docuseal_id, birthdate });
return NextResponse.json(
{ error: 'Paramètres manquants', verified: false },
{ status: 400 }
);
}
console.log('Vérification pour docuseal_id (slug):', docuseal_id);
console.log('Date de naissance fournie:', birthdate);
// Créer le client Supabase avec service role
const supabase = createSbServiceRole();
// NOUVELLE APPROCHE: Chercher d'abord le contrat avec le slug dans employee_docuseal_slug
console.log('Recherche du contrat par employee_docuseal_slug:', docuseal_id);
const { data: contract, error: contractError } = await supabase
.from('cddu_contracts')
.select('id, employee_id, contract_number, employee_docuseal_slug')
.eq('employee_docuseal_slug', docuseal_id)
.maybeSingle();
if (contractError) {
console.error('Erreur lors de la recherche du contrat:', contractError);
return NextResponse.json(
{ error: 'Erreur lors de la recherche du contrat', verified: false },
{ status: 500 }
);
}
if (!contract) {
console.error('Aucun contrat trouvé avec employee_docuseal_slug:', docuseal_id);
return NextResponse.json(
{ error: 'Document introuvable', verified: false },
{ status: 404 }
);
}
console.log('Contrat trouvé:', {
id: contract.id,
employee_id: contract.employee_id,
contract_number: contract.contract_number
});
// Récupérer les infos du salarié depuis la table salaries
const { data: salarie, error: salarieError } = await supabase
.from('salaries')
.select('date_naissance, prenom, nom, adresse_mail')
.eq('id', contract.employee_id)
.maybeSingle();
if (salarieError) {
console.error('Erreur lors de la récupération du salarié:', salarieError);
return NextResponse.json(
{ error: 'Erreur lors de la vérification', verified: false },
{ status: 500 }
);
}
if (!salarie) {
console.error('Salarié introuvable pour employee_id:', contract.employee_id);
return NextResponse.json(
{ error: 'Salarié introuvable', verified: false },
{ status: 404 }
);
}
if (!salarie.date_naissance) {
console.warn('Date de naissance non renseignée pour le salarié');
// Si pas de date de naissance en base, on accepte quand même (pour ne pas bloquer)
return NextResponse.json({
verified: true,
message: 'Vérification acceptée (date de naissance non renseignée)'
});
}
console.log('Salarié trouvé:', {
prenom: salarie.prenom,
nom: salarie.nom,
date_naissance: salarie.date_naissance
});
// Comparer les dates de naissance
// Normaliser les dates pour la comparaison (format YYYY-MM-DD)
const dbBirthdate = new Date(salarie.date_naissance).toISOString().split('T')[0];
const inputBirthdate = new Date(birthdate).toISOString().split('T')[0];
console.log('Comparaison dates:', {
db: dbBirthdate,
input: inputBirthdate,
match: dbBirthdate === inputBirthdate
});
if (dbBirthdate === inputBirthdate) {
console.log('Date de naissance vérifiée avec succès');
return NextResponse.json({
verified: true,
message: 'Date de naissance vérifiée'
});
} else {
console.log('Date de naissance incorrecte');
return NextResponse.json(
{
error: 'Date de naissance incorrecte',
verified: false
},
{ status: 401 }
);
}
} catch (error) {
console.error('Erreur lors de la vérification de la date de naissance:', error);
console.error('Type erreur:', error instanceof Error ? error.message : String(error));
console.error('Stack:', error instanceof Error ? error.stack : 'N/A');
return NextResponse.json(
{
error: 'Erreur serveur lors de la vérification',
verified: false,
details: error instanceof Error ? error.message : 'Unknown error'
},
{ status: 500 }
);
}
}