feat(responsable): add material stock table
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user