- 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
152 lines
4.9 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|