diff --git a/EPAServeur/Services/FormationService.cs b/EPAServeur/Services/FormationService.cs index 2c25d60..fc35640 100644 --- a/EPAServeur/Services/FormationService.cs +++ b/EPAServeur/Services/FormationService.cs @@ -1,6 +1,7 @@ using EPAServeur.Context; using EPAServeur.Exceptions; using EPAServeur.IServices; +using EPAServeur.Models.EP; using EPAServeur.Models.Formation; using IO.Swagger.DTO; using Microsoft.EntityFrameworkCore; @@ -20,6 +21,11 @@ namespace EPAServeur.Services /// private readonly EpContext epContext; + /// + /// Accès et service collaborateur + /// + private readonly ICollaborateurService collaborateurService; + /// /// Nombre d'éléments min à afficher par page /// @@ -53,9 +59,10 @@ namespace EPAServeur.Services /// Constructeur de la classe FormationService /// /// - public FormationService(EpContext _epContext) + public FormationService(EpContext _epContext, ICollaborateurService _collaborateurService) { epContext = _epContext; + collaborateurService = _collaborateurService; } #endregion @@ -81,7 +88,12 @@ namespace EPAServeur.Services if (formation == null) throw new FormationNotFoundException(string.Format("Aucune formation trouvée avec l'id suivant: {0}.",idFormation)); - return GetFormationDTO(formation); + if (formation.ParticipationsFormation.Count == 0) + return GetFormationDTO(formation); + + IEnumerable collaborateurDTOs = await GetCollaborateurDTOs(formation.ParticipationsFormation); + + return GetFormationDTO(formation, collaborateurDTOs); } /// @@ -375,7 +387,15 @@ namespace EPAServeur.Services if (!asc.HasValue) asc = defaultAsc; - switch (columnName) + if (string.IsNullOrWhiteSpace(columnName)) + { + if (asc.Value) + return query.OrderBy(p => p.Intitule); + else + return query.OrderByDescending(p => p.Intitule); + } + + switch (columnName.ToLower()) { case "intitule": if (asc.Value) @@ -402,9 +422,6 @@ namespace EPAServeur.Services return query.OrderBy(p => p.EstCertifiee); else return query.OrderByDescending(p => p.EstCertifiee); - //(A faire lorsque la gestion des participations aux formations sera terminée) - //case "participants": - // return query; default: if (asc.Value) return query.OrderBy(p => p.Intitule); @@ -421,7 +438,7 @@ namespace EPAServeur.Services /// private IQueryable IdStatutsFilter(IQueryable query, List idStatuts) { - if (idStatuts != null && idStatuts.Count > 0) + if (idStatuts != null && idStatuts.Count > 0 && idStatuts.First().HasValue) return query.Where(formation => idStatuts.Contains(formation.Statut.IdStatutFormation)); else return query; @@ -523,7 +540,35 @@ namespace EPAServeur.Services Statut = GetStatutFormationDTO(formation.Statut), Mode = GetModeFormationDTO(formation.ModeFormation), Type = GetTypeFormationDTO(formation.TypeFormation), - Participations = GetParticipationsFormationDTO(formation.ParticipationsFormation) + }; + + return formationDTO; + } + + /// + /// Récuperer un objet FormationDTO avec des participations en fonction d'un objet Formation et d'une liste de CollaborateurDTO + /// + /// + /// + private FormationDTO GetFormationDTO(Formation formation, IEnumerable collaborateurDTOs) + { + FormationDTO formationDTO = new FormationDTO() + { + Id = formation.IdFormation, + Intitule = formation.Intitule, + IdAgence = formation.IdAgence, + DateDebut = formation.DateDebut, + DateFin = formation.DateFin, + Heure = formation.Heure, + Jour = formation.Jour, + Organisme = formation.Organisme, + EstCertifiee = formation.EstCertifiee, + EstRealisee = formation.EstRealisee, + Origine = GetOrigineFormationDTO(formation.Origine), + Statut = GetStatutFormationDTO(formation.Statut), + Mode = GetModeFormationDTO(formation.ModeFormation), + Type = GetTypeFormationDTO(formation.TypeFormation), + Participations = GetParticipationsFormationDTO(formation.ParticipationsFormation, collaborateurDTOs) }; return formationDTO; @@ -621,42 +666,120 @@ namespace EPAServeur.Services } /// - /// Récuperer une liste de ParticipationFormationDTO en fonction d'une liste de ParticipationFormation + /// Récuperer une liste de CollaborateurDTO contenant les collaborateurs et les référents /// /// /// - private List GetParticipationsFormationDTO(List participationsFormation) + private async Task> GetCollaborateurDTOs(List participationsFormation) + { + if (participationsFormation.Count == 0) + return null; + + List guids = participationsFormation.SelectMany(participationFormation => new[] { (Guid?)participationFormation.DemandeFormation.Ep.IdCollaborateur, participationFormation.DemandeFormation.Ep.IdReferent }).ToList(); + + return await collaborateurService.GetCollaborateurDTOsAsync(guids); ; + } + + /// + /// Récuperer une liste de ParticipationFormationDTO en fonction d'une liste de ParticipationFormation et d'une liste de CollaborateurDTO + /// + /// + /// + private List GetParticipationsFormationDTO(List participationsFormation, IEnumerable collaborateurDTOs) { List participationFormationDTOs; - if (participationsFormation == null || participationsFormation.Count == 0) + if (participationsFormation == null || participationsFormation.Count == 0 || collaborateurDTOs == null || !collaborateurDTOs.Any()) return null; - participationFormationDTOs = participationsFormation.Select(participationFormation => GetParticipationFormationDTO(participationFormation)).ToList(); + participationFormationDTOs = participationsFormation.Select(participationFormation => GetParticipationFormationDTO(participationFormation, collaborateurDTOs)) + .OrderBy(participationFormation => participationFormation.Collaborateur.Nom) + .ThenBy(participationFormation => participationFormation.Collaborateur.Prenom).ToList(); return participationFormationDTOs; } /// - /// Récuperer un objet ParticipationFormationDTO en fonction d'un objet ParticipationFormation + /// Récuperer un objet ParticipationFormationDTO en fonction d'un objet ParticipationFormation et d'une liste de CollaborateurDTO /// /// /// - private ParticipationFormationDTO GetParticipationFormationDTO(ParticipationFormation participationFormation) + private ParticipationFormationDTO GetParticipationFormationDTO(ParticipationFormation participationFormation, IEnumerable collaborateurDTOs) { - if (participationFormation == null) - return null; ParticipationFormationDTO participationFormationDTO = new ParticipationFormationDTO() { Id = participationFormation.IdParticipationFormation, DateCreation = participationFormation.DateCreation, Intitule = participationFormation.Formation.Intitule, - DateDebut= participationFormation.Formation.DateDebut, + DateDebut = participationFormation.Formation.DateDebut, Statut = GetStatutFormationDTO(participationFormation.Formation.Statut), + Collaborateur = GetCollaborateurDTO(participationFormation, collaborateurDTOs), + Ep = GetEpInformationDTO(participationFormation.DemandeFormation.Ep, collaborateurDTOs) }; + return participationFormationDTO; } + /// + /// Récupère un objet CollaborateurDTO en fonction d'un objet ParticipationFormation et d'une liste de CollaborateurDTO + /// + /// + /// + private CollaborateurDTO GetCollaborateurDTO(ParticipationFormation participationFormation, IEnumerable collaborateurDTOs) + { + CollaborateurDTO collaborateur; + + if (participationFormation == null) + return null; + + if (collaborateurDTOs == null || !collaborateurDTOs.Any()) + collaborateur = null; + else + collaborateur = collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == participationFormation.DemandeFormation.Ep.IdCollaborateur); + + return collaborateur; + } + + /// + /// Récupère un objet EpInformationDTO en fonction d'un objet Ep et d'une liste de CollaborateurDTO + /// + /// + /// + private EpInformationDTO GetEpInformationDTO(Ep ep, IEnumerable collaborateurDTOs) + { + CollaborateurDTO collaborateur; + CollaborateurDTO referent; + + if (ep == null) + return null; + + if (collaborateurDTOs == null || !collaborateurDTOs.Any()) + { + collaborateur = null; + referent = null; + } + else + { + collaborateur = collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == ep.IdCollaborateur); + referent = collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == ep.IdReferent); + } + + EpInformationDTO epInformationDTO = new EpInformationDTO() + { + Id = ep.IdEP, + Type = ep.TypeEP, + Statut = ep.Statut, + DateDisponibilite = ep.DateDisponibilite, + DatePrevisionnelle = ep.DatePrevisionnelle, + Obligatoire = ep.Obligatoire, + Collaborateur = collaborateur, + Referent = referent, + }; + + return epInformationDTO; + } + + #endregion #region DTO to Object @@ -677,6 +800,7 @@ namespace EPAServeur.Services formation.Jour = Convert.ToInt32(formationDTO.Jour.Value); formation.Organisme = formationDTO.Organisme; formation.EstCertifiee = formationDTO.EstCertifiee.Value; + //formation.EstRealisee = formationDTO.EstRealisee.Value; formation.Origine = GetOrigineFormation(formationDTO.Origine); formation.Statut = GetStatutFormation(formationDTO.Statut); formation.ModeFormation = GetModeFormation(formationDTO.Mode);