import { ActiviteResponsable, EmpruntResponsable, MaterielResponsable, StatutCount, } from '../repositories/responsable.repository'; import { DashboardResponsableData } from '../services/responsable.service'; export interface RepartitionStatutResponse { total: number; parStatut: Record; } 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 = {}; 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, })), }; }