From 1373fea1ba44b54945fbe499c9101a84f9edabd2 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Thu, 25 Feb 2021 09:04:00 +0100 Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20du=20service=20ParticipationFor?= =?UTF-8?q?mationService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IParticipationFormationService.cs | 17 + .../Services/ParticipationFormationService.cs | 370 ++++++++++++++++++ 2 files changed, 387 insertions(+) create mode 100644 EPAServeur/IServices/IParticipationFormationService.cs create mode 100644 EPAServeur/Services/ParticipationFormationService.cs diff --git a/EPAServeur/IServices/IParticipationFormationService.cs b/EPAServeur/IServices/IParticipationFormationService.cs new file mode 100644 index 0000000..8201d23 --- /dev/null +++ b/EPAServeur/IServices/IParticipationFormationService.cs @@ -0,0 +1,17 @@ +using EPAServeur.Context; +using IO.Swagger.DTO; +using IO.Swagger.ModelCollaborateur; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.IServices +{ + public interface IParticipationFormationService + { + Task GetEvaluationCollaborateurAsync(long idParticipationFormation); + Task> GetParticipationByCollaborateurAsync(Guid idCollaborateur); + Task EvaluerFormationAsync(long idParticipationFormation, EvaluationDTO evaluationDTO); + } +} diff --git a/EPAServeur/Services/ParticipationFormationService.cs b/EPAServeur/Services/ParticipationFormationService.cs new file mode 100644 index 0000000..6eb1323 --- /dev/null +++ b/EPAServeur/Services/ParticipationFormationService.cs @@ -0,0 +1,370 @@ +using EPAServeur.Context; +using EPAServeur.Exceptions; +using EPAServeur.IServices; +using EPAServeur.Models.EP; +using EPAServeur.Models.Formation; +using EPAServeur.Models.SaisieChamp; +using IO.Swagger.DTO; +using IO.Swagger.Enum; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Services +{ + public class ParticipationFormationService : IParticipationFormationService + { + #region Variables + + /// + /// Accès et gestion de la base de données + /// + private readonly EpContext epContext; + + /// + /// Accès et service collaborateur + /// + private readonly ICollaborateurService collaborateurService; + + #endregion + + #region Contructeurs + + /// + /// Constructeur de la classe FormationService + /// + /// + public ParticipationFormationService(EpContext _epContext, ICollaborateurService _collaborateurService) + { + epContext = _epContext; + collaborateurService = _collaborateurService; + } + + #endregion + + #region Méthodes Service + + /// + /// Récupérer une évaluation faite par un collaborateur. + /// + /// Id d'une participation formation + /// + public async Task GetEvaluationCollaborateurAsync(long idParticipationFormation) + { + ParticipationFormation participationFormation; + + participationFormation = await epContext.ParticipationFormation + .Include(participationFormation => participationFormation.Evaluation) + .Include(participationFormation => participationFormation.Formation) + .FirstOrDefaultAsync(participationFormation => participationFormation.IdParticipationFormation == idParticipationFormation); + + if (participationFormation == null) + throw new ParticipationFormationNotFoundException(string.Format("Aucune participation formation trouvée avec l'id suivant: {0}.", idParticipationFormation)); + + return GetEvaluationDTO(participationFormation); + } + + /// + /// Récupérer la liste des participations de formation d’un collaborateur. + /// + /// Id du collaborateur + /// + public async Task> GetParticipationByCollaborateurAsync(Guid idCollaborateur) + { + IQueryable query; + IEnumerable participationFormations; + IEnumerable participationFormationDTOs; + + query = epContext.ParticipationFormation + .Include(participationFormation => participationFormation.Evaluation) + .Include(participationFormation => participationFormation.Formation) + .ThenInclude(formation => formation.Statut) + .Include(participationFormation => participationFormation.DemandeFormation) + .ThenInclude(demandeFormation => demandeFormation.Ep) + .Where(participationFormation => participationFormation.DemandeFormation.Ep.IdCollaborateur == idCollaborateur && participationFormation.DemandeFormation.Etat == EtatDemande.Validee); + + participationFormations = await query.ToListAsync(); + + IEnumerable collaborateurDTOs = await GetCollaborateurDTOs(participationFormations); + + participationFormationDTOs = participationFormations.Select(participationFormation => GetParticipationFormationDTO(participationFormation, collaborateurDTOs)); + + return participationFormationDTOs; + } + + /// + /// Evaluer une formation. + /// + /// Id d'une participation formation + /// Evaluation d'une formation + /// + public async Task EvaluerFormationAsync(long idParticipationFormation, EvaluationDTO evaluationDTO) + { + ParticipationFormation participationFormation; + + if (!evaluationDTO.Id.HasValue || evaluationDTO.Id.Value != idParticipationFormation) + throw new ParticipationFormationIncompatibleIdException("L'id de la participation formation a mettre à jour et la participation formation a mettre à jour sont incompatble."); + + IsEvaluationValide(evaluationDTO); + + participationFormation = await epContext.ParticipationFormation.Include(p => p.Evaluation) + .FirstOrDefaultAsync(p => p.IdParticipationFormation == idParticipationFormation); + + if (participationFormation == null) + throw new ParticipationFormationNotFoundException(string.Format("Aucune participation formation trouvée avec l'id suivant: {0}.", idParticipationFormation)); + + participationFormation.Evaluation = evaluationDTO.Saisies.Select(s => GetSaisie(s)).ToList(); + participationFormation.EstEvaluee = true; + + await epContext.SaveChangesAsync(); + + return GetEvaluationDTO(participationFormation); + } + + #endregion + + #region Méthodes Privée + /// + /// Vérifier si un objet EvaluationDTO est valide pour une mise à jour + /// + /// + /// Un objet EvaluationDTO est valide si l'objet n'est pas null, si l'intitulé, la date de début et la valeur permettant de dire si la formation est certifiée ou non ne sont pas null, + /// si l'évaluation possède au moins une saisie et si la saisie a une note + /// + /// + /// true si l'objet est valide, false sinon + private void IsEvaluationValide(EvaluationDTO evaluation) + { + // Vérifier que l'évaluation n'est pas null + if (evaluation == null) + throw new ParticipationFormationInvalidException("Aucune évaluation n'a été reçue."); + + // Vérifier que la formation a bien un intitulé + if (string.IsNullOrWhiteSpace(evaluation.Intitule)) + throw new ParticipationFormationInvalidException("L'intitulé de la formation doit contenir au moins 1 caractère."); + + // Vérifier que la formation a bien une valeur permettant de dire si la formation est certifiée ou non + if (!evaluation.EstCertifie.HasValue) + throw new ParticipationFormationInvalidException("Impossible d'évaluer une formation sans savoir si la formation est certfiée ou non."); + + // Vérifier que la formation a bien une date de début + if (!evaluation.DateDebut.HasValue) + throw new ParticipationFormationInvalidException("Impossible d'évaluer une formation sans date de début de formation."); + + // Vérifier que l'évaluation possède au moins une saisie + if (evaluation.Saisies == null || evaluation.Saisies.Count == 0) + throw new ParticipationFormationInvalidException("Impossible d'évaluer une formation sans saisie."); + + // Vérifier que l'évaluation possède une note pour chaque saisie + if (evaluation.Saisies.Any(s => !s.Note.HasValue)) + throw new ParticipationFormationInvalidException("Toutes les saisies doivent posséder une note."); + } + + #region Object to DTO + + /// + /// Récuperer un objet ParticipationFormationDTO en fonction d'un objet ParticipationFormation et d'une liste de CollaborateurDTO + /// + /// + /// + private ParticipationFormationDTO GetParticipationFormationDTO(ParticipationFormation participationFormation, IEnumerable collaborateurDTOs) + { + ParticipationFormationDTO participationFormationDTO = new ParticipationFormationDTO() + { + Id = participationFormation.IdParticipationFormation, + DateCreation = participationFormation.DateCreation, + Intitule = participationFormation.Formation.Intitule, + DateDebut = participationFormation.Formation.DateDebut, + Statut = GetStatutFormationDTO(participationFormation.Formation.Statut), + Collaborateur = GetCollaborateurDTO(participationFormation, collaborateurDTOs), + Ep = GetEpInformationDTO(participationFormation.DemandeFormation.Ep, collaborateurDTOs) + }; + + return participationFormationDTO; + } + + + /// + /// Récuperer un objet EvaluationDTO en fonction d'un objet ParticipationFormation + /// + /// + /// + private EvaluationDTO GetEvaluationDTO(ParticipationFormation participationFormation) + { + EvaluationDTO evaluationDTO = new EvaluationDTO() + { + Id = participationFormation.IdParticipationFormation, + Intitule = participationFormation.Formation.Intitule, + DateDebut = participationFormation.Formation.DateDebut, + EstCertifie = participationFormation.Formation.EstCertifiee, + Saisies = participationFormation.Evaluation.Select(s => GetSaisieDTO(s)).ToList() + }; + + return evaluationDTO; + } + + /// + /// Récuperer un objet SaisieDTO en fonction d'un objet Saisie + /// + /// + /// + private SaisieDTO GetSaisieDTO(Saisie saisie) + { + if (saisie == null) + return null; + + SaisieDTO saisieDTO = new SaisieDTO() + { + Id = saisie.IdSaisie, + Note = saisie.Note, + Texte = saisie.Texte, + Champ = GetChampDTO(saisie.Champ), + TypeSaisie = saisie.TypeSaisie + }; + return saisieDTO; + } + + /// + /// Récuperer un objet ChampDTO en fonction d'un objet Champ + /// + /// + /// + private ChampDTO GetChampDTO(Champ champ) + { + if (champ == null) + return null; + + ChampDTO champDTO = new ChampDTO() + { + Id = champ.IdChamp, + Texte = champ.Texte, + Section = champ.Section, + Soussection = champ.SousSection, + Ordre = champ.Ordre, + TypeChamp = champ.TypeChamp, + TypeSaisie = champ.TypeSaisie + }; + return champDTO; + } + + /// + /// Récuperer un objet StatutFormationDTO en fonction d'un objet StatutFormation + /// + /// + /// + private StatutFormationDTO GetStatutFormationDTO(StatutFormation statutFormation) + { + if (statutFormation == null) + return null; + StatutFormationDTO statutFormationDTO = new StatutFormationDTO() + { + Id = statutFormation.IdStatutFormation, + Libelle = statutFormation.Libelle + }; + return statutFormationDTO; + } + + /// + /// Récuperer une liste de CollaborateurDTO contenant les collaborateurs et les référents. Retourne null s'il n'y a aucune participation. + /// + /// + /// + private async Task> GetCollaborateurDTOs(IEnumerable participationsFormation) + { + if (!participationsFormation.Any()) + return null; + + List guids = participationsFormation.SelectMany(participationFormation => new[] { (Guid?)participationFormation.DemandeFormation.Ep.IdCollaborateur, participationFormation.DemandeFormation.Ep.IdReferent }).ToList(); + + return await collaborateurService.GetCollaborateurDTOsAsync(guids); ; + } + + /// + /// 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) + { + return collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == participationFormation.DemandeFormation.Ep.IdCollaborateur); + } + + /// + /// 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; + + + 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 + + /// + /// Récuperer un objet Saisie en fonction d'un objet SaisieDTO + /// + /// + /// + private Saisie GetSaisie(SaisieDTO saisieDTO) + { + Saisie saisie = new Saisie() + { + IdSaisie = saisieDTO.Id.Value, + Note = saisieDTO.Note, + Texte = saisieDTO.Texte, + Champ = GetChamp(saisieDTO.Champ), + TypeSaisie = saisieDTO.TypeSaisie + }; + return saisie; + } + + /// + /// Récuperer un objet Champ en fonction d'un objet ChampDTO + /// + /// + /// + private Champ GetChamp(ChampDTO champDTO) + { + Champ champ = new Champ() + { + IdChamp = champDTO.Id.Value, + Texte = champDTO.Texte, + Section = champDTO.Section, + SousSection = champDTO.Soussection, + Ordre = champDTO.Ordre.Value, + TypeChamp = champDTO.TypeChamp, + TypeSaisie = champDTO.TypeSaisie + }; + return champ; + } + + #endregion + + #endregion + + } +}