Files
EME_APP/eme-backend/src/repositories/responsable.repository.ts
T
2026-07-17 10:06:39 +02:00

356 lines
8.5 KiB
TypeScript

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 type MaterielResponsable = Prisma.MaterielGetPayload<{
include: {
categorie: true;
accessoires: { include: { accessoire: true } };
};
}>;
export type AnomalieResponsable = Prisma.AnomalieGetPayload<{
include: {
emprunt: true;
etudiant: true;
materiel: { include: { categorie: true } };
traitePar: true;
};
}>;
export type NotificationResponsable = Prisma.NotificationGetPayload<{
include: {
anomalie: {
include: {
emprunt: true;
materiel: true;
};
};
};
}>;
export type HistoriqueResponsable = Prisma.HistoriqueGetPayload<{
include: {
utilisateur: true;
materiel: true;
emprunt: true;
sallePret: true;
posteEmprunt: true;
};
}>;
export interface EmpruntResponsableFiltres {
statut?: string;
}
export interface MaterielResponsableFiltres {
statut?: string;
categorieId?: number;
recherche?: string;
}
export interface AnomalieResponsableFiltres {
statut?: string;
type?: string;
}
export interface NotificationResponsableFiltres {
lu?: boolean;
}
export interface HistoriqueResponsableFiltres {
action?: string;
utilisateurId?: number;
materielId?: number;
empruntId?: number;
dateDebut?: Date;
dateFin?: Date;
}
export interface ChangerStatutAnomalieData {
anomalieId: number;
campusId: number;
responsableId: number;
statut: string;
observation?: 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<StatutCount[]> {
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<StatutCount[]> {
const rows = await prisma.emprunt.groupBy({
by: ['statut'],
where: { campusId },
_count: { _all: true },
});
return mapStatutCounts(rows);
}
export async function countAnomaliesParStatut(campusId: number): Promise<StatutCount[]> {
const rows = await prisma.anomalie.groupBy({
by: ['statut'],
where: { emprunt: { campusId } },
_count: { _all: true },
});
return mapStatutCounts(rows);
}
export function countNotificationsNonLues(utilisateurId: number): Promise<number> {
return prisma.notification.count({
where: { utilisateurId, lu: false },
});
}
export function findActiviteRecente(
campusId: number,
limite: number,
): Promise<ActiviteResponsable[]> {
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<EmpruntResponsable[]> {
return prisma.emprunt.findMany({
where: {
campusId,
...(filtres.statut ? { statut: filtres.statut } : {}),
},
include: {
utilisateur: true,
materiel: { include: { categorie: true } },
},
orderBy: { dateEmprunt: 'desc' },
});
}
export function findMaterielsResponsable(
campusId: number,
filtres: MaterielResponsableFiltres,
): Promise<MaterielResponsable[]> {
return prisma.materiel.findMany({
where: {
campusId,
actif: true,
...(filtres.statut ? { statut: filtres.statut } : {}),
...(filtres.categorieId !== undefined ? { categorieId: filtres.categorieId } : {}),
...(filtres.recherche
? {
OR: [
{ nom: { contains: filtres.recherche } },
{ marque: { contains: filtres.recherche } },
{ modele: { contains: filtres.recherche } },
{ reference: { contains: filtres.recherche } },
],
}
: {}),
},
include: {
categorie: true,
accessoires: { include: { accessoire: true } },
},
orderBy: { nom: 'asc' },
});
}
export function findAnomaliesResponsable(
campusId: number,
filtres: AnomalieResponsableFiltres,
): Promise<AnomalieResponsable[]> {
return prisma.anomalie.findMany({
where: {
emprunt: { campusId },
...(filtres.statut ? { statut: filtres.statut } : {}),
...(filtres.type ? { type: filtres.type } : {}),
},
include: {
emprunt: true,
etudiant: true,
materiel: { include: { categorie: true } },
traitePar: true,
},
orderBy: { dateDetection: 'desc' },
});
}
export function findAnomalieResponsableById(
campusId: number,
anomalieId: number,
): Promise<AnomalieResponsable | null> {
return prisma.anomalie.findFirst({
where: {
id: anomalieId,
emprunt: { campusId },
},
include: {
emprunt: true,
etudiant: true,
materiel: { include: { categorie: true } },
traitePar: true,
},
});
}
export function changerStatutAnomalieResponsable(
data: ChangerStatutAnomalieData,
): Promise<AnomalieResponsable> {
return prisma.$transaction(async (tx) => {
const anomalie = await tx.anomalie.update({
where: { id: data.anomalieId },
data: {
statut: data.statut,
traiteeParId: data.responsableId,
...(data.observation !== undefined ? { observation: data.observation } : {}),
...(data.statut === 'RESOLUE' || data.statut === 'CLOTUREE'
? { dateResolution: new Date() }
: {}),
},
include: {
emprunt: true,
etudiant: true,
materiel: { include: { categorie: true } },
traitePar: true,
},
});
await tx.historique.create({
data: {
utilisateurId: data.responsableId,
empruntId: anomalie.empruntId,
materielId: anomalie.materielId,
campusId: data.campusId,
action: 'TRAITEMENT_ANOMALIE',
description: `Anomalie #${anomalie.id} passee au statut ${data.statut}`,
dateAction: new Date(),
},
});
return anomalie;
});
}
export function findNotificationsResponsable(
utilisateurId: number,
filtres: NotificationResponsableFiltres,
): Promise<NotificationResponsable[]> {
return prisma.notification.findMany({
where: {
utilisateurId,
...(filtres.lu !== undefined ? { lu: filtres.lu } : {}),
},
include: {
anomalie: {
include: {
emprunt: true,
materiel: true,
},
},
},
orderBy: { dateCreation: 'desc' },
});
}
export function marquerNotificationLue(
utilisateurId: number,
notificationId: number,
): Promise<NotificationResponsable> {
return prisma.notification.update({
where: {
id: notificationId,
utilisateurId,
},
data: { lu: true },
include: {
anomalie: {
include: {
emprunt: true,
materiel: true,
},
},
},
});
}
export async function marquerNotificationsResponsableLues(utilisateurId: number): Promise<number> {
const result = await prisma.notification.updateMany({
where: { utilisateurId, lu: false },
data: { lu: true },
});
return result.count;
}
export function findHistoriqueResponsable(
campusId: number,
filtres: HistoriqueResponsableFiltres,
): Promise<HistoriqueResponsable[]> {
return prisma.historique.findMany({
where: {
campusId,
...(filtres.action ? { action: filtres.action } : {}),
...(filtres.utilisateurId !== undefined ? { utilisateurId: filtres.utilisateurId } : {}),
...(filtres.materielId !== undefined ? { materielId: filtres.materielId } : {}),
...(filtres.empruntId !== undefined ? { empruntId: filtres.empruntId } : {}),
...(filtres.dateDebut || filtres.dateFin
? {
dateAction: {
...(filtres.dateDebut ? { gte: filtres.dateDebut } : {}),
...(filtres.dateFin ? { lte: filtres.dateFin } : {}),
},
}
: {}),
},
include: {
utilisateur: true,
materiel: true,
emprunt: true,
sallePret: true,
posteEmprunt: true,
},
orderBy: { dateAction: 'desc' },
});
}