import { Prisma } from '@prisma/client'; import { prisma } from '../db/prisma'; export interface StatutCount { statut: string; count: number; } export type ActiviteResponsable = Prisma.HistoriqueGetPayload<{ include: { utilisateur: true; materiel: true; emprunt: true; }; }>; export type EmpruntResponsable = Prisma.EmpruntGetPayload<{ include: { utilisateur: true; materiel: { include: { categorie: true } }; }; }>; export interface EmpruntResponsableFiltres { statut?: string; } function mapStatutCounts(rows: Array<{ statut: string; _count: { _all: number } }>): StatutCount[] { return rows.map((row) => ({ statut: row.statut, count: row._count._all })); } export async function countMaterielsParStatut(campusId: number): Promise { const rows = await prisma.materiel.groupBy({ by: ['statut'], where: { campusId, actif: true }, _count: { _all: true }, }); return mapStatutCounts(rows); } export async function countEmpruntsParStatut(campusId: number): Promise { const rows = await prisma.emprunt.groupBy({ by: ['statut'], where: { campusId }, _count: { _all: true }, }); return mapStatutCounts(rows); } export async function countAnomaliesParStatut(campusId: number): Promise { const rows = await prisma.anomalie.groupBy({ by: ['statut'], where: { emprunt: { campusId } }, _count: { _all: true }, }); return mapStatutCounts(rows); } export function countNotificationsNonLues(utilisateurId: number): Promise { return prisma.notification.count({ where: { utilisateurId, lu: false }, }); } export function findActiviteRecente( campusId: number, limite: number, ): Promise { return prisma.historique.findMany({ where: { campusId }, include: { utilisateur: true, materiel: true, emprunt: true, }, orderBy: { dateAction: 'desc' }, take: limite, }); } export function findEmpruntsResponsable( campusId: number, filtres: EmpruntResponsableFiltres, ): Promise { return prisma.emprunt.findMany({ where: { campusId, ...(filtres.statut ? { statut: filtres.statut } : {}), }, include: { utilisateur: true, materiel: { include: { categorie: true } }, }, orderBy: { dateEmprunt: 'desc' }, }); }