using EPAServeur.Context; using EPAServeur.IServices; using EPAServeur.Models.EP; using IO.Swagger.DTO; using IO.Swagger.Enum; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace EPAServeur.Services { public class EpInformationService : IEpInformationService { #region Variables /// /// Accès et gestion de la base de données /// private readonly EpContext context; /// /// Accès et service collaborateur /// private readonly ICollaborateurService collaborateurService; /// /// Accès au service permettant de transformer un modèle en dto /// private readonly ITransformDTO transformDTO; /// /// Nombre d'éléments min à afficher par page /// private readonly int minParPage = 5; /// /// Nom d'éléments max à affichar par page /// private readonly int maxParPage = 100; /// /// Nombre d'éléments à afficher par défaut par page /// private readonly int defaultParPage = 15; #endregion #region constructeur public EpInformationService(EpContext context, ICollaborateurService collaborateurService, ITransformDTO _transformDTO) { this.context = context; this.collaborateurService = collaborateurService; this.transformDTO = _transformDTO; } #endregion #region Services async public async Task> GetEPEnCours(List idBUs, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => idBUs.Contains(ep.IdBu)).AsEnumerable().Where(ep => EstEpEnCours(ep.Statut)); return await GetEpInformationDTOs(eps, asc, numPage, parPage, texte, tri, dateDebut, dateFin); } public async Task GetEPEnCoursCount(List idBUs, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => idBUs.Contains(ep.IdBu)).AsEnumerable().Where(ep => EstEpEnCours(ep.Statut)); return await GetEpInformationDTOsCount(eps, texte, dateDebut, dateFin); } public async Task> GetEPEnCoursCollaborateurParticipant(Guid? idCollaborateur) { throw new NotImplementedException(); } public async Task> GetEPEnCoursReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => ep.IdReferent.Equals(idReferent)).AsEnumerable().Where(ep => EstEpEnCours(ep.Statut)); return await GetEpInformationDTOs(eps, asc, numPage, parPage, texte, tri, dateDebut, dateFin); } public async Task GetEPEnCoursReferentCount(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => ep.IdReferent.Equals(idReferent)).AsEnumerable().Where(ep => EstEpEnCours(ep.Statut)); return await GetEpInformationDTOsCount(eps, texte, dateDebut, dateFin); } public async Task> GetEPSignes(List idBUs, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => idBUs.Contains(ep.IdBu)).Where(ep => ep.Statut == StatutEp.Signe); return await GetEpInformationDTOs(eps, asc, numPage, parPage, texte, tri, dateDebut, dateFin); } public async Task> GetEPSignesCollaborateur(Guid? idCollaborateur) { IEnumerable eps = context.Ep.Where(ep => ep.IdCollaborateur.Equals(idCollaborateur)).Where(ep => ep.Statut.Equals(StatutEp.Signe)); return await GetEpInformationDTOs(eps, true, 1, maxParPage, "", "", null, null); } public async Task GetEPSignesCount(List idBUs, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => idBUs.Contains(ep.IdBu)).Where(ep => ep.Statut == StatutEp.Signe); return await GetEpInformationDTOsCount(eps, texte, dateDebut, dateFin); } public async Task> GetEPSignesReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => ep.IdReferent.Equals(idReferent)).Where(ep => ep.Statut.Equals(StatutEp.Signe)); return await GetEpInformationDTOs(eps, asc, numPage, parPage, texte, tri, dateDebut, dateFin); } public async Task GetEPSignesReferentCount(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { IEnumerable eps = context.Ep.Where(ep => ep.IdReferent.Equals(idReferent)).Where(ep => ep.Statut.Equals(StatutEp.Signe)); return await GetEpInformationDTOsCount(eps, texte, dateDebut, dateFin); } public async Task GetProchainEPCollaborateur(Guid? idCollaborateur) { Ep ep = context.Ep.Where(ep => ep.IdCollaborateur.Equals(idCollaborateur)).OrderBy(ep => ep.DateDisponibilite).AsEnumerable().Where(ep => ep.Statut.Equals(StatutEp.Cree) || EstEpEnCours(ep.Statut)).FirstOrDefault(); if (ep == null) return null; IEnumerable collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(new List() { ep.IdReferent, ep.IdCollaborateur }); return transformDTO.EpToEpDTO(ep, collaborateurDTOs); } #endregion #region méthodes privées private async Task> GetEpInformationDTOs(IEnumerable eps, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { eps = TriDate(eps, dateDebut, dateFin); IEnumerable collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(eps); IEnumerable epDTOs = eps.Select(ep => transformDTO.EpToEpDTO(ep, collaborateurDTOs)); if (!string.IsNullOrEmpty(texte)) epDTOs = epDTOs.Where(e => TriTexte(e, texte)); epDTOs = TriColonne(epDTOs, tri); if (asc != null && asc.HasValue && !asc.Value) epDTOs = epDTOs.Reverse(); return SkipAndTake(epDTOs, numPage, parPage); } private async Task GetEpInformationDTOsCount(IEnumerable eps, string texte, DateTime? dateDebut, DateTime? dateFin) { eps = TriDate(eps, dateDebut, dateFin); IEnumerable collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(eps); IEnumerable epDTOs = eps.Select(ep => transformDTO.EpToEpDTO(ep, collaborateurDTOs)); if(!string.IsNullOrEmpty(texte)) epDTOs = epDTOs.Where(e => TriTexte(e, texte)); return epDTOs.Count(); } private IEnumerable TriDate(IEnumerable eps, DateTime? dateDebut, DateTime? dateFin) { if (dateDebut.HasValue && dateDebut.Value != null) eps = eps.Where(ep => ep.DatePrevisionnelle >= dateDebut.Value); if (dateFin.HasValue && dateFin.Value != null) eps = eps.Where(ep => ep.DatePrevisionnelle < dateFin.Value.AddDays(1)); return eps; } private IEnumerable TriColonne(IEnumerable epDTOs, string tri) { switch (tri) { case "agence": epDTOs = epDTOs.OrderBy(e => e.Collaborateur.BusinessUnit.Nom); break; case "collaborateur": epDTOs = epDTOs.OrderBy(e => e.Collaborateur.Nom + e.Collaborateur.Prenom); break; case "referent": epDTOs = epDTOs.OrderBy(e => e.Referent.Nom + e.Referent.Prenom); break; case "dateentretien": epDTOs = epDTOs.OrderBy(e => e.DatePrevisionnelle); break; case "typeep": epDTOs = epDTOs.OrderBy(e => e.Type); break; case "statutep": epDTOs = epDTOs.OrderBy(e => e.Statut); break; case "datearrivee": epDTOs = epDTOs.OrderBy(e => e.Collaborateur.DateArrivee); break; case "datedisponibilite": epDTOs = epDTOs.OrderBy(e => e.DateDisponibilite); break; } return epDTOs; } private IEnumerable SkipAndTake(IEnumerable epDTOs, int? numPage, int? parPage) { if(numPage == null ||!numPage.HasValue) numPage = 1; if (parPage == null || !parPage.HasValue || parPage < minParPage || parPage > maxParPage) parPage = defaultParPage; int skip = (numPage.Value - 1) * parPage.Value; return epDTOs.Skip(skip).Take(parPage.Value); } private bool EstEpEnCours(StatutEp statut) { return statut != StatutEp.Annule && statut != StatutEp.Cree && statut != StatutEp.Rejete && statut != StatutEp.Signe; } private bool TriTexte(EpInformationDTO epDTOs, string texte) { return (epDTOs.Collaborateur.Nom + " " + epDTOs.Collaborateur.Prenom).ToLower().Contains(texte.ToLower()) || (epDTOs.Collaborateur.Prenom + " " + epDTOs.Collaborateur.Nom).ToLower().Contains(texte.ToLower()); } #endregion } }