feat(responsable): add anomaly and history tables
This commit is contained in:
@@ -24,7 +24,9 @@ import {
|
||||
parseStatutAnomalie,
|
||||
parseStatutMateriel,
|
||||
parseStatutEmprunt,
|
||||
parseTriAnomalie,
|
||||
parseTriEmprunt,
|
||||
parseTriHistorique,
|
||||
parseTriMateriel,
|
||||
} from '../services/responsable.service';
|
||||
import {
|
||||
@@ -53,6 +55,9 @@ function getHistoriqueFiltres(req: Request) {
|
||||
empruntId: parsePositiveIntQuery(req.query.empruntId, 'empruntId'),
|
||||
dateDebut: parseDateQuery(req.query.dateDebut, 'dateDebut'),
|
||||
dateFin: parseDateQuery(req.query.dateFin, 'dateFin'),
|
||||
recherche: typeof req.query.q === 'string' ? req.query.q : undefined,
|
||||
tri: parseTriHistorique(req.query.tri),
|
||||
ordre: parseOrdreTri(req.query.ordre),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -163,10 +168,16 @@ export async function getAnomalies(req: Request, res: Response): Promise<void> {
|
||||
|
||||
const statut = parseStatutAnomalie(req.query.statut);
|
||||
const type = typeof req.query.type === 'string' ? req.query.type : undefined;
|
||||
const recherche = typeof req.query.q === 'string' ? req.query.q : undefined;
|
||||
const tri = parseTriAnomalie(req.query.tri);
|
||||
const ordre = parseOrdreTri(req.query.ordre);
|
||||
|
||||
const anomalies = await listerAnomaliesResponsable(user.roleCode, user.campusId, {
|
||||
statut,
|
||||
type,
|
||||
recherche,
|
||||
tri,
|
||||
ordre,
|
||||
});
|
||||
res.json({ data: anomalies.map(toAnomalieResponsableResponse) });
|
||||
}
|
||||
|
||||
@@ -96,6 +96,9 @@ export interface MaterielResponsableFiltres {
|
||||
export interface AnomalieResponsableFiltres {
|
||||
statut?: string;
|
||||
type?: string;
|
||||
recherche?: string;
|
||||
tri?: 'dateDetection' | 'type' | 'materiel' | 'etudiant' | 'statut';
|
||||
ordre?: 'asc' | 'desc';
|
||||
}
|
||||
|
||||
export interface NotificationResponsableFiltres {
|
||||
@@ -109,6 +112,9 @@ export interface HistoriqueResponsableFiltres {
|
||||
empruntId?: number;
|
||||
dateDebut?: Date;
|
||||
dateFin?: Date;
|
||||
recherche?: string;
|
||||
tri?: 'dateAction' | 'action' | 'utilisateur' | 'materiel' | 'emprunt';
|
||||
ordre?: 'asc' | 'desc';
|
||||
}
|
||||
|
||||
export interface ChangerStatutAnomalieData {
|
||||
@@ -421,11 +427,40 @@ export function findAnomaliesResponsable(
|
||||
campusId: number,
|
||||
filtres: AnomalieResponsableFiltres,
|
||||
): Promise<AnomalieResponsable[]> {
|
||||
const ordre = filtres.ordre ?? 'desc';
|
||||
const orderBy: Prisma.AnomalieOrderByWithRelationInput[] = (() => {
|
||||
switch (filtres.tri) {
|
||||
case 'type':
|
||||
return [{ type: ordre }, { dateDetection: 'desc' }, { id: 'desc' }];
|
||||
case 'materiel':
|
||||
return [{ materiel: { nom: ordre } }, { dateDetection: 'desc' }, { id: 'desc' }];
|
||||
case 'etudiant':
|
||||
return [{ etudiant: { nom: ordre } }, { dateDetection: 'desc' }, { id: 'desc' }];
|
||||
case 'statut':
|
||||
return [{ statut: ordre }, { dateDetection: 'desc' }, { id: 'desc' }];
|
||||
default:
|
||||
return [{ dateDetection: ordre }, { id: 'desc' }];
|
||||
}
|
||||
})();
|
||||
|
||||
return prisma.anomalie.findMany({
|
||||
where: {
|
||||
emprunt: { campusId },
|
||||
...(filtres.statut ? { statut: filtres.statut } : {}),
|
||||
...(filtres.type ? { type: filtres.type } : {}),
|
||||
...(filtres.recherche
|
||||
? {
|
||||
OR: [
|
||||
{ description: { contains: filtres.recherche } },
|
||||
{ type: { contains: filtres.recherche } },
|
||||
{ materiel: { nom: { contains: filtres.recherche } } },
|
||||
{ materiel: { reference: { contains: filtres.recherche } } },
|
||||
{ etudiant: { nom: { contains: filtres.recherche } } },
|
||||
{ etudiant: { prenom: { contains: filtres.recherche } } },
|
||||
{ etudiant: { email: { contains: filtres.recherche } } },
|
||||
],
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
include: {
|
||||
emprunt: true,
|
||||
@@ -433,7 +468,7 @@ export function findAnomaliesResponsable(
|
||||
materiel: { include: { categorie: true } },
|
||||
traitePar: true,
|
||||
},
|
||||
orderBy: { dateDetection: 'desc' },
|
||||
orderBy,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -548,6 +583,22 @@ export function findHistoriqueResponsable(
|
||||
campusId: number,
|
||||
filtres: HistoriqueResponsableFiltres,
|
||||
): Promise<HistoriqueResponsable[]> {
|
||||
const ordre = filtres.ordre ?? 'desc';
|
||||
const orderBy: Prisma.HistoriqueOrderByWithRelationInput[] = (() => {
|
||||
switch (filtres.tri) {
|
||||
case 'action':
|
||||
return [{ action: ordre }, { dateAction: 'desc' }, { id: 'desc' }];
|
||||
case 'utilisateur':
|
||||
return [{ utilisateur: { nom: ordre } }, { dateAction: 'desc' }, { id: 'desc' }];
|
||||
case 'materiel':
|
||||
return [{ materiel: { nom: ordre } }, { dateAction: 'desc' }, { id: 'desc' }];
|
||||
case 'emprunt':
|
||||
return [{ empruntId: ordre }, { dateAction: 'desc' }, { id: 'desc' }];
|
||||
default:
|
||||
return [{ dateAction: ordre }, { id: 'desc' }];
|
||||
}
|
||||
})();
|
||||
|
||||
return prisma.historique.findMany({
|
||||
where: {
|
||||
campusId,
|
||||
@@ -563,6 +614,19 @@ export function findHistoriqueResponsable(
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
...(filtres.recherche
|
||||
? {
|
||||
OR: [
|
||||
{ action: { contains: filtres.recherche } },
|
||||
{ description: { contains: filtres.recherche } },
|
||||
{ utilisateur: { nom: { contains: filtres.recherche } } },
|
||||
{ utilisateur: { prenom: { contains: filtres.recherche } } },
|
||||
{ utilisateur: { email: { contains: filtres.recherche } } },
|
||||
{ materiel: { nom: { contains: filtres.recherche } } },
|
||||
{ materiel: { reference: { contains: filtres.recherche } } },
|
||||
],
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
include: {
|
||||
utilisateur: true,
|
||||
@@ -571,6 +635,6 @@ export function findHistoriqueResponsable(
|
||||
sallePret: true,
|
||||
posteEmprunt: true,
|
||||
},
|
||||
orderBy: { dateAction: 'desc' },
|
||||
orderBy,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -80,8 +80,18 @@ export type TriMaterielResponsable =
|
||||
export interface ListerAnomaliesResponsableFiltres {
|
||||
statut?: StatutAnomalie;
|
||||
type?: string;
|
||||
recherche?: string;
|
||||
tri?: TriAnomalieResponsable;
|
||||
ordre?: OrdreTri;
|
||||
}
|
||||
|
||||
export type TriAnomalieResponsable =
|
||||
| 'dateDetection'
|
||||
| 'type'
|
||||
| 'materiel'
|
||||
| 'etudiant'
|
||||
| 'statut';
|
||||
|
||||
export interface ListerNotificationsResponsableFiltres {
|
||||
lu?: boolean;
|
||||
}
|
||||
@@ -93,8 +103,18 @@ export interface ListerHistoriqueResponsableFiltres {
|
||||
empruntId?: number;
|
||||
dateDebut?: Date;
|
||||
dateFin?: Date;
|
||||
recherche?: string;
|
||||
tri?: TriHistoriqueResponsable;
|
||||
ordre?: OrdreTri;
|
||||
}
|
||||
|
||||
export type TriHistoriqueResponsable =
|
||||
| 'dateAction'
|
||||
| 'action'
|
||||
| 'utilisateur'
|
||||
| 'materiel'
|
||||
| 'emprunt';
|
||||
|
||||
export interface ChangerStatutAnomalieResponsableRequest {
|
||||
statut: StatutAnomalie;
|
||||
observation?: string;
|
||||
@@ -244,6 +264,23 @@ export function parseStatutAnomalie(value: unknown): StatutAnomalie | undefined
|
||||
return value as StatutAnomalie;
|
||||
}
|
||||
|
||||
export function parseTriAnomalie(value: unknown): TriAnomalieResponsable | undefined {
|
||||
if (value === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
const valeurs: readonly TriAnomalieResponsable[] = [
|
||||
'dateDetection',
|
||||
'type',
|
||||
'materiel',
|
||||
'etudiant',
|
||||
'statut',
|
||||
];
|
||||
if (typeof value !== 'string' || !valeurs.includes(value as TriAnomalieResponsable)) {
|
||||
throw new AppError(400, 'tri invalide');
|
||||
}
|
||||
return value as TriAnomalieResponsable;
|
||||
}
|
||||
|
||||
export function parseCategorieId(value: unknown): number | undefined {
|
||||
if (value === undefined) {
|
||||
return undefined;
|
||||
@@ -328,6 +365,23 @@ export function parseDateQuery(value: unknown, champ: string): Date | undefined
|
||||
return parsed;
|
||||
}
|
||||
|
||||
export function parseTriHistorique(value: unknown): TriHistoriqueResponsable | undefined {
|
||||
if (value === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
const valeurs: readonly TriHistoriqueResponsable[] = [
|
||||
'dateAction',
|
||||
'action',
|
||||
'utilisateur',
|
||||
'materiel',
|
||||
'emprunt',
|
||||
];
|
||||
if (typeof value !== 'string' || !valeurs.includes(value as TriHistoriqueResponsable)) {
|
||||
throw new AppError(400, 'tri invalide');
|
||||
}
|
||||
return value as TriHistoriqueResponsable;
|
||||
}
|
||||
|
||||
export function parseLu(value: unknown): boolean | undefined {
|
||||
if (value === undefined) {
|
||||
return undefined;
|
||||
|
||||
Reference in New Issue
Block a user