From 7ae791238bd31341b1f994cdae57a56a1548575f Mon Sep 17 00:00:00 2001 From: OURY Sarah <sarah.oury@soprasteria.com> Date: Tue, 23 Jul 2024 15:52:50 +0000 Subject: [PATCH] [SOY] Utilisation nouvelles api --- CHANGELOG.md | 1 + e2e/5_assert.sh | 1 - .../EquipementPhysique_hors_serveur.csv | 2 +- services/.workspace/.idea/compiler.xml | 55 - .../model/CalculEquipementPhysique.java | 7 +- .../calculs/domain/model/CalculSizes.java | 1 - .../client/ReferentielClient.java | 49 - .../config/DomainConfiguration.java | 6 - .../rest/calculs/CalculsReseauController.java | 40 - .../infrastructure/mapper/DomainMapper.java | 14 - .../mapper/ReferentielMapper.java | 16 - .../repository/IndicateurRepository.java | 32 +- .../CalculEquipementPhysiqueService.java | 5 +- .../service/calcul/CalculReseauService.java | 58 - .../IntegrationCalculEquipementsService.java | 6 +- ...richissementEquipementPhysiqueService.java | 44 +- .../ApiEventCalculsApplicationTests.java | 12 +- .../calcul/CalculReseauServiceTest.java | 42 - ...issementEquipementPhysiqueServiceTest.java | 103 +- .../resources/input/equipementPhysique.json | 89 +- .../impl/ImportDonneesEntreePortImpl.java | 7 +- .../ports/output/ReferentielServicePort.java | 4 - .../adapters/ReferentielRestClient.java | 35 +- .../service/ErrorManagementService.java | 2 +- .../utils/Constants.java | 1 + ...DemandeCalculImpactEquipementPhysique.java | 43 +- .../DemandeCalculImpactOperationNonIT.java | 3 +- .../demande/DemandeCalculImpactReseau.java | 30 - .../data/entree/EquipementPhysique.java | 8 +- ...eferentielCorrespondanceRefEquipement.java | 6 +- .../ReferentielImpactEquipement.java | 16 - .../referentiel/ReferentielImpactReseau.java | 19 - .../referentiel/ReferentielMixElectrique.java | 14 - .../ReferentielTypeEquipement.java | 24 - .../TraceCalculImpactEquipementPhysique.java | 4 +- .../service/CalculImpactReseauService.java | 12 - ...ulImpactEquipementPhysiqueServiceImpl.java | 55 +- .../impl/CalculImpactReseauServiceImpl.java | 133 - ...reeDeVieEquipementPhysiqueServiceImpl.java | 8 +- ...ceCalculImpactEquipementPhysiqueUtils.java | 4 +- .../traceur/TraceCalculImpactReseauUtils.java | 44 - ...ulImpactEquipementPhysiqueServiceTest.java | 2768 ++++++----------- .../CalculImpactReseauServiceTest.java | 215 -- ...reeDeVieEquipementPhysiqueServiceTest.java | 34 +- .../steps/DataTableTypeDefinitions.java | 6 +- 45 files changed, 1166 insertions(+), 2912 deletions(-) delete mode 100644 services/.workspace/.idea/compiler.xml delete mode 100644 services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/rest/calculs/CalculsReseauController.java delete mode 100644 services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauService.java delete mode 100644 services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauServiceTest.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactReseau.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactEquipement.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactReseau.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielMixElectrique.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielTypeEquipement.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactReseauService.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactReseauServiceImpl.java delete mode 100644 services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactReseauUtils.java delete mode 100644 services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactReseauServiceTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7caa7ee2..cd8753fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tous les changements de ce projet seront documentés dans ce document. ## [Non livré] +- Nettoyage du code : Enlever tous les appels aux anciennes API (impactReseau, impactEquipement, mixelec et typeEquipement), les API restent fonctionnelles mais ne sont plus appelées par les autres composants - Nettoyage : Supression des tables, Entities et Repositories plus utilisés (pour MixElectrique, ImpactEquipement, ImpactReseau & TypeEquipement) - Lancer les calculs sur uniquement quelques critères et/ou étapes -> [Issue6](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/6) diff --git a/e2e/5_assert.sh b/e2e/5_assert.sh index 03c217fb..93b6a5e0 100644 --- a/e2e/5_assert.sh +++ b/e2e/5_assert.sh @@ -18,7 +18,6 @@ mkdir actual export_table equipementPhysique conso_elec_moyenne,critere,etapeacv,impact_unitaire,nom_entite,nom_entite_discriminator,nom_equipement,nom_source_donnee,nom_source_donnee_discriminator,quantite,source,statut_equipement_physique,statut_indicateur,trace,type_equipement,unite,version_calcul,qualite export_table equipementVirtuel cluster,conso_elec_moyenne,critere,etapeacv,impact_unitaire,nom_entite,nom_entite_discriminator,nom_equipement,nom_equipement_virtuel,nom_source_donnee,nom_source_donnee_discriminator,source,statut_indicateur,trace,unite,version_calcul,qualite export_table application conso_elec_moyenne,critere,domaine,etapeacv,impact_unitaire,nom_application,nom_entite,nom_entite_discriminator,nom_equipement_physique,nom_equipement_virtuel,nom_source_donnee,nom_source_donnee_discriminator,source,sous_domaine,statut_indicateur,trace,type_environnement,unite,version_calcul,qualite -export_table reseau etapeacv,critere,source,statut_indicateur,trace,version_calcul,impact_unitaire,unite,nom_entite,nom_equipement export_table operationNonIT conso_elec_moyenne,critere,etapeacv,impact_unitaire,nom_entite,nom_entite_discriminator,nom_item_non_it,nom_source_donnee,nom_source_donnee_discriminator,quantite,source,statut_indicateur,trace,type_item,unite,version_calcul,qualite ALL_OK=true diff --git a/e2e/input_template/EquipementPhysique_hors_serveur.csv b/e2e/input_template/EquipementPhysique_hors_serveur.csv index d4e39e30..c2169111 100644 --- a/e2e/input_template/EquipementPhysique_hors_serveur.csv +++ b/e2e/input_template/EquipementPhysique_hors_serveur.csv @@ -8,7 +8,7 @@ physical-eq-006;PIXEL 6;1;;2022-10-18;2022-12-18;0.1;0.2;0.2;Communication Devic 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;;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-010;Cisco 5672UP;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;;;; physical-eq-013;HP 8470w;2;;2025-08-23;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; diff --git a/services/.workspace/.idea/compiler.xml b/services/.workspace/.idea/compiler.xml deleted file mode 100644 index 84cc240a..00000000 --- a/services/.workspace/.idea/compiler.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="CompilerConfiguration"> - <annotationProcessing> - <profile default="true" name="Default" enabled="true" /> - <profile name="Maven default annotation processors profile" enabled="true"> - <sourceOutputDir name="target/generated-sources/annotations" /> - <sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> - <outputRelativeToContentRoot value="true" /> - </profile> - <profile name="Annotation profile for common" enabled="true"> - <sourceOutputDir name="target/generated-sources/annotations" /> - <sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> - <outputRelativeToContentRoot value="true" /> - <processorPath useClasspath="false"> - <entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.5.5.Final/mapstruct-processor-1.5.5.Final.jar" /> - <entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.5.5.Final/mapstruct-1.5.5.Final.jar" /> - <entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" /> - <entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok-mapstruct-binding/0.2.0/lombok-mapstruct-binding-0.2.0.jar" /> - <entry name="$MAVEN_REPOSITORY$/com/github/therapi/therapi-runtime-javadoc-scribe/0.15.0/therapi-runtime-javadoc-scribe-0.15.0.jar" /> - <entry name="$MAVEN_REPOSITORY$/com/github/therapi/therapi-runtime-javadoc/0.15.0/therapi-runtime-javadoc-0.15.0.jar" /> - <entry name="$MAVEN_REPOSITORY$/org/instancio/instancio-processor/2.2.0/instancio-processor-2.2.0.jar" /> - <entry name="$MAVEN_REPOSITORY$/org/instancio/instancio-core/2.2.0/instancio-core-2.2.0.jar" /> - <entry name="$MAVEN_REPOSITORY$/org/jetbrains/annotations/23.1.0/annotations-23.1.0.jar" /> - </processorPath> - <module name="api-referentiel" /> - <module name="api-event-indicateurs" /> - <module name="common" /> - <module name="api-event-enrichissement" /> - <module name="api-rest-caculs" /> - <module name="calculs" /> - <module name="api-expositiondonneesentrees" /> - <module name="api-event-donneesEntrees" /> - <module name="api-event-calculs" /> - </profile> - </annotationProcessing> - <bytecodeTargetLevel> - <module name="api-event-calcul-indicateurs" target="17" /> - <module name="api-event-enrichissement" target="17" /> - <module name="api-expositionDonneesEntrees" target="17" /> - </bytecodeTargetLevel> - </component> - <component name="JavacSettings"> - <option name="ADDITIONAL_OPTIONS_OVERRIDE"> - <module name="api-event-calculs" options="-parameters" /> - <module name="api-event-donneesEntrees" options="-parameters" /> - <module name="api-expositiondonneesentrees" options="-parameters" /> - <module name="api-referentiel" options="-parameters" /> - <module name="api-rest-caculs" options="-parameters" /> - <module name="calculs" options="-parameters" /> - <module name="common" options="-parameters" /> - <module name="core" options="-parameters" /> - </option> - </component> -</project> \ No newline at end of file diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculEquipementPhysique.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculEquipementPhysique.java index 170b5cd6..9356ac3d 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculEquipementPhysique.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculEquipementPhysique.java @@ -17,8 +17,7 @@ public class CalculEquipementPhysique { private List<HypotheseDTO> hypotheses; private CorrespondanceRefEquipementDTO correspondanceRefEquipement; private EquipementPhysiqueDTO equipementPhysique; - private TypeEquipementDTO typeEquipement; - private List<MixElectriqueDTO> mixElectriques; - private List<ImpactReseauDTO> impactsReseau; - private List<ImpactEquipementDTO> impactsEquipement; + private TypeItemDTO typeItem; + private List<FacteurCaracterisationDTO> facteurCaracterisations; + } \ No newline at end of file diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculSizes.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculSizes.java index 89f9b898..5bb2028b 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculSizes.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/domain/model/CalculSizes.java @@ -12,7 +12,6 @@ public class CalculSizes { private long nbIndicateurEquipementPhysique; private long nbIndicateurEquipementVirtuel; private long nbIndicateurApplication; - private long nbIndicateurReseau; private long nbIndicateurOperationNonIT; private long nbIndicateurMessagerie; } diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/client/ReferentielClient.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/client/ReferentielClient.java index ba9e0e06..ad6ddc9f 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/client/ReferentielClient.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/client/ReferentielClient.java @@ -71,18 +71,6 @@ public class ReferentielClient { return null; } - @Cacheable(value = "TypeEquipement") - public TypeEquipementDTO getTypeEquipement(String type) { - try { - return interneNumEcoEvalApi.getTypeEquipement(type).block(); - } catch (WebClientResponseException e) { - if (e.getStatusCode() != HttpStatusCode.valueOf(404)) { - throw new ExternalApiException(e); - } - } - return null; - } - @Cacheable(value = "TypeItem") public TypeItemDTO getTypeItem(String type) { try { @@ -95,43 +83,6 @@ public class ReferentielClient { return null; } - @Cacheable(value = "ImpactEquipement") - public ImpactEquipementDTO getImpactEquipement(String refEquipement, String critere, String etape) { - try { - return interneNumEcoEvalApi.getImpactEquipement(refEquipement, critere, etape).block(); - } catch (WebClientResponseException e) { - if (e.getStatusCode() != HttpStatusCode.valueOf(404)) { - throw new ExternalApiException(e); - } - } - return null; - } - - @Cacheable(value = "ImpactReseau") - public ImpactReseauDTO getImpactReseau(String refReseau, String critere, String etape) { - try { - return interneNumEcoEvalApi.getImpactReseau(refReseau, critere, etape).block(); - } catch (WebClientResponseException e) { - if (e.getStatusCode() != HttpStatusCode.valueOf(404)) { - throw new ExternalApiException(e); - } - } - return null; - } - - @Cacheable(value = "MixElectrique") - public MixElectriqueDTO getMixElectrique(String pays, String critere) { - if (pays == null || critere == null) return null; - try { - return interneNumEcoEvalApi.getMixElectrique(pays, critere).block(); - } catch (WebClientResponseException e) { - if (e.getStatusCode() != HttpStatusCode.valueOf(404)) { - throw new ExternalApiException(e); - } - } - return null; - } - @Cacheable(value = "FacteurCaracterisationMixElec") public FacteurCaracterisationDTO getMixElectriqueFromFacteurCaracterisation(String critere, String localisation) { try { diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/DomainConfiguration.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/DomainConfiguration.java index d41eaae9..ff21d8a6 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/DomainConfiguration.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/DomainConfiguration.java @@ -30,12 +30,6 @@ public class DomainConfiguration { return new CalculImpactApplicationServiceImpl(); } - - @Bean - public CalculImpactReseauService calculImpactReseauService() { - return new CalculImpactReseauServiceImpl(); - } - @Bean public CalculImpactOperationNonITService calculImpactOperationNonITService() { return new CalculImpactOperationNonITServiceImpl(); diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/rest/calculs/CalculsReseauController.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/rest/calculs/CalculsReseauController.java deleted file mode 100644 index f859f330..00000000 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/rest/calculs/CalculsReseauController.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.mte.numecoeval.calculs.infrastructure.controller.rest.calculs; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.AllArgsConstructor; -import org.mte.numecoeval.calculs.domain.port.input.service.impl.CalculImpactReseauServiceImpl; -import org.mte.numecoeval.calculs.infrastructure.mapper.DomainMapper; -import org.mte.numecoeval.calculs.infrastructure.service.rest.calculs.CheckIndicateurService; -import org.mte.numecoeval.calculs.rest.generated.api.model.DemandeCalculImpactReseauEquipementPhysiqueRest; -import org.mte.numecoeval.calculs.rest.generated.api.model.IndicateurImpactReseauRest; -import org.mte.numecoeval.calculs.rest.generated.api.server.CalculsReseauApi; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@AllArgsConstructor -public class CalculsReseauController implements CalculsReseauApi { - - DomainMapper domainMapper; - - ObjectMapper objectMapper; - - CheckIndicateurService checkIndicateurService; - - /** - * POST /calculs/reseau/equipementPhysique - * - * @param demandeCalculImpactReseauEquipementPhysiqueRest (required) - * @return la liste d'indicateurs calcules - */ - @Override - public ResponseEntity<IndicateurImpactReseauRest> calculerImpactReseau(DemandeCalculImpactReseauEquipementPhysiqueRest demandeCalculImpactReseauEquipementPhysiqueRest) { - var demandeCalcul = domainMapper.toDomain(demandeCalculImpactReseauEquipementPhysiqueRest); - - var indicateur = new CalculImpactReseauServiceImpl().calculerImpactReseau(demandeCalcul); - - return checkIndicateurService.isOk(indicateur.getStatutIndicateur()) ? - ResponseEntity.ok(domainMapper.toRest(indicateur)) : - ResponseEntity.badRequest().body(domainMapper.toRest(indicateur)); - } -} diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/DomainMapper.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/DomainMapper.java index 47ef6c1b..94c276a0 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/DomainMapper.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/DomainMapper.java @@ -26,8 +26,6 @@ public interface DomainMapper { /* Référentiels */ - ReferentielTypeEquipement toDomain(TypeEquipementRest rest); - ReferentielCorrespondanceRefEquipement toDomain(CorrespondanceRefEquipementRest rest); ReferentielHypothese toDomain(HypotheseRest rest); @@ -36,13 +34,6 @@ public interface DomainMapper { ReferentielCritere toDomain(CritereRest rest); - ReferentielImpactEquipement toDomain(ImpactEquipementRest rest); - - @Mapping(source = "valeur", target = "impactReseauMobileMoyen") - ReferentielImpactReseau toDomain(ImpactReseauRest rest); - - ReferentielMixElectrique toDomain(MixElectriqueRest rest); - ReferentielImpactMessagerie toDomain(ImpactMessagerieRest rest); /*Indicateurs*/ @@ -58,8 +49,6 @@ public interface DomainMapper { IndicateurImpactApplicationRest toRest(ImpactApplication domain); - IndicateurImpactReseauRest toRest(ImpactReseau domain); - IndicateurImpactOperationNonITRest toRest(ImpactOperationNonIT domain); IndicateurImpactMessagerieRest toRest(ImpactMessagerie domain); @@ -68,9 +57,6 @@ public interface DomainMapper { @Mapping(target = "dateCalcul", expression = "java(java.time.LocalDateTime.now())") DemandeCalculImpactEquipementPhysique toDomain(DemandeCalculImpactEquipementPhysiqueRest rest); - @Mapping(target = "dateCalcul", expression = "java(java.time.LocalDateTime.now())") - DemandeCalculImpactReseau toDomain(DemandeCalculImpactReseauEquipementPhysiqueRest rest); - @Mapping(target = "dateCalcul", expression = "java(java.time.LocalDateTime.now())") DemandeCalculImpactEquipementVirtuel toDomain(DemandeCalculEquipementVirtuelRest rest); diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/ReferentielMapper.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/ReferentielMapper.java index 6624cc54..4d078347 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/ReferentielMapper.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/mapper/ReferentielMapper.java @@ -1,7 +1,6 @@ package org.mte.numecoeval.calculs.infrastructure.mapper; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; import org.mte.numecoeval.calculs.domain.data.referentiel.*; import org.mte.numecoeval.calculs.referentiels.generated.api.model.*; @@ -14,11 +13,6 @@ public interface ReferentielMapper { ReferentielCritere toCritere(CritereDTO critereDTO); - @Mapping(source = "valeur", target = "impactReseauMobileMoyen") - ReferentielImpactReseau toImpactReseau(ImpactReseauDTO impactReseauDTO); - - List<ReferentielImpactReseau> toListImpactReseau(List<ImpactReseauDTO> impactReseauDTO); - ReferentielHypothese toHypothese(HypotheseDTO hypotheseDTO); List<ReferentielHypothese> toListHypothese(List<HypotheseDTO> hypotheseDTO); @@ -27,21 +21,11 @@ public interface ReferentielMapper { List<ReferentielFacteurCaracterisation> toListFacteurCaracterisation(List<FacteurCaracterisationDTO> facteurCaracterisationDTO); - ReferentielImpactEquipement toImpactEquipement(ImpactEquipementDTO impactEquipementDTO); - - List<ReferentielImpactEquipement> toListImpactEquipement(List<ImpactEquipementDTO> impactEquipementDTO); - - ReferentielMixElectrique toMixElectrique(MixElectriqueDTO mixElectriqueDTO); - - List<ReferentielMixElectrique> toListMixElectrique(List<MixElectriqueDTO> mixElectriqueDTO); - ReferentielImpactMessagerie toImpactMessagerie(ImpactMessagerieDTO impactMessagerieDTO); List<ReferentielImpactMessagerie> toListImpactMessagerie(List<ImpactMessagerieDTO> impactMessagerieDTO); ReferentielCorrespondanceRefEquipement toCorrespondanceRefEquipement(CorrespondanceRefEquipementDTO dto); - ReferentielTypeEquipement toTypeEquipement(TypeEquipementDTO dto); - ReferentielTypeItem toTypeItem(TypeItemDTO dto); } diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/IndicateurRepository.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/IndicateurRepository.java index a2148ebc..c26afae5 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/IndicateurRepository.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/IndicateurRepository.java @@ -89,8 +89,7 @@ public class IndicateurRepository { public void saveIndicateursEquipements( List<ImpactEquipementPhysique> impactsEquipementPhysique, List<ImpactEquipementVirtuel> impactsEquipementVirtuels, - List<ImpactApplication> impactsApplications, - List<ImpactReseau> impactsReseau + List<ImpactApplication> impactsApplications ) { if (impactsEquipementPhysique.isEmpty()) return; @@ -192,35 +191,6 @@ public class IndicateurRepository { ps.executeBatch(); } - - try (var ps = conn.prepareStatement(INSERT_RESEAU_QUERY)) { - - for (ImpactReseau indicateur : impactsReseau) { - ps.setTimestamp(1, PreparedStatementUtils.getTimestampFromLocalDateTime(indicateur.getDateCalcul())); - ps.setDate(2, PreparedStatementUtils.getDateFromLocalDate(indicateur.getDateLot())); - ps.setDate(3, PreparedStatementUtils.getDateFromLocalDate(Optional.ofNullable(indicateur.getDateLot()).orElse(LocalDate.EPOCH))); - ps.setString(4, indicateur.getNomOrganisation()); - ps.setString(5, StringUtils.defaultString(indicateur.getNomOrganisation())); - ps.setString(6, indicateur.getEtapeACV()); - ps.setString(7, indicateur.getCritere()); - ps.setString(8, indicateur.getNomEquipement()); - ps.setString(9, indicateur.getNomEntite()); - ps.setString(10, StringUtils.defaultString(indicateur.getNomEntite())); - ps.setString(11, indicateur.getSource()); - ps.setString(12, indicateur.getStatutIndicateur()); - ps.setString(13, indicateur.getTrace()); - ps.setString(14, indicateur.getVersionCalcul()); - PreparedStatementUtils.setDoubleValue(ps, 15, indicateur.getImpactUnitaire()); - ps.setString(16, indicateur.getUnite()); - ps.setString(17, indicateur.getNomLot()); - ps.setString(18, indicateur.getNomSourceDonnee()); - ps.setString(19, StringUtils.defaultString(indicateur.getNomSourceDonnee())); - ps.addBatch(); - } - - ps.executeBatch(); - } - conn.commit(); } catch (SQLException e) { log.error("Une erreur s'est produite lors de l'insertion dans PostgreSQL. Exception: ", e); diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java index c1102a25..4fdb49aa 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java @@ -51,11 +51,10 @@ public class CalculEquipementPhysiqueService { .equipementPhysique(entreesMapper.toDomain(calculEquipementPhysique.getEquipementPhysique())) .etape(referentielMapper.toEtape(etapeDTO)) .critere(referentielMapper.toCritere(critereDTO)) - .typeEquipement(referentielMapper.toTypeEquipement(calculEquipementPhysique.getTypeEquipement())) + .typeItem(referentielMapper.toTypeItem(calculEquipementPhysique.getTypeItem())) .correspondanceRefEquipement(referentielMapper.toCorrespondanceRefEquipement(calculEquipementPhysique.getCorrespondanceRefEquipement())) .hypotheses(referentielMapper.toListHypothese(calculEquipementPhysique.getHypotheses())) - .mixElectriques(referentielMapper.toListMixElectrique(calculEquipementPhysique.getMixElectriques())) - .impactEquipements(referentielMapper.toListImpactEquipement(calculEquipementPhysique.getImpactsEquipement())) + .facteurCaracterisations(referentielMapper.toListFacteurCaracterisation(calculEquipementPhysique.getFacteurCaracterisations())) .optionsCalcul(new OptionsCalcul(dureeUsage)) .build(); diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauService.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauService.java deleted file mode 100644 index 307fc4a6..00000000 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauService.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.mte.numecoeval.calculs.infrastructure.service.calcul; - -import lombok.AllArgsConstructor; -import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactReseau; -import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactReseau; -import org.mte.numecoeval.calculs.domain.model.CalculEquipementPhysique; -import org.mte.numecoeval.calculs.domain.port.input.service.CalculImpactReseauService; -import org.mte.numecoeval.calculs.infrastructure.mapper.EntreesMapper; -import org.mte.numecoeval.calculs.infrastructure.mapper.ReferentielMapper; -import org.mte.numecoeval.calculs.referentiels.generated.api.model.CritereDTO; -import org.mte.numecoeval.calculs.referentiels.generated.api.model.EtapeDTO; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@Service -@AllArgsConstructor -public class CalculReseauService { - - EntreesMapper entreesMapper; - ReferentielMapper referentielMapper; - - CalculImpactReseauService calculImpactReseauService; - - /** - * Calcule les impacts réseau d'un équipement physique - * Returne la liste d'impacts - * - * @param calculEquipementPhysique l'equipement physique - * @return la liste d'impacts - */ - public List<ImpactReseau> calculImpactReseau(CalculEquipementPhysique calculEquipementPhysique) { - - List<ImpactReseau> impactReseauList = new ArrayList<>(); - - if (calculEquipementPhysique == null || - calculEquipementPhysique.getEquipementPhysique() == null || - calculEquipementPhysique.getEquipementPhysique().getGoTelecharge() == null) return impactReseauList; - - LocalDateTime dateCalcul = LocalDateTime.now(); - - for (EtapeDTO etape : calculEquipementPhysique.getEtapes()) { - for (CritereDTO critere : calculEquipementPhysique.getCriteres()) { - impactReseauList.add(calculImpactReseauService.calculerImpactReseau(DemandeCalculImpactReseau.builder() - .dateCalcul(dateCalcul) - .equipementPhysique(entreesMapper.toDomain(calculEquipementPhysique.getEquipementPhysique())) - .etape(referentielMapper.toEtape(etape)) - .critere(referentielMapper.toCritere(critere)) - .impactsReseau(referentielMapper.toListImpactReseau(calculEquipementPhysique.getImpactsReseau())) - .build())); - } - } - - return impactReseauList; - } -} \ No newline at end of file diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/IntegrationCalculEquipementsService.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/IntegrationCalculEquipementsService.java index 1eff91ae..c3eb9545 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/IntegrationCalculEquipementsService.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/IntegrationCalculEquipementsService.java @@ -7,7 +7,6 @@ import org.mte.numecoeval.calculs.domain.data.entree.EquipementVirtuel; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactApplication; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementVirtuel; -import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactReseau; import org.mte.numecoeval.calculs.domain.model.CalculEquipementPhysique; import org.mte.numecoeval.calculs.domain.model.CalculSizes; import org.mte.numecoeval.calculs.infrastructure.repository.ApplicationRepository; @@ -33,7 +32,6 @@ public class IntegrationCalculEquipementsService { CalculEquipementPhysiqueService calculEquipementPhysiqueService; CalculEquipementVirtuelService calculEquipementVirtuelService; CalculApplicationService calculApplicationService; - CalculReseauService calculReseauService; /** * Calcul les impacts d'un équipement physique enrichi, liste des impacts: @@ -62,7 +60,6 @@ public class IntegrationCalculEquipementsService { var ttAfterClear = System.currentTimeMillis(); List<ImpactEquipementPhysique> impactEquipementPhysiqueList = calculEquipementPhysiqueService.calculImpactEquipementPhysique(calculEquipementPhysique); - List<ImpactReseau> impactReseauList = calculReseauService.calculImpactReseau(calculEquipementPhysique); // get equipements virtuels List<EquipementVirtuel> equipementVirtuelList = equipementVirtuelRepository.findEquipementVirtuels(nomOrganisation, nomLot, nomEquipementPhysique); @@ -95,7 +92,7 @@ public class IntegrationCalculEquipementsService { var ttAfterEqVAndApp = System.currentTimeMillis(); // save impacts into db - indicateurRepository.saveIndicateursEquipements(impactEquipementPhysiqueList, allImpactVirtuel, allImpactApplication, impactReseauList); + indicateurRepository.saveIndicateursEquipements(impactEquipementPhysiqueList, allImpactVirtuel, allImpactApplication); var ttAfterSave = System.currentTimeMillis(); @@ -124,7 +121,6 @@ public class IntegrationCalculEquipementsService { result.setNbIndicateurEquipementPhysique(impactEquipementPhysiqueList.size()); result.setNbIndicateurEquipementVirtuel(allImpactVirtuel.size()); result.setNbIndicateurApplication(allImpactApplication.size()); - result.setNbIndicateurReseau(impactReseauList.size()); return result; } } \ No newline at end of file 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 28043cc2..cf2ea565 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 @@ -79,52 +79,46 @@ public class EnrichissementEquipementPhysiqueService { }); calculEquipementPhysique.setHypotheses(hypotheses); + if (equipementPhysiqueDTO.getModele() != null) { calculEquipementPhysique.setCorrespondanceRefEquipement(referentielClient.getCorrespondanceRefEquipement(equipementPhysiqueDTO.getModele())); } - calculEquipementPhysique.setTypeEquipement(referentielClient.getTypeEquipement(equipementPhysiqueDTO.getType())); - calculEquipementPhysique.setImpactsEquipement(new ArrayList<>()); - calculEquipementPhysique.setImpactsReseau(new ArrayList<>()); - calculEquipementPhysique.setMixElectriques(new ArrayList<>()); + calculEquipementPhysique.setTypeItem(referentielClient.getTypeItem(equipementPhysiqueDTO.getType())); + + calculEquipementPhysique.setFacteurCaracterisations(new ArrayList<>()); for (var critere : calculEquipementPhysique.getCriteres()) { for (var etape : calculEquipementPhysique.getEtapes()) { if (calculEquipementPhysique.getCorrespondanceRefEquipement() != null) { - calculEquipementPhysique.getImpactsEquipement().add( - referentielClient.getImpactEquipement( - calculEquipementPhysique.getCorrespondanceRefEquipement().getRefEquipementCible(), + calculEquipementPhysique.getFacteurCaracterisations().add( + referentielClient.getFacteurCaracterisationByCritereAndEtapeAndNom( critere.getNomCritere(), - etape.getCode() + etape.getCode(), + calculEquipementPhysique.getCorrespondanceRefEquipement().getRefEquipementCible() ) ); - } else if (calculEquipementPhysique.getTypeEquipement() != null - && StringUtils.isNotBlank(calculEquipementPhysique.getTypeEquipement().getRefEquipementParDefaut())) { - calculEquipementPhysique.getImpactsEquipement().add( - referentielClient.getImpactEquipement( - calculEquipementPhysique.getTypeEquipement().getRefEquipementParDefaut(), + } else if (calculEquipementPhysique.getTypeItem() != null + && StringUtils.isNotBlank(calculEquipementPhysique.getTypeItem().getRefItemParDefaut())) { + calculEquipementPhysique.getFacteurCaracterisations().add( + referentielClient.getFacteurCaracterisationByCritereAndEtapeAndNom( critere.getNomCritere(), - etape.getCode() + etape.getCode(), + calculEquipementPhysique.getTypeItem().getRefItemParDefaut() ) ); } - calculEquipementPhysique.getImpactsReseau().add( - referentielClient.getImpactReseau( - "impactReseauMobileMoyen", - critere.getNomCritere(), - etape.getCode() - ) - ); } - var mixElec = referentielClient.getMixElectrique(equipementPhysiqueDTO.getPaysDUtilisation(), critere.getNomCritere()); - if (mixElec != null) calculEquipementPhysique.getMixElectriques().add(mixElec); + var mixElec = referentielClient.getMixElectriqueFromFacteurCaracterisation(critere.getNomCritere(), equipementPhysiqueDTO.getPaysDUtilisation()); + if (mixElec != null) calculEquipementPhysique.getFacteurCaracterisations().add(mixElec); if (equipementPhysiqueDTO.getDataCenter() != null && StringUtils.isNotBlank(equipementPhysiqueDTO.getDataCenter().getLocalisation()) && !StringUtils.equals(equipementPhysiqueDTO.getPaysDUtilisation(), equipementPhysiqueDTO.getDataCenter().getLocalisation())) { - var mixElecDataCenter = referentielClient.getMixElectrique(equipementPhysiqueDTO.getDataCenter().getLocalisation(), critere.getNomCritere()); - if (mixElecDataCenter != null) calculEquipementPhysique.getMixElectriques().add(mixElecDataCenter); + var mixElecDataCenter = referentielClient.getMixElectriqueFromFacteurCaracterisation(critere.getNomCritere(), equipementPhysiqueDTO.getDataCenter().getLocalisation()); + if (mixElecDataCenter != null) + calculEquipementPhysique.getFacteurCaracterisations().add(mixElecDataCenter); } } diff --git a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java index 4310c440..35979fc3 100644 --- a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java +++ b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java @@ -9,7 +9,10 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mte.numecoeval.calculs.domain.data.entree.Application; import org.mte.numecoeval.calculs.domain.data.entree.EquipementVirtuel; -import org.mte.numecoeval.calculs.domain.data.indicateurs.*; +import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactApplication; +import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; +import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementVirtuel; +import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactMessagerie; import org.mte.numecoeval.calculs.domain.model.CalculEquipementPhysique; import org.mte.numecoeval.calculs.domain.model.CalculMessagerie; import org.mte.numecoeval.calculs.infrastructure.repository.*; @@ -41,7 +44,6 @@ import static org.mockito.Mockito.times; @EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, DataSourceAutoConfiguration.class, KafkaAutoConfiguration.class}) class ApiEventCalculsApplicationTests { - @Autowired IntegrationCalculEquipementsService integrationCalculEquipementsService; @Autowired @@ -69,8 +71,6 @@ class ApiEventCalculsApplicationTests { ArgumentCaptor<List<ImpactEquipementPhysique>> captorImpactEqPh = ArgumentCaptor.forClass((Class) List.class); ArgumentCaptor<List<ImpactEquipementVirtuel>> captorImpactEqV = ArgumentCaptor.forClass((Class) List.class); ArgumentCaptor<List<ImpactApplication>> captorImpactApp = ArgumentCaptor.forClass((Class) List.class); - ArgumentCaptor<List<ImpactReseau>> captorImpactReseau = ArgumentCaptor.forClass((Class) List.class); - ArgumentCaptor<List<ImpactMessagerie>> captorImpactMsg = ArgumentCaptor.forClass((Class) List.class); @Test @@ -120,18 +120,16 @@ class ApiEventCalculsApplicationTests { integrationCalculEquipementsService.calculImpactEquipementPhysique(calculEquipementPhysique); /* CAPTURE Impacts lists */ - Mockito.verify(indicateurRepository, times(1)).saveIndicateursEquipements(captorImpactEqPh.capture(), captorImpactEqV.capture(), captorImpactApp.capture(), captorImpactReseau.capture()); + Mockito.verify(indicateurRepository, times(1)).saveIndicateursEquipements(captorImpactEqPh.capture(), captorImpactEqV.capture(), captorImpactApp.capture()); List<ImpactEquipementPhysique> actualImpactEqPh = captorImpactEqPh.getValue(); List<ImpactEquipementVirtuel> actualImpactEqV = captorImpactEqV.getValue(); List<ImpactApplication> actualImpactApp = captorImpactApp.getValue(); - List<ImpactReseau> actualImpactReseau = captorImpactReseau.getValue(); /* Check EXPECTED */ Assertions.assertEquals(4, actualImpactEqPh.size()); Assertions.assertEquals(4, actualImpactEqV.size()); Assertions.assertEquals(4, actualImpactApp.size()); - Assertions.assertEquals(4, actualImpactReseau.size()); /* Check all statutIndicateur = OK */ // Assertions.assertTrue(actualImpactEqPh.stream().allMatch(i -> "OK".equals(i.getStatutIndicateur()))); diff --git a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauServiceTest.java b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauServiceTest.java deleted file mode 100644 index 836abbc1..00000000 --- a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculReseauServiceTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.mte.numecoeval.calculs.infrastructure.service.calcul; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import org.junit.jupiter.api.Assertions; -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.calculs.domain.model.CalculEquipementPhysique; - -import java.util.List; - -@ExtendWith(MockitoExtension.class) -class CalculReseauServiceTest { - - @InjectMocks - CalculReseauService calculReseauService; - - private static final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); - - @Test - void testCalculImpactReseau_nullCases() throws JsonProcessingException { - Assertions.assertEquals(List.of(), calculReseauService.calculImpactReseau(null)); - - Assertions.assertEquals(List.of(), calculReseauService.calculImpactReseau(new CalculEquipementPhysique())); - - Assertions.assertEquals(List.of(), calculReseauService.calculImpactReseau(mapper.readValue(""" - { "equipementPhysique": {} } - """, CalculEquipementPhysique.class))); - - Assertions.assertEquals(List.of(), calculReseauService.calculImpactReseau(mapper.readValue(""" - { - "equipementPhysique": { - "goTelecharge": null - } - } - """, CalculEquipementPhysique.class))); - } - -} \ No newline at end of file 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 47f30be0..b7259e49 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 @@ -88,16 +88,22 @@ class EnrichissementEquipementPhysiqueServiceTest { /* MOCK REFERENTIEL : Etapes */ Mockito.lenient().when(referentielClient.getEtapes()).thenReturn(Arrays.asList(mapper.readValue(""" - [{ "code": "UTILISATION", "libelle": "Using" }] + [ + { "code": "FABRICATION", "libelle": "Manufacturing" }, + { "code": "DISTRIBUTION", "libelle": "Transportation" }, + { "code": "UTILISATION", "libelle": "Using" }, + { "code": "FIN_DE_VIE", "libelle": "End of Life" } + ] """, EtapeDTO[].class))); /* MOCK REFERENTIEL : Criteres */ Mockito.lenient().when(referentielClient.getCriteres()).thenReturn(Arrays.asList(mapper.readValue(""" - [{ - "nomCritere": "Climate change", - "unite": "kg CO2 eq", - "description": "Greenhouse gases (GHG)" - }] + [ + { "nomCritere": "Climate change" }, + { "nomCritere": "Particulate matter and respiratory inorganics" }, + { "nomCritere": "Ionising radiation" }, + { "nomCritere": "Acidification" } + ] """, CritereDTO[].class))); /* MOCK REFERENTIEL : Hypothese */ @@ -109,42 +115,11 @@ class EnrichissementEquipementPhysiqueServiceTest { } """, HypotheseDTO.class)); - /* MOCK REFERENTIEL : ImpactReseau */ - Mockito.lenient().when(referentielClient.getImpactReseau(any(), any(), any())).thenReturn(new ImpactReseauDTO()); - - /* MOCK REFERENTIEL : MixElectrique */ - var mixFr = new MixElectriqueDTO(); - mixFr.setPays("FR"); - Mockito.lenient().when(referentielClient.getMixElectrique("France", "Climate change")).thenReturn(mixFr); - Mockito.lenient().when(referentielClient.getMixElectrique(null, "Climate change")).thenReturn(null); - } - - void initMocksEtapesAndCriteres() throws JsonProcessingException { - /* MOCK REFERENTIEL : Etapes */ - Mockito.lenient().when(referentielClient.getEtapes()).thenReturn(Arrays.asList(mapper.readValue(""" - [{ "code": "FABRICATION", "libelle": "Manufacturing" }, - { "code": "DISTRIBUTION", "libelle": "Transportation" }, - { "code": "UTILISATION", "libelle": "Using" }, - { "code": "FIN_DE_VIE", "libelle": "End of Life" }] - """, EtapeDTO[].class))); - - Mockito.lenient().when(referentielClient.getCriteres()).thenReturn(Arrays.asList(mapper.readValue(""" - [{ - "nomCritere": "Climate change", - "unite": "kg CO2 eq", - "description": "Greenhouse gases (GHG)" - }, - { - "nomCritere": "Particulate matter and respiratory inorganics" - }, - { - "nomCritere": "Ionising radiation" - }, - { - "nomCritere": "Acidification" - }] - """, CritereDTO[].class))); + var mixFr = new FacteurCaracterisationDTO(); + mixFr.setLocalisation("FR"); + Mockito.lenient().when(referentielClient.getMixElectriqueFromFacteurCaracterisation("Climate change", "France")).thenReturn(mixFr); + Mockito.lenient().when(referentielClient.getMixElectriqueFromFacteurCaracterisation("Climate change", null)).thenReturn(null); } @Test @@ -163,20 +138,19 @@ class EnrichissementEquipementPhysiqueServiceTest { } """, CorrespondanceRefEquipementDTO.class)); - /* MOCK REFERENTIEL : ImpactEquipement */ - var impactEquipementDTO = new ImpactEquipementDTO(); - impactEquipementDTO.setValeur(1.1); + /* MOCK REFERENTIEL : FacteurCaracterisation */ + var fcDTO = new FacteurCaracterisationDTO(); + fcDTO.setValeur(1.1); - Mockito.when(referentielClient.getImpactEquipement(eq("cible"), any(), any())).thenReturn(impactEquipementDTO); + Mockito.when(referentielClient.getFacteurCaracterisationByCritereAndEtapeAndNom(any(), any(), eq("cible"))).thenReturn(fcDTO); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); - Assertions.assertEquals(1, actual.getEtapes().size()); - Assertions.assertEquals(1, actual.getCriteres().size()); + Assertions.assertEquals(4, actual.getEtapes().size()); + Assertions.assertEquals(4, actual.getCriteres().size()); Assertions.assertEquals(4, actual.getHypotheses().size()); - Assertions.assertEquals(1, actual.getMixElectriques().size()); - Assertions.assertEquals("FR", actual.getMixElectriques().get(0).getPays()); - Assertions.assertEquals(1.1, actual.getImpactsEquipement().get(0).getValeur()); + Assertions.assertEquals(17, actual.getFacteurCaracterisations().size()); + Assertions.assertEquals(1.1, actual.getFacteurCaracterisations().getFirst().getValeur()); Assertions.assertEquals("HAUTE", actual.getEquipementPhysique().getQualite()); } @@ -184,34 +158,30 @@ class EnrichissementEquipementPhysiqueServiceTest { void testServiceEnrichissementEquipementPhysique_typeEquipement() throws JsonProcessingException { /* MOCK REFERENTIEL : CorrespondanceRefEquipement */ - Mockito.when(referentielClient.getTypeEquipement("Server")).thenReturn(mapper.readValue(""" + Mockito.when(referentielClient.getTypeItem("Server")).thenReturn(mapper.readValue(""" { - "refEquipementParDefaut": "default-ref-server" + "refItemParDefaut": "default-ref-server" } - """, TypeEquipementDTO.class)); - - /* MOCK REFERENTIEL : ImpactEquipement */ - var impactEquipementDTO = new ImpactEquipementDTO(); - impactEquipementDTO.setValeur(2.2); + """, TypeItemDTO.class)); - equipementPhysiqueDTO.setModele(null); + /* MOCK REFERENTIEL : FacteurCaracterisation */ + var fcDTO = new FacteurCaracterisationDTO(); + fcDTO.setValeur(2.2); - Mockito.when(referentielClient.getImpactEquipement(eq("default-ref-server"), any(), any())).thenReturn(impactEquipementDTO); + Mockito.when(referentielClient.getFacteurCaracterisationByCritereAndEtapeAndNom(any(), any(), eq("default-ref-server"))).thenReturn(fcDTO); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); - Assertions.assertEquals(1, actual.getEtapes().size()); - Assertions.assertEquals(1, actual.getCriteres().size()); + Assertions.assertEquals(4, actual.getEtapes().size()); + Assertions.assertEquals(4, actual.getCriteres().size()); Assertions.assertEquals(4, actual.getHypotheses().size()); - Assertions.assertEquals(1, actual.getMixElectriques().size()); - Assertions.assertEquals("FR", actual.getMixElectriques().get(0).getPays()); - Assertions.assertEquals(2.2, actual.getImpactsEquipement().get(0).getValeur()); + Assertions.assertEquals(17, actual.getFacteurCaracterisations().size()); + Assertions.assertEquals(2.2, actual.getFacteurCaracterisations().getFirst().getValeur()); Assertions.assertEquals("HAUTE", actual.getEquipementPhysique().getQualite()); } @Test void testServiceEnrichissementEquipementPhysique_filterEtapes() throws JsonProcessingException { - initMocksEtapesAndCriteres(); Mockito.lenient().when(donneesEntreeRepository.findEtapes(any())).thenReturn("UTILISATION##FABRICATION"); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); @@ -221,7 +191,6 @@ class EnrichissementEquipementPhysiqueServiceTest { @Test void testServiceEnrichissementEquipementPhysique_doesNotFilterEtapesWhenDataNull() throws JsonProcessingException { - initMocksEtapesAndCriteres(); Mockito.lenient().when(donneesEntreeRepository.findEtapes(any())).thenReturn(null); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); @@ -231,7 +200,6 @@ class EnrichissementEquipementPhysiqueServiceTest { @Test void testServiceEnrichissementEquipementPhysique_filterCriteres() throws JsonProcessingException { - initMocksEtapesAndCriteres(); Mockito.lenient().when(donneesEntreeRepository.findCriteres(any())).thenReturn("Climate change##Ionising radiation##Acidification"); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); @@ -241,7 +209,6 @@ class EnrichissementEquipementPhysiqueServiceTest { @Test void testServiceEnrichissementEquipementPhysique_doesNotFilterCriteresWhenDataNull() throws JsonProcessingException { - initMocksEtapesAndCriteres(); Mockito.lenient().when(donneesEntreeRepository.findCriteres(any())).thenReturn(null); var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); diff --git a/services/api-event-calculs/src/test/resources/input/equipementPhysique.json b/services/api-event-calculs/src/test/resources/input/equipementPhysique.json index 30d28311..eeb19664 100644 --- a/services/api-event-calculs/src/test/resources/input/equipementPhysique.json +++ b/services/api-event-calculs/src/test/resources/input/equipementPhysique.json @@ -61,131 +61,88 @@ }, "stockageTotalVirtuel": null }, - "typeEquipement": { + "typeItem": { "type": "Server", "serveur": true, "commentaire": "Lifetime par defaut Sopra Steria", "dureeVieDefaut": 7.0, "source": "", - "refEquipementParDefaut": "blade-server--28" + "refItemParDefaut": "blade-server--28" }, - "mixElectriques": [ - null, + "facteurCaracterisations": [ { - "pays": "France", - "raccourcisAnglais": "FR", + "nom": "Electricty-mix FR", + "localisation": "France", + "categorie": "electricity-mix", "critere": "Climate change", "valeur": 0.0813225, "source": "Base IMPACTS®2.02" }, - null, { - "pays": "France", - "raccourcisAnglais": "FR", + "nom": "Electricty-mix FR", + "localisation": "France", + "categorie": "electricity-mix", "critere": "Particulate matter and respiratory inorganics", "valeur": 4.15844e-9, "source": "Base IMPACTS®2.02" }, - null, { - "pays": "France", - "raccourcisAnglais": "FR", + "nom": "Electricty-mix FR", + "localisation": "France", + "categorie": "electricity-mix", "critere": "Ionising radiation", "valeur": 3.23443, "source": "Base IMPACTS®2.02" }, - null, { - "pays": "France", - "raccourcisAnglais": "FR", + "nom": "Electricty-mix FR", + "localisation": "France", + "categorie": "electricity-mix", "critere": "Acidification", "valeur": 0.000209809, "source": "Base IMPACTS®2.02" }, - null, { - "pays": "France", - "raccourcisAnglais": "FR", + "nom": "Electricty-mix FR", + "localisation": "France", + "categorie": "electricity-mix", "critere": "Resource use (minerals and metals)", "valeur": 4.85798e-8, "source": "Base IMPACTS®2.02" - } - ], - "impactsReseau": [ - { - "refReseau": "impactReseauMobileMoyen", - "etapeACV": "FABRICATION", - "critere": "Climate change", - "unite": null, - "source": "Test V1.00", - "valeur": 518.28, - "consoElecMoyenne": null - }, - { - "refReseau": "impactReseauMobileMoyen", - "etapeACV": "UTILISATION", - "critere": "Climate change", - "unite": null, - "source": "Test V1.00", - "valeur": 76.28, - "consoElecMoyenne": null - }, - { - "refReseau": "impactReseauMobileMoyen", - "etapeACV": "FABRICATION", - "critere": "Particulate matter and respiratory inorganics", - "unite": null, - "source": "Test V1.00", - "valeur": 148.28, - "consoElecMoyenne": null }, { - "refReseau": "impactReseauMobileMoyen", - "etapeACV": "UTILISATION", - "critere": "Particulate matter and respiratory inorganics", - "unite": null, - "source": "Test V1.00", - "valeur": 18.8, - "consoElecMoyenne": null - } - ], - "impactsEquipement": [ - { - "refEquipement": "blade-server--28", + "nom": "blade-server--28", "etape": "FABRICATION", "critere": "Climate change", + "unite": null, "source": "test", - "type": "", "valeur": 2935.5392, "consoElecMoyenne": 3504.0, "description": "Blade server 2 processor high-end 1 SSD: 1024 GB each 0 HDD 16 RAM, 16 GB each 0 GPU" }, { - "refEquipement": "blade-server--28", + "nom": "blade-server--28", "etape": "UTILISATION", "critere": "Climate change", "source": "test", - "type": "", "valeur": 234.62784, "consoElecMoyenne": 3504.0, "description": "Blade server 2 processor high-end 1 SSD: 1024 GB each 0 HDD 16 RAM, 16 GB each 0 GPU" }, { - "refEquipement": "blade-server--28", + "nom": "blade-server--28", "etape": "FABRICATION", "critere": "Particulate matter and respiratory inorganics", "source": "test", - "type": "", "valeur": 0.0000917808, "consoElecMoyenne": 3504.0, "description": "Blade server 2 processor high-end 1 SSD: 1024 GB each 0 HDD 16 RAM, 16 GB each 0 GPU" }, { - "refEquipement": "blade-server--28", + "nom": "blade-server--28", "etape": "UTILISATION", "critere": "Particulate matter and respiratory inorganics", "source": "test", - "type": "", "valeur": 0.000052475904, "consoElecMoyenne": 3504.0, "description": "Blade server 2 processor high-end 1 SSD: 1024 GB each 0 HDD 16 RAM, 16 GB each 0 GPU" 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 cdb09811..9c2275c2 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 @@ -12,7 +12,6 @@ import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.StatutTra 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.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.TypeItemDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -192,7 +191,7 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { RapportImport rapportImport = new RapportImport(); rapportImport.setFichier(csvEquipementPhysique.getOriginalFilename()); rapportImport.setType("equipement_physique"); - List<TypeEquipementDTO> typesEquipement = referentielServicePort.getAllTypesEquipement(); + List<TypeItemDTO> typesItem = referentielServicePort.getAllTypesItem(); Set<String> avertissements = new HashSet<>(); try (Reader reader = new InputStreamReader(csvEquipementPhysique.getInputStream())) { @@ -209,7 +208,7 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { String nomEquipementPhysique = CSVHelper.safeString(csvRecord, LABEL_NOM_EQUIPEMENT_PHYSIQUE, "equipement"); String typeEquipement = csvRecord.get("type"); String checkNomTypeItem = errorManagementService.checkNomTypeItem(typeEquipement, "L'équipement physique", nomEquipementPhysique); - var refTypeEquipementOpt = typesEquipement.stream() + var refTypeEquipementOpt = typesItem.stream() .filter(refType -> refType.getType().equals(typeEquipement)) .findFirst(); @@ -271,7 +270,7 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { .qualite(qualite) .build(); - var erreurs = errorManagementService.checkEquipementPhysique(equipementToAdd, refTypeEquipementOpt.get().getRefEquipementParDefaut()); + var erreurs = errorManagementService.checkEquipementPhysique(equipementToAdd, refTypeEquipementOpt.get().getRefItemParDefaut()); rapportImport.getErreurs().addAll(erreurs.getKey()); avertissements.addAll(erreurs.getValue()); defaultValueService.setEquipementValeurDefaut(equipementToAdd); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/output/ReferentielServicePort.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/output/ReferentielServicePort.java index 44eb82e2..2cd2bfea 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/output/ReferentielServicePort.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/output/ReferentielServicePort.java @@ -7,14 +7,10 @@ import java.util.List; public interface ReferentielServicePort { boolean hasMixElec(String pays); - List<TypeEquipementDTO> getAllTypesEquipement(); - List<TypeItemDTO> getAllTypesItem(); CorrespondanceRefEquipementDTO getCorrespondance(String modele); - ImpactEquipementDTO getImpactEquipement(String refEquipement, String critere, String etape); - FacteurCaracterisationDTO getFacteurCaracterisation(String critere, String etape, String refItem); List<EtapeDTO> getAllEtapes(); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/adapters/ReferentielRestClient.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/adapters/ReferentielRestClient.java index 277f1e5d..ac417db6 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/adapters/ReferentielRestClient.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/adapters/ReferentielRestClient.java @@ -6,6 +6,7 @@ import org.mte.numecoeval.expositiondonneesentrees.domain.exception.RestExceptio import org.mte.numecoeval.expositiondonneesentrees.domain.ports.output.ReferentielServicePort; import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.client.InterneNumEcoEvalApi; import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.*; +import org.mte.numecoeval.expositiondonneesentrees.utils.Constants; import org.springframework.cache.annotation.Cacheable; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -23,24 +24,17 @@ public class ReferentielRestClient implements ReferentielServicePort { @Cacheable("hasMixElec") @Override public boolean hasMixElec(String pays) { - boolean result = false; try { - var res = interneNumEcoEvalApi.getMixElectriqueParPaysWithHttpInfo(pays).block(); - if (res == null || res.getBody() == null) return result; - return !res.getBody().isEmpty(); + var res = interneNumEcoEvalApi.getFacteurCaracterisation(null, null, null, pays, Constants.ELECTRICITY_MIX_CATEGORY).blockFirst(); + if (res == null) return result; + return true; } catch (Exception e) { - log.error("Une erreur est survenue lors de l'appel au référentiel mix electrique", e); + log.error("Une erreur est survenue lors de l'appel au référentiel facteurcaracterisation", e); } return result; } - @Override - public List<TypeEquipementDTO> getAllTypesEquipement() { - var result = interneNumEcoEvalApi.getAllTypeEquipementWithHttpInfo().block(); - return result.getBody(); - } - @Override public List<TypeItemDTO> getAllTypesItem() { var result = interneNumEcoEvalApi.getAllTypeItemWithHttpInfo().block(); @@ -60,28 +54,9 @@ public class ReferentielRestClient implements ReferentielServicePort { } } - @Cacheable("ImpactEquipement") - @Override - public ImpactEquipementDTO getImpactEquipement(String refEquipement, String critere, String etape) { - - try { - var res = interneNumEcoEvalApi.getImpactEquipement(refEquipement, critere, etape).block(); - if (res != null) { - return res; - } - } catch (WebClientResponseException e) { - if (e.getStatusCode() != HttpStatus.NOT_FOUND) { - log.error("Une erreur est survenue lors de l'appel au référentiel impactequipement", e); - return null; - } - } - return null; - } - @Cacheable("FacteurCaracterisation") @Override public FacteurCaracterisationDTO getFacteurCaracterisation(String critere, String etape, String refEquipement) { - try { var res = interneNumEcoEvalApi.getFacteurCaracterisation(critere, etape, refEquipement, null, null).blockFirst(); if (res != null) { 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 8ed1eabf..f803a3fd 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 @@ -123,7 +123,7 @@ public class ErrorManagementService { var criteres = referentielServicePort.getAllCriteres(); for (var critere : criteres) { for (var etape : etapes) { - var impact = referentielServicePort.getImpactEquipement(refEquipement, critere.getNomCritere(), etape.getCode()); + var impact = referentielServicePort.getFacteurCaracterisation(critere.getNomCritere(), etape.getCode(), refEquipement); if (impact == null) { avertissements.add(messageProperties.getMessages().get("ITEM_IMPACT_INCONNU").formatted(refEquipement, etape.getCode(), critere.getNomCritere())); } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/utils/Constants.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/utils/Constants.java index ca102130..17909eaf 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/utils/Constants.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/utils/Constants.java @@ -4,5 +4,6 @@ import java.util.List; public class Constants { public static final List<String> QUALITES_DONNEES = List.of("BASSE", "MOYENNE", "HAUTE"); + public static final String ELECTRICITY_MIX_CATEGORY = "electricity-mix"; } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java index 6c0da70e..99719512 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java @@ -1,11 +1,9 @@ package org.mte.numecoeval.calculs.domain.data.demande; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.referentiel.*; +import org.mte.numecoeval.calculs.domain.utils.Constants; import java.time.LocalDateTime; import java.util.List; @@ -14,6 +12,7 @@ import java.util.Optional; @Builder @AllArgsConstructor +@NoArgsConstructor @Getter @Setter public class DemandeCalculImpactEquipementPhysique { @@ -26,15 +25,13 @@ public class DemandeCalculImpactEquipementPhysique { ReferentielCritere critere; - ReferentielTypeEquipement typeEquipement; + ReferentielTypeItem typeItem; ReferentielCorrespondanceRefEquipement correspondanceRefEquipement; List<ReferentielHypothese> hypotheses; - List<ReferentielImpactEquipement> impactEquipements; - - List<ReferentielMixElectrique> mixElectriques; + List<ReferentielFacteurCaracterisation> facteurCaracterisations; OptionsCalcul optionsCalcul; @@ -54,28 +51,28 @@ public class DemandeCalculImpactEquipementPhysique { .toList(); } - public Optional<ReferentielImpactEquipement> getImpactEquipement(String refEquipement) { - if (refEquipement == null || impactEquipements == null) { + public Optional<ReferentielFacteurCaracterisation> getFacteurCaracterisation(String refItem) { + if (refItem == null || facteurCaracterisations == null) { return Optional.empty(); } - return impactEquipements.stream() + return facteurCaracterisations.stream() .filter(Objects::nonNull) - .filter(impactEquipement -> refEquipement.equals(impactEquipement.getRefEquipement()) - && critere.getNomCritere().equals(impactEquipement.getCritere()) - && etape.getCode().equals(impactEquipement.getEtape()) + .filter(facteurCaracterisation -> refItem.equals(facteurCaracterisation.getNom()) + && critere.getNomCritere().equals(facteurCaracterisation.getCritere()) + && etape.getCode().equals(facteurCaracterisation.getEtape()) ) .findFirst(); } - public Optional<ReferentielMixElectrique> getMixElectrique(String pays) { - if (pays == null || mixElectriques == null) { + public Optional<ReferentielFacteurCaracterisation> getMixElectriqueFromFacteurCaracterisation(String localisation) { + if (localisation == null || facteurCaracterisations == null) { return Optional.empty(); } - return mixElectriques.stream() + return facteurCaracterisations.stream() .filter(Objects::nonNull) - .filter(mixElectrique -> pays.equals(mixElectrique.getPays()) - && critere.getNomCritere().equals(mixElectrique.getCritere()) - ) + .filter(fc -> Constants.ELECTRICITY_MIX_CATEGORY.equals(fc.getCategorie()) && + localisation.equals(fc.getLocalisation()) && + critere.getNomCritere().equals(fc.getCritere())) .findFirst(); } @@ -86,9 +83,9 @@ public class DemandeCalculImpactEquipementPhysique { return null; } - public String getRefEquipementParDefaut() { - if (typeEquipement != null) { - return typeEquipement.getRefEquipementParDefaut(); + public String getRefItemParDefaut() { + if (typeItem != null) { + return typeItem.getRefItemParDefaut(); } return null; } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactOperationNonIT.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactOperationNonIT.java index fade2b05..e0ddf3a4 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactOperationNonIT.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactOperationNonIT.java @@ -73,8 +73,7 @@ public class DemandeCalculImpactOperationNonIT { .filter(Objects::nonNull) .filter(fc -> Constants.ELECTRICITY_MIX_CATEGORY.equals(fc.getCategorie()) && localisation.equals(fc.getLocalisation()) && - critere.getNomCritere().equals(fc.getCritere()) - ) + critere.getNomCritere().equals(fc.getCritere())) .findFirst(); } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactReseau.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactReseau.java deleted file mode 100644 index 4a76a7ad..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactReseau.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.mte.numecoeval.calculs.domain.data.demande; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; -import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielCritere; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielEtapeACV; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielImpactReseau; - -import java.time.LocalDateTime; -import java.util.List; - -@Builder -@AllArgsConstructor -@Getter -@Setter -public class DemandeCalculImpactReseau { - - LocalDateTime dateCalcul; - - EquipementPhysique equipementPhysique; - - ReferentielEtapeACV etape; - - ReferentielCritere critere; - - List<ReferentielImpactReseau> impactsReseau; -} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java index 02376c96..ba2cdfaf 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java @@ -1,13 +1,15 @@ package org.mte.numecoeval.calculs.domain.data.entree; -import lombok.Builder; -import lombok.Data; +import lombok.*; import java.time.LocalDate; import java.util.List; -@Data @Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter public class EquipementPhysique { private String nomEquipementPhysique; private String modele; diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielCorrespondanceRefEquipement.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielCorrespondanceRefEquipement.java index 0170b74f..bf19aa67 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielCorrespondanceRefEquipement.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielCorrespondanceRefEquipement.java @@ -1,12 +1,10 @@ package org.mte.numecoeval.calculs.domain.data.referentiel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Builder @AllArgsConstructor +@NoArgsConstructor @Getter @Setter public class ReferentielCorrespondanceRefEquipement { diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactEquipement.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactEquipement.java deleted file mode 100644 index 7aa514cd..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactEquipement.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mte.numecoeval.calculs.domain.data.referentiel; - -import lombok.Builder; -import lombok.Data; - -@Builder -@Data -public class ReferentielImpactEquipement { - String refEquipement; - String etape; - String critere; - String source; - String type; - Double valeur; - Double consoElecMoyenne; -} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactReseau.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactReseau.java deleted file mode 100644 index 6ed08356..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielImpactReseau.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.mte.numecoeval.calculs.domain.data.referentiel; - -import lombok.Builder; -import lombok.Data; - -@Builder -@Data -public class ReferentielImpactReseau { - - private String refReseau; - private String critere; - private String etapeACV; - private String unite; - private String source; - private Double impactReseauMobileMoyen; - private Double consoElecMoyenne; - - -} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielMixElectrique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielMixElectrique.java deleted file mode 100644 index 67ca4449..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielMixElectrique.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.mte.numecoeval.calculs.domain.data.referentiel; - -import lombok.Builder; -import lombok.Data; - -@Builder -@Data -public class ReferentielMixElectrique { - String pays; - String raccourcisAnglais; - String critere; - Double valeur; - String source; -} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielTypeEquipement.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielTypeEquipement.java deleted file mode 100644 index 7a762ff5..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/referentiel/ReferentielTypeEquipement.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.mte.numecoeval.calculs.domain.data.referentiel; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Builder -@AllArgsConstructor -@Getter -@Setter -public class ReferentielTypeEquipement { - String type; - - Boolean serveur; - - String commentaire; - - Double dureeVieDefaut; - - String source; - - String refEquipementParDefaut; -} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/TraceCalculImpactEquipementPhysique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/TraceCalculImpactEquipementPhysique.java index a8236a86..f3d000e3 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/TraceCalculImpactEquipementPhysique.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/TraceCalculImpactEquipementPhysique.java @@ -11,8 +11,8 @@ public class TraceCalculImpactEquipementPhysique { private String formule; private ConsoElecAnMoyenne consoElecAnMoyenne; private MixElectrique mixElectrique; - private Double valeurReferentielImpactEquipement; - private String sourceReferentielImpactEquipement; + private Double valeurReferentielFacteurCaracterisation; + private String sourceReferentielFacteurCaracterisation; private DureeDeVie dureeDeVie; private String erreur; } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactReseauService.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactReseauService.java deleted file mode 100644 index 5d2b8b5b..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactReseauService.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.mte.numecoeval.calculs.domain.port.input.service; - -import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactReseau; -import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactReseau; - -public interface CalculImpactReseauService { - - String REF_RESEAU = "impactReseauMobileMoyen"; - - ImpactReseau calculerImpactReseau(DemandeCalculImpactReseau demandeCalcul); - -} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java index 27b32aa9..c6956b92 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java @@ -6,7 +6,7 @@ import org.apache.commons.lang3.StringUtils; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.erreur.TypeErreurCalcul; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielImpactEquipement; +import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielFacteurCaracterisation; import org.mte.numecoeval.calculs.domain.data.trace.ConsoElecAnMoyenne; import org.mte.numecoeval.calculs.domain.data.trace.DureeDeVie; import org.mte.numecoeval.calculs.domain.data.trace.MixElectrique; @@ -26,8 +26,8 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq private static final String VERSION_CALCUL = "1.0"; public static final String NB_JOUR_UTILISE_PAR_DEFAUT = "NbJourUtiliseParDefaut"; public static final String ERREUR_DE_CALCUL_IMPACT_EQUIPEMENT_MESSAGE = "Erreur de calcul impact équipement: Type: {}, Cause: {}, Etape: {}, Critere: {}, Equipement Physique: {}, RefEquipementRetenu: {}, RefEquipementParDefaut: {}"; - private final DureeDeVieEquipementPhysiqueService dureeDeVieEquipementPhysiqueService; + private final DureeDeVieEquipementPhysiqueService dureeDeVieEquipementPhysiqueService; public ImpactEquipementPhysique calculerImpactEquipementPhysique(DemandeCalculImpactEquipementPhysique demandeCalcul) { log.debug("Début de calcul d'impact d'équipement physique : {}, {}, {} ", @@ -44,7 +44,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq demandeCalcul.getCritere().getNomCritere(), demandeCalcul.getEquipementPhysique().getNomEquipementPhysique(), demandeCalcul.getRefEquipementCible(), - demandeCalcul.getRefEquipementParDefaut()); + demandeCalcul.getRefItemParDefaut()); impactErreur = buildCalculImpactForError(demandeCalcul, e); } catch (Exception e) { log.debug("{} : Erreur de calcul impact équipement physique: Erreur technique de l'indicateur : {}", TypeErreurCalcul.ERREUR_TECHNIQUE.getCode(), e.getMessage()); @@ -71,9 +71,9 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq consoElecMoyenne = consoElecAnMoyenne.getValeur(); traceCalculImpactEquipementPhysique = TraceCalculImpactEquipementPhysiqueUtils.buildTracePremierScenario(quantite, consoElecAnMoyenne, mixElectrique, tauxUtilisationEqPhysique); } else { - var refImpactEquipementOpt = getImpactEquipement(demandeCalcul); + var refImpactEquipementOpt = getFacteurCaracterisation(demandeCalcul); if (refImpactEquipementOpt.isPresent()) { - ReferentielImpactEquipement referentielImpactEquipement = refImpactEquipementOpt.get(); + ReferentielFacteurCaracterisation referentielImpactEquipement = refImpactEquipementOpt.get(); var valeurReferentiel = referentielImpactEquipement.getValeur(); valeurImpactUnitaire = quantite * valeurReferentiel * tauxUtilisationEqPhysique; DureeDeVie dureeVie = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); @@ -85,7 +85,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Durée de vie de l'équipement inconnue"); } } else { - throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Impact Equipement inconnu"); + throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Facteur Caracterisation inconnu"); } } @@ -94,17 +94,17 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq return calcul; } - private Optional<ReferentielImpactEquipement> getImpactEquipement(DemandeCalculImpactEquipementPhysique demandeCalcul) { + private Optional<ReferentielFacteurCaracterisation> getFacteurCaracterisation(DemandeCalculImpactEquipementPhysique demandeCalcul) { - Optional<ReferentielImpactEquipement> resultFromRefEquipementCible = Optional.empty(); + Optional<ReferentielFacteurCaracterisation> resultFromRefEquipementCible = Optional.empty(); if (StringUtils.isNotBlank(demandeCalcul.getRefEquipementCible())) { - resultFromRefEquipementCible = demandeCalcul.getImpactEquipement( + resultFromRefEquipementCible = demandeCalcul.getFacteurCaracterisation( demandeCalcul.getCorrespondanceRefEquipement().getRefEquipementCible() ); } if (resultFromRefEquipementCible.isEmpty()) { - return demandeCalcul.getImpactEquipement( - demandeCalcul.getRefEquipementParDefaut() + return demandeCalcul.getFacteurCaracterisation( + demandeCalcul.getRefItemParDefaut() ); } return resultFromRefEquipementCible; @@ -118,7 +118,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq .critere(demandeCalcul.getCritere().getNomCritere()) .dateCalcul(demandeCalcul.getDateCalcul()) .versionCalcul(VERSION_CALCUL) - .reference(StringUtils.defaultIfEmpty(demandeCalcul.getRefEquipementCible(), demandeCalcul.getRefEquipementParDefaut())) + .reference(StringUtils.defaultIfEmpty(demandeCalcul.getRefEquipementCible(), demandeCalcul.getRefItemParDefaut())) .typeEquipement(demandeCalcul.getEquipementPhysique().getType()) .quantite(demandeCalcul.getEquipementPhysique().getQuantite()) .statutEquipementPhysique(demandeCalcul.getEquipementPhysique().getStatut()) @@ -143,7 +143,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq .critere(demandeCalcul.getCritere().getNomCritere()) .dateCalcul(demandeCalcul.getDateCalcul()) .versionCalcul(VERSION_CALCUL) - .reference(StringUtils.defaultIfEmpty(demandeCalcul.getRefEquipementCible(), demandeCalcul.getRefEquipementParDefaut())) + .reference(StringUtils.defaultIfEmpty(demandeCalcul.getRefEquipementCible(), demandeCalcul.getRefItemParDefaut())) .typeEquipement(demandeCalcul.getEquipementPhysique().getType()) .quantite(demandeCalcul.getEquipementPhysique().getQuantite()) .statutEquipementPhysique(demandeCalcul.getEquipementPhysique().getStatut()) @@ -170,21 +170,20 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq .build(); } - - if (StringUtils.isAllBlank(demandeCalcul.getRefEquipementCible(), demandeCalcul.getRefEquipementParDefaut())) { - throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Impact Equipement inconnu"); + if (StringUtils.isAllBlank(demandeCalcul.getRefEquipementCible(), demandeCalcul.getRefItemParDefaut())) { + throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Facteur Caracterisation inconnu"); } - var referentielImpactEquipementOpt = getImpactEquipement(demandeCalcul); + var referentielImpactEquipementOpt = getFacteurCaracterisation(demandeCalcul); if (referentielImpactEquipementOpt.isEmpty()) { - throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Impact Equipement inconnu"); + throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Facteur Caracterisation inconnu"); } if (referentielImpactEquipementOpt.get().getConsoElecMoyenne() == null) { throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Donnée de consommation electrique manquante : equipementPhysique : " + demandeCalcul.getEquipementPhysique().getNomEquipementPhysique() + ", RefEquipementCible : " + demandeCalcul.getRefEquipementCible() + - ", RefEquipementParDefaut : " + demandeCalcul.getRefEquipementParDefaut() + ", RefItemParDefaut : " + demandeCalcul.getRefItemParDefaut() ); } @@ -198,25 +197,25 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq } private MixElectrique getMixElectrique(DemandeCalculImpactEquipementPhysique demandeCalcul) throws CalculImpactException { - // Taiga #918 - EquipementPhysique.dataCenter != null est équivalent à EquipementPhysique.nomCourtDatacenter est renseigné + le DataCenter existe dans les données + // EquipementPhysique.dataCenter != null est équivalent à EquipementPhysique.nomCourtDatacenter est renseigné + le DataCenter existe dans les données if (demandeCalcul.getEquipementPhysique().getDataCenter() != null && StringUtils.isNotBlank(demandeCalcul.getEquipementPhysique().getDataCenter().getLocalisation())) { var pays = demandeCalcul.getEquipementPhysique().getDataCenter().getLocalisation(); - var refMixElecOpt = demandeCalcul.getMixElectrique(pays); + var refMixElecOpt = demandeCalcul.getMixElectriqueFromFacteurCaracterisation(pays); if (refMixElecOpt.isPresent()) { - var refMixElec = refMixElecOpt.get().getValeur(); + var refMixElec = refMixElecOpt.get(); var pue = getDataCenterPUE(demandeCalcul); return MixElectrique.builder() .isServeur(true) .dataCenterPue(pue) - .valeurReferentielMixElectrique(refMixElec) - .sourceReferentielMixElectrique(refMixElecOpt.get().getSource()) - .valeur(refMixElec * pue) + .valeurReferentielMixElectrique(refMixElec.getValeur()) + .sourceReferentielMixElectrique(refMixElec.getSource()) + .valeur(refMixElec.getValeur() * pue) .build(); } } if (StringUtils.isNotBlank(demandeCalcul.getEquipementPhysique().getPaysDUtilisation())) { - var refMixElecOpt = demandeCalcul.getMixElectrique(demandeCalcul.getEquipementPhysique().getPaysDUtilisation()); + var refMixElecOpt = demandeCalcul.getMixElectriqueFromFacteurCaracterisation(demandeCalcul.getEquipementPhysique().getPaysDUtilisation()); if (refMixElecOpt.isPresent()) { var refMixElec = refMixElecOpt.get(); return MixElectrique.builder() @@ -229,7 +228,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Il n'existe pas de Mix électrique pour cet équipement : critere: " + demandeCalcul.getCritere().getNomCritere() + " - equipement: " + demandeCalcul.getEquipementPhysique().getNomEquipementPhysique() + - " - Pays d'utilisation: " + demandeCalcul.getEquipementPhysique().getPaysDUtilisation() + + " - Localisation: " + demandeCalcul.getEquipementPhysique().getPaysDUtilisation() + " - NomCourtDatacenter: " + demandeCalcul.getEquipementPhysique().getNomCourtDatacenter() ); @@ -248,7 +247,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq "Le PUE est manquant et ne permet le calcul de l'impact à l'usage de l'équipement :" + " equipement: " + demandeCalcul.getEquipementPhysique().getNomEquipementPhysique() + " - RefEquipementCible: " + demandeCalcul.getRefEquipementCible() + - " - refEquipementParDefaut: " + demandeCalcul.getRefEquipementParDefaut() + + " - refItemParDefaut: " + demandeCalcul.getRefItemParDefaut() + " - NomCourtDatacenter: " + demandeCalcul.getEquipementPhysique().getNomCourtDatacenter() ); diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactReseauServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactReseauServiceImpl.java deleted file mode 100644 index 74f449d0..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactReseauServiceImpl.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.mte.numecoeval.calculs.domain.port.input.service.impl; - -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactReseau; -import org.mte.numecoeval.calculs.domain.data.erreur.TypeErreurCalcul; -import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactReseau; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielImpactReseau; -import org.mte.numecoeval.calculs.domain.exception.CalculImpactException; -import org.mte.numecoeval.calculs.domain.port.input.service.CalculImpactReseauService; -import org.mte.numecoeval.calculs.domain.traceur.TraceCalculImpactReseauUtils; -import org.mte.numecoeval.calculs.domain.traceur.TraceUtils; - -import java.util.Objects; - -@Slf4j -@AllArgsConstructor -public class CalculImpactReseauServiceImpl implements CalculImpactReseauService { - - private static final String VERSION_CALCUL = "1.0"; - - @Override - public ImpactReseau calculerImpactReseau(DemandeCalculImpactReseau demandeCalcul) { - try { - if (demandeCalcul.getEquipementPhysique().getGoTelecharge() == null) { - throw new CalculImpactException( - TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), - "Erreur de calcul impact réseau: Etape: %s, Critere: %s, Equipement Physique: %s : la valeur en_EqP(Equipement).goTelecharge est nulle" - .formatted( - demandeCalcul.getEtape().getCode(), - demandeCalcul.getCritere().getNomCritere(), - demandeCalcul.getEquipementPhysique().getNomEquipementPhysique() - ) - ); - } - - var referentielImpactReseau = getReferentielImpactReseau(demandeCalcul, REF_RESEAU); - - return calculerImpact(demandeCalcul, referentielImpactReseau); - } catch (CalculImpactException exception) { - log.debug("{} : {}", exception.getErrorType(), exception.getMessage()); - return buildCalculForError(demandeCalcul, exception); - } catch (Exception exception) { - log.debug("{} : {}", TypeErreurCalcul.ERREUR_TECHNIQUE, exception.getMessage()); - return buildCalculForError(demandeCalcul, new CalculImpactException(TypeErreurCalcul.ERREUR_TECHNIQUE.getCode(), exception.getMessage())); - } - } - - private ReferentielImpactReseau getReferentielImpactReseau(DemandeCalculImpactReseau demandeCalcul, String refReseau) throws CalculImpactException { - var referentielImpactReseau = demandeCalcul.getImpactsReseau().stream() - .filter(Objects::nonNull) - .filter(refImpactReseau -> - demandeCalcul.getEtape().getCode().equals(refImpactReseau.getEtapeACV()) - && demandeCalcul.getCritere().getNomCritere().equals(refImpactReseau.getCritere()) - && refReseau.equals(refImpactReseau.getRefReseau()) - ) - .findFirst() - .orElseThrow(() -> new CalculImpactException( - TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), - "Erreur de calcul impact réseau: Etape: %s, Critere: %s, RefReseau: %s, Equipement Physique: %s : La référence ImpactReseau n'existe pas." - .formatted( - demandeCalcul.getEtape().getCode(), - demandeCalcul.getCritere().getNomCritere(), - REF_RESEAU, - demandeCalcul.getEquipementPhysique().getNomEquipementPhysique() - ) - ) - ); - - if (Objects.isNull(referentielImpactReseau.getImpactReseauMobileMoyen())) { - throw new CalculImpactException( - TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), - "Erreur de calcul impact réseau: Etape: %s, Critere: %s, RefReseau: %s, Equipement Physique: %s : L'impactReseauMobileMoyen de la référence est null." - .formatted( - demandeCalcul.getEtape().getCode(), - demandeCalcul.getCritere().getNomCritere(), - REF_RESEAU, - demandeCalcul.getEquipementPhysique().getNomEquipementPhysique() - ) - ); - } - - return referentielImpactReseau; - } - - private ImpactReseau calculerImpact(DemandeCalculImpactReseau demandeCalcul, ReferentielImpactReseau referentielImpactReseau) { - return ImpactReseau.builder() - .versionCalcul(VERSION_CALCUL) - .dateCalcul(demandeCalcul.getDateCalcul()) - .nomLot(demandeCalcul.getEquipementPhysique().getNomLot()) - .nomSourceDonnee(demandeCalcul.getEquipementPhysique().getNomSourceDonnee()) - .dateLot(demandeCalcul.getEquipementPhysique().getDateLot()) - .etapeACV(demandeCalcul.getEtape().getCode()) - .critere(demandeCalcul.getCritere().getNomCritere()) - .statutIndicateur("OK") - .source(referentielImpactReseau.getSource()) - .nomEntite(demandeCalcul.getEquipementPhysique().getNomEntite()) - .nomOrganisation(demandeCalcul.getEquipementPhysique().getNomOrganisation()) - .nomEquipement(demandeCalcul.getEquipementPhysique().getNomEquipementPhysique()) - .impactUnitaire( - demandeCalcul.getEquipementPhysique().getGoTelecharge() * referentielImpactReseau.getImpactReseauMobileMoyen() - ) - .unite(referentielImpactReseau.getUnite()) - .trace( - TraceUtils.getTraceFromTraceur( - TraceCalculImpactReseauUtils.buildTrace(demandeCalcul, referentielImpactReseau)) - ) - .build(); - } - - private ImpactReseau buildCalculForError(DemandeCalculImpactReseau demandeCalcul, CalculImpactException exception) { - return ImpactReseau.builder() - .versionCalcul(VERSION_CALCUL) - .dateCalcul(demandeCalcul.getDateCalcul()) - .nomLot(demandeCalcul.getEquipementPhysique().getNomLot()) - .nomSourceDonnee(demandeCalcul.getEquipementPhysique().getNomSourceDonnee()) - .dateLot(demandeCalcul.getEquipementPhysique().getDateLot()) - .etapeACV(demandeCalcul.getEtape().getCode()) - .critere(demandeCalcul.getCritere().getNomCritere()) - .statutIndicateur("ERREUR") - .nomEntite(demandeCalcul.getEquipementPhysique().getNomEntite()) - .nomOrganisation(demandeCalcul.getEquipementPhysique().getNomOrganisation()) - .nomEquipement(demandeCalcul.getEquipementPhysique().getNomEquipementPhysique()) - .unite(demandeCalcul.getCritere().getUnite()) - .impactUnitaire(null) - .unite(demandeCalcul.getCritere().getUnite()) - .trace(TraceUtils.getTraceFromTraceur( - TraceCalculImpactReseauUtils.buildTraceErreur(exception)) - ) - .build(); - } - -} \ No newline at end of file diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java index 58e22f1d..b22c5f0c 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java @@ -125,11 +125,11 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe @Override public DureeDeVieParDefaut calculerDureeVieDefaut(DemandeCalculImpactEquipementPhysique demandeCalcul) throws CalculImpactException { - if (demandeCalcul.getTypeEquipement() != null && demandeCalcul.getTypeEquipement().getDureeVieDefaut() != null) { + if (demandeCalcul.getTypeItem() != null && demandeCalcul.getTypeItem().getDureeVieDefaut() != null) { return DureeDeVieParDefaut.builder() - .valeurTypeItemDureeVieDefaut(demandeCalcul.getTypeEquipement().getDureeVieDefaut()) - .sourceTypeItemDureeVieDefaut(demandeCalcul.getTypeEquipement().getSource()) - .valeur(demandeCalcul.getTypeEquipement().getDureeVieDefaut()) + .valeurTypeItemDureeVieDefaut(demandeCalcul.getTypeItem().getDureeVieDefaut()) + .sourceTypeItemDureeVieDefaut(demandeCalcul.getTypeItem().getSource()) + .valeur(demandeCalcul.getTypeItem().getDureeVieDefaut()) .build(); } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java index 42560d27..acf0260c 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java @@ -32,8 +32,8 @@ public class TraceCalculImpactEquipementPhysiqueUtils { public static TraceCalculImpactEquipementPhysique buildTraceSecondScenario(Double quantite, Double valeurRefrentiel, String sourceReferentiel, DureeDeVie dureeDeVie, Double taux_utilisation) { return TraceCalculImpactEquipementPhysique.builder() .formule(getFormuleSecondScenario(quantite, valeurRefrentiel, dureeDeVie.getValeurRetenue(), taux_utilisation)) - .valeurReferentielImpactEquipement(valeurRefrentiel) - .sourceReferentielImpactEquipement(sourceReferentiel) + .valeurReferentielFacteurCaracterisation(valeurRefrentiel) + .sourceReferentielFacteurCaracterisation(sourceReferentiel) .dureeDeVie(dureeDeVie) .build(); } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactReseauUtils.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactReseauUtils.java deleted file mode 100644 index 69c37222..00000000 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactReseauUtils.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.mte.numecoeval.calculs.domain.traceur; - -import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactReseau; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielImpactReseau; -import org.mte.numecoeval.calculs.domain.data.trace.TraceCalculImpactReseau; -import org.mte.numecoeval.calculs.domain.exception.CalculImpactException; - -public class TraceCalculImpactReseauUtils { - private TraceCalculImpactReseauUtils() { - } - - private static String getFormule(Float goTelecharge, String critere, String etapeACV, String equipementPhysique, Double impactReseauMobileMoyen) { - return "impactReseau = 'equipementPhysique.goTelecharge (%s) x ref_ImpactReseau(%s, %s, %s).valeur(%s)'".formatted(goTelecharge, critere, etapeACV, equipementPhysique, impactReseauMobileMoyen); - } - - public static TraceCalculImpactReseau buildTraceErreur(CalculImpactException exception) { - var message = "Erreur lors du calcul de l'impact réseau pour un équipement physique"; - if(exception != null) { - message = exception.getErrorType() + " : " + exception.getMessage(); - } - return TraceCalculImpactReseau.builder() - .erreur(message) - .build(); - } - - public static TraceCalculImpactReseau buildTrace(DemandeCalculImpactReseau demandeCalculImpactReseau, ReferentielImpactReseau referentielImpactReseau){ - - return TraceCalculImpactReseau.builder() - .critere(demandeCalculImpactReseau.getCritere().getNomCritere()) - .etapeACV(demandeCalculImpactReseau.getEtape().getCode()) - .equipementPhysique(demandeCalculImpactReseau.getEquipementPhysique().getNomEquipementPhysique()) - .impactReseauMobileMoyen(referentielImpactReseau.getImpactReseauMobileMoyen().toString()) - .goTelecharge(demandeCalculImpactReseau.getEquipementPhysique().getGoTelecharge().toString()) - .sourceReferentielReseau(referentielImpactReseau.getSource()) - .formule(getFormule( - demandeCalculImpactReseau.getEquipementPhysique().getGoTelecharge(), - demandeCalculImpactReseau.getCritere().getNomCritere(), - demandeCalculImpactReseau.getEtape().getCode(), - referentielImpactReseau.getRefReseau(), - referentielImpactReseau.getImpactReseauMobileMoyen() - )) - .build(); - } -} diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java index 38135838..a638acf6 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java @@ -11,7 +11,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.entree.DataCenter; -import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.referentiel.*; import org.mte.numecoeval.calculs.domain.data.trace.ConsoElecAnMoyenne; @@ -30,10 +29,9 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.util.Collections; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -41,767 +39,432 @@ import static org.mockito.Mockito.*; class CalculImpactEquipementPhysiqueServiceTest { private CalculImpactEquipementPhysiqueService calculImpactEquipementPhysiqueService; - private String etapeACV; - private ReferentielCritere critere; - private LocalDateTime dateCalcul; - private String refEquipementCible; - private String refEquipementParDefaut; - private EquipementPhysique equipementPhysique; - private ReferentielImpactEquipement referentielImpactEquipement; - private ReferentielMixElectrique referentielMixElectrique; - ReferentielCorrespondanceRefEquipement refEquipement; - ReferentielTypeEquipement typeEquipement; - ReferentielHypothese referentielHypothese; + @Mock private DureeDeVieEquipementPhysiqueServiceImpl dureeDeVieEquipementPhysiqueService; + private static final ObjectMapper objectMapper = new ObjectMapper(); + + private DemandeCalculImpactEquipementPhysique createDemande() { + try { + var res = objectMapper.readValue(""" + { + "equipementPhysique": { + "nomEquipementPhysique" : "Apple Iphone 11", + "nomOrganisation": "Test", + "nomLot": "Test|20220101", + "type" : "telephone", + "modele": "iphone-11", + "paysDUtilisation": "France", + "quantite": 1.0 }, + "etape": { + "code": "UTILISATION" + }, + "critere": { + "nomCritere": "Changement Climatique", + "unite": "kg CO_{2} eq" + }, + "correspondanceRefEquipement":{ + "refEquipementCible": "iphone", + "modeleEquipementSource" : "iphone-11" + }, + "facteurCaracterisations":[ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.08 + }, + { + "nom": "iphone", + "niveau" : "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne":10 + }], + "hypotheses": [] + } + """, DemandeCalculImpactEquipementPhysique.class); + res.setDateCalcul(LocalDateTime.parse("2024-01-01T00:00:00")); + return res; + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + @BeforeEach - public void init() throws Exception { + public void init() { MockitoAnnotations.openMocks(this); - calculImpactEquipementPhysiqueService = new CalculImpactEquipementPhysiqueServiceImpl( - dureeDeVieEquipementPhysiqueService - ); - etapeACV = "UTILISATION"; - String etapeACV = "UTILISATION"; - critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - dateCalcul = LocalDateTime.now(); - refEquipementCible = "Apple Iphone 11"; - refEquipementParDefaut = "Apple Iphone 11"; - equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .modeUtilisation("COPE") - .build(); - referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF1") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(refEquipementCible) - .consoElecMoyenne(0.09) - .build(); - referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.0813225) - .build(); - refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); + calculImpactEquipementPhysiqueService = new CalculImpactEquipementPhysiqueServiceImpl(dureeDeVieEquipementPhysiqueService); } - @Test - void shouldCalculerImpactEquipementPhysique_CAF1() { + @Test + void shouldCalculerImpactEquipementPhysique_CAF1() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Apple Iphone 11"; - String refEquipementParDefaut = "Apple Iphone 11"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - // Consommation electrique annuelle à null, celle du référentiel sera utilisé - .consoElecAnnuelle(null) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF1") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(refEquipementCible) - .consoElecMoyenne(0.09) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.0813225) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur": 0.08 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 10 + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); + assertEquals(LocalDateTime.parse("2024-01-01T00:00:00"), actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(0.0073, actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + assertEquals(0.8, actualImpactUnitaireLimited); + assertEquals(10, actual.getConsoElecMoyenne()); } - /* même cas que le CAF1 mais avec une consoElecAnnuelle à 0 au lieu de null. + /** + * même cas que le CAF1 mais avec une consoElecAnnuelle à 0 au lieu de null. * Conformément au Taiga 895 : le 0 est bien appliqué et ramène le résultat à 0 */ @Test void taiga895_shouldApplyConsoElecAnnuelWithConsoElecAnnuelleAt0_CAF1() { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Apple Iphone 11"; - String refEquipementParDefaut = "Apple Iphone 11"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - // Consommation electrique annuelle à 0, elle sera utilisé et rend le calcul à 0 - .consoElecAnnuelle(0.0) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF1") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(0.09) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.0813225) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(0.0); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); assertEquals(0, actualImpactUnitaireLimited); assertEquals(0, actual.getConsoElecMoyenne()); - assertNotEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); } @Test - void shouldCalculerImpactEquipementPhysique_CAF2_neededCorrection() { + void shouldCalculerImpactEquipementPhysique_CAF2_neededCorrection() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Ecran2"; - String refEquipementParDefaut = "Ecran2"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Ecran") - .nomEquipementPhysique("Ecran2") - .modele("Ecran2") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(30.0) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF2") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(70.0) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.0813225) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); - + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur": 0.0813225 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 70.0 + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(3, RoundingMode.DOWN).doubleValue(); assertEquals(5.692, actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + assertEquals(70.0, actual.getConsoElecMoyenne()); } @Test - void shouldCalculerImpactEquipementPhysique_CAF3_decimalFixing() { + void shouldCalculerImpactEquipementPhysique_CAF3_decimalFixing() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "OrdinateurBureau3"; - String refEquipementParDefaut = "OrdinateurBureau3"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("OrdinateurBureau") - .nomEquipementPhysique("OrdinateurBureau3") - .modele("OrdinateurBureau3") - .paysDUtilisation("Irlande") - .nomCourtDatacenter(null) - .quantite(1.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF3") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(3504.0) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("Irlande") - .raccourcisAnglais("IR") - .source("CAF3") - .valeur(0.648118) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur": 0.648118 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 3504.0 + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); - assertEquals(dateCalcul, actual.getDateCalcul()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); // quantité * refEquipementPhysique.consoElecMoyenne * MixElec assertEquals(BigDecimal.valueOf(1.0 * 3504.0 * 0.648118).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + assertEquals(3504.0, actual.getConsoElecMoyenne()); } @Test - void taiga918_DataCenterReferencedAndUsedForPUE_CAF1() { + void taiga918_DataCenterReferencedAndUsedForPUE_CAF1() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); DataCenter dataCenter = DataCenter.builder() .nomCourtDatacenter("sequoia2") .nomLongDatacenter("sequoia2") .localisation("France") .pue(1.43) .build(); - String refEquipementCible = "ref-Serveur1"; - String refEquipementParDefaut = "ref-Serveur1"; - LocalDateTime dateCalcul = LocalDateTime.now(); - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Serveur_100") - .dateAchat(LocalDate.of(2018, 10, 1)) - .modele("ref-Serveur1") - .paysDUtilisation("France") - .serveur(true) - .nomCourtDatacenter("sequoia2") - .dataCenter(dataCenter) - .quantite(2.0) - .consoElecAnnuelle(500.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.08) - .build(); - - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(500.0); + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + demandeCalcul.getEquipementPhysique().setQuantite(2.0); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); - assertEquals(dateCalcul, actual.getDateCalcul()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); // quantité * equipementPhysique.consoElecAnnuelle * DataCenter.pue * MixElec(France) assertEquals(BigDecimal.valueOf(2.0 * 500.0 * 1.43 * 0.08).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); } @Test - void taiga918_DataCenterWithoutPUEAndDefaultPUEUsed_CAF2() { - + void taiga918_DataCenterWithoutPUEAndDefaultPUEUsed_CAF2() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); DataCenter dataCenter = DataCenter.builder() .nomCourtDatacenter("sequoia3") .nomLongDatacenter("sequoia3") .localisation("France") .pue(null) .build(); - String refEquipementCible = "ref-Serveur4"; - String refEquipementParDefaut = "ref-Serveur4"; - LocalDateTime dateCalcul = LocalDateTime.now(); - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Serveur_104") - .modele("ref-Serveur4") - .paysDUtilisation("France") - .serveur(true) - .nomCourtDatacenter("sequoia3") - .dataCenter(dataCenter) - .consoElecAnnuelle(500.0) - .quantite(1.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(2.0) - .code("PUEParDefaut") - .source("CAF2") - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF2") - .valeur(0.08) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .hypotheses(Collections.singletonList(referentielHypothese)) - .build(); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(500.0); + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + } + ] + """, ReferentielFacteurCaracterisation[].class))); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "PUEParDefaut", + "valeur": "2.0", + "source": "sourceDefault" + } + ] + """, ReferentielHypothese[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); - assertEquals(dateCalcul, actual.getDateCalcul()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); // quantité * equipementPhysique.consoElecAnnuelle * ref_Hypothese(PUEParDefaut).valeur * MixElec France assertEquals(BigDecimal.valueOf(1.0 * 500.0 * 2.0 * 0.08).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); } @Test - void taiga918_ConsoElecMoyenneUsedFromRef_CAF3() { + void taiga918_ConsoElecMoyenneUsedFromRef_CAF3() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); DataCenter dataCenter = DataCenter.builder() .nomCourtDatacenter("sequoia2") .nomLongDatacenter("sequoia2") .localisation("France") .pue(1.43) .build(); - String refEquipementCible = "ref-Serveur2"; - String refEquipementParDefaut = "ref-Serveur2"; - LocalDateTime dateCalcul = LocalDateTime.now(); - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Serveur_101") - .modele("ref-Serveur2") - .paysDUtilisation("France") - .serveur(true) - .nomCourtDatacenter("sequoia2") - .dataCenter(dataCenter) - .quantite(1.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF2") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(10512.0) - .valeur(1139.839200000007) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF3") - .valeur(0.08) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 10512.0 + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); - assertEquals(dateCalcul, actual.getDateCalcul()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); // quantité * refEquipementPhysique.consoElecMoyenne * DataCEnter.pue * MixElec France assertEquals(BigDecimal.valueOf(1.0 * 10512.0 * 1.43 * 0.08).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + assertEquals(10512.0, actual.getConsoElecMoyenne()); } @Test - void taiga918_CAF4_whenDonneesConsoElecAbsente_shouldReturnErreurCalcul() { + void taiga918_CAF4_whenDonneesConsoElecAbsente_shouldReturnErreurCalcul() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - DataCenter dataCenter = DataCenter.builder() - .nomCourtDatacenter("sequoia2") - .nomLongDatacenter("sequoia2") - .localisation("France") - .pue(1.43) - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "ref-Serveur3"; - String refEquipementParDefaut = "ref-Serveur3"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Serveur_103") - .modele("ref-Serveur3") - .paysDUtilisation("France") - .serveur(true) - .nomCourtDatacenter("sequoia2") - .dataCenter(dataCenter) - .consoElecAnnuelle(null) - .quantite(1.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF4") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(null) - .valeur(1139.839200000007) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(null); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": null + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertNull(actual.getImpactUnitaire()); assertEquals("ERREUR", actual.getStatutIndicateur()); assertEquals( - "{\"erreur\":\"ErrCalcFonc : Donnée de consommation electrique manquante : equipementPhysique : Serveur_103, RefEquipementCible : ref-Serveur3, RefEquipementParDefaut : ref-Serveur3\"}", + "{\"erreur\":\"ErrCalcFonc : Donnée de consommation electrique manquante : equipementPhysique : Apple Iphone 11, RefEquipementCible : iphone, RefItemParDefaut : iphone\"}", actual.getTrace() ); } @Test - void taiga918_ecranCAF5() { - + void taiga918_ecranCAF5() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "ref-Ecran"; - String refEquipementParDefaut = "ref-Ecran"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Ecran") - .nomEquipementPhysique("Ecran_1") - .modele("ref-Ecran") - .paysDUtilisation("France") - .serveur(false) - .nomCourtDatacenter(null) - .dataCenter(null) - .quantite(1.0) - .consoElecAnnuelle(100.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF5") - .valeur(0.08) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(100.0); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": null + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); - assertEquals(dateCalcul, actual.getDateCalcul()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); // quantité * equipementPhysique.consoElecAnnuelle * MixElec France assertEquals(BigDecimal.valueOf(1.0 * 100.0 * 0.08).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); @@ -809,70 +472,53 @@ class CalculImpactEquipementPhysiqueServiceTest { @Test void shouldCalculerImpactEquipementPhysique_CAF4() throws Exception { - //Given - String etapeACV = "FABRICATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Ordinateur4"; - String refEquipementParDefaut = "Ordinateur4"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Desktop") - .nomEquipementPhysique("Ordinateur4") - .modele("Ordinateur4") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(null) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF4") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(null) - .valeur(142.0) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "FABRICATION"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "refEcran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + }, + { + "nom": "refEcran", + "niveau": "2-Equipement", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "valeur": 142.0 + } + ] + """, ReferentielFacteurCaracterisation[].class))); when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(5.0d).build()); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); + // quantité * facteurCaracterisation / dureeDeVie + assertEquals(BigDecimal.valueOf(1.0 * 142.0 / 5.0).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); assertEquals(28.4, actualImpactUnitaireLimited); verify(dureeDeVieEquipementPhysiqueService, times(1)).calculerDureeVie(demandeCalcul); assertNull(actual.getConsoElecMoyenne()); @@ -880,262 +526,134 @@ class CalculImpactEquipementPhysiqueServiceTest { @Test void shouldCalculerImpactEquipementPhysique_CAF5() throws Exception { - //Given - String etapeACV = "FIN_DE_VIE"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "KyoceraTaskalfa3253Ci"; - String refEquipementParDefaut = "KyoceraTaskalfa3253Ci"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Imprimante") - .nomEquipementPhysique("Imprimante5") - .modele("KyoceraTaskalfa3253Ci") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(null) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF5") - .etape(etapeACV) - .critere(critere.getNomCritere()) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(123.3) - .valeur(17.3) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "FIN_DE_VIE"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + }, + { + "nom": "ref-Ecran", + "niveau": "2-Equipement", + "etape": "FIN_DE_VIE", + "critere": "Changement Climatique", + "valeur": 17.3 + } + ] + """, ReferentielFacteurCaracterisation[].class))); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(6.0).build()); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(2.8833, actualImpactUnitaireLimited); + // quantité * facteurCaracterisation / dureeDeVie + assertEquals(BigDecimal.valueOf(1.0 * 17.3 / 6.0).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); verify(dureeDeVieEquipementPhysiqueService, times(1)).calculerDureeVie(demandeCalcul); assertNull(actual.getConsoElecMoyenne()); } @Test void shouldCalculerImpactEquipementPhysique_CAF6() throws Exception { - //Given - String etapeACV = "DISTRIBUTION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Ecran6"; - String refEquipementParDefaut = "Ecran6"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Ecran") - .nomEquipementPhysique("Ecran6") - .modele("Ecran6") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(null) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF6") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(123.3) - .valeur(1.273) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "DISTRIBUTION"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08 + }, + { + "nom": "ref-Ecran", + "niveau": "2-Equipement", + "etape": "DISTRIBUTION", + "critere": "Changement Climatique", + "valeur": 1.273 + } + ] + """, ReferentielFacteurCaracterisation[].class))); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(7.0).build()); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(0.1818, actualImpactUnitaireLimited); + // quantité * facteurCaracterisation / dureeDeVie + assertEquals(BigDecimal.valueOf(1.0 * 1.273 / 7.0).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); verify(dureeDeVieEquipementPhysiqueService, times(1)).calculerDureeVie(demandeCalcul); assertNull(actual.getConsoElecMoyenne()); } - @Test - void shouldCalculerImpactEquipementPhysique_whenEtapeACVUTILISATIONAndEquipementConsoElecMoyenneFilled() throws Exception { - - //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Apple Iphone 11"; - String refEquipementParDefaut = "Apple Iphone 11"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .consoElecAnnuelle(0.09) - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.0813225) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); - - //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); - - //Then - assertContentIndicateur(demandeCalcul, actual); - assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); - assertNotNull(actual.getImpactUnitaire()); - double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(0.0073, actualImpactUnitaireLimited); - assertEquals(equipementPhysique.getConsoElecAnnuelle(), actual.getConsoElecMoyenne()); - } - @Test void shouldBuildTraceWithFirstFormulaScenario1() throws JsonProcessingException { - //GIVEN - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder().nomCritere("Changement Climatique").unite("CO2").build(); - String refEquipementCible = "Samsung SMP"; - String refEquipementParDefaut = "Samsung SMP"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .nomEquipementPhysique("Samsung S21") - .modele("Samsung SMP") - .consoElecAnnuelle(200d) - .paysDUtilisation("France") - .nbJourUtiliseAn(230d) - .serveur(false) - .quantite(3d) - .build(); - - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("Source-Mix") - .valeur(150d) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(LocalDateTime.now()) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + //Given + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setQuantite(3d); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(200d); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 150, + "source": "Source-Mix" + } + ] + """, ReferentielFacteurCaracterisation[].class))); var formule = TraceCalculImpactEquipementPhysiqueUtils.getFormulePremierScenario(3d, 200d, 150d, 1.0); - var consoElecAnMoyenne = ConsoElecAnMoyenne.builder().valeurItemConsoElecAnnuelle(200d).valeur(200d).build(); var mixElectrique = MixElectrique.builder().valeur(150d).valeurReferentielMixElectrique(150d).sourceReferentielMixElectrique("Source-Mix").build(); TraceCalculImpactEquipementPhysique trace = TraceCalculImpactEquipementPhysique.builder() @@ -1143,7 +661,9 @@ class CalculImpactEquipementPhysiqueServiceTest { .consoElecAnMoyenne(consoElecAnMoyenne) .mixElectrique(mixElectrique) .build(); + var expected = new ObjectMapper().writeValueAsString(trace); + //WHEN var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //THEN @@ -1152,58 +672,48 @@ class CalculImpactEquipementPhysiqueServiceTest { @Test void shouldBuildTraceWithFirstFormulaScenario2() throws JsonProcessingException { - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder().nomCritere("Changement Climatique").unite("CO2").build(); + //Given + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + DataCenter dataCenter = DataCenter.builder() .localisation("Spain") .pue(5d) .build(); - String refEquipementCible = "IBM E1080"; - String refEquipementParDefaut = "IBM E1080"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .quantite(6d) - .modele("IBM E1080") - .serveur(true) - .dataCenter(dataCenter) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement("IBM E1080") - .source("source-RefEquipement") - .consoElecMoyenne(130d) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("Spain") - .source("Source-Mix") - .valeur(25d) - .build(); - - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(LocalDateTime.now()) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + + demandeCalcul.getEquipementPhysique().setQuantite(6d); + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + demandeCalcul.getEquipementPhysique().setServeur(true); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "Spain", + "valeur": 25, + "source":"Source-Mix" + }, + { + "nom": "ref-Ecran", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne":130, + "source": "source-RefEquipement" + } + ] + """, ReferentielFacteurCaracterisation[].class))); var formule = TraceCalculImpactEquipementPhysiqueUtils.getFormulePremierScenario(6d, 130d, 5d * 25d, 1.0); @@ -1233,58 +743,41 @@ class CalculImpactEquipementPhysiqueServiceTest { @Test void shouldBuildTraceWithSecondFormula() throws JsonProcessingException, CalculImpactException { - String etapeACV = "Fin de vie"; - ReferentielCritere critere = ReferentielCritere.builder().nomCritere("Changement Climatique").unite("CO2").build(); + + //Given LocalDate dateAchat = LocalDate.of(2020, 1, 22); LocalDate dateRetrait = LocalDate.of(2021, 5, 12); - double quantite = 6d; - double tauxUtilisation = 1.0; - String refEquipementCible = "IBM E1080"; - String refEquipementParDefaut = "IBM E1080"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .quantite(quantite) - .modele("IBM E1080") - .dateAchat(dateAchat) - .dateRetrait(dateRetrait) - .serveur(false) - .build(); - double valeurRefrentiel = 100d; - String sourceReferentielImpactEquipement = "source-RefEquipement"; - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement("IBM E1080") - .source(sourceReferentielImpactEquipement) - .consoElecMoyenne(130d) - .valeur(valeurRefrentiel) - .build(); - - - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(LocalDateTime.now()) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setQuantite(6d); + demandeCalcul.getEquipementPhysique().setDateAchat(dateAchat); + demandeCalcul.getEquipementPhysique().setDateRetrait(dateRetrait); + demandeCalcul.setOptionsCalcul(new OptionsCalcul("REEL")); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "FIN DE VIE"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "ref-Ecran", + "niveau": "2-Equipement", + "etape": "FIN DE VIE", + "critere": "Changement Climatique", + "valeur":100, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)).thenCallRealMethod(); @@ -1298,13 +791,13 @@ class CalculImpactEquipementPhysiqueServiceTest { .dateRetrait(dateRetrait.format(DateTimeFormatter.ISO_DATE)) .build(); - var formule = TraceCalculImpactEquipementPhysiqueUtils.getFormuleSecondScenario(quantite, valeurRefrentiel, valeurDureeVie, tauxUtilisation); + var formule = TraceCalculImpactEquipementPhysiqueUtils.getFormuleSecondScenario(6d, 100d, valeurDureeVie, 1.0); TraceCalculImpactEquipementPhysique trace = TraceCalculImpactEquipementPhysique.builder() .formule(formule) .dureeDeVie(dureeDeVie) - .valeurReferentielImpactEquipement(valeurRefrentiel) - .sourceReferentielImpactEquipement(sourceReferentielImpactEquipement) + .valeurReferentielFacteurCaracterisation(100d) + .sourceReferentielFacteurCaracterisation("sourceReferentielFacteurCaracterisation") .build(); var expected = new ObjectMapper().writeValueAsString(trace); //WHEN @@ -1314,67 +807,46 @@ class CalculImpactEquipementPhysiqueServiceTest { assertEquals(expected, actual.getTrace()); } + //EN DOUBLE @Test - void taiga862_CAF1_calculImpactEquipementPhysiqueWithoutCorrespondanceShouldUseRefEquipementParDefaut() throws Exception { - + void taiga862_CAF1_calculImpactEquipementPhysiqueWithoutCorrespondanceShouldUseRefItemParDefaut() throws Exception { //Given - String etapeACV = "DISTRIBUTION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementParDefaut = "EcranParDefaut"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Ecran") - .nomEquipementPhysique("Ecran6") - .modele("Ecran6") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(null) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .critere(critere.getNomCritere()) - .etape(etapeACV) - .source("CAF6") - .refEquipement(refEquipementParDefaut) - .consoElecMoyenne(123.3) - .valeur(1.273) - .build(); - - ReferentielCorrespondanceRefEquipement refEquipement = null; - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "DISTRIBUTION"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "ref-Ecran", + "niveau": "2-Equipement", + "etape": "DISTRIBUTION", + "critere": "Changement Climatique", + "valeur":1.273, + "consoElecMoyenne": 123, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(7.0).build()); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); assertEquals(0.1818, actualImpactUnitaireLimited); @@ -1383,70 +855,51 @@ class CalculImpactEquipementPhysiqueServiceTest { } @Test - void taiga862_CAF1_calculImpactEquipementPhysiqueWithoutImpactForCorrespondanceShouldUseRefEquipementParDefaut() throws Exception { - + void taiga862_CAF1_calculImpactEquipementPhysiqueWithoutImpactForCorrespondanceShouldUseRefItemParDefaut() throws Exception { //Given - String etapeACV = "DISTRIBUTION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementParDefaut = "EcranParDefaut"; - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .critere(critere.getNomCritere()) - .etape(etapeACV) - .source("CAF6") - .refEquipement(refEquipementParDefaut) - .consoElecMoyenne(123.3) - .valeur(1.273) - .build(); - String refEquipementCible = "Ecran6"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Ecran") - .nomEquipementPhysique("Ecran6") - .modele("Ecran6") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(null) - .build(); - - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "DISTRIBUTION"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Cible" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "DISTRIBUTION", + "critere": "Changement Climatique", + "valeur":1.273, + "consoElecMoyenne": 123, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(7.0).build()); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); assertEquals(0.1818, actualImpactUnitaireLimited); @@ -1455,72 +908,44 @@ class CalculImpactEquipementPhysiqueServiceTest { } @Test - void tech_whenDureeDeVieUnknown_shouldReturnIndicateurWithError() { - + void tech_whenDureeDeVieUnknown_shouldReturnIndicateurWithError() throws JsonProcessingException { //Given - String etapeACV = "FIN_DE_VIE"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - DataCenter dataCenter = DataCenter.builder() - .nomCourtDatacenter("sequoia2") - .nomLongDatacenter("sequoia2") - .localisation("France") - .pue(1.43) - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "ref-Serveur3"; - String refEquipementParDefaut = "ref-Serveur3"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Serveur_103") - .modele("ref-Serveur3") - .paysDUtilisation("France") - .serveur(true) - .nomCourtDatacenter("sequoia2") - .dataCenter(dataCenter) - .consoElecAnnuelle(null) - .quantite(1.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF4") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(100.0) - .valeur(1139.839200000007) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); - + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "DISTRIBUTION"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Cible" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "DISTRIBUTION", + "critere": "Changement Climatique", + "valeur":1.273, + "consoElecMoyenne": 123, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); @@ -1533,598 +958,382 @@ class CalculImpactEquipementPhysiqueServiceTest { } @Test - void verifyErrorWhenCallConsoElecAnMoyenneWithoutConsoInEntryWithImpactRefWithoutConso() { - + void verifyErrorwhenNoReferentielImpactEquipement_shouldReturnIndicateurWithError() throws JsonProcessingException { //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Apple Iphone 11"; - String refEquipementParDefaut = "Apple Iphone 11"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF5") - .valeur(0.08) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF4") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(null) - .valeur(1139.839200000007) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "Apple Iphone 11" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie": "electricity-mix", + "localisation": "France", + "valeur": 0.08, + "source":"Source-Mix" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); - - //Then - assertContentIndicateur(demandeCalcul, actual); - assertNull(actual.getImpactUnitaire()); - assertEquals("ERREUR", actual.getStatutIndicateur()); - assertEquals( - "{\"erreur\":\"ErrCalcFonc : Donnée de consommation electrique manquante : equipementPhysique : Apple Iphone 11, RefEquipementCible : Apple Iphone 11, RefEquipementParDefaut : Apple Iphone 11\"}", - actual.getTrace() - ); - } - - @Test - void verifyErrorWhenCallConsoElecAnMoyenneWithoutConsoInEntryAndNoImpactRef() { - - //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementParDefaut = "EcranParDefaut"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Ecran") - .nomEquipementPhysique("Ecran6") - .modele("Ecran6") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .build(); - //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertNull(actual.getImpactUnitaire()); assertEquals("ERREUR", actual.getStatutIndicateur()); assertEquals( - "{\"erreur\":\"ErrCalcFonc : Référentiel Impact Equipement inconnu\"}", + "{\"erreur\":\"ErrCalcFonc : Référentiel Facteur Caracterisation inconnu\"}", actual.getTrace() ); } - @Test - void tech_whenNoReferentielImpactEquipement_shouldReturnIndicateurWithError() throws CalculImpactException { - //Given - String etapeACV = "FIN_DE_VIE"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - DataCenter dataCenter = DataCenter.builder() - .nomCourtDatacenter("sequoia2") - .nomLongDatacenter("sequoia2") - .localisation("France") - .pue(1.43) - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "ref-Serveur3"; - String refEquipementParDefaut = "ref-Serveur3"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Serveur_103") - .modele("ref-Serveur3") - .paysDUtilisation("France") - .serveur(true) - .nomCourtDatacenter("sequoia2") - .dataCenter(dataCenter) - .consoElecAnnuelle(null) - .quantite(1.0) - .nbJourUtiliseAn(365.0) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(6.0) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.emptyList()) - .build(); - - //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); - - //Then - assertContentIndicateur(demandeCalcul, actual); - assertNull(actual.getImpactUnitaire()); - assertEquals("ERREUR", actual.getStatutIndicateur()); - assertEquals( - "{\"erreur\":\"ErrCalcFonc : Référentiel Impact Equipement inconnu\"}", - actual.getTrace() - ); - } @Test void tech_whenMixElectriqueNotFound_shouldReturnIndicateurWithError() throws Exception { - //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Apple Iphone 11"; - String refEquipementParDefaut = "Apple Iphone 11"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .consoElecAnnuelle(0.09) - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.emptyList()) - .build(); - + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Cible" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "valeur":1.273, + "consoElecMoyenne": 123, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertNull(actual.getImpactUnitaire()); assertEquals("ERREUR", actual.getStatutIndicateur()); assertEquals( - "{\"erreur\":\"ErrCalcFonc : Il n'existe pas de Mix électrique pour cet équipement : critere: Changement Climatique - equipement: Apple Iphone 11 - Pays d'utilisation: France - NomCourtDatacenter: null\"}", + "{\"erreur\":\"ErrCalcFonc : Il n'existe pas de Mix électrique pour cet équipement : critere: Changement Climatique - equipement: Apple Iphone 11 - Localisation: France - NomCourtDatacenter: null\"}", actual.getTrace() ); } @Test void tech_whenMixElectriqueNotFoundWithDataCenter_shouldReturnIndicateurWithError() throws Exception { - //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "IBM X96"; - String refEquipementParDefaut = "IBM X96"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("IBM X96") - .modele("IBM X96") - .paysDUtilisation("France") - .consoElecAnnuelle(0.09) - .quantite(1.0) - .nbJourUtiliseAn(216.0) + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + demandeCalcul.getEquipementPhysique().setNomCourtDatacenter("TanaMana 2"); + DataCenter dataCenter = DataCenter.builder() + .localisation("Spain") + .pue(5d) .nomCourtDatacenter("TanaMana 2") - .dataCenter( - DataCenter.builder() - .nomCourtDatacenter("TanaMana 2") - .nomLongDatacenter("TanaMana 2 - Rack B") - .localisation("France") - .pue(6.2) - .build() - ) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.emptyList()) - .build(); - + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Cible" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "valeur":1.273, + "consoElecMoyenne": 123, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertNull(actual.getImpactUnitaire()); assertEquals("ERREUR", actual.getStatutIndicateur()); assertEquals( - "{\"erreur\":\"ErrCalcFonc : Il n'existe pas de Mix électrique pour cet équipement : critere: Changement Climatique - equipement: IBM X96 - Pays d'utilisation: France - NomCourtDatacenter: TanaMana 2\"}", + "{\"erreur\":\"ErrCalcFonc : Il n'existe pas de Mix électrique pour cet équipement : critere: Changement Climatique - equipement: Apple Iphone 11 - Localisation: France - NomCourtDatacenter: TanaMana 2\"}", actual.getTrace() ); } @Test void tech_whenPUEUknown_shouldReturnIndicateurWithError() throws Exception { - //Given - String etapeACV = "UTILISATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "IBM X96"; - String refEquipementParDefaut = "IBM X96"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Serveur") - .nomEquipementPhysique("Tanabana2-IBM X96") - .modele("IBM X96") - .paysDUtilisation("France") - .consoElecAnnuelle(0.09) - .quantite(1.0) - .nbJourUtiliseAn(216.0) + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + demandeCalcul.getEquipementPhysique().setNomCourtDatacenter("TanaMana 2"); + demandeCalcul.getEquipementPhysique().setServeur(true); + DataCenter dataCenter = DataCenter.builder() + .localisation("France") + .pue(null) .nomCourtDatacenter("TanaMana 2") - .dataCenter( - DataCenter.builder() - .nomCourtDatacenter("TanaMana 2") - .nomLongDatacenter("TanaMana 2 - Rack B") - .localisation("France") - .pue(null) - .build() - ) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - ReferentielMixElectrique referentielMixElectrique = ReferentielMixElectrique.builder() - .critere(critere.getNomCritere()) - .pays("France") - .raccourcisAnglais("FR") - .source("CAF1") - .valeur(0.0813225) - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) .build(); + demandeCalcul.getEquipementPhysique().setDataCenter(dataCenter); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Cible" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "telephone", + "categorie": "EquipementPhysique", + "refItemParDefaut": "iphone" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.08 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "valeur":1.273, + "consoElecMoyenne": 123, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertNull(actual.getImpactUnitaire()); assertEquals("ERREUR", actual.getStatutIndicateur()); assertEquals( - "{\"erreur\":\"ErrCalcFonc : Le PUE est manquant et ne permet le calcul de l'impact à l'usage de l'équipement : equipement: Tanabana2-IBM X96 - RefEquipementCible: IBM X96 - refEquipementParDefaut: IBM X96 - NomCourtDatacenter: TanaMana 2\"}", + "{\"erreur\":\"ErrCalcFonc : Le PUE est manquant et ne permet le calcul de l'impact à l'usage de l'équipement : equipement: Apple Iphone 11 - RefEquipementCible: ref-Cible - refItemParDefaut: iphone - NomCourtDatacenter: TanaMana 2\"}", actual.getTrace() ); } - private void assertContentIndicateur(DemandeCalculImpactEquipementPhysique source, ImpactEquipementPhysique result) { - assertNotNull(result); - assertEquals(source.getEquipementPhysique().getNomEquipementPhysique(), result.getNomEquipement()); - assertEquals(source.getEquipementPhysique().getType(), result.getTypeEquipement()); - assertEquals(source.getEquipementPhysique().getStatut(), result.getStatutEquipementPhysique()); - assertEquals(source.getEquipementPhysique().getQuantite(), result.getQuantite()); - - assertEquals(source.getEquipementPhysique().getNomLot(), result.getNomLot()); - assertEquals(source.getEquipementPhysique().getDateLot(), result.getDateLot()); - assertEquals(source.getEquipementPhysique().getNomOrganisation(), result.getNomOrganisation()); - assertEquals(source.getEquipementPhysique().getNomEntite(), result.getNomEntite()); - assertEquals(source.getEquipementPhysique().getNomSourceDonnee(), result.getNomSourceDonnee()); - - assertEquals(source.getDateCalcul(), result.getDateCalcul()); - - assertEquals(source.getCritere().getNomCritere(), result.getCritere()); - assertEquals(source.getEtape().getCode(), result.getEtapeACV()); - assertEquals(source.getCritere().getUnite(), result.getUnite()); - - assertEquals("1.0", result.getVersionCalcul()); - } @Test - void verifyFormulaForModeUtilisationCOPE() { + void verifyFormulaForModeUtilisationCOPE() throws JsonProcessingException { //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .modeUtilisation("COPE") - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(0.8) - .code("taux_utilisation_COPE") - .source("RCP_SI") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .hypotheses(Collections.singletonList(referentielHypothese)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModeUtilisation("COPE"); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "taux_utilisation_COPE", + "valeur": "0.8", + "source": "source" + } + ] + """, ReferentielHypothese[].class))); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.0813225 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 0.09, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); + //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(0.0058, actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + // quantité * consoElecMoyenne *tauxUtilisation + assertEquals(BigDecimal.valueOf(0.0813225 * 0.09 * 0.8).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); } @Test - void verifyFormulaForModeUtilisationBYOD() { + void verifyFormulaForModeUtilisationBYOD() throws JsonProcessingException { //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .modeUtilisation("BYOD") - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(0.57) - .code("taux_utilisation_BYOD") - .source("RCP_SI") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .hypotheses(Collections.singletonList(referentielHypothese)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModeUtilisation("BYOD"); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "taux_utilisation_BYOD", + "valeur": "0.57", + "source": "source" + } + ] + """, ReferentielHypothese[].class))); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.0813225 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 0.09, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); + //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(0.0041, actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + // quantité * consoElecMoyenne *tauxUtilisation + assertEquals(BigDecimal.valueOf(0.0813225 * 0.09 * 0.57).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); } @Test - void verifyFormulaForModeUtilisationModeUtilisationNull() { + void verifyFormulaForModeUtilisationModeUtilisationNull() throws JsonProcessingException { //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(0.57) - .code("taux_utilisation_BYOD") - .source("RCP_SI") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .hypotheses(Collections.singletonList(referentielHypothese)) - .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModeUtilisation(null); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.0813225 + }, + { + "nom": "iphone", + "niveau": "2-Equipement", + "etape": "UTILISATION", + "critere": "Changement Climatique", + "consoElecMoyenne": 0.09, + "source": "sourceReferentielFacteurCaracterisation" + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); + //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(0.0073, actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + // quantité * consoElecMoyenne * tauxUtilisation + assertEquals(BigDecimal.valueOf(0.0813225 * 0.09 * 1.0).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); } @Test - void verifyFormulaForModeUtilisationModeUtilisationUnknown() { - //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .modeUtilisation("COB") - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(0.57) - .code("taux_utilisation_BYOD") - .source("RCP_SI") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .hypotheses(Collections.singletonList(referentielHypothese)) - .build(); + void verifyFormulaForModeUtilisationUnknown() throws JsonProcessingException { + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModeUtilisation("COB"); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "taux_utilisation_BYOD", + "valeur": "0.57", + "source": "source" + } + ] + """, ReferentielHypothese[].class))); + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.0813225 + } + ] + """, ReferentielFacteurCaracterisation[].class))); //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("ERREUR", actual.getStatutIndicateur()); @@ -2134,37 +1343,28 @@ class CalculImpactEquipementPhysiqueServiceTest { } @Test - void verifyFormulaForModeUtilisationModeUtilisationCOPEButNotInRefHypotheses() { - //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .modeUtilisation("COPE") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .build(); + void verifyFormulaForModeUtilisationModeUtilisationCOPEButNotInRefHypotheses() throws JsonProcessingException { + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.getEquipementPhysique().setModeUtilisation("COPE"); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.0813225 + } + ] + """, ReferentielFacteurCaracterisation[].class))); + //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); + //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("ERREUR", actual.getStatutIndicateur()); @@ -2175,123 +1375,119 @@ class CalculImpactEquipementPhysiqueServiceTest { @Test void verifyFormulaForNotTUILISATIONModeUtilisationCOPE() throws Exception { - //Given - String etapeACV = "FABRICATION"; - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - LocalDateTime dateCalcul = LocalDateTime.now(); - String refEquipementCible = "Ordinateur4"; - String refEquipementParDefaut = "Ordinateur4"; - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Desktop") - .nomEquipementPhysique("Ordinateur4") - .modele("Ordinateur4") - .paysDUtilisation("France") - .quantite(1.0) - .modeUtilisation("COPE") - .nbJourUtiliseAn(null) - .build(); - ReferentielImpactEquipement referentielImpactEquipement = ReferentielImpactEquipement.builder() - .source("CAF4") - .critere(critere.getNomCritere()) - .etape(etapeACV) - .refEquipement(equipementPhysique.getModele()) - .consoElecMoyenne(null) - .valeur(142.0) - .build(); - ReferentielCorrespondanceRefEquipement refEquipement = ReferentielCorrespondanceRefEquipement.builder() - .refEquipementCible(refEquipementCible) - .modeleEquipementSource(equipementPhysique.getModele()) - .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() - .type(equipementPhysique.getType()) - .refEquipementParDefaut(refEquipementParDefaut) - .dureeVieDefaut(null) - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(0.85) - .code("taux_utilisation_COPE") - .source("RCP_SI") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .hypotheses(Collections.singletonList(referentielHypothese)) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .optionsCalcul(new OptionsCalcul("REEL")) - .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(5.0d).build()); + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + demandeCalcul.setEtape(objectMapper.readValue(""" + {"code": "DISTRIBUTION"} + """, ReferentielEtapeACV.class)); + + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + demandeCalcul.getEquipementPhysique().setModeUtilisation("COPE"); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "taux_utilisation_COPE", + "valeur": "0.85", + "source": "source" + } + ] + """, ReferentielHypothese[].class))); + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "ref-Ecran", + "niveau": "2-Equipement", + "etape": "DISTRIBUTION", + "critere": "Changement Climatique", + "valeur": 142 + } + ] + """, ReferentielFacteurCaracterisation[].class))); + + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))) + .thenReturn(DureeDeVie.builder().valeurRetenue(5.0d).build()); + //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); + //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); - assertEquals(dateCalcul, actual.getDateCalcul()); assertNotNull(actual.getImpactUnitaire()); double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); - assertEquals(24.14, actualImpactUnitaireLimited); + // quantité / facteurCaracterisation * tauxUtilisation + assertEquals(BigDecimal.valueOf(1.0 * 142 * 0.85 / 5.0).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); verify(dureeDeVieEquipementPhysiqueService, times(1)).calculerDureeVie(demandeCalcul); assertNull(actual.getConsoElecMoyenne()); } @Test void verifyFormulaForUTILISATIONTauxUtilisationFilled() throws Exception { - //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .type("Téléphone") - .nomEquipementPhysique("Apple Iphone 11") - .modele("Apple Iphone 11") - .paysDUtilisation("France") - .quantite(1.0) - .nbJourUtiliseAn(216.0) - .consoElecAnnuelle(0.09) - .modeUtilisation("") - .tauxUtilisation(0.1) - .build(); - ReferentielHypothese referentielHypothese = ReferentielHypothese.builder() - .valeur(0.57) - .code("taux_utilisation_BYOD") - .source("RCP_SI") - .build(); - DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique - .builder() - .dateCalcul(dateCalcul) - .etape(ReferentielEtapeACV.builder().code(etapeACV).build()) - .critere(critere) - .equipementPhysique(equipementPhysique) - .correspondanceRefEquipement(refEquipement) - .typeEquipement(typeEquipement) - .impactEquipements(Collections.singletonList(referentielImpactEquipement)) - .mixElectriques(Collections.singletonList(referentielMixElectrique)) - .hypotheses(Collections.singletonList(referentielHypothese)) - .build(); + + DemandeCalculImpactEquipementPhysique demandeCalcul = createDemande(); + + demandeCalcul.getEquipementPhysique().setModele("ECRAN DELL"); + demandeCalcul.getEquipementPhysique().setConsoElecAnnuelle(56.0); + demandeCalcul.getEquipementPhysique().setTauxUtilisation(0.1); + + demandeCalcul.setCorrespondanceRefEquipement(objectMapper.readValue(""" + { + "modeleEquipementSource":"ECRAN DELL", + "refEquipementCible": "ref-Ecran" + } + """, ReferentielCorrespondanceRefEquipement.class)); + + demandeCalcul.setFacteurCaracterisations(List.of(objectMapper.readValue(""" + [ + { + "nom": "Electricty Mix FR", + "etape": "FABRICATION", + "critere": "Changement Climatique", + "categorie" : "electricity-mix", + "niveau": "0-Base data", + "localisation": "France", + "source": "CAF1", + "valeur" : 0.08 + } + ] + """, ReferentielFacteurCaracterisation[].class))); + //When - var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( - demandeCalcul - ); + var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique(demandeCalcul); //Then assertContentIndicateur(demandeCalcul, actual); assertEquals("OK", actual.getStatutIndicateur()); assertNotNull(actual.getImpactUnitaire()); - double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(5, RoundingMode.DOWN).doubleValue(); - assertEquals(0.00073, actualImpactUnitaireLimited); - assertEquals(referentielImpactEquipement.getConsoElecMoyenne(), actual.getConsoElecMoyenne()); + double actualImpactUnitaireLimited = BigDecimal.valueOf(actual.getImpactUnitaire()).setScale(4, RoundingMode.DOWN).doubleValue(); + // quantité * consoElecMoyenne * MixElectrique * TauxUtilisation + assertEquals(BigDecimal.valueOf(1.0 * 56 * 0.08 * 0.1).setScale(4, RoundingMode.DOWN).doubleValue(), actualImpactUnitaireLimited); + } + + private void assertContentIndicateur(DemandeCalculImpactEquipementPhysique source, ImpactEquipementPhysique result) { + assertNotNull(result); + assertEquals(source.getEquipementPhysique().getNomEquipementPhysique(), result.getNomEquipement()); + assertEquals(source.getEquipementPhysique().getType(), result.getTypeEquipement()); + assertEquals(source.getEquipementPhysique().getStatut(), result.getStatutEquipementPhysique()); + assertEquals(source.getEquipementPhysique().getQuantite(), result.getQuantite()); + + assertEquals(source.getEquipementPhysique().getNomLot(), result.getNomLot()); + assertEquals(source.getEquipementPhysique().getDateLot(), result.getDateLot()); + assertEquals(source.getEquipementPhysique().getNomOrganisation(), result.getNomOrganisation()); + assertEquals(source.getEquipementPhysique().getNomEntite(), result.getNomEntite()); + assertEquals(source.getEquipementPhysique().getNomSourceDonnee(), result.getNomSourceDonnee()); + + assertEquals(source.getDateCalcul(), result.getDateCalcul()); + + assertEquals(source.getCritere().getNomCritere(), result.getCritere()); + assertEquals(source.getEtape().getCode(), result.getEtapeACV()); + assertEquals(source.getCritere().getUnite(), result.getUnite()); + + assertEquals("1.0", result.getVersionCalcul()); } } \ No newline at end of file diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactReseauServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactReseauServiceTest.java deleted file mode 100644 index 5ae06bb4..00000000 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactReseauServiceTest.java +++ /dev/null @@ -1,215 +0,0 @@ -package org.mte.numecoeval.calculs.domain.service; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactReseau; -import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; -import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactReseau; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielCritere; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielEtapeACV; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielImpactReseau; -import org.mte.numecoeval.calculs.domain.port.input.service.CalculImpactReseauService; -import org.mte.numecoeval.calculs.domain.port.input.service.impl.CalculImpactReseauServiceImpl; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Collections; - -import static org.junit.jupiter.api.Assertions.*; - -class CalculImpactReseauServiceTest { - - private final String REF_RESEAU = "impactReseauMobileMoyen"; - - private CalculImpactReseauService calculImpactService; - - @BeforeEach - void setUp() { - calculImpactService = new CalculImpactReseauServiceImpl(); - } - - @Test - void shouldReturnCorrectCalculImpact_whenValidInputs() { - // Given - LocalDateTime dateCalcul = LocalDateTime.now(); - ReferentielEtapeACV etapeACV = ReferentielEtapeACV.builder() - .code("UTILISATION") - .build(); - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .nomEquipementPhysique("Equipement 1") - .goTelecharge(3.5f) - .build(); - ReferentielImpactReseau referentielImpactReseau = ReferentielImpactReseau.builder() - .etapeACV(etapeACV.getCode()) - .critere(critere.getNomCritere()) - .refReseau(REF_RESEAU) - .impactReseauMobileMoyen(4d) - .build(); - var demandeCalcul = DemandeCalculImpactReseau.builder() - .dateCalcul(dateCalcul) - .equipementPhysique(equipementPhysique) - .etape(etapeACV) - .critere(critere) - .impactsReseau(Collections.singletonList(referentielImpactReseau)) - .build(); - Double expected = 4d * 3.5f; - - //When - var impactReseau = assertDoesNotThrow(() -> calculImpactService.calculerImpactReseau(demandeCalcul)); - - //Then - assertNotNull(impactReseau.getImpactUnitaire()); - assertEquals(expected, impactReseau.getImpactUnitaire()); - assertContentIndicateur(demandeCalcul, impactReseau); - assertEquals("OK", impactReseau.getStatutIndicateur()); - assertEquals( - "{\"critere\":\"Changement Climatique\",\"etapeACV\":\"UTILISATION\",\"equipementPhysique\":\"Equipement 1\",\"impactReseauMobileMoyen\":\"4.0\",\"goTelecharge\":\"3.5\",\"formule\":\"impactReseau = 'equipementPhysique.goTelecharge (3.5) x ref_ImpactReseau(Changement Climatique, UTILISATION, impactReseauMobileMoyen).valeur(4.0)'\"}", - impactReseau.getTrace() - ); - } - - @Test - void shouldReturnError_whenInvalidInputs() { - //Given - ReferentielEtapeACV etapeACV = ReferentielEtapeACV.builder() - .code("UTILISATION") - .build(); - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .nomEquipementPhysique("Equipement 1") - .goTelecharge(null) - .build(); - var demandeCalcul = DemandeCalculImpactReseau.builder() - .dateCalcul(LocalDateTime.now()) - .equipementPhysique(equipementPhysique) - .etape(etapeACV) - .critere(critere) - .impactsReseau(Collections.emptyList()) - .build(); - - //When - var impactReseau = calculImpactService.calculerImpactReseau(demandeCalcul); - - //Then - assertContentIndicateur(demandeCalcul, impactReseau); - assertEquals("ERREUR", impactReseau.getStatutIndicateur()); - assertNull(impactReseau.getImpactUnitaire()); - assertEquals("{\"erreur\":\"ErrCalcFonc : Erreur de calcul impact réseau: Etape: UTILISATION, Critere: Changement Climatique, Equipement Physique: Equipement 1 : la valeur en_EqP(Equipement).goTelecharge est nulle\"}", impactReseau.getTrace()); - } - - @Test - void shouldReturnError_whenInvalidReference() { - //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .nomEquipementPhysique("Equipement 1") - .goTelecharge(4.0f) - .build(); - ReferentielEtapeACV etapeACV = ReferentielEtapeACV.builder() - .code("UTILISATION") - .build(); - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - ReferentielImpactReseau referentielImpactReseau = ReferentielImpactReseau.builder() - .etapeACV(etapeACV.getCode()) - .critere(critere.getNomCritere()) - .refReseau(REF_RESEAU) - .build(); - var demandeCalcul = DemandeCalculImpactReseau.builder() - .dateCalcul(LocalDateTime.now()) - .equipementPhysique(equipementPhysique) - .etape(etapeACV) - .critere(critere) - .impactsReseau(Collections.singletonList(referentielImpactReseau)) - .build(); - - //When - var impactReseau = calculImpactService.calculerImpactReseau(demandeCalcul); - - //Then - assertContentIndicateur(demandeCalcul, impactReseau); - assertEquals("ERREUR", impactReseau.getStatutIndicateur()); - assertNull(impactReseau.getImpactUnitaire()); - assertEquals("{\"erreur\":\"ErrCalcFonc : Erreur de calcul impact réseau: Etape: UTILISATION, Critere: Changement Climatique, RefReseau: impactReseauMobileMoyen, Equipement Physique: Equipement 1 : L'impactReseauMobileMoyen de la référence est null.\"}", impactReseau.getTrace()); - } - - @Test - void shouldReturnError_whenReferenceNotFound() { - //Given - EquipementPhysique equipementPhysique = EquipementPhysique.builder() - .dateLot(LocalDate.of(2022, 1, 1)) - .nomOrganisation("Test") - .nomLot("Test|20220101") - .nomSourceDonnee("Source_Test") - .nomEquipementPhysique("Equipement 1") - .goTelecharge(4.0f) - .dateLot(LocalDate.of(2023, 1, 1)) - .build(); - ReferentielEtapeACV etapeACV = ReferentielEtapeACV.builder() - .code("UTILISATION") - .build(); - ReferentielCritere critere = ReferentielCritere.builder() - .nomCritere("Changement Climatique") - .unite("kg CO_{2} eq") - .build(); - ReferentielImpactReseau referentielImpactReseau = ReferentielImpactReseau.builder() - .etapeACV(etapeACV.getCode()) - .critere(critere.getNomCritere()) - .refReseau(REF_RESEAU) - .build(); - var demandeCalcul = DemandeCalculImpactReseau.builder() - .dateCalcul(LocalDateTime.now()) - .equipementPhysique(equipementPhysique) - .etape(etapeACV) - .critere(critere) - .impactsReseau(Collections.singletonList(referentielImpactReseau)) - .build(); - - //When - var impactReseau = calculImpactService.calculerImpactReseau(demandeCalcul); - - //Then - assertContentIndicateur(demandeCalcul, impactReseau); - assertEquals("ERREUR", impactReseau.getStatutIndicateur()); - assertNull(impactReseau.getImpactUnitaire()); - assertEquals("{\"erreur\":\"ErrCalcFonc : Erreur de calcul impact réseau: Etape: UTILISATION, Critere: Changement Climatique, RefReseau: impactReseauMobileMoyen, Equipement Physique: Equipement 1 : L'impactReseauMobileMoyen de la référence est null.\"}", impactReseau.getTrace()); - } - - private static void assertContentIndicateur(DemandeCalculImpactReseau demandeCalcul, ImpactReseau impactReseau) { - assertEquals(demandeCalcul.getDateCalcul(), impactReseau.getDateCalcul()); - - assertEquals(demandeCalcul.getEtape().getCode(), impactReseau.getEtapeACV()); - assertEquals(demandeCalcul.getCritere().getNomCritere(), impactReseau.getCritere()); - assertEquals(demandeCalcul.getCritere().getNomCritere(), impactReseau.getCritere()); - - assertEquals(demandeCalcul.getEquipementPhysique().getNomLot(), impactReseau.getNomLot()); - assertEquals(demandeCalcul.getEquipementPhysique().getDateLot(), impactReseau.getDateLot()); - assertEquals(demandeCalcul.getEquipementPhysique().getNomEntite(), impactReseau.getNomEntite()); - assertEquals(demandeCalcul.getEquipementPhysique().getNomOrganisation(), impactReseau.getNomOrganisation()); - assertEquals(demandeCalcul.getEquipementPhysique().getNomEquipementPhysique(), impactReseau.getNomEquipement()); - assertEquals(demandeCalcul.getEquipementPhysique().getNomSourceDonnee(), impactReseau.getNomSourceDonnee()); - - assertEquals("1.0", impactReseau.getVersionCalcul()); - } - -} \ No newline at end of file diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java index 60969a2a..821cc25c 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java @@ -8,7 +8,7 @@ import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.erreur.TypeErreurCalcul; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielHypothese; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielTypeEquipement; +import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielTypeItem; import org.mte.numecoeval.calculs.domain.data.trace.DureeDeVie; import org.mte.numecoeval.calculs.domain.exception.CalculImpactException; import org.mte.numecoeval.calculs.domain.port.input.service.DureeDeVieEquipementPhysiqueService; @@ -28,7 +28,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy"); @Test - void whenTypeEquipementDoesntHaveDureeDeVie_shouldUseHypotheseForDureeDeVie() throws Exception { + void whenTypeItemDoesntHaveDureeDeVie_shouldUseHypotheseForDureeDeVie() throws Exception { //Given EquipementPhysique equipementPhysique = EquipementPhysique.builder() @@ -38,7 +38,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { .code("dureeVieParDefaut") .valeur(1.17d) .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() + ReferentielTypeItem typeItem = ReferentielTypeItem.builder() .type("serveur") .dureeVieDefaut(null) .build(); @@ -46,7 +46,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { .builder() .equipementPhysique(equipementPhysique) .hypotheses(Collections.singletonList(hypothese)) - .typeEquipement(typeEquipement) + .typeItem(typeItem) .optionsCalcul(new OptionsCalcul("REEL")) .build(); @@ -70,7 +70,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When @@ -92,7 +92,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When @@ -113,7 +113,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When @@ -137,7 +137,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When @@ -166,7 +166,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { .builder() .equipementPhysique(equipement) .hypotheses(Collections.singletonList(hypothese)) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When @@ -177,7 +177,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { } @Test - void whenMissingDate_ShouldUseDureeDeVieTypeEquipementInPriority() throws Exception { + void whenMissingDate_ShouldUseDureeDeVieTypeItemInPriority() throws Exception { //Given var equipement = EquipementPhysique.builder() .type("laptop") @@ -186,14 +186,14 @@ class DureeDeVieEquipementPhysiqueServiceTest { .code("dureeVieParDefaut") .valeur(1.17d) .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() + ReferentielTypeItem typeItem = ReferentielTypeItem.builder() .type("laptop") .dureeVieDefaut(3.5d) .build(); DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(typeEquipement) + .typeItem(typeItem) .hypotheses(Collections.singletonList(hypothese)) .optionsCalcul(new OptionsCalcul("REEL")) .build(); @@ -214,14 +214,14 @@ class DureeDeVieEquipementPhysiqueServiceTest { .code("dureeVieParDefaut") .valeur(null) .build(); - ReferentielTypeEquipement typeEquipement = ReferentielTypeEquipement.builder() + ReferentielTypeItem typeItem = ReferentielTypeItem.builder() .type("laptop") .dureeVieDefaut(null) .build(); DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(typeEquipement) + .typeItem(typeItem) .hypotheses(Collections.singletonList(hypothese)) .optionsCalcul(new OptionsCalcul("REEL")) .build(); @@ -244,7 +244,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("FIXE")) .build(); //When @@ -265,7 +265,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("FIXE")) .build(); //When @@ -348,7 +348,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique .builder() .equipementPhysique(equipement) - .typeEquipement(null) + .typeItem(null) .optionsCalcul(new OptionsCalcul("FIXE")) .build(); diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java index f69aaf98..25f145ad 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java @@ -11,7 +11,7 @@ import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.entree.EquipementVirtuel; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielHypothese; -import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielTypeEquipement; +import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielTypeItem; import java.text.ParseException; import java.time.LocalDate; @@ -87,8 +87,8 @@ public class DataTableTypeDefinitions { var hypotheses = new ArrayList<ReferentielHypothese>(); if (StringUtils.isNotBlank(entry.get("refTypeEquipement.dureeVieDefaut"))) { - builder.typeEquipement( - ReferentielTypeEquipement.builder() + builder.typeItem( + ReferentielTypeItem.builder() .dureeVieDefaut(getDoubleOrNull(entry, "refTypeEquipement.dureeVieDefaut")) .build() ); -- GitLab