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/ParticipationFormationServi...

175 lines
8.4 KiB

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.Enum;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EPAServeur.Services
{
public class ParticipationFormationService : IParticipationFormationService
{
#region Variables
/// <summary>
/// Accès et gestion de la base de données
/// </summary>
private readonly EpContext epContext;
/// <summary>
/// Accès et service collaborateur
/// </summary>
private readonly ICollaborateurService collaborateurService;
/// <summary>
/// Accès au service permettant de transformer un modèle en dto
/// </summary>
private readonly ITransformDTO transformDTO;
#endregion
#region Contructeurs
/// <summary>
/// Constructeur de la classe FormationService
/// </summary>
/// <param name="_epContext"></param>
public ParticipationFormationService(EpContext _epContext, ICollaborateurService _collaborateurService, ITransformDTO _transformDTO)
{
epContext = _epContext;
collaborateurService = _collaborateurService;
transformDTO = _transformDTO;
}
#endregion
#region Méthodes Service
/// <summary>
/// Récupérer une évaluation faite par un collaborateur.
/// </summary>
/// <param name="idParticipationFormation">Id d&#x27;une participation formation</param>
/// <returns></returns>
public async Task<EvaluationDTO> GetEvaluationCollaborateurAsync(long idParticipationFormation)
{
ParticipationFormation participationFormation;
participationFormation = await epContext.ParticipationFormation
.Include(participationFormation => participationFormation.Evaluation)
.Include(participationFormation => participationFormation.Formation)
.FirstOrDefaultAsync(participationFormation => participationFormation.IdParticipationFormation == idParticipationFormation);
if (participationFormation == null)
throw new ParticipationFormationNotFoundException(string.Format("Aucune participation formation trouvée avec l'id suivant: {0}.", idParticipationFormation));
return transformDTO.GetEvaluationDTO(participationFormation);
}
/// <summary>
/// Récupérer la liste des participations de formation d’un collaborateur.
/// </summary>
/// <param name="idCollaborateur">Id du collaborateur</param>
/// <returns></returns>
public async Task<IEnumerable<ParticipationFormationDTO>> GetParticipationsByCollaborateurAsync(Guid idCollaborateur)
{
IQueryable<ParticipationFormation> query;
IEnumerable<ParticipationFormation> participationFormations;
IEnumerable<ParticipationFormationDTO> participationFormationDTOs;
query = epContext.ParticipationFormation
.Include(participationFormation => participationFormation.Evaluation)
.Include(participationFormation => participationFormation.Formation)
.ThenInclude(formation => formation.Statut)
.Include(participationFormation => participationFormation.DemandeFormation)
.ThenInclude(demandeFormation => demandeFormation.Ep)
.Where(participationFormation => participationFormation.DemandeFormation.Ep.IdCollaborateur == idCollaborateur && participationFormation.DemandeFormation.Etat == EtatDemande.Validee);
participationFormations = await query.ToListAsync();
IEnumerable<CollaborateurDTO> collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(participationFormations);
participationFormationDTOs = participationFormations.Select(participationFormation => transformDTO.GetParticipationFormationDTO(participationFormation, collaborateurDTOs));
return participationFormationDTOs;
}
/// <summary>
/// Evaluer une formation.
/// </summary>
/// <param name="idParticipationFormation">Id d&#x27;une participation formation</param>
/// <param name="evaluationDTO">Evaluation d'une formation</param>
/// <returns></returns>
public async Task<EvaluationDTO> EvaluerFormationAsync(long idParticipationFormation, EvaluationDTO evaluationDTO)
{
ParticipationFormation participationFormation;
IsEvaluationValide(evaluationDTO);
if (!evaluationDTO.Id.HasValue || evaluationDTO.Id.Value != idParticipationFormation)
throw new ParticipationFormationIncompatibleIdException("L'id de la participation formation a mettre à jour et la participation formation a mettre à jour sont incompatble.");
participationFormation = await epContext.ParticipationFormation.Include(p => p.Evaluation)
.Include(p => p.Formation)
.FirstOrDefaultAsync(p => p.IdParticipationFormation == idParticipationFormation);
if (participationFormation == null)
throw new ParticipationFormationNotFoundException(string.Format("Aucune participation formation trouvée avec l'id suivant: {0}.", idParticipationFormation));
participationFormation.Evaluation = evaluationDTO.Saisies.Select(s => transformDTO.GetSaisie(s)).ToList();
participationFormation.EstEvaluee = true;
await epContext.SaveChangesAsync();
return transformDTO.GetEvaluationDTO(participationFormation);
}
#endregion
#region Méthodes Privée
/// <summary>
/// Vérifier si un objet EvaluationDTO est valide pour une mise à jour
/// </summary>
/// <remarks>
/// Un objet EvaluationDTO est valide si l'objet n'est pas null, si l'intitulé, la date de début et la valeur permettant de dire si la formation est certifiée ou non ne sont pas null,
/// si l'évaluation possède au moins une saisie et si la saisie a une note
/// </remarks>
/// <param name="evaluation"></param>
/// <returns>true si l'objet est valide, false sinon</returns>
private void IsEvaluationValide(EvaluationDTO evaluation)
{
// Vérifier que l'évaluation n'est pas null
if (evaluation == null)
throw new ParticipationFormationInvalidException("Aucune évaluation n'a été reçue.");
// Vérifier que la formation a bien un intitulé
if (string.IsNullOrWhiteSpace(evaluation.Intitule))
throw new ParticipationFormationInvalidException("L'intitulé de la formation doit contenir au moins 1 caractère.");
// Vérifier que la formation a bien une valeur permettant de dire si la formation est certifiée ou non
if (!evaluation.EstCertifiee.HasValue)
throw new ParticipationFormationInvalidException("Impossible d'évaluer une formation sans savoir si la formation est certfiée ou non.");
// Vérifier que la formation a bien une date de début
if (!evaluation.DateDebut.HasValue)
throw new ParticipationFormationInvalidException("Impossible d'évaluer une formation sans date de début de formation.");
// Vérifier que l'évaluation possède au moins une saisie
if (evaluation.Saisies == null || evaluation.Saisies.Count == 0)
throw new ParticipationFormationInvalidException("Impossible d'évaluer une formation sans saisie.");
// Vérifier que l'évaluation possède une note pour chaque saisie
if (evaluation.Saisies.Any(s => !s.Note.HasValue && (s.TypeSaisie == TypeSaisie.Competence || s.TypeSaisie == TypeSaisie.Notation)))
throw new ParticipationFormationInvalidException("Toutes les saisies de type compétence ou notation doivent posséder une note.");
}
#endregion
}
}