Files
EME_APP/eme-backend/src/dtos/responsable.dto.ts
T
2026-07-15 12:35:16 +02:00

187 lines
4.3 KiB
TypeScript

import {
ActiviteResponsable,
EmpruntResponsable,
MaterielResponsable,
StatutCount,
} from '../repositories/responsable.repository';
import { DashboardResponsableData } from '../services/responsable.service';
export interface RepartitionStatutResponse {
total: number;
parStatut: Record<string, number>;
}
export interface ActiviteResponsableResponse {
id: number;
action: string;
description: string;
dateAction: Date;
utilisateur: {
id: number;
nom: string;
prenom: string;
};
materiel: {
id: number;
nom: string;
reference: string;
} | null;
empruntId: number | null;
}
export interface DashboardResponsableResponse {
kpis: {
materiels: RepartitionStatutResponse;
emprunts: RepartitionStatutResponse;
anomalies: RepartitionStatutResponse;
notificationsNonLues: number;
};
activiteRecente: ActiviteResponsableResponse[];
}
export interface EmpruntResponsableResponse {
id: number;
statut: string;
dateEmprunt: Date;
dateRetourPrevue: Date;
dateRetourReelle: Date | null;
etudiant: {
id: number;
nom: string;
prenom: string;
email: string;
classe: string | null;
};
materiel: {
id: number;
nom: string;
reference: string;
statut: string;
categorie: {
id: number;
nom: string;
};
};
}
export interface MaterielResponsableResponse {
id: number;
nom: string;
marque: string;
modele: string;
reference: string;
statut: string;
etatGeneral: string;
categorie: {
id: number;
nom: string;
};
accessoires: Array<{
id: number;
nom: string;
quantiteAttendue: number;
obligatoire: boolean;
}>;
}
function toRepartition(rows: StatutCount[]): RepartitionStatutResponse {
const parStatut: Record<string, number> = {};
let total = 0;
for (const row of rows) {
parStatut[row.statut] = row.count;
total += row.count;
}
return { total, parStatut };
}
function toActiviteResponse(activite: ActiviteResponsable): ActiviteResponsableResponse {
return {
id: activite.id,
action: activite.action,
description: activite.description,
dateAction: activite.dateAction,
utilisateur: {
id: activite.utilisateur.id,
nom: activite.utilisateur.nom,
prenom: activite.utilisateur.prenom,
},
materiel: activite.materiel
? {
id: activite.materiel.id,
nom: activite.materiel.nom,
reference: activite.materiel.reference,
}
: null,
empruntId: activite.empruntId,
};
}
export function toDashboardResponsableResponse(
data: DashboardResponsableData,
): DashboardResponsableResponse {
return {
kpis: {
materiels: toRepartition(data.materiels),
emprunts: toRepartition(data.emprunts),
anomalies: toRepartition(data.anomalies),
notificationsNonLues: data.notificationsNonLues,
},
activiteRecente: data.activiteRecente.map(toActiviteResponse),
};
}
export function toEmpruntResponsableResponse(
emprunt: EmpruntResponsable,
): EmpruntResponsableResponse {
return {
id: emprunt.id,
statut: emprunt.statut,
dateEmprunt: emprunt.dateEmprunt,
dateRetourPrevue: emprunt.dateRetourPrevue,
dateRetourReelle: emprunt.dateRetourReelle,
etudiant: {
id: emprunt.utilisateur.id,
nom: emprunt.utilisateur.nom,
prenom: emprunt.utilisateur.prenom,
email: emprunt.utilisateur.email,
classe: emprunt.utilisateur.classe,
},
materiel: {
id: emprunt.materiel.id,
nom: emprunt.materiel.nom,
reference: emprunt.materiel.reference,
statut: emprunt.materiel.statut,
categorie: {
id: emprunt.materiel.categorie.id,
nom: emprunt.materiel.categorie.nom,
},
},
};
}
export function toMaterielResponsableResponse(
materiel: MaterielResponsable,
): MaterielResponsableResponse {
return {
id: materiel.id,
nom: materiel.nom,
marque: materiel.marque,
modele: materiel.modele,
reference: materiel.reference,
statut: materiel.statut,
etatGeneral: materiel.etatGeneral,
categorie: {
id: materiel.categorie.id,
nom: materiel.categorie.nom,
},
accessoires: materiel.accessoires.map((liaison) => ({
id: liaison.accessoire.id,
nom: liaison.accessoire.nom,
quantiteAttendue: liaison.quantiteAttendue,
obligatoire: liaison.obligatoire,
})),
};
}