diff --git a/CHANGELOG.md b/CHANGELOG.md index 1af720e604b18bf81466700ed4c1fd584c2a01e6..ab1cd1fac63828ed80211b9d184b15ac2d2dd732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,13 @@ Tous les changements de ce projet seront documentés dans ce document. ## [Non livré] + - Nettoyage : Supression des tables, Entities et Repositories plus utilisés (pour MixElectrique, ImpactEquipement, ImpactReseau & TypeEquipement) +## [2.0.1] - 2024-07-10 + +- Correction bug lors du lancement d'un calcul pour un équipement physique dont le modèle n'est pas renseigné -> [Issue8](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/8) + ## [2.0.0] - 2024-06-14 Adaptations pour être conforme avec le référentiel méthodologique d'évaluation environnementale des Systèmes d'Information [(RCP SI)](https://librairie.ademe.fr/consommer-autrement/6649-referentiel-methodologique-d-evaluation-environnementale-des-systemes-d-information-si.html): diff --git a/e2e/input_template/EquipementPhysique_hors_serveur.csv b/e2e/input_template/EquipementPhysique_hors_serveur.csv index 918baf79bc1849420c76cd23e5c73c6151ec0435..d4e39e300cae58958b56a5e142ec5bf86468347f 100644 --- a/e2e/input_template/EquipementPhysique_hors_serveur.csv +++ b/e2e/input_template/EquipementPhysique_hors_serveur.csv @@ -7,7 +7,7 @@ physical-eq-005;P2720DC;2;;2022-11-04;2023-06-16;-4.5;-1;2;Monitor;In stock;Fran physical-eq-006;PIXEL 6;1;;2022-10-18;2022-12-18;0.1;0.2;0.2;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;test;haute physical-eq-007;UP2516D;1;;2022-07-31;2023-06-16;4.5;;;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;0.9;basse physical-eq-008;UP2516D;2;;2022-03-10;2023-06-16;4.5;1;2;Wrong / Type;In stock;France;;;;MY ENTERPRISE;;365;;COPE;0.6; -physical-eq-009;Unknown;3;;2021-08-09;2023-06-16;4.5;1;2;IP Router;In use;France;;;;MY ENTERPRISE;;365;;COPE;0; +physical-eq-009;;3;;2021-08-09;2023-06-16;4.5;1;2;IP Router;In use;France;;;;MY ENTERPRISE;;365;;COPE;0; physical-eq-010;Unknown;3;;2021-08-09;2023-06-16;4.5;1;2;IP Router;In use;France;;;;MY ENTERPRISE;;365;;;; physical-eq-011;HP 8440p;1;;2021-08-05;2023-06-16;4.5;1;2;Wrong \type;Missing;France;;;;MY ENTERPRISE;;365;;;; physical-eq-012;HP 8440p;1;;2023-04-27;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; @@ -17,7 +17,7 @@ physical-eq-015;CROSSCALL;1;;2022-08-20;2023-06-16;4.5;1;2;Communication Device; physical-eq-016;CROSSCALL;11;;2022-05-20;2023-06-16;4.5;1;2;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; physical-eq-017;CROSSCALL;8;;2022-05-28;2023-06-16;4.5;1;2;Communication Device;In use;France;;;;MY ENTERPRISE;;365;;;; physical-eq-018;HUAWEI P9;11;;2021-01-28;2023-06-16;4.5;1;2;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-019;HUAWEI P9;4;;2022-08-18;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-019;;4;;2022-08-18;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; physical-eq-020;HUAWEI P9;1;;2023-06-18;2023-06-16;4.5;1;2;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;; physical-eq-021;HUAWEI P9;32;;2021-01-28;2023-06-16;4.5;1;2;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;; physical-eq-022;HUAWEI P9;9;;2024-08-18;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementEquipementPhysiqueService.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementEquipementPhysiqueService.java index 73114e06370b5685d071933d6f88c5572e1d1ff1..d3e3830c0e4c51a563a8af4b4221aef19a94df67 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementEquipementPhysiqueService.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementEquipementPhysiqueService.java @@ -46,8 +46,9 @@ public class EnrichissementEquipementPhysiqueService { }); calculEquipementPhysique.setHypotheses(hypotheses); - - calculEquipementPhysique.setCorrespondanceRefEquipement(referentielClient.getCorrespondanceRefEquipement(equipementPhysiqueDTO.getModele())); + if (equipementPhysiqueDTO.getModele() != null) { + calculEquipementPhysique.setCorrespondanceRefEquipement(referentielClient.getCorrespondanceRefEquipement(equipementPhysiqueDTO.getModele())); + } calculEquipementPhysique.setTypeEquipement(referentielClient.getTypeEquipement(equipementPhysiqueDTO.getType())); calculEquipementPhysique.setImpactsEquipement(new ArrayList<>()); diff --git a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementEquipementPhysiqueServiceTest.java b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementEquipementPhysiqueServiceTest.java index 579474dced27d915e198073f3a63d76d6876f241..7d7c105b55fc114e5714877d4a75f410ac0440b5 100644 --- a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementEquipementPhysiqueServiceTest.java +++ b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementEquipementPhysiqueServiceTest.java @@ -121,7 +121,7 @@ class EnrichissementEquipementPhysiqueServiceTest { } @Test - void testServiceEnrichissementEquipementPhysqique_correspondanceRefEquipement() throws JsonProcessingException { + void testServiceEnrichissementEquipementPhysique_correspondanceRefEquipement() throws JsonProcessingException { /* MOCK REFERENTIEL : CorrespondanceRefEquipement */ Mockito.when(referentielClient.getCorrespondanceRefEquipement("blade-server--28")).thenReturn(mapper.readValue(""" @@ -150,7 +150,7 @@ class EnrichissementEquipementPhysiqueServiceTest { @Test - void testServiceEnrichissementEquipementPhysqique_typeEquipement() throws JsonProcessingException { + void testServiceEnrichissementEquipementPhysique_typeEquipement() throws JsonProcessingException { /* MOCK REFERENTIEL : CorrespondanceRefEquipement */ Mockito.when(referentielClient.getTypeEquipement("Server")).thenReturn(mapper.readValue(""" @@ -163,6 +163,8 @@ class EnrichissementEquipementPhysiqueServiceTest { var impactEquipementDTO = new ImpactEquipementDTO(); impactEquipementDTO.setValeur(2.2); + equipementPhysiqueDTO.setModele(null); + Mockito.when(referentielClient.getImpactEquipement(eq("default-ref-server"), any(), any())).thenReturn(impactEquipementDTO); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); 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 f0faabc32f03e6e6460dc04da04e83c38fd38c0b..8ed1eabfe75d977546e740d462ac527709d939b8 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 @@ -103,11 +103,15 @@ public class ErrorManagementService { // CA 1.5 // L'ajout d'un équipement physique dont le type d'équipement ne possède pas de refEquipementParDefaut et dont le Modele n'est pas présent dans la table des ref_CorrespondanceRefEqP sort l'erreur suivante dans le rapport de contrôle if (StringUtils.isBlank(refEquipementParDefaut)) { - CorrespondanceRefEquipementDTO refCorrespondance = referentielServicePort.getCorrespondance(equipementPhysique.getModele()); - if (refCorrespondance == null) { + if (equipementPhysique.getModele() == null) { erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_CORRESPONDANCE_INCONNUE").formatted(equipementPhysique.getNomEquipementPhysique(), equipementPhysique.getType())); } else { - refEquipement = refCorrespondance.getRefEquipementCible(); + CorrespondanceRefEquipementDTO refCorrespondance = referentielServicePort.getCorrespondance(equipementPhysique.getModele()); + if (refCorrespondance == null) { + erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_CORRESPONDANCE_INCONNUE").formatted(equipementPhysique.getNomEquipementPhysique(), equipementPhysique.getType())); + } else { + refEquipement = refCorrespondance.getRefEquipementCible(); + } } } 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 index 7f3d0c3fed86e0c14109f9e299091d19d1ca4bfd..d49ebddcbe2ecaedb34ffb0b029e400a8b722e9a 100644 --- 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 @@ -16,6 +16,7 @@ import org.mte.numecoeval.expositiondonneesentrees.domain.model.EquipementPhysiq import org.mte.numecoeval.expositiondonneesentrees.domain.model.OperationNonIT; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.output.ReferentielServicePort; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.config.MessageProperties; +import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.CorrespondanceRefEquipementDTO; import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.CritereDTO; import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.EtapeDTO; import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.FacteurCaracterisationDTO; @@ -165,7 +166,88 @@ public class ErrorManagementServiceTest { } @Test - void importOperationNonIT_with_TypeNotInRefType_shouldReturnReportWith1Error() { + void importEqPhysique_shouldReturnReportWithoutError() { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .dureeUsageInterne(1.0) + .dureeUsageAval(0.0) + .statut("In use") + .paysDUtilisation("France") + .build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, "ref"); + Assertions.assertFalse(actual.getKey().stream().anyMatch("L'équipement physical-eq-001 de type null ne possède pas de référence d'équipement par défaut dans la table ref_type_item et pas de correspondance dans la table ref_correspondance_ref_eqp"::equals)); + } + + @Test + void importEqPhysique_with_ModeleNull_shouldReturnReportWith1Error() { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .type("phone") + .dureeUsageInterne(1.0) + .dureeUsageAval(0.0) + .statut("In use") + .paysDUtilisation("France") + .build(); + + Mockito.lenient().when(referentielServicePort.getCorrespondance(eq1.getType())).thenReturn(null); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + Assertions.assertTrue(actual.getKey().stream().anyMatch("L'équipement physical-eq-001 de type phone ne possède pas de référence d'équipement par défaut dans la table ref_type_item et pas de correspondance dans la table ref_correspondance_ref_eqp"::equals)); + } + + @Test + void importEqPhysique_with_ModeleAndCorrepondance_shouldReportWithoutError() throws JsonProcessingException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .modele("P123") + .type("phone") + .dureeUsageInterne(1.0) + .dureeUsageAval(0.0) + .statut("In use") + .paysDUtilisation("France") + .build(); + + /* MOCK REFERENTIEL : CorrespondanceRefEquipement */ + Mockito.lenient().when(referentielServicePort.getCorrespondance(eq1.getModele())).thenReturn(mapper.readValue(""" + { + "modeleEquipementSource": "P123", + "refEquipementCible": "smartphone-1" + } + """, CorrespondanceRefEquipementDTO.class)); + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + Assertions.assertFalse(actual.getKey().stream().anyMatch("L'équipement physical-eq-001 de type null ne possède pas de référence d'équipement par défaut dans la table ref_type_item et pas de correspondance dans la table ref_correspondance_ref_eqp"::equals)); + } + + @Test + void importEqPhysique_with_Modele_without_Correspondance_shouldReturnReportWith1Error() throws JsonProcessingException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .type("phone") + .dureeUsageInterne(1.0) + .dureeUsageAval(0.0) + .statut("In use") + .paysDUtilisation("France") + .build(); + + /* MOCK REFERENTIEL : CorrespondanceRefEquipement */ + Mockito.lenient().when(referentielServicePort.getCorrespondance(eq1.getModele())).thenReturn(mapper.readValue(""" + { + "modeleEquipementSource": "P123", + "refEquipementCible": "smartphone-1" + } + """, CorrespondanceRefEquipementDTO.class)); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + Assertions.assertTrue(actual.getKey().stream().anyMatch("L'équipement physical-eq-001 de type phone ne possède pas de référence d'équipement par défaut dans la table ref_type_item et pas de correspondance dans la table ref_correspondance_ref_eqp"::equals)); + } + + @Test + void importOperationNonIT_with_TypeNotInRefType_shouldNotReturnError() { OperationNonIT eq1 = OperationNonIT.builder() .nomItemNonIT("Batiment_datacenter_St_Malo") .quantite(1.0)