Files
MAD-Platform/app/api/dashboard/stats/route.ts

133 lines
4.0 KiB
TypeScript
Raw Normal View History

2026-01-22 18:53:23 +01:00
import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { getCurrentUser } from '@/lib/auth';
// GET - Récupérer les statistiques du dashboard
export async function GET(request: NextRequest) {
try {
const user = await getCurrentUser();
if (!user) {
return NextResponse.json({ error: 'Non autorisé' }, { status: 401 });
}
const now = new Date();
const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate());
const endOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);
const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, 999);
const startOfLastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1);
const endOfLastMonth = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59, 999);
const startOfYesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
const endOfYesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1, 23, 59, 59, 999);
2026-02-15 14:36:28 +01:00
// 1. Participations du mois (trajets validés/terminés ce mois)
const participationsMoisData = await prisma.participationFinanciere.findMany({
2026-01-22 18:53:23 +01:00
where: {
2026-02-15 14:36:28 +01:00
trajet: {
date: {
gte: startOfMonth,
lte: endOfMonth,
},
2026-01-22 18:53:23 +01:00
},
},
2026-02-15 14:36:28 +01:00
include: { trajet: { select: { date: true } } },
2026-01-22 18:53:23 +01:00
});
2026-02-15 14:36:28 +01:00
const participationsCeMois = participationsMoisData;
const montantMoyenParTrajet = 6.80;
const participationsMois = participationsCeMois.reduce(
(sum, p) => sum + (p.montant ?? montantMoyenParTrajet),
0
);
const nombreFactures = participationsCeMois.length;
2026-01-22 18:53:23 +01:00
// 2. Trajets aujourd'hui
const trajetsAujourdhui = await prisma.trajet.count({
where: {
archived: false,
date: {
gte: startOfToday,
lte: endOfToday,
},
},
});
// Trajets hier pour comparaison
const trajetsHier = await prisma.trajet.count({
where: {
archived: false,
date: {
gte: startOfYesterday,
lte: endOfYesterday,
},
},
});
const differenceAujourdhui = trajetsAujourdhui - trajetsHier;
// 3. Trajets réalisés ce mois (terminés)
const trajetsRealisesMois = await prisma.trajet.count({
where: {
archived: false,
statut: 'Terminé',
date: {
gte: startOfMonth,
lte: endOfMonth,
},
},
});
// Trajets réalisés le mois dernier pour comparaison
const trajetsRealisesMoisDernier = await prisma.trajet.count({
where: {
archived: false,
statut: 'Terminé',
date: {
gte: startOfLastMonth,
lte: endOfLastMonth,
},
},
});
const pourcentageEvolution = trajetsRealisesMoisDernier > 0
? Math.round(((trajetsRealisesMois - trajetsRealisesMoisDernier) / trajetsRealisesMoisDernier) * 100)
: trajetsRealisesMois > 0 ? 100 : 0;
// 4. Chauffeurs actifs (disponibles)
const totalChauffeurs = await prisma.chauffeur.count();
const chauffeursActifs = await prisma.chauffeur.count({
where: {
status: 'Disponible',
},
});
return NextResponse.json({
participationsMois: {
montant: participationsMois,
nombreFactures: nombreFactures,
},
trajetsAujourdhui: {
nombre: trajetsAujourdhui,
difference: differenceAujourdhui,
},
trajetsRealisesMois: {
nombre: trajetsRealisesMois,
pourcentageEvolution: pourcentageEvolution,
},
chauffeursActifs: {
nombre: chauffeursActifs,
total: totalChauffeurs,
},
});
} catch (error) {
console.error('Erreur lors de la récupération des statistiques:', error);
return NextResponse.json(
{ error: 'Erreur serveur' },
{ status: 500 }
);
}
}