feat(responsable): add material stock table

This commit is contained in:
SaidSoighiri94
2026-07-24 15:22:58 +02:00
parent 5121cac657
commit ec36349bad
6 changed files with 672 additions and 26 deletions
@@ -25,6 +25,7 @@ import {
parseStatutMateriel,
parseStatutEmprunt,
parseTriEmprunt,
parseTriMateriel,
} from '../services/responsable.service';
import {
toAnomalieResponsableResponse,
@@ -141,11 +142,15 @@ export async function getMateriels(req: Request, res: Response): Promise<void> {
const statut = parseStatutMateriel(req.query.statut);
const categorieId = parseCategorieId(req.query.categorieId);
const recherche = typeof req.query.q === 'string' ? req.query.q : undefined;
const tri = parseTriMateriel(req.query.tri);
const ordre = parseOrdreTri(req.query.ordre);
const materiels = await listerMaterielsResponsable(user.roleCode, user.campusId, {
statut,
categorieId,
recherche,
tri,
ordre,
});
res.json({ data: materiels.map(toMaterielResponsableResponse) });
}
@@ -89,6 +89,8 @@ export interface MaterielResponsableFiltres {
statut?: string;
categorieId?: number;
recherche?: string;
tri?: 'nom' | 'reference' | 'categorie' | 'marque' | 'etatGeneral' | 'statut';
ordre?: 'asc' | 'desc';
}
export interface AnomalieResponsableFiltres {
@@ -372,6 +374,24 @@ export function findMaterielsResponsable(
campusId: number,
filtres: MaterielResponsableFiltres,
): Promise<MaterielResponsable[]> {
const ordre = filtres.ordre ?? 'asc';
const orderBy: Prisma.MaterielOrderByWithRelationInput[] = (() => {
switch (filtres.tri) {
case 'reference':
return [{ reference: ordre }, { id: 'asc' }];
case 'categorie':
return [{ categorie: { nom: ordre } }, { nom: 'asc' }, { id: 'asc' }];
case 'marque':
return [{ marque: ordre }, { modele: ordre }, { nom: 'asc' }, { id: 'asc' }];
case 'etatGeneral':
return [{ etatGeneral: ordre }, { nom: 'asc' }, { id: 'asc' }];
case 'statut':
return [{ statut: ordre }, { nom: 'asc' }, { id: 'asc' }];
default:
return [{ nom: ordre }, { id: 'asc' }];
}
})();
return prisma.materiel.findMany({
where: {
campusId,
@@ -393,7 +413,7 @@ export function findMaterielsResponsable(
categorie: true,
accessoires: { include: { accessoire: true } },
},
orderBy: { nom: 'asc' },
orderBy,
});
}
@@ -65,8 +65,18 @@ export interface ListerMaterielsResponsableFiltres {
statut?: StatutMateriel;
categorieId?: number;
recherche?: string;
tri?: TriMaterielResponsable;
ordre?: OrdreTri;
}
export type TriMaterielResponsable =
| 'nom'
| 'reference'
| 'categorie'
| 'marque'
| 'etatGeneral'
| 'statut';
export interface ListerAnomaliesResponsableFiltres {
statut?: StatutAnomalie;
type?: string;
@@ -206,6 +216,24 @@ export function parseStatutMateriel(value: unknown): StatutMateriel | undefined
return value as StatutMateriel;
}
export function parseTriMateriel(value: unknown): TriMaterielResponsable | undefined {
if (value === undefined) {
return undefined;
}
const valeurs: readonly TriMaterielResponsable[] = [
'nom',
'reference',
'categorie',
'marque',
'etatGeneral',
'statut',
];
if (typeof value !== 'string' || !valeurs.includes(value as TriMaterielResponsable)) {
throw new AppError(400, 'tri invalide');
}
return value as TriMaterielResponsable;
}
export function parseStatutAnomalie(value: unknown): StatutAnomalie | undefined {
if (value === undefined) {
return undefined;