Files
MAD-Platform/app/api/trajets/[id]/validate/route.ts

125 lines
3.3 KiB
TypeScript
Raw Normal View History

2026-01-21 17:48:14 +01:00
import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { getCurrentUser } from '@/lib/auth';
2026-02-15 14:36:28 +01:00
import { createParticipationForTrajet } from '@/lib/participation-financiere';
2026-01-21 17:48:14 +01:00
// POST - Valider un trajet et déduire les heures du chauffeur
export async function POST(
request: NextRequest,
{ params }: { params: { id: string } }
) {
try {
const user = await getCurrentUser();
if (!user) {
return NextResponse.json({ error: 'Non autorisé' }, { status: 401 });
}
const body = await request.json();
const { dureeHeures } = body;
if (!dureeHeures || dureeHeures <= 0) {
return NextResponse.json(
{ error: 'La durée du trajet est requise' },
{ status: 400 }
);
}
2026-02-15 14:36:28 +01:00
// Récupérer le trajet avec le chauffeur et univers pro
2026-01-21 17:48:14 +01:00
const trajet = await prisma.trajet.findUnique({
where: { id: params.id },
include: {
chauffeur: true,
2026-02-15 14:36:28 +01:00
universPro: true,
2026-01-21 17:48:14 +01:00
},
});
if (!trajet) {
return NextResponse.json({ error: 'Trajet non trouvé' }, { status: 404 });
}
if (!trajet.chauffeur) {
return NextResponse.json(
{ error: 'Aucun chauffeur assigné à ce trajet' },
{ status: 400 }
);
}
if (trajet.statut === 'Validé' || trajet.statut === 'Terminé') {
return NextResponse.json(
{ error: 'Ce trajet a déjà été validé' },
{ status: 400 }
);
}
// Vérifier que le chauffeur a assez d'heures disponibles
const heuresRestantes = trajet.chauffeur.heuresRestantes;
const heuresADeduire = Math.round(dureeHeures);
if (heuresRestantes < heuresADeduire) {
return NextResponse.json(
{
error: `Le chauffeur n'a que ${heuresRestantes}h disponibles. Le trajet nécessite ${heuresADeduire}h.`,
},
{ status: 400 }
);
}
// Mettre à jour le trajet et déduire les heures du chauffeur
const [trajetUpdated, chauffeurUpdated] = await Promise.all([
prisma.trajet.update({
where: { id: params.id },
data: {
statut: 'Validé',
},
include: {
adherent: {
select: {
id: true,
nom: true,
prenom: true,
telephone: true,
email: true,
},
},
chauffeur: {
select: {
id: true,
nom: true,
prenom: true,
telephone: true,
},
},
},
}),
prisma.chauffeur.update({
where: { id: trajet.chauffeur.id },
data: {
heuresRestantes: heuresRestantes - heuresADeduire,
},
}),
]);
2026-02-15 14:36:28 +01:00
// Créer la participation financière (document)
try {
await createParticipationForTrajet(params.id);
} catch (err) {
console.error('Erreur création participation:', err);
}
2026-01-21 17:48:14 +01:00
return NextResponse.json({
trajet: trajetUpdated,
chauffeur: {
id: chauffeurUpdated.id,
heuresRestantes: chauffeurUpdated.heuresRestantes,
},
heuresDeduites: heuresADeduire,
});
} catch (error) {
console.error('Erreur lors de la validation du trajet:', error);
return NextResponse.json(
{ error: 'Erreur serveur' },
{ status: 500 }
);
}
}