diff --git a/CHANGELOG.md b/CHANGELOG.md index 0661adcc44953bb9fe6a5268a657b8e9ecbd7d8b..dbfe0db421b5635a6afbcd126665487272c10e33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Tous les changements de ce projet seront documentés dans ce document. ## [Non livré] - Intégrer des nouveaux impacts au référentiel -> [Issue1](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/1) - Defect: Mauvaise description de l'API de chargement des données d'entrées +- Defect : Erreur sur le calcul comparant la date de retrait et la date d'achat pour les équipements physiques - Mise à jour de Java 17 vers 21 et des dépendances - Defect: Libellé erreur erroné quand donnée de référence manquante - Ajout du mode d'utilisation et taux d'utilisation diff --git a/assets/docker-compose/docker-compose.yml b/assets/docker-compose/docker-compose.yml index f0eb0f0d8c5cb3132843d0c8c550c7467360a061..5d890da1366ea0e30ae031378665349322110f85 100644 --- a/assets/docker-compose/docker-compose.yml +++ b/assets/docker-compose/docker-compose.yml @@ -19,7 +19,7 @@ services: - "numecoeval_zookeeper_data:/bitnami" environment: ALLOW_ANONYMOUS_LOGIN: "yes" - + # Kafka basé sur la documentation officielle de Bitnami ## https://github.com/bitnami/containers/blob/main/bitnami/kafka/docker-compose.yml ## https://hub.docker.com/r/bitnami/kafka/ @@ -72,7 +72,7 @@ services: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK: $LOGGING_LEVEL_ORG_SPRINGFRAMEWORK api-rest-expositiondonneesentrees: - image: ${REGISTRY_URL}/api-expositiondonneesentrees:${TAG} + image: ${REGISTRY_URL}/api-expositiondonneesentrees:${TAG} depends_on: - postgresdb - api-rest-referentiels @@ -95,6 +95,7 @@ services: NUMECOEVAL_URLS_ALLOWED: "http://localhost,http://api-rest-expositiondonneesentrees" LOGGING_LEVEL_ROOT: $LOGGING_LEVEL_ROOT LOGGING_LEVEL_ORG_SPRINGFRAMEWORK: $LOGGING_LEVEL_ORG_SPRINGFRAMEWORK + NUMECOEVAL_CALCULS_SERVER_URL: "http://api-event-calculs:8080" api-event-donneesentrees: image: ${REGISTRY_URL}/api-event-donneesentrees:${TAG} diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/MessageProperties.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/MessageProperties.java index 2b155075ddec16d50ac936ab41858b4f18393588..6675bb9df2ef2255b7f3218d8d22790e6ce28a45 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/MessageProperties.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/MessageProperties.java @@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.stereotype.Component; -import java.util.HashMap; +import java.util.Map; @Component @EnableConfigurationProperties @@ -15,6 +15,6 @@ import java.util.HashMap; @Setter public class MessageProperties { - private HashMap<String, String> messages; + private Map<String, String> messages; } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java index 952379b7acbcdeaf9a01a8488019dd731bf7dd52..473a1a4e1fed90602ece904dcfee3464a3919c43 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java @@ -92,7 +92,7 @@ public class ErrorManagementService { // CA 3.1 // L'ajout d'un équipement dont le date de retrait (equipementPhysique.DateRetrait) précède la date d'achat (equipementPhysique.DateAchat) if (equipementPhysique.getDateAchat() != null && equipementPhysique.getDateRetrait() != null && - equipementPhysique.getDateAchat().isBefore(equipementPhysique.getDateRetrait())) { + equipementPhysique.getDateAchat().isAfter(equipementPhysique.getDateRetrait())) { erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_DATE_INCOHERENTE").formatted(equipementPhysique.getNomEquipementPhysique())); } diff --git a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0e4adc46067632e80213c44e6c6ee6bb155b6e2b --- /dev/null +++ b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java @@ -0,0 +1,89 @@ +package org.mte.numecoeval.expositiondonneesentrees.infrastructure.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mte.numecoeval.expositiondonneesentrees.domain.model.EquipementPhysique; +import org.mte.numecoeval.expositiondonneesentrees.domain.ports.output.ReferentielServicePort; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.config.MessageProperties; + +import java.io.IOException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +@ExtendWith(MockitoExtension.class) +public class ErrorManagementServiceTest { + @Mock + MessageProperties messageProperties; + @InjectMocks + ErrorManagementService errorManagementService; + @Mock + ReferentielServicePort referentielServicePort; + + private Map<String, String> messages = new HashMap<>(); + + @BeforeEach + public void init() { + List<String> modeUtilisationList = new ArrayList<>(); + errorManagementService = new ErrorManagementService(messageProperties, referentielServicePort, modeUtilisationList); + messages.put("LIGNE_INCONSISTENTE", "Fichier %s , La ligne n°%d n'est pas consistente avec les headers du fichier"); + messages.put("LIGNE_INCORRECTE", "Fichier %s , La ligne n°%d est incorrecte pour l'objet %s requise"); + messages.put("TYPE_EQUIPEMENT_INCONNU", "Le type d'équipement %s correspondant à l'équipement %s n'existe pas dans la table des références ref_TypeEquipement"); + messages.put("EQUIPEMENT_MIX_ELEC_LOCALISATION_INCONNUE", "Le pays %s correspondant à l'équipement physique %s n'existe pas dans la table des mix électriques ref_MixElec.pays"); + messages.put("DATACENTER_MIX_ELEC_LOCALISATION_INCONNUE", "La localisation %s du centre de données %s n'existe pas dans la table des mix électriques ref_MixElec.pays"); + messages.put("EQUIPEMENT_CORRESPONDANCE_INCONNUE", "L'équipement %s de type %s ne possède pas de référence d'équipement par défaut dans la table ref_typeEquipement et pas de correspondance dans la table ref_CorrespondanceRefEqP"); + messages.put("EQUIPEMENT_IMPACT_INCONNU", "L'impact de l'équipement de référence %s pour l'étape %s et le critère %s ne pourra pas être calculé en raison de l'absence de facteur d'impact sur l'équipement"); + messages.put("EQUIPEMENT_DATE_INCOHERENTE", "L'âge de l'équipement %s ne peut être calculé car sa date de retrait précède sa date d'achat"); + messages.put("EQUIPEMENT_MODE_UTILISATION_INCONNU", "Le mode d'utilisation renseigné '%s' est inconnu du référentiel"); + messages.put("EQUIPEMENT_TAUX_UTILISATION_INVALIDE", "Le taux d'utilisation renseigné '%s' n'est pas valide, il doit être compris entre 0 et 1, le taux par défaut sera appliqué."); + messages.put("EQUIPEMENT_DATACENTER_INCONNU", "L'équipement %s n'est lié à aucun datacenter"); + messages.put("EQUIPEMENT_VIRTUEL_INCONNU", "L'équipement virtuel %s n'est supporté par aucun équipement physique"); + messages.put("APPLICATION_AVEC_EQUIPEMENT_PHYSIQUE_INCONNU", "L'application %s n'est supporté par aucun équipement physique"); + messages.put("APPLICATION_AVEC_EQUIPEMENT_VIRTUEL_INCONNU", "L'application %s n'est supporté par aucun équipement virtuel"); + Mockito.lenient().when(messageProperties.getMessages()).thenReturn(messages); + } + + @Test + void importEqPhysique_with_DateEntreeAfterDateRetrait_shouldReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .modele("P2719") + .quantite(1.0) + .dateAchat(LocalDate.of(2023, 3, 30)) + .dateRetrait(LocalDate.of(2023, 1, 17)) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .modeUtilisation("COPE").build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertTrue(actual.getKey().stream().anyMatch(ds -> "L'âge de l'équipement physical-eq-001 ne peut être calculé car sa date de retrait précède sa date d'achat".equals(ds))); + } + + @Test + void importEqPhysique_with_DateEntreeAfterDateRetrait_shouldNotReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .modele("P2719") + .quantite(1.0) + .dateAchat(LocalDate.of(2021, 3, 30)) + .dateRetrait(LocalDate.of(2023, 1, 17)) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .modeUtilisation("COPE").build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertFalse(actual.getKey().stream().anyMatch(ds -> "L'âge de l'équipement physical-eq-001 ne peut être calculé car sa date de retrait précède sa date d'achat".equals(ds))); + } +} diff --git a/services/api-expositiondonneesentrees/src/test/resources/equipementPhysique.csv b/services/api-expositiondonneesentrees/src/test/resources/equipementPhysique.csv index dec2cbe1fa34fe8d08aa4031b70da63b6399cc3f..76afcce70ff76ee90f90d4d15968a22d2d206f0f 100644 --- a/services/api-expositiondonneesentrees/src/test/resources/equipementPhysique.csv +++ b/services/api-expositiondonneesentrees/src/test/resources/equipementPhysique.csv @@ -1,2 +1,2 @@ test -test +test \ No newline at end of file