diff --git a/EPAServeur.Tests/Services/ParticipationFormationServiceTests.cs b/EPAServeur.Tests/Services/ParticipationFormationServiceTests.cs new file mode 100644 index 0000000..cbe581c --- /dev/null +++ b/EPAServeur.Tests/Services/ParticipationFormationServiceTests.cs @@ -0,0 +1,310 @@ +using EPAServeur.Context; +using EPAServeur.Exceptions; +using EPAServeur.IServices; +using EPAServeur.Models.Formation; +using EPAServeur.Services; +using IO.Swagger.ApiCollaborateur; +using IO.Swagger.DTO; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Tests.Services +{ + [TestFixture] + public class ParticipationFormationServiceTests + { + #region Variables + + private EpContext epContext; + private ICollaborateurApi collaborateurApi; + private ICollaborateurService collaborateurService; + #endregion + + #region Setup + + [SetUp] + public void Setup() + { + // Utilisation d'une base de données en mémoire + var optionBuider = new DbContextOptionsBuilder() + .UseInMemoryDatabase("server_ep_test") + .Options; + + epContext = new EpContext(optionBuider); + collaborateurApi = new CollaborateurApi(); + collaborateurService = new CollaborateurService(collaborateurApi, epContext); + epContext.Database.EnsureDeleted(); + epContext.Database.EnsureCreated(); + epContext.SaveChanges(); + + // Ajout du jeu de données pour les tests + DataSeeder.AddFormations(epContext); + + // Détache les entités du context car la base de données InMemory créé des conflits + // entre les clés primaires lors d'un Update ou d'un Insert + foreach (var entity in epContext.ChangeTracker.Entries()) + { + entity.State = EntityState.Detached; + } + } + + #endregion + + #region Tests GetEvaluationCollaborateurAsync + [Test] + public async Task GetEvaluationCollaborateurAsync_PasseEnParamUnIdExistantDansLeJeuDeDonneesFictif_RetourneUneEvaluation() + { + // Arrange + ParticipationFormationService participationFormationService = new ParticipationFormationService(epContext, collaborateurService); + int idParticipationFormation = 5; + // Act + EvaluationDTO evaluationDTO = await participationFormationService.GetEvaluationCollaborateurAsync(idParticipationFormation); + + // Assert + Assert.AreEqual(idParticipationFormation, evaluationDTO.Id); + Assert.AreEqual(new DateTime(2020, 5, 25, 14, 0, 0), evaluationDTO.DateDebut); + Assert.True(evaluationDTO.EstCertifie); + Assert.AreEqual("Apprendre C# et le développement de logiciels avec WPF", evaluationDTO.Intitule); + } + + [TestCase(-1)] + [TestCase(0)] + [TestCase(999999)] + public void GetEvaluationCollaborateurAsync_PasseEnParamUnIdInexistantDansLeJeuDeDonneesFictif_LeveUneParticipationFormationNotFoundException(long idParticipationFormation) + { + // Arrange + ParticipationFormationService participationFormationService = new ParticipationFormationService(epContext, collaborateurService); + + // Act + AsyncTestDelegate throwException = () => participationFormationService.GetEvaluationCollaborateurAsync(idParticipationFormation); + + // Assert + Assert.ThrowsAsync(typeof(ParticipationFormationNotFoundException), throwException); + } + + #endregion + + #region Tests GetParticipationByCollaborateur + + [TestCase("842650db-a548-4472-a3af-4c5fff3c1ab8")] + [TestCase("4f3fcd23-a1e4-4c9e-afa2-d06ca9216491")] + public async Task GetParticipationByCollaborateur_PasseDesParamsValides_RetourneDesParticipationsFormations(Guid idCollaborateur) + { + // Arrange + ParticipationFormationService participationFormationService = new ParticipationFormationService(epContext, collaborateurService); + + // Act + IEnumerable participationFormationDTOs = await participationFormationService.GetParticipationByCollaborateurAsync(idCollaborateur); + + // Assert + Assert.Less(0, participationFormationDTOs.Count()); + } + + [TestCase("e7820f92-eab1-42f5-ae96-5c16e71ff1e6")] + [TestCase("b5254c6c-7caa-435f-a4bb-e0cf92559832")] + public async Task GetFormationsAsync_PasseDesParamsInvalides_RetourneZeroFormation(Guid idCollaborateur) + { + // Arrange + ParticipationFormationService participationFormationService = new ParticipationFormationService(epContext, collaborateurService); + + // Act + IEnumerable participationFormationDTOs = await participationFormationService.GetParticipationByCollaborateurAsync(idCollaborateur); + + // Assert + Assert.AreEqual(0, participationFormationDTOs.Count()); + } + + #endregion + /* + #region Tests UpdateFormationAsync + + [TestCase(1, 2, 2, 1, 1, 2, "Test modification formation", "Apside", "2020-10-31", "2020-11-04")] + public async Task UpdateFormationAsync_ModifieUneFormationValide_FormationModifieeAvecSucces(long idFormation, int? idMode, int? idStatut, int? idType, int? idOrigine, long? idAgence, string intitule, string organisme, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + ModeFormationDTO modeExterne = epContext.ModeFormation.Where(mode => mode.IdModeFormation == idMode) + .Select(mode => new ModeFormationDTO { Id = mode.IdModeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + StatutFormationDTO statutPlanifie = epContext.StatutFormation.Where(mode => mode.IdStatutFormation == idStatut) + .Select(mode => new StatutFormationDTO { Id = mode.IdStatutFormation, Libelle = mode.Libelle }).FirstOrDefault(); + TypeFormationDTO typeELearning = epContext.TypeFormation.Where(mode => mode.IdTypeFormation == idType) + .Select(mode => new TypeFormationDTO { Id = mode.IdTypeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + OrigineFormationDTO origineFormationCollaborateur = epContext.OrigineFormation.Where(mode => mode.IdOrigineFormation == idOrigine) + .Select(mode => new OrigineFormationDTO { Id = mode.IdOrigineFormation, Libelle = mode.Libelle }).FirstOrDefault(); + + FormationService formationService = new FormationService(epContext, collaborateurService); + + FormationDTO formation = await formationService.GetFormationByIdAsync(idFormation); + + formation.Intitule = intitule; + formation.IdAgence = idAgence; + formation.DateDebut = dateDebut; + formation.DateFin = dateFin; + formation.Heure = 2; + formation.Jour = 1; + formation.Mode = modeExterne; + formation.Type = typeELearning; + formation.Organisme = organisme; + formation.Origine = origineFormationCollaborateur; + formation.Statut = statutPlanifie; + formation.EstCertifiee = false; + + + // Act + FormationDTO formationModifie = await formationService.UpdateFormationAsync(idFormation, formation); + + // Assert + Assert.IsNotNull(formationModifie); + Assert.AreEqual(idFormation, formationModifie.Id); + Assert.AreEqual(formation.Intitule, formationModifie.Intitule); + Assert.AreEqual(formation.IdAgence, formationModifie.IdAgence); + Assert.AreEqual(formation.DateDebut, formationModifie.DateDebut); + Assert.AreEqual(formation.DateFin, formationModifie.DateFin); + Assert.AreEqual(formation.Heure, formationModifie.Heure); + Assert.AreEqual(formation.Jour, formationModifie.Jour); + Assert.AreEqual(formation.Mode, formationModifie.Mode); + Assert.AreEqual(formation.Type, formationModifie.Type); + Assert.AreEqual(formation.Organisme, formationModifie.Organisme); + Assert.AreEqual(formation.Origine, formationModifie.Origine); + Assert.AreEqual(formation.Statut, formationModifie.Statut); + Assert.AreEqual(formation.EstCertifiee, formationModifie.EstCertifiee); + } + + [TestCase(1, 1, 1, 3, 1, 1, "Test Formation", "Apside", "2020-10-31", "2020-10-30")] + [TestCase(1, 0, 1, 3, 1, 1, "Test Formation", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 0, 3, 1, 1, "Test Formation", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 0, 1, 1, "Test Formation", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 0, 1, "Test Formation", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 0, "Test Formation", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 1, "", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 1, "Test Formation", "", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, null, "Test Formation", "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 1, null, "Apside", "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 1, "Test Formation", null, "2020-10-31", "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 1, "Test Formation", "Apside", null, "2020-11-02")] + [TestCase(1, 1, 1, 3, 1, 1, "Test Formation", "Apside", "2020-10-31", null)] + public async Task UpdateFormationAsync_ModifieUneFormationAvecDesProprietesInvalides_LeveUneFormationInvalidException(long idFormation, int? idMode, int? idStatut, int? idType, int? idOrigine, long? idAgence, string intitule, string organisme, DateTime? dateDebut, DateTime? dateFin) + { + + // Arrange + ModeFormationDTO modeExterne = epContext.ModeFormation.Where(mode => mode.IdModeFormation == idMode) + .Select(mode => new ModeFormationDTO { Id = mode.IdModeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + StatutFormationDTO statutPlanifie = epContext.StatutFormation.Where(mode => mode.IdStatutFormation == idStatut) + .Select(mode => new StatutFormationDTO { Id = mode.IdStatutFormation, Libelle = mode.Libelle }).FirstOrDefault(); + TypeFormationDTO typeELearning = epContext.TypeFormation.Where(mode => mode.IdTypeFormation == idType) + .Select(mode => new TypeFormationDTO { Id = mode.IdTypeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + OrigineFormationDTO origineFormationCollaborateur = epContext.OrigineFormation.Where(mode => mode.IdOrigineFormation == idOrigine) + .Select(mode => new OrigineFormationDTO { Id = mode.IdOrigineFormation, Libelle = mode.Libelle }).FirstOrDefault(); + + FormationService formationService = new FormationService(epContext, collaborateurService); + + FormationDTO formation = await formationService.GetFormationByIdAsync(idFormation); + + formation.Intitule = intitule; + formation.IdAgence = idAgence; + formation.DateDebut = dateDebut; + formation.DateFin = dateFin; + formation.Heure = 2; + formation.Jour = 1; + formation.Mode = modeExterne; + formation.Type = typeELearning; + formation.Organisme = organisme; + formation.Origine = origineFormationCollaborateur; + formation.Statut = statutPlanifie; + formation.EstCertifiee = false; + + // Act + AsyncTestDelegate throwException = () => formationService.UpdateFormationAsync(idFormation, formation); + + // Assert + Assert.ThrowsAsync(typeof(FormationInvalidException), throwException); + } + + [TestCase(2, 2, 2, 1, 1, 2, "Test modification formation", "Apside", "2020-10-31", "2020-11-04")] + [TestCase(0, 2, 2, 1, 1, 2, "Test modification formation", "Apside", "2020-10-31", "2020-11-04")] + [TestCase(null, 2, 2, 1, 1, 2, "Test modification formation", "Apside", "2020-10-31", "2020-11-04")] + public async Task UpdateFormationAsync_ModifieUneFormationAvecUnIdIncorrecte_LeveUneFormationIncompatibleIdException(long? idFormation, int? idMode, int? idStatut, int? idType, int? idOrigine, long? idAgence, string intitule, string organisme, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + ModeFormationDTO modeExterne = epContext.ModeFormation.Where(mode => mode.IdModeFormation == idMode) + .Select(mode => new ModeFormationDTO { Id = mode.IdModeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + StatutFormationDTO statutPlanifie = epContext.StatutFormation.Where(mode => mode.IdStatutFormation == idStatut) + .Select(mode => new StatutFormationDTO { Id = mode.IdStatutFormation, Libelle = mode.Libelle }).FirstOrDefault(); + TypeFormationDTO typeELearning = epContext.TypeFormation.Where(mode => mode.IdTypeFormation == idType) + .Select(mode => new TypeFormationDTO { Id = mode.IdTypeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + OrigineFormationDTO origineFormationCollaborateur = epContext.OrigineFormation.Where(mode => mode.IdOrigineFormation == idOrigine) + .Select(mode => new OrigineFormationDTO { Id = mode.IdOrigineFormation, Libelle = mode.Libelle }).FirstOrDefault(); + + FormationService formationService = new FormationService(epContext, collaborateurService); + + FormationDTO formation = await formationService.GetFormationByIdAsync(1); + + formation.Id = idFormation; + formation.Intitule = intitule; + formation.IdAgence = idAgence; + formation.DateDebut = dateDebut; + formation.DateFin = dateFin; + formation.Heure = 2; + formation.Jour = 1; + formation.Mode = modeExterne; + formation.Type = typeELearning; + formation.Organisme = organisme; + formation.Origine = origineFormationCollaborateur; + formation.Statut = statutPlanifie; + formation.EstCertifiee = false; + + // Act + AsyncTestDelegate throwException = () => formationService.UpdateFormationAsync(1, formation); + + // Assert + Assert.ThrowsAsync(typeof(FormationIncompatibleIdException), throwException); + } + + [TestCase(0, 2, 2, 1, 1, 2, "Test modification formation", "Apside", "2020-10-31", "2020-11-04")] + public void UpdateFormationAsync_ModifieUneFormationAvecUnIdInexistant_RetourneUnObjetNull(long idFormation, int? idMode, int? idStatut, int? idType, int? idOrigine, long? idAgence, string intitule, string organisme, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + ModeFormationDTO modeExterne = epContext.ModeFormation.Where(mode => mode.IdModeFormation == idMode) + .Select(mode => new ModeFormationDTO { Id = mode.IdModeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + StatutFormationDTO statutPlanifie = epContext.StatutFormation.Where(mode => mode.IdStatutFormation == idStatut) + .Select(mode => new StatutFormationDTO { Id = mode.IdStatutFormation, Libelle = mode.Libelle }).FirstOrDefault(); + TypeFormationDTO typeELearning = epContext.TypeFormation.Where(mode => mode.IdTypeFormation == idType) + .Select(mode => new TypeFormationDTO { Id = mode.IdTypeFormation, Libelle = mode.Libelle }).FirstOrDefault(); + OrigineFormationDTO origineFormationCollaborateur = epContext.OrigineFormation.Where(mode => mode.IdOrigineFormation == idOrigine) + .Select(mode => new OrigineFormationDTO { Id = mode.IdOrigineFormation, Libelle = mode.Libelle }).FirstOrDefault(); + + FormationService formationService = new FormationService(epContext, collaborateurService); + + FormationDTO formation = new FormationDTO + { + Id = idFormation, + Intitule = intitule, + IdAgence = idAgence, + DateDebut = dateDebut, + DateFin = dateFin, + Heure = 2, + Jour = 1, + Mode = modeExterne, + Type = typeELearning, + Organisme = organisme, + Origine = origineFormationCollaborateur, + Statut = statutPlanifie, + EstCertifiee = false + }; + + // Act + AsyncTestDelegate throwException = () => formationService.UpdateFormationAsync(idFormation, formation); + + // Assert + Assert.ThrowsAsync(typeof(FormationNotFoundException), throwException); + } + + + #endregion + */ + + } +} \ No newline at end of file diff --git a/EPAServeur/Context/DataSeeder.cs b/EPAServeur/Context/DataSeeder.cs index d7e8238..0e4c686 100644 --- a/EPAServeur/Context/DataSeeder.cs +++ b/EPAServeur/Context/DataSeeder.cs @@ -1253,10 +1253,10 @@ namespace EPAServeur.Context // Participation formation - ParticipationFormation p1, p2, p3, p4; + //ParticipationFormation p1, p2, p3, p4; ParticipationFormation p5, p6, p7, p8; - ParticipationFormation p9, p10, p11, p12; - + //ParticipationFormation p9, p10, p11, p12; + /* p1 = new ParticipationFormation { @@ -1301,13 +1301,12 @@ namespace EPAServeur.Context Formation = f3 }; epContext.ParticipationFormation.Add(p4); - + */ p5 = new ParticipationFormation { IdParticipationFormation = 5, DateCreation = new DateTime(2020, 5, 25, 9, 0, 0), EstEvaluee = false, - IdDemandeFormation = d5.IdDemandeFormation, DemandeFormation = d5, Formation = f3 }; @@ -1318,7 +1317,6 @@ namespace EPAServeur.Context IdParticipationFormation = 6, DateCreation = new DateTime(2020, 6, 25, 9, 0, 0), EstEvaluee = false, - IdDemandeFormation = d6.IdDemandeFormation, DemandeFormation = d6, Formation = f4 }; @@ -1329,7 +1327,6 @@ namespace EPAServeur.Context IdParticipationFormation = 7, DateCreation = new DateTime(2020, 7, 25, 9, 0, 0), EstEvaluee = false, - IdDemandeFormation = d7.IdDemandeFormation, DemandeFormation = d7, Formation = f4 }; @@ -1340,12 +1337,11 @@ namespace EPAServeur.Context IdParticipationFormation = 8, DateCreation = new DateTime(2020, 8, 25, 9, 0, 0), EstEvaluee = false, - IdDemandeFormation = d8.IdDemandeFormation, DemandeFormation = d8, Formation = f5 }; epContext.ParticipationFormation.Add(p8); - + /* p9 = new ParticipationFormation { IdParticipationFormation = 9, @@ -1390,7 +1386,7 @@ namespace EPAServeur.Context }; epContext.ParticipationFormation.Add(p12); - + */ epContext.SaveChanges(); } diff --git a/EPAServeur/Context/EpContext.cs b/EPAServeur/Context/EpContext.cs index 2378b40..104fdde 100644 --- a/EPAServeur/Context/EpContext.cs +++ b/EPAServeur/Context/EpContext.cs @@ -154,6 +154,8 @@ namespace EPAServeur.Context { entity.HasKey(e => e.IdDemandeFormation); entity.Property(e => e.IdDemandeFormation).ValueGeneratedOnAdd(); + entity.HasOne(e => e.ParticipationFormation).WithOne(e => e.DemandeFormation).HasForeignKey(d => d.IdParticipationFormation); + }); modelBuilder.Entity(entity => @@ -189,8 +191,6 @@ namespace EPAServeur.Context entity.HasKey(e => e.IdParticipationFormation); entity.Property(e => e.IdParticipationFormation).ValueGeneratedOnAdd(); entity.HasMany(e => e.Evaluation).WithOne(e => e.ParticipationFormation); - entity.HasOne(e => e.DemandeFormation).WithOne(a => a.ParticipationFormation).HasForeignKey(a => a.IdDemandeFormation); - }); modelBuilder.Entity(entity => diff --git a/EPAServeur/Controllers/ParticipationsFormationsApi.cs b/EPAServeur/Controllers/ParticipationsFormationsApi.cs index 446cf7e..b581060 100644 --- a/EPAServeur/Controllers/ParticipationsFormationsApi.cs +++ b/EPAServeur/Controllers/ParticipationsFormationsApi.cs @@ -18,6 +18,14 @@ using IO.Swagger.Attributes; using IO.Swagger.Security; using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; +using EPAServeur.IServices; +using Microsoft.Extensions.Logging; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using System.Threading.Tasks; +using EPAServeur.Exceptions; +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; namespace IO.Swagger.Controllers { @@ -26,7 +34,18 @@ namespace IO.Swagger.Controllers /// [ApiController] public class ParticipationsFormationsApiController : ControllerBase - { + { + private readonly IParticipationFormationService participationFormationService; + private readonly ILogger logger; + private readonly IWebHostEnvironment env; + + public ParticipationsFormationsApiController(IParticipationFormationService _participationFormationService, ILogger _logger, IWebHostEnvironment _env) + { + participationFormationService = _participationFormationService; + logger = _logger; + env = _env; + } + /// /// /// @@ -41,7 +60,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpPut] [Route("/api/participationsformation/{idParticipationFormation}/evaluation")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("EvaluerFormation")] [SwaggerResponse(statusCode: 200, type: typeof(EvaluationDTO), description: "Evaluation envoyĂ©e avec succès")] @@ -50,32 +69,95 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "La ressource n'a pas Ă©tĂ© trouvĂ©e")] [SwaggerResponse(statusCode: 415, type: typeof(ErreurDTO), description: "L’opĂ©ration ne peut pas ĂŞtre effectuĂ©e car certaines donnĂ©es sont manquantes")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult EvaluerFormation([FromBody]EvaluationDTO body, [FromRoute][Required]long? idParticipationFormation) - { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(200, default(EvaluationDTO)); - - //TODO: Uncomment the next line to return response 401 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(401, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(403, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 404 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(404, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 415 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(415, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "{\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 0,\n \"estCertifiee\" : true,\n \"intitule\" : \"intitule\",\n \"saisies\" : [ {\n \"note\" : 6,\n \"texte\" : \"texte\",\n \"id\" : \"id\",\n \"champ\" : {\n \"ordre\" : 6,\n \"texte\" : \"texte\",\n \"section\" : \"section\",\n \"soussection\" : \"soussection\",\n \"id\" : 3,\n \"typeSaisie\" : \"Commentaire\"\n }\n }, {\n \"note\" : 6,\n \"texte\" : \"texte\",\n \"id\" : \"id\",\n \"champ\" : {\n \"ordre\" : 6,\n \"texte\" : \"texte\",\n \"section\" : \"section\",\n \"soussection\" : \"soussection\",\n \"id\" : 3,\n \"typeSaisie\" : \"Commentaire\"\n }\n } ]\n}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(EvaluationDTO); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task EvaluerFormation([FromBody]EvaluationDTO body, [FromRoute][Required]long idParticipationFormation) + { + if (env.IsDevelopment()) + logger.LogInformation("Mise Ă  jour de la participation Ă  la formation d'id {idParticipationFormation}.", idParticipationFormation); + + try + { + body = await participationFormationService.EvaluerFormationAsync(idParticipationFormation, body); + } + catch (ParticipationFormationIncompatibleIdException e) + { + if (env.IsDevelopment()) + logger.LogInformation(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status415UnsupportedMediaType, + Message = e.Message, + }; + + return StatusCode(erreur.Code.Value, erreur.Message); + } + catch (ParticipationFormationInvalidException e) + { + if (env.IsDevelopment()) + logger.LogInformation(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status415UnsupportedMediaType, + Message = e.Message, + }; + + return StatusCode(erreur.Code.Value, erreur.Message); + } + catch (ParticipationFormationNotFoundException e) + { + if (env.IsDevelopment()) + logger.LogInformation(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status404NotFound, + Message = e.Message + }; + + return NotFound(erreur); + } + catch (DbUpdateConcurrencyException e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = string.Format("La participation Ă  la formation {0} n'a pas pu ĂŞtre mise Ă  jour car elle est prise par une autre ressource.", idParticipationFormation) + }; + + return StatusCode(erreur.Code.Value, erreur); + } + catch (DbUpdateException e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur est survenue sur le serveur lors de la mise Ă  jour de la participation Ă  la formation." + }; + + return StatusCode(erreur.Code.Value, erreur); + } + catch (Exception e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur inconnue est survenue sur le serveur." + }; + + return StatusCode(erreur.Code.Value, erreur); + } + + if (env.IsDevelopment()) + logger.LogInformation("Update effectuĂ© avec succès"); + + return Ok(body); } /// @@ -90,7 +172,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/participationsformation/{idParticipationFormation}/evaluation")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetEvaluationCollaborateur")] [SwaggerResponse(statusCode: 200, type: typeof(EvaluationDTO), description: "OK")] @@ -98,29 +180,47 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "L’utilisateur souhaitant accĂ©der Ă  la ressource n’a pas les droits d’accès suffisants")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "La ressource n'a pas Ă©tĂ© trouvĂ©e")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetEvaluationCollaborateur([FromRoute][Required]long? idParticipationFormation) - { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(200, default(EvaluationDTO)); - - //TODO: Uncomment the next line to return response 401 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(401, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(403, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 404 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(404, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "{\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 0,\n \"estCertifiee\" : true,\n \"intitule\" : \"intitule\",\n \"saisies\" : [ {\n \"note\" : 6,\n \"texte\" : \"texte\",\n \"id\" : \"id\",\n \"champ\" : {\n \"ordre\" : 6,\n \"texte\" : \"texte\",\n \"section\" : \"section\",\n \"soussection\" : \"soussection\",\n \"id\" : 3,\n \"typeSaisie\" : \"Commentaire\"\n }\n }, {\n \"note\" : 6,\n \"texte\" : \"texte\",\n \"id\" : \"id\",\n \"champ\" : {\n \"ordre\" : 6,\n \"texte\" : \"texte\",\n \"section\" : \"section\",\n \"soussection\" : \"soussection\",\n \"id\" : 3,\n \"typeSaisie\" : \"Commentaire\"\n }\n } ]\n}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(EvaluationDTO); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task GetEvaluationCollaborateur([FromRoute][Required]long idParticipationFormation) + { + if (env.IsDevelopment()) + logger.LogInformation("RĂ©cupĂ©ration de la participation Ă  la formation {idParticipationFormation}.", idParticipationFormation); + + EvaluationDTO evaluationDTO; + + try + { + evaluationDTO = await participationFormationService.GetEvaluationCollaborateurAsync(idParticipationFormation); + } + catch (ParticipationFormationNotFoundException e) + { + if (env.IsDevelopment()) + logger.LogInformation(e.Message); + + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = StatusCodes.Status404NotFound, + Message = e.Message + }; + + return NotFound(erreurDTO); + } + catch (Exception e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur inconnue est survenue sur le serveur." + }; + + return StatusCode(erreur.Code.Value, erreur); + } + + if (env.IsDevelopment()) + logger.LogInformation("Participation Ă  la formation {idParticipationFormation} rĂ©cupĂ©rĂ©e.", idParticipationFormation); + + return Ok(evaluationDTO); } /// @@ -128,11 +228,6 @@ namespace IO.Swagger.Controllers /// /// RĂ©cupĂ©rer la liste des participations de formation d’un collaborateur. /// Id du collaborateur - /// Indique si les donnĂ©es sont rĂ©cupĂ©rĂ©es dans l'ordre croissant ou non - /// NumĂ©ro de la page du tableau Ă  afficher - /// Nombre d’élĂ©ment maximum Ă  afficher dans le tableau - /// Texte permettant de filtrer les donnĂ©es - /// Colonne du tableau sur lequel le tri devra ĂŞtre effectuĂ© /// OK /// L'utilisateur souhaitant accĂ©der Ă  la ressource n'est pas authentifiĂ© /// L’utilisateur souhaitant accĂ©der Ă  la ressource n’a pas les droits d’accès suffisants @@ -140,7 +235,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/participationsformation/{idCollaborateur}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetParticipationByCollaborateur")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] @@ -148,29 +243,34 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "L’utilisateur souhaitant accĂ©der Ă  la ressource n’a pas les droits d’accès suffisants")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "La ressource n'a pas Ă©tĂ© trouvĂ©e")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetParticipationByCollaborateur([FromRoute][Required]Guid? idCollaborateur, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) - { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(200, default(List)); - - //TODO: Uncomment the next line to return response 401 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(401, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(403, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 404 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(404, default(ErreurDTO)); - - //TODO: Uncomment the next line to return response 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "[ {\n \"estEvaluee\" : true,\n \"dateCreation\" : \"2000-01-23T04:56:07.000+00:00\",\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 7,\n \"intitule\" : \"intitule\"\n}, {\n \"estEvaluee\" : true,\n \"dateCreation\" : \"2000-01-23T04:56:07.000+00:00\",\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 7,\n \"intitule\" : \"intitule\"\n} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task GetParticipationByCollaborateur([FromRoute][Required]Guid idCollaborateur) + { + if (env.IsDevelopment()) + logger.LogInformation("RĂ©cupĂ©ration de la liste des particicaptions aux formations d'un collaborateur."); + + IEnumerable participationFormationDTOs; + + try + { + participationFormationDTOs = await participationFormationService.GetParticipationByCollaborateurAsync(idCollaborateur); + } + catch (Exception e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur inconnue est survenue sur le serveur." + }; + + return StatusCode(erreur.Code.Value, erreur); + } + + if (env.IsDevelopment()) + logger.LogInformation("Liste des particicaptions aux formations d'un collaborateur rĂ©cupĂ©rĂ©e."); + + return Ok(participationFormationDTOs); } } } diff --git a/EPAServeur/DTO/EvaluationDTO.cs b/EPAServeur/DTO/EvaluationDTO.cs index 697ead2..9a7d430 100644 --- a/EPAServeur/DTO/EvaluationDTO.cs +++ b/EPAServeur/DTO/EvaluationDTO.cs @@ -17,6 +17,7 @@ using System.Collections.ObjectModel; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; using Newtonsoft.Json; +using EPAServeur.Attributes; namespace IO.Swagger.DTO { @@ -61,7 +62,7 @@ namespace IO.Swagger.DTO /// /// Gets or Sets Saisies /// - [Required] + [CannotBeEmpty] [DataMember(Name="saisies")] public List Saisies { get; set; } diff --git a/EPAServeur/DTO/SaisieDTO.cs b/EPAServeur/DTO/SaisieDTO.cs index 2e0af93..06777ec 100644 --- a/EPAServeur/DTO/SaisieDTO.cs +++ b/EPAServeur/DTO/SaisieDTO.cs @@ -33,12 +33,13 @@ namespace IO.Swagger.DTO /// Id de la saisie [Required] [DataMember(Name="id")] - public string Id { get; set; } + public long? Id { get; set; } /// /// Note saisie /// /// Note saisie + [Required] [DataMember(Name="note")] public int? Note { get; set; } @@ -61,7 +62,7 @@ namespace IO.Swagger.DTO /// [Required] [DataMember(Name="typeSaisie")] - public TypeEp TypeSaisie { get; set; } + public TypeSaisie TypeSaisie { get; set; } /// /// Returns the string presentation of the object diff --git a/EPAServeur/Exceptions/ParticipationFormationIncompatibleIdException.cs b/EPAServeur/Exceptions/ParticipationFormationIncompatibleIdException.cs new file mode 100644 index 0000000..f29f788 --- /dev/null +++ b/EPAServeur/Exceptions/ParticipationFormationIncompatibleIdException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception qui est levĂ©e lorsque l'id de la participation Ă  une formation avec les donnĂ©es Ă  mettre Ă  jour et l'id de la participation Ă  une formation dans la base de donnĂ©es sont diffĂ©rents + /// + public class ParticipationFormationIncompatibleIdException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public ParticipationFormationIncompatibleIdException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public ParticipationFormationIncompatibleIdException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public ParticipationFormationIncompatibleIdException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/EPAServeur/Exceptions/ParticipationFormationInvalidException.cs b/EPAServeur/Exceptions/ParticipationFormationInvalidException.cs new file mode 100644 index 0000000..3dde66b --- /dev/null +++ b/EPAServeur/Exceptions/ParticipationFormationInvalidException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception qui est levĂ©e lorsqu'une participation formation est invalide + /// + public class ParticipationFormationInvalidException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public ParticipationFormationInvalidException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public ParticipationFormationInvalidException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public ParticipationFormationInvalidException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/EPAServeur/Exceptions/ParticipationFormationNotFoundException.cs b/EPAServeur/Exceptions/ParticipationFormationNotFoundException.cs new file mode 100644 index 0000000..96bbaaf --- /dev/null +++ b/EPAServeur/Exceptions/ParticipationFormationNotFoundException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception qui est levĂ©e lorsqu'une participation Ă  une formation n'a pas Ă©tĂ© trouvĂ©e + /// + public class ParticipationFormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public ParticipationFormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public ParticipationFormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public ParticipationFormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/EPAServeur/IServices/IParticipationFormationService.cs b/EPAServeur/IServices/IParticipationFormationService.cs new file mode 100644 index 0000000..8201d23 --- /dev/null +++ b/EPAServeur/IServices/IParticipationFormationService.cs @@ -0,0 +1,17 @@ +using EPAServeur.Context; +using IO.Swagger.DTO; +using IO.Swagger.ModelCollaborateur; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.IServices +{ + public interface IParticipationFormationService + { + Task GetEvaluationCollaborateurAsync(long idParticipationFormation); + Task> GetParticipationByCollaborateurAsync(Guid idCollaborateur); + Task EvaluerFormationAsync(long idParticipationFormation, EvaluationDTO evaluationDTO); + } +} diff --git a/EPAServeur/Models/Formation/ParticipationFormation.cs b/EPAServeur/Models/Formation/ParticipationFormation.cs index b6ebea3..56bfeac 100644 --- a/EPAServeur/Models/Formation/ParticipationFormation.cs +++ b/EPAServeur/Models/Formation/ParticipationFormation.cs @@ -26,11 +26,6 @@ namespace EPAServeur.Models.Formation /// public bool EstEvaluee { get; set; } - /// - /// Id de la demande de formation - /// - public long IdDemandeFormation { get; set; } - /// /// Demande de formation qui est liĂ© Ă  la participation d’un collaborateur Ă  une formation /// diff --git a/EPAServeur/Models/SaisieChamp/Champ.cs b/EPAServeur/Models/SaisieChamp/Champ.cs index 7aefee3..b728f21 100644 --- a/EPAServeur/Models/SaisieChamp/Champ.cs +++ b/EPAServeur/Models/SaisieChamp/Champ.cs @@ -34,7 +34,7 @@ namespace EPAServeur.Models.SaisieChamp /// /// Ordre du champ dans sa section ou sa sous-section /// - public long Ordre { get; set; } + public int Ordre { get; set; } /// /// Type du champ correspondant au Type du document si c’est un champ un EP ou Ă  l’évaluation sinon diff --git a/EPAServeur/Services/ParticipationFormationService.cs b/EPAServeur/Services/ParticipationFormationService.cs new file mode 100644 index 0000000..6eb1323 --- /dev/null +++ b/EPAServeur/Services/ParticipationFormationService.cs @@ -0,0 +1,370 @@ +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; + + #endregion + + #region Contructeurs + + /// + /// Constructeur de la classe FormationService + /// + /// + public ParticipationFormationService(EpContext _epContext, ICollaborateurService _collaborateurService) + { + epContext = _epContext; + collaborateurService = _collaborateurService; + } + + #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 GetEvaluationDTO(participationFormation); + } + + /// + /// RĂ©cupĂ©rer la liste des participations de formation d’un collaborateur. + /// + /// Id du collaborateur + /// + public async Task> GetParticipationByCollaborateurAsync(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 GetCollaborateurDTOs(participationFormations); + + participationFormationDTOs = participationFormations.Select(participationFormation => 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; + + 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."); + + IsEvaluationValide(evaluationDTO); + + participationFormation = await epContext.ParticipationFormation.Include(p => p.Evaluation) + .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 => GetSaisie(s)).ToList(); + participationFormation.EstEvaluee = true; + + await epContext.SaveChangesAsync(); + + return 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.EstCertifie.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)) + throw new ParticipationFormationInvalidException("Toutes les saisies doivent possĂ©der une note."); + } + + #region Object to DTO + + /// + /// RĂ©cuperer un objet ParticipationFormationDTO en fonction d'un objet ParticipationFormation et d'une liste de CollaborateurDTO + /// + /// + /// + private ParticipationFormationDTO GetParticipationFormationDTO(ParticipationFormation participationFormation, IEnumerable collaborateurDTOs) + { + ParticipationFormationDTO participationFormationDTO = new ParticipationFormationDTO() + { + Id = participationFormation.IdParticipationFormation, + DateCreation = participationFormation.DateCreation, + Intitule = participationFormation.Formation.Intitule, + DateDebut = participationFormation.Formation.DateDebut, + Statut = GetStatutFormationDTO(participationFormation.Formation.Statut), + Collaborateur = GetCollaborateurDTO(participationFormation, collaborateurDTOs), + Ep = GetEpInformationDTO(participationFormation.DemandeFormation.Ep, collaborateurDTOs) + }; + + return participationFormationDTO; + } + + + /// + /// RĂ©cuperer un objet EvaluationDTO en fonction d'un objet ParticipationFormation + /// + /// + /// + private EvaluationDTO GetEvaluationDTO(ParticipationFormation participationFormation) + { + EvaluationDTO evaluationDTO = new EvaluationDTO() + { + Id = participationFormation.IdParticipationFormation, + Intitule = participationFormation.Formation.Intitule, + DateDebut = participationFormation.Formation.DateDebut, + EstCertifie = participationFormation.Formation.EstCertifiee, + Saisies = participationFormation.Evaluation.Select(s => GetSaisieDTO(s)).ToList() + }; + + return evaluationDTO; + } + + /// + /// RĂ©cuperer un objet SaisieDTO en fonction d'un objet Saisie + /// + /// + /// + private SaisieDTO GetSaisieDTO(Saisie saisie) + { + if (saisie == null) + return null; + + SaisieDTO saisieDTO = new SaisieDTO() + { + Id = saisie.IdSaisie, + Note = saisie.Note, + Texte = saisie.Texte, + Champ = GetChampDTO(saisie.Champ), + TypeSaisie = saisie.TypeSaisie + }; + return saisieDTO; + } + + /// + /// RĂ©cuperer un objet ChampDTO en fonction d'un objet Champ + /// + /// + /// + private ChampDTO GetChampDTO(Champ champ) + { + if (champ == null) + return null; + + ChampDTO champDTO = new ChampDTO() + { + Id = champ.IdChamp, + Texte = champ.Texte, + Section = champ.Section, + Soussection = champ.SousSection, + Ordre = champ.Ordre, + TypeChamp = champ.TypeChamp, + TypeSaisie = champ.TypeSaisie + }; + return champDTO; + } + + /// + /// RĂ©cuperer un objet StatutFormationDTO en fonction d'un objet StatutFormation + /// + /// + /// + private StatutFormationDTO GetStatutFormationDTO(StatutFormation statutFormation) + { + if (statutFormation == null) + return null; + StatutFormationDTO statutFormationDTO = new StatutFormationDTO() + { + Id = statutFormation.IdStatutFormation, + Libelle = statutFormation.Libelle + }; + return statutFormationDTO; + } + + /// + /// RĂ©cuperer une liste de CollaborateurDTO contenant les collaborateurs et les rĂ©fĂ©rents. Retourne null s'il n'y a aucune participation. + /// + /// + /// + private async Task> GetCollaborateurDTOs(IEnumerable participationsFormation) + { + if (!participationsFormation.Any()) + return null; + + List guids = participationsFormation.SelectMany(participationFormation => new[] { (Guid?)participationFormation.DemandeFormation.Ep.IdCollaborateur, participationFormation.DemandeFormation.Ep.IdReferent }).ToList(); + + return await collaborateurService.GetCollaborateurDTOsAsync(guids); ; + } + + /// + /// RĂ©cupère un objet CollaborateurDTO en fonction d'un objet ParticipationFormation et d'une liste de CollaborateurDTO + /// + /// + /// + private CollaborateurDTO GetCollaborateurDTO(ParticipationFormation participationFormation, IEnumerable collaborateurDTOs) + { + return collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == participationFormation.DemandeFormation.Ep.IdCollaborateur); + } + + /// + /// RĂ©cupère un objet EpInformationDTO en fonction d'un objet Ep et d'une liste de CollaborateurDTO + /// + /// + /// + private EpInformationDTO GetEpInformationDTO(Ep ep, IEnumerable collaborateurDTOs) + { + CollaborateurDTO collaborateur; + CollaborateurDTO referent; + + + collaborateur = collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == ep.IdCollaborateur); + referent = collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == ep.IdReferent); + + EpInformationDTO epInformationDTO = new EpInformationDTO() + { + Id = ep.IdEP, + Type = ep.TypeEP, + Statut = ep.Statut, + DateDisponibilite = ep.DateDisponibilite, + DatePrevisionnelle = ep.DatePrevisionnelle, + Obligatoire = ep.Obligatoire, + Collaborateur = collaborateur, + Referent = referent, + }; + + return epInformationDTO; + } + + #endregion + + #region DTO to Object + + /// + /// RĂ©cuperer un objet Saisie en fonction d'un objet SaisieDTO + /// + /// + /// + private Saisie GetSaisie(SaisieDTO saisieDTO) + { + Saisie saisie = new Saisie() + { + IdSaisie = saisieDTO.Id.Value, + Note = saisieDTO.Note, + Texte = saisieDTO.Texte, + Champ = GetChamp(saisieDTO.Champ), + TypeSaisie = saisieDTO.TypeSaisie + }; + return saisie; + } + + /// + /// RĂ©cuperer un objet Champ en fonction d'un objet ChampDTO + /// + /// + /// + private Champ GetChamp(ChampDTO champDTO) + { + Champ champ = new Champ() + { + IdChamp = champDTO.Id.Value, + Texte = champDTO.Texte, + Section = champDTO.Section, + SousSection = champDTO.Soussection, + Ordre = champDTO.Ordre.Value, + TypeChamp = champDTO.TypeChamp, + TypeSaisie = champDTO.TypeSaisie + }; + return champ; + } + + #endregion + + #endregion + + } +} diff --git a/EPAServeur/Startup.cs b/EPAServeur/Startup.cs index 6d02a6a..8cb5efc 100644 --- a/EPAServeur/Startup.cs +++ b/EPAServeur/Startup.cs @@ -125,6 +125,7 @@ namespace EPAServeur services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped();