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 /// /// 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; #endregion #region constructeur public DemandeDelegationService(ICollaborateurService _collaborateurService, EpContext _context, ITransformDTO _transformDTO) { context = _context; collaborateurService = _collaborateurService; transformDTO = _transformDTO; } #endregion #region services async public async Task> RecupererDemandesDelegation(Guid? idReferent) { IEnumerable demandesDelegation = context.DemandeDelegation.Include(d => d.Ep).Where(d => d.IdReferent.Equals(idReferent) && d.EtatDemande.Equals(EtatDemande.EnAttente)); List guids = demandesDelegation.SelectMany(demande => new[] { (Guid?)demande.Ep.IdCollaborateur, demande.Ep.IdReferent }).ToList(); guids.Add(idReferent); IEnumerable collaborateursDTO = await collaborateurService.GetCollaborateurDTOsAsync(guids); CollaborateurDTO referent = collaborateursDTO.FirstOrDefault(c => c.Id.Equals(idReferent)); if(referent == null) { throw new ReferentNotFoundException(); } return demandesDelegation.Select(d => transformDTO.GetDemandeDelegationDTO(d, referent, collaborateursDTO)); } 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.DemandeDelegation.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.DemandeDelegation.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; } #endregion } }