diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java index 2b1557429d22610d08bbe2389ff8ebec0ddb5a4c..5a2cf1ad0b7098645e7e4a3442c728fe82ebb6ec 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java @@ -10,6 +10,7 @@ import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.ImportDonn import org.mte.numecoeval.expositiondonneesentrees.domain.ports.output.ReferentielServicePort; import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.StatutTraitement; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.helper.CSVHelper; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.DefaultValueService; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.ErrorManagementService; import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.TypeEquipementDTO; import org.slf4j.Logger; @@ -51,6 +52,8 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { final ErrorManagementService errorManagementService; + final DefaultValueService defaultValueService; + final Map<String, String> errorMessages; @Value("#{'${constraints.mode-utilisation}'.split(',')}") @@ -190,6 +193,7 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { .setTrim(true) .setSkipHeaderRecord(true) .build().parse(reader); + records.forEach(csvRecord -> { String typeEquipement = csvRecord.get("type"); @@ -207,13 +211,6 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { Float goTelecharge = goTelechargeStr == null ? null : NumberUtils.toFloat(goTelechargeStr); var tauxUtilisationStr = CSVHelper.safeString(csvRecord, "tauxUtilisation"); Double tauxUtilisation = NumberUtils.isCreatable(tauxUtilisationStr) ? NumberUtils.toDouble(tauxUtilisationStr) : null; - if (tauxUtilisation != null && (tauxUtilisation < 0 || tauxUtilisation > 1)) { - tauxUtilisation = null; - } - var modeUtilisation = CSVHelper.safeString(csvRecord, "modeUtilisation"); - if (!modeUtilisationList.contains(modeUtilisation)) { - modeUtilisation = null; - } EquipementPhysique equipementToAdd = EquipementPhysique.builder() .statutTraitement(STATUT_TRAITEMENT_EN_ATTENTE) @@ -232,7 +229,7 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { .nbCoeur(CSVHelper.safeString(csvRecord, "nbCoeur")) .nomCourtDatacenter(CSVHelper.safeString(csvRecord, "nomCourtDatacenter", "refDatacenter")) .goTelecharge(goTelecharge) - .modeUtilisation(modeUtilisation) + .modeUtilisation(CSVHelper.safeString(csvRecord, "modeUtilisation")) .tauxUtilisation(tauxUtilisation) .nbJourUtiliseAn(CSVHelper.safeDouble(csvRecord, "nbJourUtiliseAn")) .consoElecAnnuelle(CSVHelper.safeDouble(csvRecord, "consoElecAnnuelle")) @@ -244,7 +241,7 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { var erreurs = errorManagementService.checkEquipementPhysique(equipementToAdd, refTypeEquipementOpt.get().getRefEquipementParDefaut()); rapportImport.getErreurs().addAll(erreurs.getKey()); avertissements.addAll(erreurs.getValue()); - + defaultValueService.setEquipementValeurDefaut(equipementToAdd); domainModels.add(equipementToAdd); } }); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/ApplicationPortConfig.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/ApplicationPortConfig.java index 7a62c6b92eb85a818dda843aadf2fcb05f9e3fb7..3a321cd0444f88efa35f3e02e7727722b01f4a21 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/ApplicationPortConfig.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/config/ApplicationPortConfig.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.ImportDonneesEntreePort; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.impl.ImportDonneesEntreePortImpl; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.output.ReferentielServicePort; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.DefaultValueService; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.ErrorManagementService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -17,13 +18,13 @@ import java.util.List; public class ApplicationPortConfig { private ReferentielServicePort referentielServicePort; - private ErrorManagementService errorManagementService; + private DefaultValueService defaultValueService; private MessageProperties messageProperties; private List<String> modeUtilisationList; @Bean public ImportDonneesEntreePort importDonneesEntreePort() { - return new ImportDonneesEntreePortImpl(referentielServicePort, errorManagementService, messageProperties.getMessages(), modeUtilisationList); + return new ImportDonneesEntreePortImpl(referentielServicePort, errorManagementService, defaultValueService, messageProperties.getMessages(), modeUtilisationList); } } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java new file mode 100644 index 0000000000000000000000000000000000000000..7d2a97d670fcd3e25ab03378bd201bf810d1cddd --- /dev/null +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java @@ -0,0 +1,32 @@ +package org.mte.numecoeval.expositiondonneesentrees.infrastructure.service; + +import lombok.AllArgsConstructor; +import org.mte.numecoeval.expositiondonneesentrees.domain.model.EquipementPhysique; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@AllArgsConstructor +public class DefaultValueService { + + @Value("#{'${constraints.mode-utilisation}'.split(',')}") + private List<String> modeUtilisationList; + + /** + * fonction à effet de bord qui permet de réaffecter certaines variables à leur valeur par défaut lorsque leur valeur initiale est incorrecte (créé un avertissement) + * + * @param equipementPhysique un equipementPhysique à enregistrer en base + */ + public void setEquipementValeurDefaut(EquipementPhysique equipementPhysique) { + if (equipementPhysique.getModeUtilisation() != null && !modeUtilisationList.contains(equipementPhysique.getModeUtilisation())) { + equipementPhysique.setModeUtilisation(null); + } + + Double taux = equipementPhysique.getTauxUtilisation(); + if (taux != null && (taux < 0 || taux > 1)) { + equipementPhysique.setTauxUtilisation(null); + } + } +} diff --git a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/domain/port/input/ImportDonneesEntreePortImplTest.java b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/domain/port/input/ImportDonneesEntreePortImplTest.java index a92ad7fc80a14c33aa6e99fc16bb9a3482731263..d4063d474093e97c63092d189b33dea4f9fdb10d 100644 --- a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/domain/port/input/ImportDonneesEntreePortImplTest.java +++ b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/domain/port/input/ImportDonneesEntreePortImplTest.java @@ -9,6 +9,7 @@ import org.mockito.MockitoAnnotations; import org.mte.numecoeval.expositiondonneesentrees.domain.model.*; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.impl.ImportDonneesEntreePortImpl; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.output.ReferentielServicePort; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.DefaultValueService; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.ErrorManagementService; import org.springframework.web.multipart.MultipartFile; @@ -31,12 +32,14 @@ class ImportDonneesEntreePortImplTest { ImportDonneesEntreePortImpl importDonneesEntreePort; ErrorManagementService errorManagementService; + DefaultValueService defaultValueService; + private List<String> modeUtilisationList; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); - importDonneesEntreePort = new ImportDonneesEntreePortImpl(referentielServicePort, errorManagementService, errorMessages, modeUtilisationList); + importDonneesEntreePort = new ImportDonneesEntreePortImpl(referentielServicePort, errorManagementService, defaultValueService, errorMessages, modeUtilisationList); } @Test diff --git a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueServiceTest.java b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..71e0a0470bca9620e5dfe2f610da912d103eb62c --- /dev/null +++ b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueServiceTest.java @@ -0,0 +1,63 @@ +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.junit.jupiter.MockitoExtension; +import org.mte.numecoeval.expositiondonneesentrees.domain.model.EquipementPhysique; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +@ExtendWith(MockitoExtension.class) +public class DefaultValueServiceTest { + @InjectMocks + DefaultValueService defaultValueService; + private String mode = "COPE"; + + @BeforeEach + public void init() { + List<String> modeUtilisationList = List.of(mode); + defaultValueService = new DefaultValueService(modeUtilisationList); + } + + public EquipementPhysique equipementPhysique() { + return EquipementPhysique.builder().build(); + } + + @Test + void importEqPhysique_with_TauxUtilisationBiggerThan1_shouldBeReplacedByNull() { + EquipementPhysique eq1 = equipementPhysique(); + eq1.setTauxUtilisation(21.0); + defaultValueService.setEquipementValeurDefaut(eq1); + assertNull(eq1.getTauxUtilisation()); + } + + @Test + void importEqPhysique_with_TauxUtilisationOK_shouldReturnSameTaux() { + EquipementPhysique eq1 = equipementPhysique(); + double tauxOK = 0.74; + eq1.setTauxUtilisation(tauxOK); + defaultValueService.setEquipementValeurDefaut(eq1); + assertEquals(tauxOK, eq1.getTauxUtilisation(), 0.01); + } + + @Test + void importEqPhysique_with_ModeUtilisationKO_shouldBeReplacedByNull() { + EquipementPhysique eq1 = equipementPhysique(); + eq1.setModeUtilisation("MODE_INCONNU"); + defaultValueService.setEquipementValeurDefaut(eq1); + assertNull(eq1.getModeUtilisation()); + } + + @Test + void importEqPhysique_with_ModeUtilisationOK_shouldReturnSameMode() { + EquipementPhysique eq1 = equipementPhysique(); + eq1.setModeUtilisation(mode); + defaultValueService.setEquipementValeurDefaut(eq1); + assertEquals(mode, eq1.getModeUtilisation()); + } +}