using EPAServeur.Context; using EPAServeur.Exceptions; using EPAServeur.IServices; using EPAServeur.Models.EP; using IO.Swagger.ApiCollaborateur; using IO.Swagger.DTO; using IO.Swagger.Enum; using IO.Swagger.ModelCollaborateur; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace EPAServeur.Services { public class DemandeDelegationService : IDemandeDelegationService { #region variables private readonly EpContext context; private static ICollaborateurApi collaborateurAPI; #endregion #region constructeur public DemandeDelegationService(ICollaborateurApi _collaborateurApi, EpContext _context) { context = _context; collaborateurAPI = _collaborateurApi; } #endregion #region services async public async Task> RecupererDemandesDelegation(Guid? idReferent) { Collaborateur referent = await collaborateurAPI.ChercherCollabIdAsync(idReferent); if (referent == null) throw new ReferentNotFoundException(); CollaborateurDTO referentDTO = GetCollaborateurDTO(referent); var tasks = from demandeDelegation in context.DemandeDelegations.Include( d => d.Ep) where demandeDelegation.IdReferent.Equals(idReferent) && demandeDelegation.EtatDemande.Equals(EtatDemande.EnAttente) select GetDemandeDelegationDTO(demandeDelegation, referentDTO) ; return await Task.WhenAll(tasks); } public async Task UpdateDemandeDelegation(long id, DemandeDelegationDTO demandeDelegationDTO) { if (id != demandeDelegationDTO.Id) throw new DemandeDelegationIncompatibleException("La demande de délégation ne correspond pas avec l'identifiant reçu"); if (demandeDelegationDTO == null || !demandeDelegationDTO.Id.HasValue || demandeDelegationDTO.Id == null) throw new DemandeDelegationInvalidException("Aucune demande de délégation à mettre à jour n'a été reçu"); switch(demandeDelegationDTO.EtatDemande) { case EtatDemande.EnAttente: throw new DemandeDelegationInvalidException("La demande ne peut pas être mise à jour si aucune réponse n'a été donnée"); case EtatDemande.Validee: demandeDelegationDTO = await AccepterDemandeDelegation(demandeDelegationDTO); break; case EtatDemande.Rejetee: demandeDelegationDTO = await RejeterDemandeDelegation(demandeDelegationDTO); break; } return demandeDelegationDTO; } #endregion #region méthodes privées private async Task AccepterDemandeDelegation(DemandeDelegationDTO demandeDelegationDTO) { DemandeDelegation demandeDelegation = await context.DemandeDelegations.Where(d => d.IdDemandeDelegation.Equals(demandeDelegationDTO.Id.Value)).Include(d => d.Ep).FirstOrDefaultAsync(); if (demandeDelegation == null) throw new DemandeDelegationNotFoundException("Aucune demande de délégation n'a été trouvée"); Guid ancienReferent = demandeDelegation.Ep.IdReferent.Value; // devra être utilisé pour notifier l'ancien référent demandeDelegation.Ep.IdReferent = demandeDelegationDTO.Referent.Id; context.Remove(demandeDelegation); await context.SaveChangesAsync(); return null; } private async Task RejeterDemandeDelegation(DemandeDelegationDTO demandeDelegationDTO) { if (demandeDelegationDTO.RaisonRefus == null || demandeDelegationDTO.RaisonRefus == "") throw new DemandeDelegationInvalidException("Vous devez justifiez la raison du refus"); DemandeDelegation demandeDelegation = await context.DemandeDelegations.FindAsync(demandeDelegationDTO.Id); if (demandeDelegation == null) throw new DemandeDelegationNotFoundException("Aucune demande de délégation n'a été trouvée"); demandeDelegation.EtatDemande = demandeDelegationDTO.EtatDemande; demandeDelegation.RaisonRefus= demandeDelegationDTO.RaisonRefus; demandeDelegation.DateReponse = DateTime.Now; await context.SaveChangesAsync(); return demandeDelegationDTO; } private static CollaborateurDTO GetCollaborateurDTO(Collaborateur collaborateur) { return new CollaborateurDTO() { Id = collaborateur.Id, Nom = collaborateur.Nom, Prenom = collaborateur.Prenom, }; } private static async Task GetEpInformationDTO(Ep ep) { return new EpInformationDTO() { Id = ep.IdEP, Collaborateur = GetCollaborateurDTO(await collaborateurAPI.ChercherCollabIdAsync(ep.IdCollaborateur)), DatePrevisionnelle = ep.DatePrevisionnelle, Statut = ep.Statut, Type = ep.TypeEP, Obligatoire = ep.Obligatoire, }; } private static async Task GetDemandeDelegationDTO(DemandeDelegation demande, CollaborateurDTO referent ) { return new DemandeDelegationDTO() { Id = demande.IdDemandeDelegation, DateDemande = demande.DateDemande, EtatDemande = demande.EtatDemande, Referent = referent, RaisonDemande = demande.RaisonDemande, Ep = await GetEpInformationDTO( demande.Ep) }; } #endregion } }