espace-paie-odentas/app/api/auto-declaration/route.ts

239 lines
No EOL
7.4 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { createSbServiceRole } from "@/lib/supabaseServer";
export const dynamic = "force-dynamic";
// GET - Récupérer les données d'un salarié par token sécurisé
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const token = searchParams.get('token');
if (!token) {
return NextResponse.json(
{ error: 'Token d\'accès manquant' },
{ status: 400 }
);
}
const sb = createSbServiceRole();
// Vérifier le token et récupérer les données du salarié
const { data: tokenData, error: tokenError } = await sb
.from('auto_declaration_tokens')
.select(`
id,
salarie_id,
expires_at,
used,
salaries (
id,
code_salarie,
num_salarie,
salarie,
nom,
nom_de_naissance,
prenom,
civilite,
pseudonyme,
adresse_mail,
tel,
adresse,
date_naissance,
lieu_de_naissance,
nir,
iban,
bic,
conges_spectacles,
derniere_profession,
employer_id,
justificatifs_personnels,
organizations(name)
)
`)
.eq('token', token)
.single();
if (tokenError || !tokenData) {
return NextResponse.json(
{ error: 'Token d\'accès invalide' },
{ status: 403 }
);
}
// Vérifier l'expiration du token
if (new Date() > new Date(tokenData.expires_at)) {
return NextResponse.json(
{ error: 'Token d\'accès expiré. Demandez un nouveau lien à votre employeur.' },
{ status: 403 }
);
}
const salarie = tokenData.salaries;
if (!salarie) {
return NextResponse.json(
{ error: 'Salarié non trouvé' },
{ status: 404 }
);
}
return NextResponse.json(salarie);
} catch (error) {
console.error('Erreur API:', error);
return NextResponse.json(
{ error: 'Erreur interne du serveur' },
{ status: 500 }
);
}
}
// PATCH - Mettre à jour les données d'un salarié
export async function PATCH(request: NextRequest) {
try {
const body = await request.json();
const { token, ...updateData } = body;
if (!token) {
return NextResponse.json(
{ error: 'Token d\'accès manquant' },
{ status: 400 }
);
}
const sb = createSbServiceRole();
// Vérifier le token et récupérer l'ID du salarié
const { data: tokenData, error: tokenError } = await sb
.from('auto_declaration_tokens')
.select('salarie_id, expires_at, used')
.eq('token', token)
.single();
if (tokenError || !tokenData) {
return NextResponse.json(
{ error: 'Token d\'accès invalide' },
{ status: 403 }
);
}
// Vérifier l'expiration du token
if (new Date() > new Date(tokenData.expires_at)) {
return NextResponse.json(
{ error: 'Token d\'accès expiré. Demandez un nouveau lien à votre employeur.' },
{ status: 403 }
);
}
// Préparer les données de mise à jour
const dataToUpdate: any = {
updated_at: new Date().toISOString()
};
// Mapper les champs autorisés à mettre à jour
if (updateData.civilite) dataToUpdate.civilite = updateData.civilite;
if (updateData.nom) dataToUpdate.nom = updateData.nom;
if (updateData.prenom) dataToUpdate.prenom = updateData.prenom;
if (updateData.nom_de_naissance !== undefined) dataToUpdate.nom_de_naissance = updateData.nom_de_naissance;
if (updateData.pseudonyme !== undefined) dataToUpdate.pseudonyme = updateData.pseudonyme;
if (updateData.adresse_mail) dataToUpdate.adresse_mail = updateData.adresse_mail;
if (updateData.tel !== undefined) dataToUpdate.tel = updateData.tel;
if (updateData.adresse !== undefined) dataToUpdate.adresse = updateData.adresse;
if (updateData.date_naissance !== undefined) dataToUpdate.date_naissance = updateData.date_naissance;
if (updateData.lieu_de_naissance !== undefined) dataToUpdate.lieu_de_naissance = updateData.lieu_de_naissance;
if (updateData.nir !== undefined) dataToUpdate.nir = updateData.nir;
if (updateData.conges_spectacles !== undefined) dataToUpdate.conges_spectacles = updateData.conges_spectacles;
if (updateData.iban !== undefined) dataToUpdate.iban = updateData.iban;
if (updateData.bic !== undefined) dataToUpdate.bic = updateData.bic;
if (updateData.derniere_profession !== undefined) dataToUpdate.derniere_profession = updateData.derniere_profession;
if (updateData.notes) {
// Récupérer les notes existantes pour les préserver
const { data: currentSalarie } = await sb
.from('salaries')
.select('notes, justificatifs_personnels')
.eq('id', tokenData.salarie_id)
.single();
// Préparer la nouvelle note avec horodatage
const currentDate = new Date().toISOString().split('T')[0];
const currentTime = new Date().toLocaleString('fr-FR');
const newNote = `[${currentTime} - Auto-déclaration]\n${updateData.notes}`;
// Ajouter aux notes existantes ou créer une nouvelle note
if (currentSalarie?.notes) {
dataToUpdate.notes = `${currentSalarie.notes}\n\n${newNote}`;
} else {
dataToUpdate.notes = newNote;
}
// Également ajouter aux justificatifs personnels (format JSON) pour historique
const noteEntry = {
date: currentDate,
source: 'auto-declaration',
notes: updateData.notes
};
dataToUpdate.justificatifs_personnels = JSON.stringify([noteEntry]);
}
// Si le nom ou le prénom change, mettre à jour automatiquement la colonne "salarie"
if (updateData.nom || updateData.prenom) {
// Récupérer les données actuelles pour compléter
const { data: currentData } = await sb
.from('salaries')
.select('nom, prenom')
.eq('id', tokenData.salarie_id)
.single();
if (currentData) {
const newNom = updateData.nom || currentData.nom;
const newPrenom = updateData.prenom || currentData.prenom;
// Mettre à jour "salarie" avec le format "NOM + Prénom"
if (newNom || newPrenom) {
const nomUpper = (newNom || '').toUpperCase().trim();
const prenomCapitalized = (newPrenom || '').trim();
dataToUpdate.salarie = [nomUpper, prenomCapitalized].filter(Boolean).join(' ');
}
}
}
// Mettre à jour le salarié
const { data, error } = await sb
.from('salaries')
.update(dataToUpdate)
.eq('id', tokenData.salarie_id)
.select()
.single();
if (error) {
console.error('Erreur Supabase update:', error);
return NextResponse.json(
{ error: 'Erreur lors de la mise à jour' },
{ status: 500 }
);
}
// Marquer le token comme utilisé (optionnel)
await sb
.from('auto_declaration_tokens')
.update({
used: true,
used_at: new Date().toISOString()
})
.eq('token', token);
return NextResponse.json({
success: true,
data: data
});
} catch (error) {
console.error('Erreur API:', error);
return NextResponse.json(
{ error: 'Erreur interne du serveur' },
{ status: 500 }
);
}
}