133 lines
4.0 KiB
TypeScript
133 lines
4.0 KiB
TypeScript
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);
|
|
|
|
// 1. Participations du mois (trajets validés/terminés ce mois)
|
|
const participationsMoisData = await prisma.participationFinanciere.findMany({
|
|
where: {
|
|
trajet: {
|
|
date: {
|
|
gte: startOfMonth,
|
|
lte: endOfMonth,
|
|
},
|
|
},
|
|
},
|
|
include: { trajet: { select: { date: true } } },
|
|
});
|
|
|
|
const participationsCeMois = participationsMoisData;
|
|
const montantMoyenParTrajet = 6.80;
|
|
const participationsMois = participationsCeMois.reduce(
|
|
(sum, p) => sum + (p.montant ?? montantMoyenParTrajet),
|
|
0
|
|
);
|
|
const nombreFactures = participationsCeMois.length;
|
|
|
|
// 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 }
|
|
);
|
|
}
|
|
}
|