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
///
/// Accès et gestion de la base de données
///
private readonly EpContext epContext;
///
/// 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 Contructeurs
///
/// Constructeur de la classe FormationService
///
///
public ParticipationFormationService(EpContext _epContext, ICollaborateurService _collaborateurService, ITransformDTO _transformDTO)
{
epContext = _epContext;
collaborateurService = _collaborateurService;
transformDTO = _transformDTO;
}
#endregion
#region Méthodes Service
///
/// Récupérer une évaluation faite par un collaborateur.
///
/// Id d'une participation formation
///
public async Task 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);
}
///
/// Récupérer la liste des participations de formation d’un collaborateur.
///
/// Id du collaborateur
///
public async Task> GetParticipationsByCollaborateurAsync(Guid idCollaborateur)
{
IQueryable query;
IEnumerable participationFormations;
IEnumerable 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 collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(participationFormations);
participationFormationDTOs = participationFormations.Select(participationFormation => transformDTO.GetParticipationFormationDTO(participationFormation, collaborateurDTOs));
return participationFormationDTOs;
}
///
/// Evaluer une formation.
///
/// Id d'une participation formation
/// Evaluation d'une formation
///
public async Task 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
///
/// Vérifier si un objet EvaluationDTO est valide pour une mise à jour
///
///
/// 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
///
///
/// true si l'objet est valide, false sinon
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
}
}