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.ModelCollaborateur; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace EPAServeur.Services { public class EngagementService : IEngagementService { #region Variables private readonly EpContext epContext; private readonly ICollaborateurService collaborateurService; private readonly IReferentService referentService; #endregion #region Contructeurs /// /// Constructeur de la classe EngagementService /// /// public EngagementService(EpContext _epContext, ICollaborateurService _collaborateurService, IReferentService _referentService) { epContext = _epContext; collaborateurService = _collaborateurService; referentService = _referentService; } #endregion #region Méthodes Service public IEnumerable GetEngagements(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) { IEnumerable engagements; if (texte == null) texte = ""; else texte = texte.ToLower(); int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; if (idAgence != null) engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Ep.IdAgence == idAgence).Skip(skip).Take(take); else engagements = epContext.Engagement.Include(engagement => engagement.Ep).Skip(skip).Take(take); if (engagements == null || engagements.Count() == 0) return new List(); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); return engagementDTOs; } public async Task> GetEngagementsAsync(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) { IEnumerable engagements; if (texte == null) texte = ""; else texte = texte.ToLower(); int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; if (idAgence != null) engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Ep.IdAgence == idAgence).Skip(skip).Take(take).ToListAsync(); else engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Skip(skip).Take(take).ToListAsync(); if (engagements == null || engagements.Count() == 0) return new List(); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement)); var results = await Task.WhenAll(engagementDTOs); return results; } public IEnumerable GetEngagementsEnAttente(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) { IEnumerable engagements; if (texte == null) texte = ""; else texte = texte.ToLower(); int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; if (idAgence != null) engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Ep.IdAgence == idAgence && engagement.Realise == null).Skip(skip).Take(take).ToList(); else engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise == null).Skip(skip).Take(take).ToList(); if (engagements == null || engagements.Count() == 0) return new List(); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); return engagementDTOs; } public async Task> GetEngagementsEnAttenteAsync(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) { IEnumerable engagements; if (texte == null) texte = ""; else texte = texte.ToLower(); int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; if (idAgence != null) engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Ep.IdAgence == idAgence && engagement.Realise == null).Skip(skip).Take(take).ToListAsync(); else engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise == null).Skip(skip).Take(take).ToListAsync(); if (engagements == null || engagements.Count() == 0) return new List(); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement)); var results = await Task.WhenAll(engagementDTOs); return results; } public IEnumerable GetEngagementsRepondus(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) { IEnumerable engagements; if (texte == null) texte = ""; else texte = texte.ToLower(); int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; if (idAgence != null) engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Ep.IdAgence == idAgence && engagement.Modalite.ToLower().Contains(texte)).Skip(skip).Take(take); else engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise != null && engagement.Modalite.ToLower().Contains(texte)).Skip(skip).Take(take); if (engagements == null || engagements.Count() == 0) return new List(); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); return engagementDTOs; } public async Task> GetEngagementsRepondusAsync(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) { IEnumerable engagements; if (texte == null) texte = ""; else texte = texte.ToLower(); int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; if (idAgence != null) engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Ep.IdAgence == idAgence && engagement.Modalite.ToLower().Contains(texte)).Skip(skip).Take(take).ToListAsync(); else engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise != null && engagement.Modalite.ToLower().Contains(texte)).Skip(skip).Take(take).ToListAsync(); if (engagements == null || engagements.Count() == 0) return new List(); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement)); var results = await Task.WhenAll(engagementDTOs); return results; } /// /// Donner une réponse à un engagement /// /// /// /// public EngagementDTO RepondreEngagement(EngagementDTO engagementDTO, long? idEngagement) { if (!IsEngagementValide(engagementDTO)) throw new EngagementInvalidException("Impossible de répondre à l'engagement, des données sont manquants."); if (engagementDTO.Realise == false && string.IsNullOrWhiteSpace(engagementDTO.RaisonNonRealisable)) throw new EngagementInvalidException("Impossible de répondre à l'engagement, une raison doit être rensignée lorsqu'un engagement n'est pas réalisé."); if (engagementDTO == null && !engagementDTO.Id.HasValue && engagementDTO.Id.Value != idEngagement) throw new EngagementIncompatibleIdException(); Engagement engagement = epContext.Engagement.Include(engagement => engagement.Ep).FirstOrDefault(engagement => engagement.IdEngagement == idEngagement); if (engagement == null) throw new EngagementNotFoundException(); engagement.Realise = engagementDTO.Realise; switch (engagement.Realise) { case true: engagement.Realisable = engagementDTO.Realisable; engagement.RaisonNonRealisable = null; break; case false: engagement.Realisable = engagementDTO.Realisable; engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable; break; default: engagement.Realisable = null; engagement.RaisonNonRealisable = null; break; } epContext.SaveChanges(); return GetEngagementDTO(engagement); } /// /// Donner une réponse à un engagement de manière asynchrone /// /// /// /// public async Task RepondreEngagementAsync(EngagementDTO engagementDTO, long? idEngagement) { if (!IsEngagementValide(engagementDTO)) throw new EngagementInvalidException("Impossible de répondre à l'engagement, des données sont manquants."); if (engagementDTO.Realise == false && string.IsNullOrWhiteSpace(engagementDTO.RaisonNonRealisable)) throw new EngagementInvalidException("Impossible de répondre à l'engagement, une raison doit être rensignée lorsqu'un engagement n'est pas réalisé."); Engagement engagement = await epContext.Engagement.Include(engagement => engagement.Ep).FirstOrDefaultAsync(engagement => engagement.IdEngagement == idEngagement); if (engagement == null) throw new EngagementNotFoundException(); engagement.Realise = engagementDTO.Realise; switch (engagement.Realise) { case true: engagement.Realisable = engagementDTO.Realisable; engagement.RaisonNonRealisable = null; break; case false: engagement.Realisable = engagementDTO.Realisable; engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable; break; default: engagement.Realisable = null; engagement.RaisonNonRealisable = null; break; } await epContext.SaveChangesAsync(); return await GetEngagementDTOAsync(engagement); } #endregion #region Méthodes Privée private bool IsEngagementValide(EngagementDTO engagementDTO) { return !(engagementDTO == null || engagementDTO.Id == null || engagementDTO.Action == null || engagementDTO.DatePrevisionnelle == null || engagementDTO.Dispositif == null || engagementDTO.Modalite == null); } #region Object to DTO /// /// Récupère un objet EngagementDTO en fonction d'un objet Engagement /// /// /// private EngagementDTO GetEngagementDTO(Engagement engagement) { EngagementDTO engagementDTO = new EngagementDTO() { Id = engagement.IdEngagement, Action = engagement.Action, DatePrevisionnelle = engagement.DateLimite, Dispositif = engagement.Dispositif, Modalite = engagement.Modalite, RaisonNonRealisable = engagement.RaisonNonRealisable, Realisable = engagement.Realisable, Realise = engagement.Realise, Ep = GetEpInformationDTO(engagement.Ep) }; return engagementDTO; } /// /// Récupère un objet EngagementDTO en fonction d'un objet Engagement /// /// /// private async Task GetEngagementDTOAsync(Engagement engagement) { EngagementDTO engagementDTO = new EngagementDTO() { Id = engagement.IdEngagement, Action = engagement.Action, DatePrevisionnelle = engagement.DateLimite, Dispositif = engagement.Dispositif, Modalite = engagement.Modalite, RaisonNonRealisable = engagement.RaisonNonRealisable, Realisable = engagement.Realisable, Realise = engagement.Realise, Ep = await GetEpInformationDTOAsync(engagement.Ep) }; return engagementDTO; } /// /// Récupère un objet EpInformationDTO en fonction d'un objet Ep /// /// /// private EpInformationDTO GetEpInformationDTO(Ep ep) { EpInformationDTO epInformationDTO = new EpInformationDTO() { Id = ep.Id, Type = ep.TypeEP.ToString(), Statut = ep.Statut.ToString(), DatePrevisionnelle = ep.DatePrevisionnelle, Obligatoire = ep.Obligatoire, Collaborateur = collaborateurService.GetCollaborateurById(ep.IdCollaborateur), Referent = referentService.GetReferentById(ep.IdReferent) //Ajouter la date de disponibilité }; return epInformationDTO; } /// /// Récupère un objet EpInformationDTO en fonction d'un objet Ep /// /// /// private async Task GetEpInformationDTOAsync(Ep ep) { EpInformationDTO epInformationDTO = new EpInformationDTO() { Id = ep.Id, Type = ep.TypeEP.ToString(), Statut = ep.Statut.ToString(), DatePrevisionnelle = ep.DatePrevisionnelle, Obligatoire = ep.Obligatoire //Ajouter la date de disponibilité }; var collaborateur = collaborateurService.GetCollaborateurByIdAsync(ep.IdCollaborateur); var referent = referentService.GetReferentByIdAsync(ep.IdReferent); await Task.WhenAll(collaborateur, referent); epInformationDTO.Collaborateur = collaborateur.Result; epInformationDTO.Referent = referent.Result; return epInformationDTO; } #endregion #region DTO to Object /// /// Modifie un objet Engagement en fonction d'un objet FormationDTO /// /// /// /// private Engagement SetEngagement(Engagement engagement, EngagementDTO engagementDTO) { engagement.Action = engagementDTO.Action; engagement.DateLimite = engagementDTO.DatePrevisionnelle.Value; engagement.Dispositif = engagementDTO.Dispositif; engagement.Modalite = engagementDTO.Modalite; engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable; engagement.Realisable = engagementDTO.Realisable; engagement.Realise = engagementDTO.Realise; engagement.Ep = GetEp(engagementDTO.Ep); return engagement; } /// /// Récupère un objet Ep en fonction d'un objet EpDTO /// /// /// private Ep GetEp(EpInformationDTO epInformationDTO) { if (epInformationDTO == null) return null; // Traiter Enum.TryParse(epInformationDTO.Type, out TypeChamp typeChamp); Enum.TryParse(epInformationDTO.Statut, out StatutEP statutEP); Ep ep = new Ep() { Id = epInformationDTO.Id.Value, TypeEP = typeChamp, Statut = statutEP, DatePrevisionnelle = epInformationDTO.DatePrevisionnelle.Value, Obligatoire = epInformationDTO.Obligatoire.Value, IdReferent = epInformationDTO.Referent.Id.Value, IdCollaborateur = epInformationDTO.Collaborateur.Id.Value, // Ajouter la date de disponibilité }; return ep; } #endregion #endregion } }