diff --git a/EPAServeur.Tests/Controllers/DemandeFormationApiTests.cs b/EPAServeur.Tests/Controllers/DemandeFormationApiTests.cs new file mode 100644 index 0000000..37f1911 --- /dev/null +++ b/EPAServeur.Tests/Controllers/DemandeFormationApiTests.cs @@ -0,0 +1,637 @@ +using EPAServeur.Context; +using EPAServeur.Exceptions; +using EPAServeur.Models.Formation; +using EPAServeur.Services; +using IO.Swagger.Controllers; +using IO.Swagger.DTO; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.DependencyInjection; +using EPAServeur.IServices; +using Moq; +using IO.Swagger.ApiCollaborateur; +using IO.Swagger.Enum; + +namespace EPAServeur.Tests.Controllers +{ + [TestFixture] + public class DemandeFormationApiTests + { + #region Variables + + private IDemandeFormationService demandeFormationService; + private Mock mockEnvironment; + private EpContext epContext; + #endregion + + #region Setup + + [SetUp] + public void Setup() + { + // Création d'une collection de services pour l'injection de dépendance + var services = new ServiceCollection(); + + // Utilisation d'une base de données en mémoire + var optionBuider = new DbContextOptionsBuilder() + .UseInMemoryDatabase("server_ep_test") + .Options; + + services.AddDbContext(b => b.UseInMemoryDatabase("server_ep_test")); + + epContext = new EpContext(optionBuider); + + 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; + } + + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + // Récupère le service qui sera utilsé pour tester le contrôleur + var serviceProvider = services.BuildServiceProvider(); + demandeFormationService = serviceProvider.GetService(); + + // Simule l'interface IWebHostEnvironment avec Moq + mockEnvironment = new Mock(); + + mockEnvironment + .Setup(m => m.EnvironmentName) + .Returns("Development"); + + } + + #endregion + + #region Tests GetDemandesFormation + + [Test] + public void GetDemandesFormation_PasseDesParamsPresentsDansLaBDD_RetourneUnObjetOkResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + + // Act + var okResult = DemandesFormationApiController.GetDemandesFormation(null, null, null, null, null, null, null, null, null, null); + + // Assert + Assert.IsInstanceOf(okResult.Result); + } + + [Test] + public void GetDemandesFormation_PasseDesParamsPresentsDansLaBDD_RetourneLesCinqPremieresDemandesDeFormations() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + int nbDemandeFormation = 5; + int idFirstDemandeFormation = 1; + int idLastDemandeFormation = 3; + + // Act + var okResult = DemandesFormationApiController.GetDemandesFormation(null, null, null, null, 1, 5, null, null, null, null).Result as OkObjectResult; + + // Assert + Assert.IsInstanceOf>(okResult.Value); + Assert.AreEqual(nbDemandeFormation, (okResult.Value as IEnumerable).Count()); + Assert.AreEqual(idFirstDemandeFormation, (okResult.Value as IEnumerable).First().Id); + Assert.AreEqual(idLastDemandeFormation, (okResult.Value as IEnumerable).Last().Id); + } + + #endregion + + #region Tests GetDemandesFormationCount + + [Test] + public void GetDemandesFormationCount_PasseDesParamsPresentsDansLaBDD_RetourneUnObjetOkResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + + // Act + var okResult = DemandesFormationApiController.GetDemandesFormationCount(null, null, null, null, null, null); + + // Assert + Assert.IsInstanceOf(okResult.Result); + } + + [Test] + public void GetDemandesFormationCount_PasseDesParamsPresentsDansLaBDD_RetourneLeBonNombreDeDemandeDeFormation() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + int nbDemandeFormation = 12; + + // Act + var okResult = DemandesFormationApiController.GetDemandesFormationCount(null, null, null, null, null, null).Result as OkObjectResult; + + // Assert + Assert.IsInstanceOf(okResult.Value); + Assert.AreEqual(nbDemandeFormation, (long)okResult.Value); + } + + #endregion + + #region Tests GetOriginesDemandeFormation + + [Test] + public void GetOriginesDemandeFormation_RetourneUnObjetOkResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + + // Act + var okResult = DemandesFormationApiController.GetOriginesDemandeFormation(); + + // Assert + Assert.IsInstanceOf(okResult.Result); + } + + [Test] + public void GetOriginesDemandeFormation_RetourneToutesLesOriginesDeDemande() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + int nbOrigineDemande = 5; + // Act + var okResult = DemandesFormationApiController.GetOriginesDemandeFormation().Result as OkObjectResult; + + // Assert + Assert.IsInstanceOf>(okResult.Value); + Assert.AreEqual(nbOrigineDemande, (okResult.Value as IEnumerable).Count()); + } + + #endregion + + #region Tests AddDemandeFormation + + [Test] + public void AddDemandeFormation_AjouteUneDemandeDeFormationAvecUnCollaborateurNull_RetourneUnObjetObjectResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = null; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + // Act + var objectResult = DemandesFormationApiController.AddDemandeFormation(demandeFormation); + + // Assert + Assert.IsInstanceOf(objectResult.Result); + } + + [Test] + public void AddDemandeFormation_AjouteUneDemandeDeFormationValide_RetourneUnObjetCreatedResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + // Act + var createdResult = DemandesFormationApiController.AddDemandeFormation(demandeFormation); + + // Assert + Assert.IsInstanceOf(createdResult.Result); + } + + [Test] + public void AddDemandeFormation_AjouteUneDemandeDeFormationValide_RetourneLaDemandeDeFormationCreee() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + // Act + var createdResult = DemandesFormationApiController.AddDemandeFormation(demandeFormation).Result as CreatedResult; + + // Assert + Assert.IsInstanceOf(createdResult.Value); + Assert.AreEqual("Formation React", (createdResult.Value as DemandeFormationDTO).Libelle); + } + + #endregion + + #region Tests UpdateDemandeFormation + + [Test] + public async Task UpdateDemandeFormation_AccepteUneDemandeAvecUneFormationNull_RetourneUnObjetObjectResultDansCatchDemandeFormationInvalidException() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 3; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = null; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + // Act + var objectResult = DemandesFormationApiController.UpdateDemandeFormation(demandeFormation, idDemandeFormation); + + // Assert + Assert.IsInstanceOf(objectResult.Result); + } + + [Test] + public async Task UpdateDemandeFormation_AccepteUneDemandeAvecUnIdDemandeFormationNull_RetourneUnObjetObjectResultDansCatchDemandeFormationIncompatibleIdException() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 1; + long? idDemandeFormationIncorrecte = null; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormationIncorrecte, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + // Act + var objectResult = DemandesFormationApiController.UpdateDemandeFormation(demandeFormation, idDemandeFormation); + + // Assert + Assert.IsInstanceOf(objectResult.Result); + } + + [Test] + public async Task UpdateDemandeFormation_AccepteUneDemandeInexistante_RetourneUnObjetObjectResultDansCatchDemandeFormationNotFoundExceptionn() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 0; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + // Act + var objectResult = DemandesFormationApiController.UpdateDemandeFormation(demandeFormation, idDemandeFormation); + + // Assert + Assert.IsInstanceOf(objectResult.Result); + } + + [Test] + public async Task UpdateDemandeFormation_AccepteUneDemandeDeDemandeFormation_RetourneUnObjetOkObjectResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 1; + int nbParticipant = 0; + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 1, + Intitule = "Formation Mainframe Complète", + DateDebut = new DateTime(2020, 1, 25, 10, 0, 0), + DateFin = new DateTime(2020, 1, 27), + Organisme = "Organisme1", + Origine = new OrigineFormationDTO { Id = 2, Libelle = "Exigence client" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = false, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation Cobol", + Description = "Demande de formation Cobol avec Mainframe", + DemandeRH = false, + DateDemande = new DateTime(2020, 1, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + Formation = formation, + }; + + // Act + var okObjectResult = DemandesFormationApiController.UpdateDemandeFormation(demandeFormation, idDemandeFormation); + + // Assert + Assert.IsInstanceOf(okObjectResult.Result); + } + + [Test] + public async Task UpdateDemandeFormation_AccepteUneDemandeDeDemandeFormation_RetourneLaDemandeDeFormationAcceptee() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 1; + int nbParticipant = 0; + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 1, + Intitule = "Formation Mainframe Complète", + DateDebut = new DateTime(2020, 1, 25, 10, 0, 0), + DateFin = new DateTime(2020, 1, 27), + Organisme = "Organisme1", + Origine = new OrigineFormationDTO { Id = 2, Libelle = "Exigence client" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = false, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation Cobol", + Description = "Demande de formation Cobol avec Mainframe", + DemandeRH = false, + DateDemande = new DateTime(2020, 1, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + Formation = formation, + }; + + // Act + var okObjectResult = DemandesFormationApiController.UpdateDemandeFormation(demandeFormation, idDemandeFormation).Result as OkObjectResult; + + // Assert + Assert.IsInstanceOf(okObjectResult.Value); + Assert.AreEqual("Formation Cobol", (okObjectResult.Value as DemandeFormationDTO).Libelle); + } + + #endregion + + #region Tests DeleteDemandeFormation + + [Test] + public void DeleteDemandeFormation_SupprimeUneDemandeDeFormationInexistante_RetourneUnObjetNotFoundObjectResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 0; + + // Act + var notFoundObjectResult = DemandesFormationApiController.DeleteDemandeFormation(idDemandeFormation); + + // Assert + Assert.IsInstanceOf(notFoundObjectResult.Result); + } + + [Test] + public void DeleteDemandeFormation_SupprimeUneDemandeDeFormationConcernantUnEpSigne_RetourneUnObjetObjectResultDansCatchDemandeFormationInvalidException() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 2; + + // Act + var objectResult = DemandesFormationApiController.DeleteDemandeFormation(idDemandeFormation); + + // Assert + Assert.IsInstanceOf(objectResult.Result); + } + + [Test] + public void DeleteDemandeFormation_SupprimeUneDemandeDeFormation_RetourneUnObjetNoContentResult() + { + // Arrange + DemandesFormationApiController DemandesFormationApiController = new DemandesFormationApiController(demandeFormationService, new NullLogger(), mockEnvironment.Object); + long idDemandeFormation = 5; + + // Act + var noContentResult = DemandesFormationApiController.DeleteDemandeFormation(idDemandeFormation); + + // Assert + Assert.IsInstanceOf(noContentResult.Result); + } + #endregion + } +} \ No newline at end of file diff --git a/EPAServeur.Tests/Services/DemandeFormationServiceTests.cs b/EPAServeur.Tests/Services/DemandeFormationServiceTests.cs new file mode 100644 index 0000000..ca68862 --- /dev/null +++ b/EPAServeur.Tests/Services/DemandeFormationServiceTests.cs @@ -0,0 +1,1610 @@ +using EPAServeur.Context; +using EPAServeur.Exceptions; +using EPAServeur.IServices; +using EPAServeur.Models.EP; +using EPAServeur.Models.Formation; +using EPAServeur.Services; +using IO.Swagger.ApiCollaborateur; +using IO.Swagger.DTO; +using IO.Swagger.Enum; +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 DemandeFormationServiceTests + { + #region Variables + + private EpContext epContext; + private ICollaborateurApi collaborateurApi; + private ICollaborateurService collaborateurService; + private ITransformDTO transformDTO; + #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(); + transformDTO = new TransformDTO(); + collaborateurService = new CollaborateurService(collaborateurApi, epContext, transformDTO); + 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 GetDemandesFormationAsync + + [TestCase(new EtatDemande[] { EtatDemande.EnAttente, EtatDemande.Validee, EtatDemande.Rejetee }, new long[] { 1, 2 }, new StatutEp[] { StatutEp.Signe, StatutEp.SignatureReferent }, true, 1, 20, "gaillard", null, null, null)] + [TestCase(new EtatDemande[] { EtatDemande.EnAttente, EtatDemande.Validee, EtatDemande.Rejetee }, new long[] { 1 }, new StatutEp[] { StatutEp.Signe, StatutEp.SignatureReferent }, false, 1, 5, "gaillard", null, null, null)] + [TestCase(null, null, null, null, 2, 5, null, null, null, null)] + [TestCase(null, new long[] { 1 }, null, null, 1, 10, null, null, null, null)] + [TestCase(new EtatDemande[] { EtatDemande.Rejetee }, null, null, null, 1, 10, "gai", null, null, null)] + [TestCase(new EtatDemande[] { EtatDemande.EnAttente, EtatDemande.Validee, EtatDemande.Rejetee }, new long[] { }, new StatutEp[] { StatutEp.Signe, StatutEp.SignatureReferent }, null, 1, 50, "gai", null, null, null)] + public async Task GetDemandesFormationAsync_PasseDesParamsValides_RetourneDesDemandesDeFormations(EtatDemande[] arrEtatDemandes, long[] arrIdBUs, StatutEp[] arrStatutsEp, bool? asc, int? numPage, int? parPAge, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + List idBUs; + List etatDemandes; + List statutsEp; + + if (arrEtatDemandes != null) + etatDemandes = arrEtatDemandes.ToList(); + else + etatDemandes = null; + + if (arrIdBUs != null) + idBUs = arrIdBUs.Select(idBu => (long?)idBu).ToList(); + else + idBUs = null; + + if (arrStatutsEp != null) + statutsEp = arrStatutsEp.ToList(); + else + statutsEp = null; + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(etatDemandes, idBUs, statutsEp, asc, numPage, parPAge, texte, tri, dateDebut, dateFin); + + // Assert + Assert.Less(0, demandeFormationDTOs.Count()); + } + + [TestCase(1, 5)] + [TestCase(1, 10)] + public async Task GetDemandesFormationAsync_PasseEnParamNumPageEtParPage_RetourneLaPremierePageDesFormations(int? numPage, int? parPage) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, null, numPage, parPage, null, null, null, null); + + // Assert + Assert.AreEqual(parPage, demandeFormationDTOs.Count()); + } + + [TestCase(2, 5)] + [TestCase(2, 6)] + [TestCase(2, 10)] + [TestCase(2, 15)] + public async Task GetDemandesFormationAsync_PasseEnParamNumPageEtParPage_RetourneLaDeuxiemePageDesFormations(int? numPage, int? parPage) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + int nbDemandeFormationDeuxiemePage; + + switch (parPage) + { + case 5: + nbDemandeFormationDeuxiemePage = 5; + break; + case 6: + nbDemandeFormationDeuxiemePage = 6; + break; + case 10: + nbDemandeFormationDeuxiemePage = 2; + break; + default: + nbDemandeFormationDeuxiemePage = 0; + break; + } + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, null, numPage, parPage, null, null, null, null); + + // Assert + Assert.AreEqual(nbDemandeFormationDeuxiemePage, demandeFormationDTOs.Count()); + } + + [TestCase(true, "businessunit")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParBuCroissante(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual("Orléans", demandeFormationDTOs.First().Collaborateur.BusinessUnit.Nom); + Assert.AreEqual("Tours", demandeFormationDTOs.Last().Collaborateur.BusinessUnit.Nom); + } + + [TestCase(false, "businessunit")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParBuDecroissante(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual("Tours", demandeFormationDTOs.First().Collaborateur.BusinessUnit.Nom); + Assert.AreEqual("Orléans", demandeFormationDTOs.Last().Collaborateur.BusinessUnit.Nom); + + } + + [TestCase(true, "collaborateur")] + [TestCase(true, null)] + [TestCase(true, "toto")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParNomDuCollaborateurCroissant(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual("Gaillard", demandeFormationDTOs.First().Collaborateur.Nom); + Assert.AreEqual("Vasseur", demandeFormationDTOs.Last().Collaborateur.Nom); + + } + + [TestCase(false, "collaborateur")] + [TestCase(false, null)] + [TestCase(false, "toto")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParNomDuCollaborateurDecroissant(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual("Vasseur", demandeFormationDTOs.First().Collaborateur.Nom); + Assert.AreEqual("Gaillard", demandeFormationDTOs.Last().Collaborateur.Nom); + + } + + [TestCase(true, "datedemande")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParDateDemandeCroissante(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual(new DateTime(2020, 1, 22, 9, 0, 0), demandeFormationDTOs.First().DateDemande); + Assert.AreEqual(new DateTime(2020, 12, 22, 9, 0, 0), demandeFormationDTOs.Last().DateDemande); + } + + [TestCase(false, "datedemande")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParDateDemandeDecroissante(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual(new DateTime(2020, 12, 22, 9, 0, 0), demandeFormationDTOs.First().DateDemande); + Assert.AreEqual(new DateTime(2020, 1, 22, 9, 0, 0), demandeFormationDTOs.Last().DateDemande); + } + + [TestCase(true, "demanderh")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParDemandeRHCroissant(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.IsFalse(demandeFormationDTOs.First().DemandeRH); + Assert.IsTrue(demandeFormationDTOs.Last().DemandeRH); + } + + [TestCase(false, "demanderh")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParDemandeRHDecroissant(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.IsTrue(demandeFormationDTOs.First().DemandeRH); + Assert.IsFalse(demandeFormationDTOs.Last().DemandeRH); + } + + [TestCase(true, "etat")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParEtatCroissant(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual(EtatDemande.EnAttente, demandeFormationDTOs.First().EtatDemande); + Assert.AreEqual(EtatDemande.Rejetee, demandeFormationDTOs.Last().EtatDemande); + } + + [TestCase(false, "etat")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParEtatDecroissant(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual(EtatDemande.Rejetee, demandeFormationDTOs.First().EtatDemande); + Assert.AreEqual(EtatDemande.EnAttente, demandeFormationDTOs.Last().EtatDemande); + + } + + [TestCase(true, "datereponse")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParDateDerniereReponseCroissante(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.IsNull(demandeFormationDTOs.First().DateDerniereReponse); + Assert.AreEqual(new DateTime(2020, 12, 27, 9, 0, 0), demandeFormationDTOs.Last().DateDerniereReponse); + } + + [TestCase(false, "datereponse")] + public async Task GetDemandesFormationAsync_PasseEnParamAscEtTri_RetourneDesDemandesDeFormationsOrdonnanceeParDateDerniereReponseDecroissante(bool? asc, string tri) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, asc, null, null, null, tri, null, null); + + // Assert + Assert.AreEqual(new DateTime(2020, 12, 27, 9, 0, 0), demandeFormationDTOs.First().DateDerniereReponse); + Assert.IsNull(demandeFormationDTOs.Last().DateDerniereReponse); + } + + [TestCase("2020-06-19")] + public async Task GetDemandesFormationAsync_PasseEnParamUneDateDeDebut_RetourneDesDemandesDeFormationsAvecUneDateDeDebutSuperieur(DateTime dateDebut) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, null, null, null, null, null, dateDebut, null); + + // Assert + Assert.IsTrue(demandeFormationDTOs.Any(d => d.DateDemande >= dateDebut)); + } + + [TestCase("2020-05-01")] + public async Task GetDemandesFormationAsync_PasseEnParamUneDateDeFin_RetourneDesDemandesDeFormationsAvecUneDateDeFinInferieur(DateTime dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, null, null, null, null, null, null, dateFin); + + // Assert + Assert.IsTrue(demandeFormationDTOs.Any(d => d.DateDemande <= dateFin)); + } + + [TestCase("2020-10-01", "2020-12-01")] + public async Task GetDemandesFormationAsync_PasseEnParamUneDateDeDebutEtUneDateDeFin_RetourneDesDemandesDeFormationsAvecUneDateDeDebutSuperieurUneDateDeFinInferieur(DateTime dateDebut, DateTime dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, null, null, null, null, null, dateDebut, dateFin); + + // Assert + Assert.IsTrue(demandeFormationDTOs.Any(d => d.DateDemande >= dateDebut && d.DateDemande <= dateFin)); + } + + [TestCase("2020-11-01", "2020-10-01")] + public async Task GetDemandesFormationAsync_PasseEnParamUneDateDeDebutSuperieurEtUneDateDeFinInferieur_RetourneZeroDemandeDeFormation(DateTime dateDebut, DateTime dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, null, null, null, null, null, null, null, dateDebut, dateFin); + + // Assert + Assert.Zero(demandeFormationDTOs.Count()); + } + + [TestCase(new long[] { 1, 2 }, "azerty", null, null)] + [TestCase(new long[] { -1 }, "gaillard", null, null)] + [TestCase(null, null, "2021-11-01", null)] + [TestCase(null, null, null, "2019-11-01")] + public async Task GetDemandesFormationAsync_PasseDesParamsInvalides_RetourneZeroDemandeDeFormation(long[] arrIdBUs, string texte, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + List idBUs; + + if (arrIdBUs != null) + idBUs = arrIdBUs.Select(idBu => (long?)idBu).ToList(); + else + idBUs = null; + + // Act + IEnumerable demandeFormationDTOs = await demandeFormationService.GetDemandesFormationAsync(null, idBUs, null, null, null, null, texte, null, dateDebut, dateFin); + + // Assert + Assert.Zero(demandeFormationDTOs.Count()); + } + + + #endregion + + #region Tests GetDemandesFormationCountAsync + + [TestCase(new long[] { 1, 2 }, null, null, null)] + [TestCase(null, "gaillard", null, null)] + [TestCase(null, null, "2020-10-01", "2020-12-01")] + [TestCase(null, null, "2020-11-01", null)] + [TestCase(null, null, null, "2020-11-01")] + [TestCase(null, null, null, null)] + public async Task GetDemandesFormationCountAsync_PasseDesParamsValides_RetourneLeNombreTotalDeDemandesDeFormation(long[] arrIdBUs, string texte, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + List idBUs; + + if (arrIdBUs != null) + idBUs = arrIdBUs.Select(idBu => (long?)idBu).ToList(); + else + idBUs = null; + + // Act + long count = await demandeFormationService.GetDemandesFormationCountAsync(null, idBUs, null, texte, dateDebut, dateFin); + + // Assert + Assert.Less(0, count); + } + + [TestCase(new long[] { 1, 2 }, "azerty", null, null)] + [TestCase(new long[] { -1 }, "demande", null, null)] + [TestCase(null, null, "2021-11-01", null)] + [TestCase(null, null, null, "2019-11-01")] + public async Task GetDemandesFormationCountAsync_PasseDesParamsInvalides_RetourneZero(long[] arrIdBUs, string texte, DateTime? dateDebut, DateTime? dateFin) + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + List idBUs; + + if (arrIdBUs != null) + idBUs = arrIdBUs.Select(idBu => (long?)idBu).ToList(); + else + idBUs = null; + + // Act + long count = await demandeFormationService.GetDemandesFormationCountAsync(null, idBUs, null, texte, dateDebut, dateFin); + + // Assert + Assert.AreEqual(0, count); + } + + #endregion + + #region Tests GetOriginesDemandeFormationAsync + + [Test] + public async Task GetOriginesDemandeFormationAsync_RetourneToutesLesOriginesDeDemandeDeFormation() + { + // Arrange + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + IEnumerable origineDemandeFormationDTOs = await demandeFormationService.GetOriginesDemandeFormationAsync(); + + // Assert + Assert.IsNotNull(origineDemandeFormationDTOs); + Assert.AreEqual(5, origineDemandeFormationDTOs.Count()); // Nombre total d'origines de demande de formation dans la classe DataSeeder le 2020-03-08 + } + + #endregion + + #region Tests AddDemandeFormationAsync + + [Test] + public async Task AddDemandeFormationAsync_AjouteUneDemandeDeFormationValide_DemandeDeFormationAjouteeAvecSucces() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + DemandeFormationDTO demandeDeFormationAjoute = await demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Vérifie si la nouvelle demande de formation est bien liée au prochain EP du collaborateur Lemoine Coty + Ep ep = await epContext.Ep.FirstOrDefaultAsync(e => e.IdEP == 12); + bool exist = ep.DemandesFormation.Any(d => d.IdDemandeFormation == 13); + + // Assert + Assert.IsNotNull(demandeDeFormationAjoute); + Assert.AreEqual(13, demandeDeFormationAjoute.Id); + Assert.AreEqual(demandeFormation.Libelle, demandeDeFormationAjoute.Libelle); + Assert.AreEqual(demandeFormation.Description, demandeDeFormationAjoute.Description); + Assert.AreEqual(demandeFormation.DemandeRH, demandeDeFormationAjoute.DemandeRH); + Assert.AreEqual(demandeFormation.DateDemande, demandeDeFormationAjoute.DateDemande); + Assert.AreEqual(demandeFormation.EtatDemande, demandeDeFormationAjoute.EtatDemande); + Assert.AreEqual(demandeFormation.Origine, demandeDeFormationAjoute.Origine); + Assert.AreEqual(demandeFormation.Collaborateur.Id, demandeDeFormationAjoute.Collaborateur.Id); + Assert.AreEqual(demandeFormation.Collaborateur.Nom, demandeDeFormationAjoute.Collaborateur.Nom); + Assert.AreEqual(demandeFormation.Collaborateur.Prenom, demandeDeFormationAjoute.Collaborateur.Prenom); + Assert.IsTrue(exist); + } + + [Test] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationNull_LeveUneDemandeFormationInvalidException() + { + + // Arrange + DemandeFormationDTO demandeFormation = null; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [TestCase("", "Demande de formation React avec Redux", true, "2021-03-10")] + [TestCase("Formation React", "", true, "2021-03-10")] + [TestCase("Formation React", "Demande de formation React avec Redux", null, "2021-03-10")] + [TestCase("Formation React", "Demande de formation React avec Redux", true, null)] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationAvecDesProprietesInvalides_LeveUneDemandeFormationInvalidException(string libelle, string description, bool? demandeRH, DateTime? dateDemande) + { + + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = libelle, + Description = description, + DemandeRH = demandeRH, + DateDemande = dateDemande, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void AddDemandeFormationAsync__AjouteUneDemandeDeFormationQuiNestPasEnAttente_LeveUneDemandeFormationInvalidException() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationAvecUnCollaborateurNull_LeveUneDemandeFormationInvalidException() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = null; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationAvecUnIdCollaborateurNull_LeveUneDemandeFormationInvalidException() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = null, + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationAvecUneOrigineNull_LeveUneDemandeFormationInvalidException() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = null; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationAvecUnIdOrigineNull_LeveUneDemandeFormationInvalidException() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = null, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void AddDemandeFormationAsync_AjouteUneDemandeDeFormationQuiEstLieeAUnEpSigne_LeveUneDemandeFormationInvalidException() + { + // Arrange + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("301ba7f3-095e-4912-8998-a7c942dc5f23"), + BusinessUnit = new BusinessUnitDTO { Id = 1, Nom = "Tours", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Rousseau", + Prenom = "Lamar", + MailApside = "lamar.rousseau@apside-groupe.com", + DateArrivee = new DateTime(2020, 8, 1, 13, 21, 39, 799), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Libelle = "Formation React", + Description = "Demande de formation React avec Redux", + DemandeRH = true, + DateDemande = DateTime.Now, + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.AddDemandeFormationAsync(demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + + #endregion + + #region Tests UpdateDemandeFormationAsync + + [Test] + public async Task UpdateDemandeFormationAsync_AccepteUneDemandeDeDemandeFormationEtAjouteLeParticipantALaListeDesParticipantsVide_DemandeAccepteeAvecSucces() + { + // Arrange + long idDemandeFormation = 1; + int nbParticipant = 0; + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 1, + Intitule = "Formation Mainframe Complète", + DateDebut = new DateTime(2020, 1, 25, 10, 0, 0), + DateFin = new DateTime(2020, 1, 27), + Organisme = "Organisme1", + Origine = new OrigineFormationDTO { Id = 2, Libelle = "Exigence client" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = false, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation Cobol", + Description = "Demande de formation Cobol avec Mainframe", + DemandeRH = false, + DateDemande = new DateTime(2020, 1, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + DemandeFormationDTO demandeFormationAcceptee = await demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + bool participationFormationCree = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).AnyAsync(p => p.DemandeFormation.IdDemandeFormation == idDemandeFormation); + + // Assert + Assert.IsNotNull(demandeFormationAcceptee); + Assert.AreEqual(idDemandeFormation, demandeFormationAcceptee.Id); + Assert.AreEqual(demandeFormation.Libelle, demandeFormationAcceptee.Libelle); + Assert.AreEqual(demandeFormation.Description, demandeFormationAcceptee.Description); + Assert.AreEqual(demandeFormation.EtatDemande, demandeFormationAcceptee.EtatDemande); + Assert.IsNotNull(demandeFormationAcceptee.DateDerniereReponse); + Assert.IsTrue(participationFormationCree); + Assert.Less(nbParticipant, demandeFormationAcceptee.Formation.NbParticipations); + } + + [Test] + public async Task UpdateDemandeFormationAsync_AccepteUneDemandeDeDemandeFormationEtAjouteLeParticipantALaListeDesParticipantsNonVide_DemandeAccepteeAvecSucces() + { + // Arrange + long idDemandeFormation = 3; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + DemandeFormationDTO demandeFormationAcceptee = await demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + bool participationFormationCree = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).AnyAsync(p => p.DemandeFormation.IdDemandeFormation == idDemandeFormation); + + + // Assert + Assert.IsNotNull(demandeFormationAcceptee); + Assert.AreEqual(idDemandeFormation, demandeFormationAcceptee.Id); + Assert.AreEqual(demandeFormation.Libelle, demandeFormationAcceptee.Libelle); + Assert.AreEqual(demandeFormation.Description, demandeFormationAcceptee.Description); + Assert.AreEqual(demandeFormation.EtatDemande, demandeFormationAcceptee.EtatDemande); + Assert.IsNotNull(demandeFormationAcceptee.DateDerniereReponse); + Assert.IsTrue(participationFormationCree); + Assert.Less(nbParticipant, demandeFormationAcceptee.Formation.NbParticipations); + } + + [Test] + public void UpdateDemandeFormationAsync_MettreAJourUneDemandeEnAttente_LeveUneDemandeFormationInvalidException() + { + // Arrange + long idDemandeFormation = 1; + int nbParticipant = 0; + + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 1, + Intitule = "Formation Mainframe Complète", + DateDebut = new DateTime(2020, 1, 25, 10, 0, 0), + DateFin = new DateTime(2020, 1, 27), + Organisme = "Organisme1", + Origine = new OrigineFormationDTO { Id = 2, Libelle = "Exigence client" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = false, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation Cobol", + Description = "Demande de formation Cobol avec Mainframe", + DemandeRH = false, + DateDemande = new DateTime(2020, 1, 22, 9, 0, 0), + EtatDemande = EtatDemande.EnAttente, + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public void UpdateDemandeFormationAsync_AccepteUneDemandeAvecUnIdIncorrecte_LeveUneDemandeFormationIncompatibleIdException() + { + // Arrange + long idDemandeFormation = 1; + long idDemandeFormationIncorrecte = 0; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormationIncorrecte, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationIncompatibleIdException), throwException); + + } + + [Test] + public void UpdateDemandeFormationAsync_AccepteUneDemandeAvecUnIdDemandeFormationNull_LeveUneDemandeFormationIncompatibleIdException() + { + // Arrange + long idDemandeFormation = 1; + long? idDemandeFormationIncorrecte = null; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormationIncorrecte, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationIncompatibleIdException), throwException); + + } + + [Test] + public void UpdateDemandeFormationAsync_AccepteUneDemandeInexistante_LeveUneDemandeFormationNotFoundException() + { + // Arrange + long idDemandeFormation = 0; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationNotFoundException), throwException); + + } + + [Test] + public void UpdateDemandeFormationAsync_AccepteUneDemandeAvecUneFormationNull_LeveUneDemandeFormationInvalidException() + { + // Arrange + long idDemandeFormation = 3; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = null; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + + } + + [Test] + public void UpdateDemandeFormationAsync_AccepteUneDemandeAvecUnIdFormationNull_LeveUneDemandeFormationInvalidException() + { + // Arrange + long idDemandeFormation = 3; + long? idFormation = null; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = idFormation, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Validee, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + [Test] + public async Task UpdateDemandeFormationAsync_RefuseUneDemandeDeFormationEnAttente_DemandeRefuseeAvecSucces() + { + // Arrange + long idDemandeFormation = 1; + OrigineDemandeFormationDTO origineDemandeFormationApside = new OrigineDemandeFormationDTO { Id = 5, Libelle = "Demande Apside" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation Cobol", + Description = "Demande de formation Cobol avec Mainframe", + DemandeRH = false, + DateDemande = new DateTime(2020, 1, 22, 9, 0, 0), + EtatDemande = EtatDemande.Rejetee, + CommentaireRefus= "Formation indisponible pour le moment", + Origine = origineDemandeFormationApside, + Collaborateur = collaborateur + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + DemandeFormationDTO demandeFormationAcceptee = await demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + bool participationFormationExistante = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).AnyAsync(p => p.DemandeFormation.IdDemandeFormation == idDemandeFormation); + + + // Assert + Assert.IsNotNull(demandeFormationAcceptee); + Assert.AreEqual(idDemandeFormation, demandeFormationAcceptee.Id); + Assert.AreEqual(demandeFormation.Libelle, demandeFormationAcceptee.Libelle); + Assert.AreEqual(demandeFormation.Description, demandeFormationAcceptee.Description); + Assert.AreEqual(demandeFormation.EtatDemande, demandeFormationAcceptee.EtatDemande); + Assert.IsNotNull(demandeFormationAcceptee.DateDerniereReponse); + Assert.IsFalse(participationFormationExistante); + } + + [Test] + public async Task UpdateDemandeFormationAsync_RefuseUneDemandeDeFormationAccepteeEtSupprimeLaParticipation_DemandeRefuseeAvecSucces() + { + // Arrange + long idDemandeFormation = 5; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationEP = new OrigineDemandeFormationDTO { Id = 2, Libelle = "Demande EP" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("842650db-a548-4472-a3af-4c5fff3c1ab8"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Lemoine", + Prenom = "Coty", + MailApside = "coty.lemoine@apside-groupe.com", + DateArrivee = new DateTime(2017, 2, 10, 20, 37, 58, 741), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 5, 22, 9, 0, 0), + EtatDemande = EtatDemande.Rejetee, + CommentaireRefus = "Formation indisponible pour le moment", + Origine = origineDemandeFormationEP, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + DemandeFormationDTO demandeFormationAcceptee = await demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + bool participationFormationExistante = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).AnyAsync(p => p.DemandeFormation.IdDemandeFormation == idDemandeFormation); + + + // Assert + Assert.IsNotNull(demandeFormationAcceptee); + Assert.AreEqual(idDemandeFormation, demandeFormationAcceptee.Id); + Assert.AreEqual(demandeFormation.Libelle, demandeFormationAcceptee.Libelle); + Assert.AreEqual(demandeFormation.Description, demandeFormationAcceptee.Description); + Assert.AreEqual(demandeFormation.EtatDemande, demandeFormationAcceptee.EtatDemande); + Assert.IsNotNull(demandeFormationAcceptee.DateDerniereReponse); + Assert.IsFalse(participationFormationExistante); + Assert.Greater(nbParticipant, demandeFormationAcceptee.Formation.NbParticipations); + } + + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + public void UpdateDemandeFormationAsync_RefuseUneDemandeSansCommentaireRefus_LeveUneDemandeFormationInvalidException(string commentaireRefus) + { + // Arrange + long idDemandeFormation = 3; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = null; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Rejetee, + CommentaireRefus = commentaireRefus, + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + + } + + [Test] + public void UpdateDemandeFormationAsync_RefuseUneDemandeInexistante_LeveUneDemandeFormationNotFoundException() + { + // Arrange + long idDemandeFormation = 0; + int nbParticipant = 1; + OrigineDemandeFormationDTO origineDemandeFormationClient = new OrigineDemandeFormationDTO { Id = 3, Libelle = "Exigence Client" }; + + List Bus = new List() { + new BusinessUnitDTO { Id = 1, Nom = "Tours" }, + new BusinessUnitDTO { Id = 2, Nom = "Orléans" }, + }; + + CollaborateurDTO collaborateur = new CollaborateurDTO + { + Id = Guid.Parse("a0f40e2a-cc03-4032-a627-5389e1281c64"), + BusinessUnit = new BusinessUnitDTO { Id = 2, Nom = "Orléans", Agence = new AgenceDTO { Id = 1, Nom = "TOP", Bu = Bus } }, + Nom = "Vasseur", + Prenom = "Florencio", + MailApside = "florencio.vasseur@apside-groupe.com", + DateArrivee = new DateTime(2016, 1, 15, 10, 22, 30, 778), + DateDepart = null, + }; + + FormationDetailsDTO formation = new FormationDetailsDTO + { + Id = 3, + Intitule = "Apprendre C# et le développement de logiciels avec WPF", + DateDebut = new DateTime(2020, 5, 25, 14, 0, 0), + DateFin = new DateTime(2020, 5, 27), + Organisme = "Organisme2", + Origine = new OrigineFormationDTO { Id = 3, Libelle = "Exigence Apside" }, + Statut = new StatutFormationDTO { Id = 1, Libelle = "Planifiée" }, + EstCertifiee = true, + NbParticipations = nbParticipant + }; + + DemandeFormationDTO demandeFormation = new DemandeFormationDTO + { + Id = idDemandeFormation, + Libelle = "Formation C#", + Description = "Demande de formation C# avec WPF", + DemandeRH = false, + DateDemande = new DateTime(2020, 3, 22, 9, 0, 0), + EtatDemande = EtatDemande.Rejetee, + CommentaireRefus = "Formation indisponible pour le moment", + Origine = origineDemandeFormationClient, + Collaborateur = collaborateur, + Formation = formation, + }; + + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, demandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationNotFoundException), throwException); + + } + + #endregion + + #region Tests DeleteDemandeFormationAsync + + [Test] + public async Task DeleteDemandeFormationAsync_SupprimeUneDemandeDeFormation_DemandeDeFormationSupprimeeAvecSucces() + { + // Arrange + long idDemandeFormation = 5; + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + bool demandeFormationSupprimee = await demandeFormationService.DeleteDemandeFormationAsync(idDemandeFormation); + bool demandeRetireeDansEp = await epContext.Ep.Include(e => e.DemandesFormation).AnyAsync(e => e.DemandesFormation.Any(d => d.IdDemandeFormation == idDemandeFormation)); + bool demandeRetireeDansParticipation = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).AnyAsync(p => p.DemandeFormation.IdDemandeFormation == idDemandeFormation); + bool demandeFormationExiste = await epContext.DemandeFormation.AnyAsync(d => d.IdDemandeFormation == idDemandeFormation); + + // Assert + Assert.IsTrue(demandeFormationSupprimee); + Assert.IsFalse(demandeRetireeDansEp); + Assert.IsFalse(demandeRetireeDansParticipation); + Assert.IsFalse(demandeFormationExiste); + } + + [Test] + public void DeleteDemandeFormationAsync_SupprimeUneDemandeDeFormationInexistante_LeveUneDemandeFormationNotFoundException() + { + // Arrange + long idDemandeFormation = 0; + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.DeleteDemandeFormationAsync(idDemandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationNotFoundException), throwException); + } + + [Test] + public void DeleteDemandeFormationAsync_SupprimeUneDemandeDeFormationConcernantUnEpSigne_LeveUneDemandeFormationInvalidException() + { + // Arrange + long idDemandeFormation = 2; + DemandeFormationService demandeFormationService = new DemandeFormationService(epContext, collaborateurService, transformDTO); + + // Act + AsyncTestDelegate throwException = () => demandeFormationService.DeleteDemandeFormationAsync(idDemandeFormation); + + // Assert + Assert.ThrowsAsync(typeof(DemandeFormationInvalidException), throwException); + } + + #endregion + } +} \ No newline at end of file diff --git a/EPAServeur/Context/DataSeeder.cs b/EPAServeur/Context/DataSeeder.cs index de40699..581fd3b 100644 --- a/EPAServeur/Context/DataSeeder.cs +++ b/EPAServeur/Context/DataSeeder.cs @@ -1411,6 +1411,7 @@ namespace EPAServeur.Context Etat = EtatDemande.EnAttente, CommentaireRefus = null, DateDerniereReponse = null, + OrigineDemande = origineDemandeFormationApside, Ep = ep12 }; @@ -1426,6 +1427,7 @@ namespace EPAServeur.Context Etat = EtatDemande.EnAttente, CommentaireRefus = null, DateDerniereReponse = null, + OrigineDemande = origineDemandeFormationApside, Ep = ep13 }; @@ -1441,6 +1443,7 @@ namespace EPAServeur.Context Etat = EtatDemande.EnAttente, CommentaireRefus = null, DateDerniereReponse = null, + OrigineDemande = origineDemandeFormationClient, Ep = ep14 }; @@ -1456,6 +1459,7 @@ namespace EPAServeur.Context Etat = EtatDemande.EnAttente, CommentaireRefus = null, DateDerniereReponse = null, + OrigineDemande = origineDemandeFormationClient, Ep = ep13 }; @@ -1470,7 +1474,8 @@ namespace EPAServeur.Context DateDemande = new DateTime(2020, 5, 22, 9, 0, 0), Etat = EtatDemande.Validee, CommentaireRefus = null, - DateDerniereReponse = null, + DateDerniereReponse = new DateTime(2020, 5, 23, 9, 0, 0), + OrigineDemande = origineDemandeFormationEP, Ep = ep12 }; @@ -1481,11 +1486,12 @@ namespace EPAServeur.Context IdDemandeFormation = 6, Libelle = "Formation Vb.Net", Description = "Demande de formation Vb.Net avec WinForms", - DemandeRH = false, + DemandeRH = true, DateDemande = new DateTime(2020, 6, 22, 9, 0, 0), Etat = EtatDemande.Validee, CommentaireRefus = null, - DateDerniereReponse = null, + DateDerniereReponse = new DateTime(2020, 6, 23, 9, 0, 0), + OrigineDemande = origineDemandeFormationEP, Ep = ep15 }; @@ -1500,7 +1506,8 @@ namespace EPAServeur.Context DateDemande = new DateTime(2020, 7, 22, 9, 0, 0), Etat = EtatDemande.Validee, CommentaireRefus = null, - DateDerniereReponse = null, + DateDerniereReponse = new DateTime(2020, 7, 23, 9, 0, 0), + OrigineDemande = origineDemandeFormationReglement, Ep = ep16 }; @@ -1515,7 +1522,8 @@ namespace EPAServeur.Context DateDemande = new DateTime(2020, 8, 22, 9, 0, 0), Etat = EtatDemande.Validee, CommentaireRefus = null, - DateDerniereReponse = null, + DateDerniereReponse = new DateTime(2020, 8, 23, 9, 0, 0), + OrigineDemande = origineDemandeFormationReglement, Ep = ep16 }; @@ -1531,6 +1539,7 @@ namespace EPAServeur.Context Etat = EtatDemande.Rejetee, CommentaireRefus = "Aucune formation PHP pour le moment", DateDerniereReponse = new DateTime(2020, 9, 27, 9, 0, 0), + OrigineDemande = origineDemandeFormationCollaborateur, Ep = ep17 }; @@ -1544,8 +1553,9 @@ namespace EPAServeur.Context DemandeRH = false, DateDemande = new DateTime(2020, 10, 22, 9, 0, 0), Etat = EtatDemande.Rejetee, - CommentaireRefus = null, + CommentaireRefus = "Aucune formation Vus.JS", DateDerniereReponse = new DateTime(2020, 10, 27, 9, 0, 0), + OrigineDemande = origineDemandeFormationCollaborateur, Ep = ep18 }; @@ -1559,8 +1569,9 @@ namespace EPAServeur.Context DemandeRH = false, DateDemande = new DateTime(2020, 11, 22, 9, 0, 0), Etat = EtatDemande.Rejetee, - CommentaireRefus = null, + CommentaireRefus = "Aucune formation SCRUM pour le moment", DateDerniereReponse = new DateTime(2020, 11, 27, 9, 0, 0), + OrigineDemande = origineDemandeFormationCollaborateur, Ep = ep19 }; @@ -1574,8 +1585,9 @@ namespace EPAServeur.Context DemandeRH = false, DateDemande = new DateTime(2020, 12, 22, 9, 0, 0), Etat = EtatDemande.Rejetee, - CommentaireRefus = null, + CommentaireRefus = "Aucune formation avec du Xamarin pour le moment", DateDerniereReponse = new DateTime(2020, 12, 27, 9, 0, 0), + OrigineDemande = origineDemandeFormationCollaborateur, Ep = ep20 }; diff --git a/EPAServeur/Context/EpContext.cs b/EPAServeur/Context/EpContext.cs index f8614a1..80b0d11 100644 --- a/EPAServeur/Context/EpContext.cs +++ b/EPAServeur/Context/EpContext.cs @@ -152,12 +152,14 @@ namespace EPAServeur.Context }); //Formation + + modelBuilder.Entity(entity => { entity.HasKey(e => e.IdDemandeFormation); entity.Property(e => e.IdDemandeFormation).ValueGeneratedOnAdd(); - entity.HasOne(e => e.ParticipationFormation).WithOne(e => e.DemandeFormation).HasForeignKey(d => d.IdParticipationFormation); - + entity.HasOne(e => e.ParticipationFormation).WithOne(e => e.DemandeFormation).HasForeignKey("IdDemandeFormation"); + entity.HasOne(o => o.OrigineDemande).WithMany().IsRequired(); }); modelBuilder.Entity(entity => @@ -192,6 +194,7 @@ namespace EPAServeur.Context { entity.HasKey(e => e.IdParticipationFormation); entity.Property(e => e.IdParticipationFormation).ValueGeneratedOnAdd(); + entity.Property("IdDemandeFormation"); entity.HasMany(e => e.Evaluation).WithOne(e => e.ParticipationFormation); }); diff --git a/EPAServeur/Controllers/DemandesFormationApi.cs b/EPAServeur/Controllers/DemandesFormationApi.cs index a2555f1..8ee3a47 100644 --- a/EPAServeur/Controllers/DemandesFormationApi.cs +++ b/EPAServeur/Controllers/DemandesFormationApi.cs @@ -19,15 +19,34 @@ using IO.Swagger.Security; using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; using IO.Swagger.Enum; +using EPAServeur.IServices; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Hosting; +using System.Threading.Tasks; +using EPAServeur.Exceptions; +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; namespace IO.Swagger.Controllers -{ +{ /// /// /// [ApiController] public class DemandesFormationApiController : ControllerBase - { + { + private readonly IDemandeFormationService demandeFormationService; + private readonly ILogger logger; + private readonly IWebHostEnvironment env; + + public DemandesFormationApiController(IDemandeFormationService _demandeFormationService, ILogger _logger, IWebHostEnvironment _env) + { + demandeFormationService = _demandeFormationService; + logger = _logger; + env = _env; + + } /// /// /// @@ -40,7 +59,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpPost] [Route("/api/demandesformation")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("AddDemandeFormation")] [SwaggerResponse(statusCode: 201, type: typeof(DemandeFormationDTO), description: "Demande formation créée")] @@ -48,29 +67,58 @@ 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: 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 AddDemandeFormation([FromBody]DemandeFormationDTO body) - { - //TODO: Uncomment the next line to return response 201 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(201, default(DemandeFormationDTO)); - - //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 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 \"commentaireRefus\" : \"commentaireRefus\",\n \"libelle\" : \"libelle\",\n \"description\" : \"description\",\n \"dateDerniereReponse\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 2,\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 7\n },\n \"ep\" : {\n \"obligatoire\" : true,\n \"dateDisponibilite\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 9,\n \"datePrevisionnelle\" : \"2000-01-23T04:56:07.000+00:00\"\n },\n \"formation\" : {\n \"heure\" : 1,\n \"participations\" : [ {\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 } ],\n \"organisme\" : \"organisme\",\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 2\n },\n \"estCertifiee\" : true,\n \"type\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 6\n },\n \"intitule\" : \"intitule\",\n \"mode\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 1\n },\n \"jour\" : 1,\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"estRealisee\" : true,\n \"id\" : 3,\n \"dateFin\" : \"2000-01-23T04:56:07.000+00:00\",\n \"idAgence\" : 7,\n \"statut\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 4\n }\n },\n \"demandeRH\" : false,\n \"dateDemande\" : \"2000-01-23T04:56:07.000+00:00\",\n \"etatDemande\" : \"EnAttente\"\n}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(DemandeFormationDTO); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task AddDemandeFormation([FromBody] DemandeFormationDTO body) + { + if (env.IsDevelopment()) + logger.LogInformation("Ajout d'une nouvelle demande de formation."); + + try + { + body = await demandeFormationService.AddDemandeFormationAsync(body); + } + catch (DemandeFormationInvalidException 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 (DbUpdateException e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur est survenue sur le serveur lors de l'ajout de la demande de 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("Nouvelle demande de formation ajoutée."); + + return Created("", body); + } /// @@ -82,34 +130,94 @@ namespace IO.Swagger.Controllers /// 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 /// La ressource n'a pas été trouvée + /// L’opération ne peut pas être effectuée car certaines données sont manquantes /// Une erreur est survenue sur le serveur [HttpDelete] [Route("/api/demandesformation/{idDemandeFormation}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("DeleteDemandeFormation")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 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 DeleteDemandeFormation([FromRoute][Required]long? idDemandeFormation) - { - //TODO: Uncomment the next line to return response 204 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(204); + public virtual async Task DeleteDemandeFormation([FromRoute][Required] long idDemandeFormation) + { + try + { + if (env.IsDevelopment()) + logger.LogInformation("Suppression de la demande de formation {idDemandeFormation}.", idDemandeFormation); + + bool demandeFormationSupprimee = await demandeFormationService.DeleteDemandeFormationAsync(idDemandeFormation); + } + catch (DemandeFormationNotFoundException e) + { + if (env.IsDevelopment()) + logger.LogInformation(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status404NotFound, + Message = e.Message + }; + + return NotFound(erreur); + } + catch (DemandeFormationInvalidException 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 (DbUpdateConcurrencyException e) + { + logger.LogError(e.Message); + + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = string.Format("La demande de formation {0} n'a pas pu être supprimée car elle est prise par une autre ressource.", idDemandeFormation) + }; - //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)); + return StatusCode(erreur.Code.Value, erreur); + } + catch (DbUpdateException e) + { + logger.LogError(e.Message); - //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)); + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur est survenue sur le serveur lors de la suppression de la demande de formation." + }; - //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)); + return StatusCode(erreur.Code.Value, erreur); + } + catch (Exception e) + { + logger.LogError(e.Message); - //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)); + ErreurDTO erreur = new ErreurDTO() + { + Code = StatusCodes.Status500InternalServerError, + Message = "Une erreur inconnue est survenue sur le serveur." + }; - throw new NotImplementedException(); + return StatusCode(erreur.Code.Value, erreur); + } + + if (env.IsDevelopment()) + logger.LogInformation("Demande de formation {idDemandeFormation} supprimée avec succès.", idDemandeFormation); + + return NoContent(); } /// @@ -118,9 +226,10 @@ namespace IO.Swagger.Controllers /// Récupérer la liste des demandes de formation. /// Liste des états des demandes à afficher /// liste des ids des BU auxquelles les données sont rattachées + /// Liste des statuts d'EP auxquelles les données sont rattachées /// 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 + /// 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é /// Date à partir de laquelle les données son récupérées @@ -131,33 +240,41 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/demandesformation")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetDemandesFormation")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetDemandesFormation([FromQuery]List etatsDemande, [FromQuery]List idBUs, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPage, [FromQuery]string texte, [FromQuery]string tri, [FromQuery]DateTime? dateDebut, [FromQuery]DateTime? dateFin) - { - //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 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "[ {\n \"commentaireRefus\" : \"commentaireRefus\",\n \"libelle\" : \"libelle\",\n \"description\" : \"description\",\n \"dateDerniereReponse\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 2,\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 7\n },\n \"ep\" : {\n \"obligatoire\" : true,\n \"dateDisponibilite\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 9,\n \"datePrevisionnelle\" : \"2000-01-23T04:56:07.000+00:00\"\n },\n \"formation\" : {\n \"heure\" : 1,\n \"participations\" : [ {\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 } ],\n \"organisme\" : \"organisme\",\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 2\n },\n \"estCertifiee\" : true,\n \"type\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 6\n },\n \"intitule\" : \"intitule\",\n \"mode\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 1\n },\n \"jour\" : 1,\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"estRealisee\" : true,\n \"id\" : 3,\n \"dateFin\" : \"2000-01-23T04:56:07.000+00:00\",\n \"idAgence\" : 7,\n \"statut\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 4\n }\n },\n \"demandeRH\" : false,\n \"dateDemande\" : \"2000-01-23T04:56:07.000+00:00\",\n \"etatDemande\" : \"EnAttente\"\n}, {\n \"commentaireRefus\" : \"commentaireRefus\",\n \"libelle\" : \"libelle\",\n \"description\" : \"description\",\n \"dateDerniereReponse\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 2,\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 7\n },\n \"ep\" : {\n \"obligatoire\" : true,\n \"dateDisponibilite\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 9,\n \"datePrevisionnelle\" : \"2000-01-23T04:56:07.000+00:00\"\n },\n \"formation\" : {\n \"heure\" : 1,\n \"participations\" : [ {\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 } ],\n \"organisme\" : \"organisme\",\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 2\n },\n \"estCertifiee\" : true,\n \"type\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 6\n },\n \"intitule\" : \"intitule\",\n \"mode\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 1\n },\n \"jour\" : 1,\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"estRealisee\" : true,\n \"id\" : 3,\n \"dateFin\" : \"2000-01-23T04:56:07.000+00:00\",\n \"idAgence\" : 7,\n \"statut\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 4\n }\n },\n \"demandeRH\" : false,\n \"dateDemande\" : \"2000-01-23T04:56:07.000+00:00\",\n \"etatDemande\" : \"EnAttente\"\n} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task GetDemandesFormation([FromQuery] List etatsDemande, [FromQuery] List idBUs, [FromQuery] List statutsEp, [FromQuery] bool? asc, [FromQuery] int? numPage, [FromQuery][Range(5, 100)] int? parPAge, [FromQuery] string texte, [FromQuery] string tri, [FromQuery] DateTime? dateDebut, [FromQuery] DateTime? dateFin) + { + if (env.IsDevelopment()) + logger.LogInformation("Récupération de la liste des demandes de formation."); + + IEnumerable demandeFormations; + + try + { + demandeFormations = await demandeFormationService.GetDemandesFormationAsync(etatsDemande, idBUs, statutsEp, asc, numPage, parPAge, texte, tri, dateDebut, dateFin); + } + 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 demandes de formation récupérée."); + + return Ok(demandeFormations); } /// @@ -166,6 +283,7 @@ namespace IO.Swagger.Controllers /// Récupérer le nombre total de demandes de formation. /// Liste des états des demandes à afficher /// liste des ids des BU auxquelles les données sont rattachées + /// Liste des statuts d'EP auxquelles les données sont rattachées /// Texte permettant de filtrer les données /// Date à partir de laquelle les données son récupérées /// Date jusqu'à laquelle les données sont récupérées @@ -175,33 +293,41 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/demandesformation/count")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetDemandesFormationCount")] [SwaggerResponse(statusCode: 200, type: typeof(long?), description: "OK")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetDemandesFormationCount([FromQuery]List etatsDemande, [FromQuery]List idBUs, [FromQuery]string texte, [FromQuery]DateTime? dateDebut, [FromQuery]DateTime? dateFin) - { - //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(long?)); - - //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 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "0"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(long?); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task GetDemandesFormationCount([FromQuery] List etatsDemande, [FromQuery] List idBUs, [FromQuery] List statutsEp, [FromQuery] string texte, [FromQuery] DateTime? dateDebut, [FromQuery] DateTime? dateFin) + { + if (env.IsDevelopment()) + logger.LogInformation("Récupération du nombre total de demandes de formation."); + + long count; + + try + { + count = await demandeFormationService.GetDemandesFormationCountAsync(etatsDemande, idBUs, statutsEp, texte, dateDebut, dateFin); + } + 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("Nombre total de demandes de formation récupéré."); + + return Ok(count); } /// @@ -214,33 +340,41 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/originesdemandeformation")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetOriginesDemandeFormation")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetOriginesDemandeFormation() - { - //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 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "[ {\n \"libelle\" : \"libelle\",\n \"id\" : 7\n}, {\n \"libelle\" : \"libelle\",\n \"id\" : 7\n} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task GetOriginesDemandeFormation() + { + if (env.IsDevelopment()) + logger.LogInformation("Récupération de la liste des origines de demande de formation."); + + IEnumerable origineDemandes; + + try + { + origineDemandes = await demandeFormationService.GetOriginesDemandeFormationAsync(); + } + 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 origines de demande de formation récupérée."); + + return Ok(origineDemandes); } /// @@ -257,7 +391,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpPut] [Route("/api/demandesformation/{idDemandeFormation}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("UpdateDemandeFormation")] [SwaggerResponse(statusCode: 200, type: typeof(DemandeFormationDTO), description: "demande formation mise à jour")] @@ -266,32 +400,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 UpdateDemandeFormation([FromBody]DemandeFormationDTO body, [FromRoute][Required]long? idDemandeFormation) - { - //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(DemandeFormationDTO)); - - //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 \"commentaireRefus\" : \"commentaireRefus\",\n \"libelle\" : \"libelle\",\n \"description\" : \"description\",\n \"dateDerniereReponse\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 2,\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 7\n },\n \"ep\" : {\n \"obligatoire\" : true,\n \"dateDisponibilite\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : 9,\n \"datePrevisionnelle\" : \"2000-01-23T04:56:07.000+00:00\"\n },\n \"formation\" : {\n \"heure\" : 1,\n \"participations\" : [ {\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 } ],\n \"organisme\" : \"organisme\",\n \"origine\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 2\n },\n \"estCertifiee\" : true,\n \"type\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 6\n },\n \"intitule\" : \"intitule\",\n \"mode\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 1\n },\n \"jour\" : 1,\n \"dateDebut\" : \"2000-01-23T04:56:07.000+00:00\",\n \"estRealisee\" : true,\n \"id\" : 3,\n \"dateFin\" : \"2000-01-23T04:56:07.000+00:00\",\n \"idAgence\" : 7,\n \"statut\" : {\n \"libelle\" : \"libelle\",\n \"id\" : 4\n }\n },\n \"demandeRH\" : false,\n \"dateDemande\" : \"2000-01-23T04:56:07.000+00:00\",\n \"etatDemande\" : \"EnAttente\"\n}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(DemandeFormationDTO); //TODO: Change the data returned - return new ObjectResult(example); + public virtual async Task UpdateDemandeFormation([FromBody] DemandeFormationDTO body, [FromRoute][Required] long idDemandeFormation) + { + if (env.IsDevelopment()) + logger.LogInformation("Mise à jour de la demande de formation d'id {idDemandeFormation}.", idDemandeFormation); + + try + { + body = await demandeFormationService.UpdateDemandeFormationAsync(idDemandeFormation, body); + } + catch (DemandeFormationInvalidException 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 (DemandeFormationIncompatibleIdException 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 (DemandeFormationNotFoundException 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 demande de formation {0} n'a pas pu être mise à jour car elle est prise par une autre ressource.", idDemandeFormation) + }; + + 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 demande de 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); } } } diff --git a/EPAServeur/DTO/DemandeFormationDTO.cs b/EPAServeur/DTO/DemandeFormationDTO.cs index c2ca00c..cd68fea 100644 --- a/EPAServeur/DTO/DemandeFormationDTO.cs +++ b/EPAServeur/DTO/DemandeFormationDTO.cs @@ -109,7 +109,7 @@ namespace IO.Swagger.DTO /// Gets or Sets Formation /// [DataMember(Name="formation")] - public FormationDTO Formation { get; set; } + public FormationDetailsDTO Formation { get; set; } /// /// Returns the string presentation of the object diff --git a/EPAServeur/Exceptions/DemandeFormationIncompatibleIdException.cs b/EPAServeur/Exceptions/DemandeFormationIncompatibleIdException.cs new file mode 100644 index 0000000..77be02a --- /dev/null +++ b/EPAServeur/Exceptions/DemandeFormationIncompatibleIdException.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 demande de formation avec les données à mettre à jour et l'id de la demande de formation dans la base de données sont différents + /// + public class DemandeFormationIncompatibleIdException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public DemandeFormationIncompatibleIdException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public DemandeFormationIncompatibleIdException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public DemandeFormationIncompatibleIdException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/EPAServeur/Exceptions/DemandeFormationInvalidException.cs b/EPAServeur/Exceptions/DemandeFormationInvalidException.cs new file mode 100644 index 0000000..a964eda --- /dev/null +++ b/EPAServeur/Exceptions/DemandeFormationInvalidException.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 demande de formation est invalide + /// + public class DemandeFormationInvalidException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public DemandeFormationInvalidException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public DemandeFormationInvalidException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public DemandeFormationInvalidException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/EPAServeur/Exceptions/DemandeFormationNotFoundException.cs b/EPAServeur/Exceptions/DemandeFormationNotFoundException.cs new file mode 100644 index 0000000..1528bcd --- /dev/null +++ b/EPAServeur/Exceptions/DemandeFormationNotFoundException.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 demande de formation n'a pas été trouvée + /// + public class DemandeFormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public DemandeFormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public DemandeFormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public DemandeFormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/EPAServeur/IServices/ICollaborateurService.cs b/EPAServeur/IServices/ICollaborateurService.cs index da2769d..7a7f260 100644 --- a/EPAServeur/IServices/ICollaborateurService.cs +++ b/EPAServeur/IServices/ICollaborateurService.cs @@ -23,6 +23,7 @@ namespace EPAServeur.IServices Task> GetCollaborateurDTOsAsync(List guids); Task> GetCollaborateurDTOsAsync(List participationsFormation); Task> GetCollaborateurDTOsAsync(IEnumerable participationsFormation); + Task> GetCollaborateurDTOsAsync(IEnumerable demandeFormations); Task> GetCollaborateurDTOsAsync(Engagement engagement); Task> GetCollaborateurDTOsAsync(IEnumerable engagements); Task> GetCollaborateurDTOsAsync(IEnumerable eps); diff --git a/EPAServeur/IServices/IDemandeFormationService.cs b/EPAServeur/IServices/IDemandeFormationService.cs new file mode 100644 index 0000000..579bb01 --- /dev/null +++ b/EPAServeur/IServices/IDemandeFormationService.cs @@ -0,0 +1,21 @@ +using EPAServeur.Context; +using IO.Swagger.DTO; +using IO.Swagger.Enum; +using IO.Swagger.ModelCollaborateur; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.IServices +{ + public interface IDemandeFormationService + { + Task> GetOriginesDemandeFormationAsync(); + Task> GetDemandesFormationAsync(List etatsDemande, List idBUs, List statutsEp, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin); + Task GetDemandesFormationCountAsync(List etatsDemande, List idBUs, List statutsEp, string texte, DateTime? dateDebut, DateTime? dateFin); + Task AddDemandeFormationAsync(DemandeFormationDTO demandeFormationDTO); + Task UpdateDemandeFormationAsync(long idDemandeFormation, DemandeFormationDTO demandeFormationDTO); + Task DeleteDemandeFormationAsync(long idDemandeFormation); + } +} diff --git a/EPAServeur/IServices/ITransformDTO.cs b/EPAServeur/IServices/ITransformDTO.cs index 0e7ff86..6b59dba 100644 --- a/EPAServeur/IServices/ITransformDTO.cs +++ b/EPAServeur/IServices/ITransformDTO.cs @@ -17,6 +17,7 @@ namespace EPAServeur.IServices AgenceDTO GetAgenceDTO(Agence agence); BusinessUnitDTO GetBusinessUnitDTO(BU businessUnit); CollaborateurDTO GetCollaborateurDTO(ParticipationFormation participationFormation, IEnumerable collaborateurDTOs); + CollaborateurDTO GetCollaborateurDTO(DemandeFormation demandeFormation, IEnumerable collaborateurDTOs); #endregion #region Demande de délégation @@ -41,6 +42,7 @@ namespace EPAServeur.IServices ModeFormationDTO GetModeFormationDTO(ModeFormation modeFormation); TypeFormationDTO GetTypeFormationDTO(TypeFormation typeFormation); Formation SetFormation(Formation formation, FormationDTO formationDTO); + Formation GetFormation(FormationDetailsDTO formationDetailsDTO); OrigineFormation GetOrigineFormation(OrigineFormationDTO origineFormationDTO); StatutFormation GetStatutFormation(StatutFormationDTO statutFormationDTO); ModeFormation GetModeFormation(ModeFormationDTO modeFormationDTO); @@ -86,9 +88,17 @@ namespace EPAServeur.IServices List GetObjectifDTOs(List objectifs); List GetObjectifPrecedentDTO(List objectifsPrecedents); - - + + + #endregion + + #region Demande Formation + // DemandeFormation + DemandeFormationDTO GetDemandeFormationDTO(DemandeFormation demandeFormation, IEnumerable collaborateurDTOs); + DemandeFormation SetDemandeFormationWithoutParticipationFormationAndEp(DemandeFormation demandeFormation, DemandeFormationDTO demandeFormationDTO); + OrigineDemandeFormationDTO GetOrigineDemandeFormationDTO(OrigineDemande origineDemande); + OrigineDemande GetOrigineDemandeFormation(OrigineDemandeFormationDTO origineDemandeDTO); #endregion } } diff --git a/EPAServeur/Models/Formation/DemandeFormation.cs b/EPAServeur/Models/Formation/DemandeFormation.cs index 42306dc..3152b49 100644 --- a/EPAServeur/Models/Formation/DemandeFormation.cs +++ b/EPAServeur/Models/Formation/DemandeFormation.cs @@ -65,8 +65,8 @@ namespace EPAServeur.Models.Formation public ParticipationFormation ParticipationFormation { get; set; } /// - /// Origine de formation qui est liée à la demande de formation + /// Origine de demande qui est liée à la demande de formation /// - public OrigineFormation OrigineFormation { get; set; } + public OrigineDemande OrigineDemande { get; set; } } } diff --git a/EPAServeur/Models/Formation/OrigineDemande.cs b/EPAServeur/Models/Formation/OrigineDemande.cs index 381b779..a3d36c1 100644 --- a/EPAServeur/Models/Formation/OrigineDemande.cs +++ b/EPAServeur/Models/Formation/OrigineDemande.cs @@ -19,10 +19,5 @@ namespace EPAServeur.Models.Formation /// Libellé de l’origine de la demande de formation /// public string Libelle { get; set; } - - /// - /// Liste des demandes de formation qui sont liées à l'origine de formation - /// - public List DemandeFormations { get; set; } } } diff --git a/EPAServeur/Services/CollaborateurService.cs b/EPAServeur/Services/CollaborateurService.cs index 942747c..38e037d 100644 --- a/EPAServeur/Services/CollaborateurService.cs +++ b/EPAServeur/Services/CollaborateurService.cs @@ -320,6 +320,21 @@ namespace EPAServeur.Services return await GetCollaborateurDTOsAsync(guids); } + /// + /// Récupérer une liste de CollaborateurDTO contenant les collaborateurs et les référents. + /// + /// + /// + public async Task> GetCollaborateurDTOsAsync(IEnumerable demandeFormations) + { + if (demandeFormations == null || !demandeFormations.Any()) + return null; + + List guids = demandeFormations.SelectMany(participationFormation => new[] { (Guid?)participationFormation.Ep.IdCollaborateur, participationFormation.Ep.IdReferent }).ToList(); + + return await GetCollaborateurDTOsAsync(guids); + } + /// /// Récupérer le collaborateur et le référent qui sont présent dans l'EP qui est lié à l'engagement. diff --git a/EPAServeur/Services/DemandeFormationService.cs b/EPAServeur/Services/DemandeFormationService.cs new file mode 100644 index 0000000..208a63d --- /dev/null +++ b/EPAServeur/Services/DemandeFormationService.cs @@ -0,0 +1,602 @@ +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 DemandeFormationService : IDemandeFormationService + { + #region Variables + + /// + /// Accès et gestion de la base de données + /// + private readonly EpContext epContext; + + /// + /// Accès au service collaborateur + /// + private readonly ICollaborateurService collaborateurService; + + /// + /// Accès au service permettant de transformer un modèle en dto + /// + private readonly ITransformDTO transformDTO; + + /// + /// Nombre d'éléments min à afficher par page + /// + private readonly int minParPage = 5; + + /// + /// Nom d'éléments max à affichar par page + /// + private readonly int maxParPage = 100; + + /// + /// Nombre d'éléments à afficher par défaut par page + /// + private readonly int defaultParPage = 15; + + /// + /// Numéro de page min à afficher par défaut + /// + private readonly int defaultNumPage = 1; + + /// + /// Ordonnancement par défaut + /// + private readonly bool defaultAsc = true; + + + #endregion + + #region Contructeurs + + /// + /// Constructeur de la classe FormationService + /// + /// + public DemandeFormationService(EpContext _epContext, ICollaborateurService _collaborateurService, ITransformDTO _transformDTO) + { + epContext = _epContext; + collaborateurService = _collaborateurService; + transformDTO = _transformDTO; + } + + #endregion + + #region Méthodes Service + + /// + /// Récupérer la liste des origines des demandes de formation. + /// + /// + public async Task> GetOriginesDemandeFormationAsync() + { + IEnumerable origineDemandes; + IEnumerable origineDemandeDTOs; + + origineDemandes = await epContext.OrigineDemandeFormation.ToListAsync(); + + origineDemandeDTOs = origineDemandes.Select(origineFormation => transformDTO.GetOrigineDemandeFormationDTO(origineFormation)); + + return origineDemandeDTOs; + } + + /// + /// Récupérer la liste des demandes de formation. + /// + /// Liste des états des demandes à afficher + /// liste des ids des BU auxquelles les données sont rattachées + /// Liste des statuts d'EP auxquelles les données sont rattachées + /// 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é + /// Date à partir de laquelle les données son récupérées + /// Date jusqu'à laquelle les données sont récupérées + /// + public async Task> GetDemandesFormationAsync(List etatsDemande, List idBUs, List statutsEp, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) + { + IQueryable query; + IEnumerable demandeFormations; + IEnumerable demandeFormationDTOs; + IEnumerable collaborateurDTOs; + + query = epContext.DemandeFormation + .Include(demandeFormation => demandeFormation.Ep) + .Include(demandeFormation => demandeFormation.OrigineDemande) + .Include(demandeFormation => demandeFormation.ParticipationFormation) + .ThenInclude(participationFormation => participationFormation.Formation); + + query = StatutEpFilter(query, statutsEp); + query = EtatsDemandeFilter(query, etatsDemande); + query = IdBUsFilter(query, idBUs); + query = DateFilter(query, dateDebut, dateFin); + query = SkipAndTake(query, parPage, numPage); + + demandeFormations = await query.ToListAsync(); + + collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(demandeFormations); + + demandeFormationDTOs = demandeFormations.Select(demandeFormation => transformDTO.GetDemandeFormationDTO(demandeFormation, collaborateurDTOs)); + demandeFormationDTOs = CollaborateurFilter(demandeFormationDTOs, texte); + demandeFormationDTOs = OrderByColumn(demandeFormationDTOs, asc, tri); + + return demandeFormationDTOs; + + } + + /// + /// Récupérer le nombre total de demandes de formation. + /// + /// Liste des états des demandes à afficher + /// liste des ids des BU auxquelles les données sont rattachées + /// Liste des statuts d'EP auxquelles les données sont rattachées + /// Texte permettant de filtrer les données + /// Date à partir de laquelle les données son récupérées + /// Date jusqu'à laquelle les données sont récupérées + /// + public async Task GetDemandesFormationCountAsync(List etatsDemande, List idBUs, List statutsEp, string texte, DateTime? dateDebut, DateTime? dateFin) + { + IQueryable query; + IEnumerable demandeFormations; + IEnumerable demandeFormationDTOs; + IEnumerable collaborateurDTOs; + long count; + + query = epContext.DemandeFormation + .Include(demandeFormation => demandeFormation.Ep) + .Include(demandeFormation => demandeFormation.ParticipationFormation) + .ThenInclude(participationFormation => participationFormation.Formation); + + query = StatutEpFilter(query, statutsEp); + query = EtatsDemandeFilter(query, etatsDemande); + query = IdBUsFilter(query, idBUs); + query = DateFilter(query, dateDebut, dateFin); + + demandeFormations = await query.ToListAsync(); + + collaborateurDTOs = await collaborateurService.GetCollaborateurDTOsAsync(demandeFormations); + + demandeFormationDTOs = demandeFormations.Select(demandeFormation => transformDTO.GetDemandeFormationDTO(demandeFormation, collaborateurDTOs)); + demandeFormationDTOs = CollaborateurFilter(demandeFormationDTOs, texte); + + count = demandeFormationDTOs.Count(); + + return count; + } + + /// + /// Créer une demande de formation pour un collaborateur. + /// + /// + /// + /// + public async Task AddDemandeFormationAsync(DemandeFormationDTO demandeFormationDTO) + { + IsDemandeFormationValide(demandeFormationDTO); + + if (demandeFormationDTO.EtatDemande != EtatDemande.EnAttente) + throw new DemandeFormationInvalidException("Impossible de créer une demande de formation qui n'est pas en attente."); + + string collaborateur = string.Format("{0} {1}", demandeFormationDTO.Collaborateur.Nom, demandeFormationDTO.Collaborateur.Prenom); + + DemandeFormation demandeFormation = transformDTO.SetDemandeFormationWithoutParticipationFormationAndEp(new DemandeFormation(), demandeFormationDTO); + + IEnumerable statutsEp = Enum.GetValues(typeof(StatutEp)).Cast().Where(statut => statut == StatutEp.Cree || EstEpEnCours(statut)); + + Ep ep = await epContext.Ep.Include(ep => ep.DemandesFormation) + .Where(ep => ep.IdCollaborateur == demandeFormationDTO.Collaborateur.Id && statutsEp.Contains(ep.Statut)) + .OrderBy(ep => ep.DateDisponibilite).FirstOrDefaultAsync(); + if (ep == null) + throw new DemandeFormationInvalidException(string.Format("Il n'existe aucun EP en cours ou créé pour le collaborateur {0}.", collaborateur)); + + ep.DemandesFormation.Add(demandeFormation); + + await epContext.SaveChangesAsync(); + + demandeFormationDTO.Id = demandeFormation.IdDemandeFormation; + + return demandeFormationDTO; + } + + /// + /// Répondre à une demande de formation. + /// + /// + /// + /// + /// + + /// + public async Task UpdateDemandeFormationAsync(long idDemandeFormation, DemandeFormationDTO demandeFormationDTO) + { + IsDemandeFormationValide(demandeFormationDTO); + + if (!demandeFormationDTO.Id.HasValue || demandeFormationDTO.Id.Value != idDemandeFormation) + throw new DemandeFormationIncompatibleIdException("La demande de formation ne correspond pas avec l'identifiant reçu."); + + switch (demandeFormationDTO.EtatDemande) + { + case EtatDemande.EnAttente: + throw new DemandeFormationInvalidException("La demande ne peut pas être mise à jour si aucune réponse n'a été donnée."); + case EtatDemande.Validee: + demandeFormationDTO = await AccepterDemandeFormation(idDemandeFormation, demandeFormationDTO); + break; + case EtatDemande.Rejetee: + demandeFormationDTO = await RefuserDemandeFormation(idDemandeFormation, demandeFormationDTO); + break; + } + + return demandeFormationDTO; + } + + /// + /// Supprimer une demande de formation. + /// + /// + /// + public async Task DeleteDemandeFormationAsync(long idDemandeFormation) + { + IEnumerable statutsEp = Enum.GetValues(typeof(StatutEp)).Cast().Where(statut => statut == StatutEp.Cree || EstEpEnCours(statut)); + DemandeFormation demandeFormation = await epContext.DemandeFormation.Include(demandeFormation => demandeFormation.Ep) + .FirstOrDefaultAsync(demandeFormation => demandeFormation.IdDemandeFormation == idDemandeFormation); + + if (demandeFormation == null) + throw new DemandeFormationNotFoundException("Aucune demande de formation n'a été trouvée."); + + if (!statutsEp.Contains(demandeFormation.Ep.Statut)) + throw new DemandeFormationInvalidException(string.Format("L'EP {1} qui est rattaché à la demande de formation {0} n'est ni créé ni en cours. Statut de l'EP {1}: {2}.", demandeFormation.IdDemandeFormation, demandeFormation.Ep.IdEP, demandeFormation.Ep.Statut)); + + epContext.Remove(demandeFormation); + + await epContext.SaveChangesAsync(); + + return true; + + } + + + #endregion + + #region Méthodes Privée + /// + /// Accepter une demande de formation. + /// + /// Créer une participation formation et associe cette dernière la demande de formation + /// + /// + /// + /// + /// + private async Task AccepterDemandeFormation(long idDemandeFormation, DemandeFormationDTO demandeFormationDTO) + { + // Vérifier que la demande de formation a bien une formation + if (demandeFormationDTO.Formation == null || !demandeFormationDTO.Formation.Id.HasValue) + throw new DemandeFormationInvalidException("Une formation est requise pour accepter une demande de formation."); + + + DemandeFormation demandeFormation = await epContext.DemandeFormation.Include(d => d.ParticipationFormation) + .Include(d => d.Ep) + .FirstOrDefaultAsync(d => d.IdDemandeFormation == idDemandeFormation); + + if (demandeFormation == null) + throw new DemandeFormationNotFoundException("Aucune demande de formation n'a été trouvée."); + + Guid idCollaborateur = demandeFormation.Ep.IdCollaborateur; // devra être utilisé pour notifier le collaborateur + DateTime dateNow = DateTime.Now; + Formation formation = transformDTO.GetFormation(demandeFormationDTO.Formation); + ParticipationFormation participationFormation = new ParticipationFormation { DateCreation = dateNow, Formation = formation }; + + demandeFormation.Etat = demandeFormationDTO.EtatDemande; + demandeFormation.DateDerniereReponse = dateNow; + demandeFormation.ParticipationFormation = participationFormation; + + await epContext.SaveChangesAsync(); + int nbParticipations = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).Where(p => p.Formation.IdFormation == formation.IdFormation).CountAsync(); + + demandeFormationDTO.EtatDemande = demandeFormation.Etat; + demandeFormationDTO.DateDerniereReponse = demandeFormation.DateDerniereReponse; + demandeFormationDTO.Formation.NbParticipations = nbParticipations; + + return demandeFormationDTO; + } + + /// + /// Refuser une demande de formation. + /// + /// Supprime la participation formation qui est liée à la demande de formation + /// + /// + /// + /// + /// + private async Task RefuserDemandeFormation(long idDemandeFormation, DemandeFormationDTO demandeFormationDTO) + { + // Vérifier que la demande de formation a bien un commentaire expliquant la raison pour laquelle la demande a été refusée + if (string.IsNullOrWhiteSpace(demandeFormationDTO.CommentaireRefus)) + throw new DemandeFormationInvalidException("Un commentaire expliquant la raison pour laquelle la demande a été refusée est requis."); + + DemandeFormation demandeFormation = await epContext.DemandeFormation.Include(d => d.ParticipationFormation) + .Include(d => d.Ep) + .FirstOrDefaultAsync(d => d.IdDemandeFormation == idDemandeFormation); + + if (demandeFormation == null) + throw new DemandeFormationNotFoundException("Aucune demande de formation n'a été trouvée."); + + Guid idCollaborateur = demandeFormation.Ep.IdCollaborateur; // devra être utilisé pour notifier le collaborateur + + demandeFormation.Etat = demandeFormationDTO.EtatDemande; + demandeFormation.CommentaireRefus = demandeFormationDTO.CommentaireRefus; + demandeFormation.DateDerniereReponse = DateTime.Now; + + if (demandeFormation.ParticipationFormation != null) + epContext.Remove(demandeFormation.ParticipationFormation); + + await epContext.SaveChangesAsync(); + + if (demandeFormationDTO.Formation != null && demandeFormationDTO.Formation.Id.HasValue) + { + int nbParticipations = await epContext.ParticipationFormation.Include(p => p.DemandeFormation).Where(p => p.Formation.IdFormation == demandeFormationDTO.Formation.Id.Value).CountAsync(); + demandeFormationDTO.Formation.NbParticipations = nbParticipations; + } + + demandeFormationDTO.EtatDemande = demandeFormation.Etat; + demandeFormationDTO.DateDerniereReponse = demandeFormation.DateDerniereReponse; + + return demandeFormationDTO; + } + + /// + /// Vérifier si un objet DemandeFormationDTO est valide pour une mise à jour. + /// + /// + /// Un objet DemandeFormationDTO est valide si l'objet n'est pas null, si le libellé, la descritpion, + /// la date de demande de début et la valeur permettant de dire si la demande a été créé par une RH ou non ne sont pas null. + /// + /// + /// + /// true si l'objet est valide, false sinon + private void IsDemandeFormationValide(DemandeFormationDTO demande) + { + // Vérifier que la demande de formation n'est pas null + if (demande == null) + throw new DemandeFormationInvalidException("Aucune évaluation n'a été reçue."); + + // Vérifier que la demande de formation a bien un libellé + if (string.IsNullOrWhiteSpace(demande.Libelle)) + throw new DemandeFormationInvalidException("Le libellé de la demande de formation doit contenir au moins 1 caractère."); + + // Vérifier que la demande de formation a bien une description + if (string.IsNullOrWhiteSpace(demande.Description)) + throw new DemandeFormationInvalidException("La description de la demande de formation doit contenir au moins 1 caractère."); + + // Vérifier que la demande de formation a bien une valeur permettant de dire s'il s'agit d'une demande créée par une RH ou non + if (!demande.DemandeRH.HasValue) + throw new DemandeFormationInvalidException("Impossible de répondre à une demande de formation sans savoir si la demande a été créé par une RH ou non."); + + // Vérifier que la demande de formation a bien une date de demande + if (!demande.DateDemande.HasValue) + throw new DemandeFormationInvalidException("Une date de demande de formation est requise."); + + // Vérifier que la demande de formation a bien un collaborateur + if (demande.Collaborateur == null || !demande.Collaborateur.Id.HasValue) + throw new DemandeFormationInvalidException("Un collaborateur est requis pour une demande de formation."); + + // Vérifier que la demande de formation a bien un collaborateur + if (demande.Origine == null || !demande.Origine.Id.HasValue) + throw new DemandeFormationInvalidException("Une origine de formation est requise pour une demande de formation."); + } + + /// + /// Ajouter un ordonnancement croissant ou décroissant sur une colonne. + /// + /// + /// + /// + /// + private IEnumerable OrderByColumn(IEnumerable query, bool? asc, string columnName) + { + if (!asc.HasValue) + asc = defaultAsc; + + if (string.IsNullOrWhiteSpace(columnName)) + return OrderByDefault(query, (bool)asc); + + if ((bool)asc) + return OrderByAscending(query, columnName); + else + return OrderByDescending(query, columnName); + } + + /// + /// Ajouter un ordonnancement croissant sur une colonne. + /// + /// + /// + /// + private IEnumerable OrderByAscending(IEnumerable query, string columnName) + { + switch (columnName.ToLower()) + { + case "businessunit": + return query.OrderBy(d => d.Collaborateur.BusinessUnit.Nom); + case "collaborateur": + return query.OrderBy(d => d.Collaborateur.Nom); + case "datedemande": + return query.OrderBy(d => d.DateDemande); + case "demanderh": + return query.OrderBy(d => d.DemandeRH); + case "etat": + return query.OrderBy(d => d.EtatDemande); + case "datereponse": + return query.OrderBy(d => d.DateDerniereReponse); + default: + return query.OrderBy(p => p.Collaborateur.Nom); + } + } + + /// + /// Ajouter un ordonnancement décroissant sur une colonne. + /// + /// + /// + /// + private IEnumerable OrderByDescending(IEnumerable query, string columnName) + { + switch (columnName.ToLower()) + { + case "businessunit": + return query.OrderByDescending(d => d.Collaborateur.BusinessUnit.Nom); + case "collaborateur": + return query.OrderByDescending(d => d.Collaborateur.Nom); + case "datedemande": + return query.OrderByDescending(d => d.DateDemande); + case "demanderh": + return query.OrderByDescending(d => d.DemandeRH); + case "etat": + return query.OrderByDescending(d => d.EtatDemande); + case "datereponse": + return query.OrderByDescending(d => d.DateDerniereReponse); + default: + return query.OrderByDescending(d => d.Collaborateur.Nom); + } + } + + /// + /// Ajouter un ordonnancement par défaut. + /// + /// + /// + /// + private IEnumerable OrderByDefault(IEnumerable query, bool asc) + { + if (asc) + return query.OrderBy(p => p.Collaborateur.Nom); + else + return query.OrderByDescending(p => p.Collaborateur.Nom); + } + + /// + /// Ajouter un filtre pour récupérer les demandes de formation en fonction du statut de l'EP. + /// + /// + /// + /// + private IQueryable StatutEpFilter(IQueryable query, List statutsEp) + { + if (statutsEp != null && statutsEp.Count > 0) + return query.Where(demandeFormation => statutsEp.Contains(demandeFormation.Ep.Statut)); + else + return query; + } + + /// + /// Ajouter un filtre pour récupérer les demandes de formation en fonction de plusieurs états de demande. + /// + /// + /// + /// + private IQueryable EtatsDemandeFilter(IQueryable query, List etatsDemande) + { + if (etatsDemande != null && etatsDemande.Count > 0) + return query.Where(demandeFormation => etatsDemande.Contains(demandeFormation.Etat)); + else + return query; + } + + /// + /// Ajouter un filtre pour récupérer les demandes de formation en fonction de l'id BU des collaborateurs. + /// + /// + /// + /// + private IQueryable IdBUsFilter(IQueryable query, List idBus) + { + if (idBus != null && idBus.Count > 0) + return query.Where(demandeFormation => idBus.Contains(demandeFormation.Ep.IdBu)); + else + return query; + } + + /// + /// Ajouter un filtre pour récupérer les formations en fonction d'un intervalle de date. + /// + /// + /// + /// + /// + private IQueryable DateFilter(IQueryable query, DateTime? dateDebut, DateTime? dateFin) + { + if (dateDebut.HasValue && dateFin.HasValue) + return query.Where(demandeFormation => demandeFormation.DateDemande >= dateDebut.Value && demandeFormation.DateDemande <= dateFin.Value.AddDays(1)); + else if (!dateDebut.HasValue && dateFin.HasValue) + return query.Where(demandeFormation => demandeFormation.DateDemande <= dateFin.Value.AddDays(1)); + else if (dateDebut.HasValue && !dateFin.HasValue) + return query.Where(demandeFormation => demandeFormation.DateDemande >= dateDebut.Value); + else + return query; + + } + + /// + /// Ajouter un filtre pour récupérer les demandes de formation en fonction du nom et du prénom du collaborateur. + /// + /// + /// + /// + private IEnumerable CollaborateurFilter(IEnumerable demandeFormationDTOs, string texte) + { + if (string.IsNullOrWhiteSpace(texte)) + return demandeFormationDTOs; + + return demandeFormationDTOs.Where(demandeFormation => (demandeFormation.Ep.Collaborateur.Nom + " " + demandeFormation.Ep.Collaborateur.Prenom).ToLower().Contains(texte.ToLower()) || + (demandeFormation.Ep.Collaborateur.Prenom + " " + demandeFormation.Ep.Collaborateur.Nom).ToLower().Contains(texte.ToLower())); + } + + /// + /// Ajouter une pagination. + /// + /// + /// + /// + /// + private IQueryable SkipAndTake(IQueryable query, int? parPage, int? numPage) + { + int skip, take; + + if (!parPage.HasValue || parPage.Value < minParPage || parPage.Value > maxParPage) + parPage = defaultParPage; + + if (!numPage.HasValue || numPage.Value <= 0) + numPage = defaultNumPage; + + + skip = (numPage.Value - 1) * parPage.Value; + take = parPage.Value; + + return query.Skip(skip).Take(take); + } + + private bool EstEpEnCours(StatutEp statut) + { + return statut != StatutEp.Annule && statut != StatutEp.Cree && statut != StatutEp.Rejete && statut != StatutEp.Signe; + } + + #endregion + + } +} diff --git a/EPAServeur/Services/TransformDTO.cs b/EPAServeur/Services/TransformDTO.cs index 935137c..93d743d 100644 --- a/EPAServeur/Services/TransformDTO.cs +++ b/EPAServeur/Services/TransformDTO.cs @@ -1,18 +1,15 @@ -using EPAServeur.Context; -using EPAServeur.Exceptions; +using EPAServeur.Exceptions; using EPAServeur.IServices; using EPAServeur.Models.EP; using EPAServeur.Models.Formation; using EPAServeur.Models.Notes; using EPAServeur.Models.SaisieChamp; -using IO.Swagger.ApiCollaborateur; using IO.Swagger.DTO; using IO.Swagger.Enum; using IO.Swagger.ModelCollaborateur; using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; namespace EPAServeur.Services { @@ -237,6 +234,22 @@ namespace EPAServeur.Services return commentaireAssistantDTO.Any() ? commentaireAssistantDTO : null; } + /// + /// Récupérer le collaborateur qui a fait une demande de formation. + /// + /// + /// + /// + public CollaborateurDTO GetCollaborateurDTO(DemandeFormation demandeFormation, IEnumerable collaborateurDTOs) + { + if (demandeFormation == null) + return null; + + if (collaborateurDTOs == null || !collaborateurDTOs.Any()) + return null; + + return collaborateurDTOs.FirstOrDefault(collaborateurDTO => collaborateurDTO.Id == demandeFormation.Ep.IdCollaborateur); + } /// /// Transformer un objet DemandeDelegation en objet DemandeDelegationDTO. @@ -653,6 +666,63 @@ namespace EPAServeur.Services return participationFormationDTOs; } + // + /// Récuperer un objet OrigineDemandeFormationDTO en fonction d'un objet OrigineDemande + /// + /// + /// + public OrigineDemandeFormationDTO GetOrigineDemandeFormationDTO(OrigineDemande origineDemande) + { + if (origineDemande == null) + return null; + + OrigineDemandeFormationDTO origineDemandeFormationDTO = new OrigineDemandeFormationDTO() + { + Id = origineDemande.IdOrigineDemande, + Libelle = origineDemande.Libelle + }; + + return origineDemandeFormationDTO; + } + + /// + /// Récuperer un objet DemandeFormationDTO en fonction d'un objet DemandeFormation et d'une liste de CollaborateurDTO + /// + /// + /// + public DemandeFormationDTO GetDemandeFormationDTO(DemandeFormation demandeFormation, IEnumerable collaborateurDTOs) + { + if (demandeFormation == null) + return null; + + if (collaborateurDTOs == null || !collaborateurDTOs.Any()) + return null; + + Formation formation; + + if (demandeFormation.ParticipationFormation != null) + formation = demandeFormation.ParticipationFormation.Formation; + else + formation = null; + + DemandeFormationDTO demandeFormationDTO = new DemandeFormationDTO() + { + Id = demandeFormation.IdDemandeFormation, + Libelle = demandeFormation.Libelle, + Description = demandeFormation.Description, + DemandeRH = demandeFormation.DemandeRH, + DateDemande = demandeFormation.DateDemande, + EtatDemande = demandeFormation.Etat, + CommentaireRefus = demandeFormation.CommentaireRefus, + DateDerniereReponse = demandeFormation.DateDerniereReponse, + Origine = GetOrigineDemandeFormationDTO(demandeFormation.OrigineDemande), + Collaborateur = GetCollaborateurDTO(demandeFormation, collaborateurDTOs), + Ep = GetEpInformationDTO(demandeFormation.Ep, collaborateurDTOs), + Formation = GetFormationDetailsDTO(formation) + }; + + return demandeFormationDTO; + } public RDVEntretienDTO GetRDVEntretienDTO(RdvEntretien rdvEntretien) { @@ -849,6 +919,49 @@ namespace EPAServeur.Services return details; } + // + /// Récupérer un objet OrigineDemande en fonction d'un objet OrigineDemandeFormationDTO + /// + /// + /// + public OrigineDemande GetOrigineDemandeFormation(OrigineDemandeFormationDTO origineDemandeDTO) + { + if (origineDemandeDTO == null) + return null; + + OrigineDemande origineDemandeFormation = new OrigineDemande() + { + IdOrigineDemande = origineDemandeDTO.Id.Value, + Libelle = origineDemandeDTO.Libelle + }; + + return origineDemandeFormation; + } + + /// + /// Mettre à jour un objet DemandeFormation en fonction d'un objet DemandeFormationDTO. + /// + /// Les propriétés ParticipationFormation et Ep ne sont pas mise à jour. + /// + /// + /// + public DemandeFormation SetDemandeFormationWithoutParticipationFormationAndEp(DemandeFormation demandeFormation, DemandeFormationDTO demandeFormationDTO) + { + if (demandeFormation == null || demandeFormationDTO == null) + return null; + + demandeFormation.Libelle = demandeFormationDTO.Libelle; + demandeFormation.Description = demandeFormationDTO.Description; + demandeFormation.DemandeRH = demandeFormationDTO.DemandeRH.Value; + demandeFormation.DateDemande = demandeFormationDTO.DateDemande.Value; + demandeFormation.Etat = demandeFormationDTO.EtatDemande; + demandeFormation.CommentaireRefus = demandeFormationDTO.CommentaireRefus; + demandeFormation.DateDerniereReponse = demandeFormationDTO.DateDerniereReponse; + demandeFormation.OrigineDemande = GetOrigineDemandeFormation(demandeFormationDTO.Origine); + + return demandeFormation; + } + /// /// Mettre à jour un objet Formation en fonction d'un objet FormationDTO. /// @@ -860,6 +973,9 @@ namespace EPAServeur.Services if (formation == null || formationDTO == null) return null; + if (formationDTO.Id.HasValue) + formation.IdFormation = formationDTO.Id.Value; + formation.Intitule = formationDTO.Intitule; formation.IdAgence = formationDTO.IdAgence.Value; formation.DateDebut = formationDTO.DateDebut.Value; @@ -877,6 +993,34 @@ namespace EPAServeur.Services return formation; } + /// + /// Récupérer un objet Formation en fonction d'un objet FormationDetailsDTO. + /// + /// + /// + public Formation GetFormation(FormationDetailsDTO formationDetailsDTO) + { + if (formationDetailsDTO == null) + return null; + + Formation formation = new Formation + { + Intitule = formationDetailsDTO.Intitule, + DateDebut = formationDetailsDTO.DateDebut.Value, + DateFin = formationDetailsDTO.DateFin.Value, + Organisme = formationDetailsDTO.Organisme, + EstCertifiee = formationDetailsDTO.EstCertifiee.Value, + //EstRealisee = formationDTO.EstRealisee.Value, + Origine = GetOrigineFormation(formationDetailsDTO.Origine), + Statut = GetStatutFormation(formationDetailsDTO.Statut), + }; + + if (formationDetailsDTO.Id.HasValue) + formation.IdFormation = formationDetailsDTO.Id.Value; + + return formation; + } + /// /// Mettre à jour la réponse d'un objet Engagement en fonction d'un objet EngagementDTO. /// diff --git a/EPAServeur/Startup.cs b/EPAServeur/Startup.cs index 4532065..3c92099 100644 --- a/EPAServeur/Startup.cs +++ b/EPAServeur/Startup.cs @@ -127,6 +127,7 @@ namespace EPAServeur services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped();