You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Digitalisation_EPA_Serveur/EPAServeur/Services/DemandeDelegationService.cs

144 lines
5.0 KiB

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;
private static ICollaborateurService collaborateurService;
#endregion
#region constructeur
public DemandeDelegationService(ICollaborateurService _collaborateurService, EpContext _context)
{
context = _context;
collaborateurService = _collaborateurService;
}
#endregion
#region services async
public async Task<IEnumerable<DemandeDelegationDTO>> RecupererDemandesDelegation(Guid? idReferent)
{
CollaborateurDTO referentDTO;
try
{
referentDTO = await collaborateurService.GetCollaborateurByIdAsync(idReferent);
}
catch(CollaborateurNotFoundException)
{
throw new ReferentNotFoundException();
}
var tasks = from demandeDelegation in context.DemandeDelegation.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<DemandeDelegationDTO> 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<DemandeDelegationDTO> 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<DemandeDelegationDTO> 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;
}
private static async Task<EpInformationDTO> GetEpInformationDTO(Ep ep)
{
return new EpInformationDTO()
{
Id = ep.IdEP,
Collaborateur = await collaborateurService.GetCollaborateurByIdAsync(ep.IdCollaborateur),
Referent = await collaborateurService.GetCollaborateurByIdAsync(ep.IdReferent),
DatePrevisionnelle = ep.DatePrevisionnelle,
DateDisponibilite = ep.DateDisponibilite,
Statut = ep.Statut,
Type = ep.TypeEP,
Obligatoire = ep.Obligatoire,
};
}
private static async Task<DemandeDelegationDTO> 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
}
}