diff --git a/CHANGELOG.md b/CHANGELOG.md index ecdd696b11b1c0668fad6232f8d5236addad58af..979cd8aeaa247e9b6c900155715f998bb56c2fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ Tous les changements de ce projet seront documentés dans ce document. +## [Non livré] + +- Colonnes goTelecharge et nbJourUtiliseAn plus obligatoires dans les fichiers d'inventaire des équipement physiques +- Correction bug dans la table ind_indicateur_impact_operation_non_it, ajout de l'attribut date_lot_discrimminator +- 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) + ## [2.0.1] - 2024-07-10 - Correction bug lors du lancement d'un calcul pour un équipement physique dont le modèle n'est pas renseigné -> [Issue8](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/8) diff --git a/docs/MoteurDeCalculG4IT_V1.1.adoc b/docs/MoteurDeCalculG4IT_V1.1.adoc index 2871cda6fb34f90fd80870b33164fa5eca08646c..fe2a19afc968f1c0696e1a950f377165054452b7 100644 --- a/docs/MoteurDeCalculG4IT_V1.1.adoc +++ b/docs/MoteurDeCalculG4IT_V1.1.adoc @@ -246,6 +246,13 @@ pour obtenir l'objet ref_Hypothese correspondant == Moteur de calcul Le déclenchement des règles présentes dans le Bloc Calcul se réalise à la soumission des calculs sur un lot donné via le endpoint POST /entrees/calculs/soumission. + +Le body de la requête est composé : + +* du nomLot : qui permet de récupérer toutes les données d'entrées liées à cette demande de calcul +* d'une liste d'étapes facultative : permet de lancer le calcul uniquement sur un sous-ensemble d'étapes présentes dans les références. Si la liste n'est pas renseignée, alors on ne filtre pas (on lance le calcul sur toutes les étapes présentes dans la table ref_etapeacv) +* d'une liste de critères facultative : permet de lancer le calcul uniquement sur un sous-ensemble de critères présents dans les références. Si la liste n'est pas renseignée, alors on ne filtre pas (on lance le calcul sur tous les critères présents dans la table ref_critere) + Il existe 2 paramètres associés à cette requête : * mode : le mode de traitement, SYNC ou ASYNC (ASYNC est la valeur par défaut) diff --git a/e2e/5_assert.sh b/e2e/5_assert.sh index 03c217fb5b59c128fc3858c0a25e8371217e2748..93b6a5e013e62137b45a4bf6aacc39e91ff63196 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 d4e39e300cae58958b56a5e142ec5bf86468347f..c2169111f3881a1924de7faba69f98126b890d51 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 84cc240af38dc7893a3d41b3e62e4c328bf1f58f..0000000000000000000000000000000000000000 --- 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/pom.xml b/services/api-event-calculs/pom.xml index 44eaafd1cba76428fc7f4ac7a8a5c34f2457d2ac..71aa8d648b594fe8c51d8c724b4004567c3cee44 100644 --- a/services/api-event-calculs/pom.xml +++ b/services/api-event-calculs/pom.xml @@ -5,12 +5,12 @@ <parent> <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>api-event-calculs</artifactId> <name>api-event-calculs</name> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <description>api-event-calculs</description> <repositories> 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 170b5cd6c8be19d23c70ea9ed1e14e2d61ab1472..9356ac3d3a6f52e7c55b29dda3faac1c9e262a72 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 89f9b8984ef5da314d27f76577b7e9c9d724509e..5bb2028bf1ad4542fd472ea0bb9538138fea5cdb 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 ba9e0e067caab98e089fc87f604ee06f38919ffb..ad6ddc9fc3e234d20bb564e96c2188553df41fe1 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/CacheConfig.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java index 5e182885f8c098c5c3518af9908a90cec1b208c9..90538c3dc77b63e7e6a9a69c99b819785f3da4d4 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java @@ -37,4 +37,13 @@ public class CacheConfig { public void emptyAllCaches() { log.info("Nettoyage de tous les caches internes"); } -} + + @CacheEvict(value = { + "EtapesFiltrees", + "CriteresFiltres", + }, allEntries = true) + @Scheduled(fixedRateString = "${numecoeval.cache.donnesfiltrees}", timeUnit = TimeUnit.MINUTES) + public void emptyDonneesFiltreesCaches() { + log.info("Nettoyage des caches d'EtapesFiltrees et CriteresFiltres"); + } +} \ No newline at end of file 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 d41eaae9ae9a7359c783b2853d15e3b6d9f88d6e..ff21d8a62e5fdcacb6f116b029c20faff0402cca 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 f859f33038835b82a3cd1f3af166e2af340eddf0..0000000000000000000000000000000000000000 --- 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/kafkalistener/ListenEquipementPhysique.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java index 3a4ed0778e1bae5d523431818c567d1092f19ea4..7bb761ea51fbf31dfe2f883406012a8dad1cf91c 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java @@ -4,7 +4,6 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.mte.numecoeval.calculs.infrastructure.service.calcul.MainEquipementPhysiqueService; import org.mte.numecoeval.topic.data.EquipementPhysiqueDTO; -import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; 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 47ef6c1b8ad71bac48517f30bbf97ce2815951a8..94c276a0124dc1e5c68d54e08c063f8cb0d56404 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 6624cc54ba6c58c9e158af0f77cba530a80f1e06..4d078347201d3df89d0516ee70559b0d03ffcd10 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/DonneesEntreeRepository.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java index d23d6cdd462b80a38913537cc472d92cc74a64ca..965c8c4f4f29fe12ef1627d5155ec3249888f404 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java @@ -45,4 +45,56 @@ public class DonneesEntreeRepository { } return result.getFirst(); } + + @Cacheable("EtapesFiltrees") + public String findEtapes(String nomLot) { + List<String> result = new ArrayList<>(); + try (Connection conn = dataSource.getConnection()) { + try (var ps = conn.prepareStatement(""" + SELECT etapes + FROM en_donnees_entrees + WHERE nom_lot = ? + """)) { + + ps.setString(1, nomLot); + var rs = ps.executeQuery(); + while (rs.next()) { + result.add(rs.getString("etapes")); + } + } + } catch (SQLException e) { + log.error("Une erreur s'est produite lors de la selection dans PostgreSQL. Exception: ", e); + throw new DatabaseException(e); + } + if (result.isEmpty()) { + return null; + } + return result.getFirst(); + } + + @Cacheable("CriteresFiltres") + public String findCriteres(String nomLot) { + List<String> result = new ArrayList<>(); + try (Connection conn = dataSource.getConnection()) { + try (var ps = conn.prepareStatement(""" + SELECT criteres + FROM en_donnees_entrees + WHERE nom_lot = ? + """)) { + + ps.setString(1, nomLot); + var rs = ps.executeQuery(); + while (rs.next()) { + result.add(rs.getString("criteres")); + } + } + } catch (SQLException e) { + log.error("Une erreur s'est produite lors de la selection dans PostgreSQL. Exception: ", e); + throw new DatabaseException(e); + } + if (result.isEmpty()) { + return null; + } + return result.getFirst(); + } } 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 a2148ebc7194456c2f3ae69e64ef70c93a3e9d21..c26afae5e373e9fb4eb232156ea32fb530b941eb 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 c1102a25bd9ea128a501996ab3316cf561e5908c..4fdb49aa7d6e4bc0523a906ccb46dc871e407828 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 307fc4a6ba5fe596ac4b6337759eac36410e6e77..0000000000000000000000000000000000000000 --- 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 1eff91ae2f216ca92e67cdea259a994cde814312..c3eb9545b3659abe57fcebe7af9b380946e5576b 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 d3e3830c0e4c51a563a8af4b4221aef19a94df67..cf2ea565b473209d6dfd46f0d0763e8ff3ab4ccb 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 @@ -4,6 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.mte.numecoeval.calculs.domain.model.CalculEquipementPhysique; import org.mte.numecoeval.calculs.infrastructure.client.ReferentielClient; +import org.mte.numecoeval.calculs.infrastructure.repository.DonneesEntreeRepository; +import org.mte.numecoeval.calculs.referentiels.generated.api.model.CritereDTO; +import org.mte.numecoeval.calculs.referentiels.generated.api.model.EtapeDTO; import org.mte.numecoeval.calculs.referentiels.generated.api.model.HypotheseDTO; import org.mte.numecoeval.topic.data.EquipementPhysiqueDTO; import org.springframework.beans.factory.annotation.Autowired; @@ -12,10 +15,13 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; @Slf4j @Service public class EnrichissementEquipementPhysiqueService { + @Autowired + DonneesEntreeRepository donneesEntreeRepository; @Value("${numecoeval.hypotheses.equipementPhysique}") private String hypothesesEquipementPhysique; @@ -34,8 +40,35 @@ public class EnrichissementEquipementPhysiqueService { calculEquipementPhysique.setEquipementPhysique(equipementPhysiqueDTO); - calculEquipementPhysique.setEtapes(referentielClient.getEtapes()); - calculEquipementPhysique.setCriteres(referentielClient.getCriteres()); + String etapesFiltrees = donneesEntreeRepository.findEtapes(calculEquipementPhysique.getEquipementPhysique().getNomLot()); + List<String> etapesList = etapesFiltrees == null ? null : new ArrayList<>(Arrays.asList(etapesFiltrees.split("##"))); + // si etapesList est vide alors on ne filtre pas et on utilise toutes les étapes du référentiel + if (etapesList == null) { + calculEquipementPhysique.setEtapes(referentielClient.getEtapes()); + } else { + List<EtapeDTO> etapesCalcul = new ArrayList<>(); + for (var etape : referentielClient.getEtapes()) { + if (etapesList.contains(etape.getCode())) { + etapesCalcul.add(etape); + } + } + calculEquipementPhysique.setEtapes(etapesCalcul); + } + + String criteresFiltrees = donneesEntreeRepository.findCriteres(calculEquipementPhysique.getEquipementPhysique().getNomLot()); + List<String> criteresList = criteresFiltrees == null ? null : new ArrayList<>(Arrays.asList(criteresFiltrees.split("##"))); + // si criteresList est vide alors on ne filtre pas et on utilise tous les critères du référentiel + if (criteresList == null) { + calculEquipementPhysique.setCriteres(referentielClient.getCriteres()); + } else { + List<CritereDTO> criteresCalcul = new ArrayList<>(); + for (var critere : referentielClient.getCriteres()) { + if (criteresList.contains(critere.getNomCritere())) { + criteresCalcul.add(critere); + } + } + calculEquipementPhysique.setCriteres(criteresCalcul); + } var hypotheses = new ArrayList<HypotheseDTO>(); @@ -46,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/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementOperationNonITService.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementOperationNonITService.java index e386fc9d020ed927499a789c258a4a12b9fd8a65..ef39f73e81226088b557b6b3bd519d29a77da726 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementOperationNonITService.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/enrichissement/EnrichissementOperationNonITService.java @@ -4,6 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.mte.numecoeval.calculs.domain.model.CalculOperationNonIT; import org.mte.numecoeval.calculs.infrastructure.client.ReferentielClient; +import org.mte.numecoeval.calculs.infrastructure.repository.DonneesEntreeRepository; +import org.mte.numecoeval.calculs.referentiels.generated.api.model.CritereDTO; +import org.mte.numecoeval.calculs.referentiels.generated.api.model.EtapeDTO; import org.mte.numecoeval.calculs.referentiels.generated.api.model.HypotheseDTO; import org.mte.numecoeval.topic.data.OperationNonITDTO; import org.springframework.beans.factory.annotation.Autowired; @@ -12,11 +15,14 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; @Slf4j @Service public class EnrichissementOperationNonITService { + @Autowired + DonneesEntreeRepository donneesEntreeRepository; @Value("${numecoeval.hypotheses.operationNonIt}") private String hypothesesOperationNonIt; @@ -34,8 +40,36 @@ public class EnrichissementOperationNonITService { calculOperationNonIT.setOperationNonIT(operationNonITDTO); - calculOperationNonIT.setEtapes(referentielClient.getEtapes()); - calculOperationNonIT.setCriteres(referentielClient.getCriteres()); + String etapesFiltrees = donneesEntreeRepository.findEtapes(calculOperationNonIT.getOperationNonIT().getNomLot()); + List<String> etapesList = etapesFiltrees == null ? null : new ArrayList<>(Arrays.asList(etapesFiltrees.split("##"))); + // si etapesList est vide alors on ne filtre pas et on utilise toutes les étapes du référentiel + if (etapesList == null) { + calculOperationNonIT.setEtapes(referentielClient.getEtapes()); + } else { + List<EtapeDTO> etapesCalcul = new ArrayList<>(); + for (var etape : referentielClient.getEtapes()) { + if (etapesList.contains(etape.getCode())) { + etapesCalcul.add(etape); + } + } + calculOperationNonIT.setEtapes(etapesCalcul); + } + + String criteresFiltrees = donneesEntreeRepository.findCriteres(calculOperationNonIT.getOperationNonIT().getNomLot()); + List<String> criteresList = criteresFiltrees == null ? null : new ArrayList<>(Arrays.asList(criteresFiltrees.split("##"))); + // si criteresList est vide alors on ne filtre pas et on utilise tous les critères du référentiel + if (criteresList == null) { + calculOperationNonIT.setCriteres(referentielClient.getCriteres()); + } else { + List<CritereDTO> criteresCalcul = new ArrayList<>(); + for (var critere : referentielClient.getCriteres()) { + if (criteresList.contains(critere.getNomCritere())) { + criteresCalcul.add(critere); + } + } + calculOperationNonIT.setCriteres(criteresCalcul); + } + calculOperationNonIT.setTypeItem(referentielClient.getTypeItem(operationNonITDTO.getType())); var hypotheses = new ArrayList<HypotheseDTO>(); diff --git a/services/api-event-calculs/src/main/resources/application.yaml b/services/api-event-calculs/src/main/resources/application.yaml index 22e10dfe982e039d484f53aecc6710e8d631002a..070760f94f56997220ec35ebe289589391063e6a 100644 --- a/services/api-event-calculs/src/main/resources/application.yaml +++ b/services/api-event-calculs/src/main/resources/application.yaml @@ -42,6 +42,7 @@ numecoeval: url: "http://localhost:18080" cache: ttl: "20" + donnesfiltrees: "1" server: port: 18085 diff --git a/services/api-event-calculs/src/main/resources/schema.sql b/services/api-event-calculs/src/main/resources/schema.sql index b95c0f3877f054fb2d0a4d4eef06adbf61a7c260..9a7df953e6de23bd18a508b6c6c6275d3cf5c8e6 100644 --- a/services/api-event-calculs/src/main/resources/schema.sql +++ b/services/api-event-calculs/src/main/resources/schema.sql @@ -104,7 +104,11 @@ CREATE TABLE IF NOT EXISTS ind_indicateur_impact_operation_non_it nom_organisation varchar(255) NULL, nom_source_donnee varchar(255) NULL, nom_item_non_it varchar(255) NULL, - qualite varchar(255) NULL + qualite varchar(255) NULL, + date_lot_discriminator date NOT NULL DEFAULT('1970-01-01'), + nom_organisation_discriminator varchar(255) NOT NULL DEFAULT(''), + nom_entite_discriminator varchar(255) NOT NULL DEFAULT(''), + nom_source_donnee_discriminator varchar(255) NOT NULL DEFAULT('') ); CREATE TABLE IF NOT EXISTS ind_indicateur_impact_messagerie @@ -158,6 +162,10 @@ ALTER TABLE IF EXISTS ind_indicateur_impact_equipement_physique ADD COLUMN IF NO ALTER TABLE IF EXISTS ind_indicateur_impact_application ADD COLUMN IF NOT EXISTS qualite varchar(255) NULL DEFAULT ''; ALTER TABLE IF EXISTS ind_indicateur_impact_equipement_virtuel ADD COLUMN IF NOT EXISTS qualite varchar(255) NULL DEFAULT ''; ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS qualite varchar(255) NULL DEFAULT ''; +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS date_lot_discriminator date NOT NULL DEFAULT('1970-01-01'); +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS nom_organisation_discriminator varchar(255) NOT NULL DEFAULT(''); +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS nom_entite_discriminator varchar(255) NOT NULL DEFAULT(''); +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS nom_source_donnee_discriminator varchar(255) NOT NULL DEFAULT(''); CREATE INDEX IF NOT EXISTS idx_ind_eq_p__nom_lot_nom_equipement ON ind_indicateur_impact_equipement_physique (nom_lot, nom_equipement); CREATE INDEX IF NOT EXISTS idx_ind_eq_v__nom_lot_nom_equipement ON ind_indicateur_impact_equipement_virtuel (nom_lot, nom_equipement); 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 4310c44079d6a92dd53ad178ec7b3f46bb86bfab..35979fc3f22d7b96bddcda90785b1d611381edfc 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 836abbc15b11d2b42e83e7b5984069c39b85da00..0000000000000000000000000000000000000000 --- 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 7d7c105b55fc114e5714877d4a75f410ac0440b5..b7259e49add5948299c301a13bebca6959f5bb60 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 @@ -12,6 +12,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.mte.numecoeval.calculs.infrastructure.client.ReferentielClient; +import org.mte.numecoeval.calculs.infrastructure.repository.DonneesEntreeRepository; import org.mte.numecoeval.calculs.infrastructure.service.enrichissement.EnrichissementEquipementPhysiqueService; import org.mte.numecoeval.calculs.referentiels.generated.api.model.*; import org.mte.numecoeval.topic.data.EquipementPhysiqueDTO; @@ -38,6 +39,9 @@ class EnrichissementEquipementPhysiqueServiceTest { @Mock ReferentielClient referentielClient; + @Mock + DonneesEntreeRepository donneesEntreeRepository; + @Value("${numecoeval.hypotheses.equipementPhysique}") private String hypothesesEquipementPhysique; @@ -84,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 */ @@ -105,18 +115,15 @@ 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); + 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 - void testServiceEnrichissementEquipementPhysqique_null() { + void testServiceEnrichissementEquipementPhysique_null() { Assertions.assertNull(enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(null)); } @@ -131,50 +138,81 @@ 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()); } - @Test 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 { + Mockito.lenient().when(donneesEntreeRepository.findEtapes(any())).thenReturn("UTILISATION##FABRICATION"); + + var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); + + Assertions.assertEquals(2, actual.getEtapes().size()); + } + + @Test + void testServiceEnrichissementEquipementPhysique_doesNotFilterEtapesWhenDataNull() throws JsonProcessingException { + Mockito.lenient().when(donneesEntreeRepository.findEtapes(any())).thenReturn(null); + + var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); + + Assertions.assertEquals(4, actual.getEtapes().size()); + } + + @Test + void testServiceEnrichissementEquipementPhysique_filterCriteres() throws JsonProcessingException { + Mockito.lenient().when(donneesEntreeRepository.findCriteres(any())).thenReturn("Climate change##Ionising radiation##Acidification"); + + var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); + + Assertions.assertEquals(3, actual.getCriteres().size()); + } + + @Test + void testServiceEnrichissementEquipementPhysique_doesNotFilterCriteresWhenDataNull() throws JsonProcessingException { + Mockito.lenient().when(donneesEntreeRepository.findCriteres(any())).thenReturn(null); + + var actual = enrichissementEquipementPhysiqueService.serviceEnrichissementEquipementPhysique(equipementPhysiqueDTO); + + Assertions.assertEquals(4, actual.getCriteres().size()); + } } diff --git a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementOperationNonITServiceTest.java b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementOperationNonITServiceTest.java index 55f4b3872c65d3f641c321655226f2d4f9c13aa0..f9042c30515fa695907987f5544dd83cf2fe9eb3 100644 --- a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementOperationNonITServiceTest.java +++ b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/EnrichissementOperationNonITServiceTest.java @@ -12,6 +12,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.mte.numecoeval.calculs.infrastructure.client.ReferentielClient; +import org.mte.numecoeval.calculs.infrastructure.repository.DonneesEntreeRepository; import org.mte.numecoeval.calculs.infrastructure.service.enrichissement.EnrichissementOperationNonITService; import org.mte.numecoeval.calculs.referentiels.generated.api.model.*; import org.mte.numecoeval.topic.data.OperationNonITDTO; @@ -24,6 +25,7 @@ import org.springframework.test.util.ReflectionTestUtils; import java.util.Arrays; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.any; @ExtendWith({MockitoExtension.class, SpringExtension.class}) @ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class) @@ -36,6 +38,8 @@ class EnrichissementOperationNonITServiceTest { @Mock ReferentielClient referentielClient; + @Mock + DonneesEntreeRepository donneesEntreeRepository; @Value("${numecoeval.hypotheses.operationNonIt}") private String hypothesesOperationNonIt; @@ -125,6 +129,33 @@ class EnrichissementOperationNonITServiceTest { """, FacteurCaracterisationDTO.class)); } + 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))); + } + @Test void testServiceEnrichissementOperationNonIT_null() { assertNull(enrichissementOperationNonITService.serviceEnrichissementOperationNonIT(null)); @@ -150,4 +181,44 @@ class EnrichissementOperationNonITServiceTest { Assertions.assertEquals("BASSE", actual.getOperationNonIT().getQualite()); } + + @Test + void testServiceEnrichissementEquipementPhysique_filterEtapes() throws JsonProcessingException { + initMocksEtapesAndCriteres(); + Mockito.lenient().when(donneesEntreeRepository.findEtapes(any())).thenReturn("UTILISATION##FABRICATION"); + + var actual = enrichissementOperationNonITService.serviceEnrichissementOperationNonIT(operationNonITDTO); + + Assertions.assertEquals(2, actual.getEtapes().size()); + } + + @Test + void testServiceEnrichissementEquipementPhysique_doesNotFilterEtapesWhenDataNull() throws JsonProcessingException { + initMocksEtapesAndCriteres(); + Mockito.lenient().when(donneesEntreeRepository.findEtapes(any())).thenReturn(null); + + var actual = enrichissementOperationNonITService.serviceEnrichissementOperationNonIT(operationNonITDTO); + + Assertions.assertEquals(4, actual.getEtapes().size()); + } + + @Test + void testServiceEnrichissementEquipementPhysique_filterCriteres() throws JsonProcessingException { + initMocksEtapesAndCriteres(); + Mockito.lenient().when(donneesEntreeRepository.findCriteres(any())).thenReturn("Climate change##Ionising radiation##Acidification"); + + var actual = enrichissementOperationNonITService.serviceEnrichissementOperationNonIT(operationNonITDTO); + + Assertions.assertEquals(3, actual.getCriteres().size()); + } + + @Test + void testServiceEnrichissementEquipementPhysique_doesNotFilterCriteresWhenDataNull() throws JsonProcessingException { + initMocksEtapesAndCriteres(); + Mockito.lenient().when(donneesEntreeRepository.findCriteres(any())).thenReturn(null); + + var actual = enrichissementOperationNonITService.serviceEnrichissementOperationNonIT(operationNonITDTO); + + Assertions.assertEquals(4, actual.getCriteres().size()); + } } 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 30d28311c0a2de8d7ffc71bfd6d7a7011ec122d5..eeb19664d61bd7d03ba91d184784442e29815d61 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-event-donneesentrees/pom.xml b/services/api-event-donneesentrees/pom.xml index bd8ce48c51e44bb0c9fb74790333e10b2b396ac9..328eb5cf8e9ae4b74a73fc7a91bdcf7b00cfc857 100644 --- a/services/api-event-donneesentrees/pom.xml +++ b/services/api-event-donneesentrees/pom.xml @@ -5,12 +5,12 @@ <parent> <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>api-event-donneesEntrees</artifactId> <name>api-event-donneesEntrees</name> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <description>api-event-donneesEntrees</description> <repositories> diff --git a/services/api-expositiondonneesentrees/pom.xml b/services/api-expositiondonneesentrees/pom.xml index 9cae4c76bbd31d010b8427f6c4db736a432c727c..4e1942334736c3f0fcf6986644ca2d45a44dfd5f 100644 --- a/services/api-expositiondonneesentrees/pom.xml +++ b/services/api-expositiondonneesentrees/pom.xml @@ -5,11 +5,11 @@ <parent> <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>api-expositiondonneesentrees</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <name>api-expositiondonneesentrees</name> <description>API Exposition des données d'entrées - Exposition par API pour injecter des données d'entrées </description> diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DemandeCalcul.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DemandeCalcul.java index 97babf49679362f1b40fb4a3ba148e4aa9a8aa74..f8c83751401ca5f2a1df51cbc41980498a3e34f6 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DemandeCalcul.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DemandeCalcul.java @@ -7,6 +7,8 @@ import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import java.util.List; + @Getter @Setter @EqualsAndHashCode @@ -17,4 +19,6 @@ public class DemandeCalcul { String nomLot; String dateLot; String nomOrganisation; + List<String> etapes; + List<String> criteres; } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java index b53d99b3bc43bd40cbc8d585f767f0d952ea3c41..1425bd952bc6c2b1468a1568d9e340d25b516f4b 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java @@ -14,7 +14,7 @@ import java.util.List; @SuppressWarnings("java:S107") // Obligatoire à cause de la gestion des fichiers différents au niveau contrat d'interface public interface ImportDonneesEntreePort { - String EQUIPEMENT_PHYSIQUE_CSV_HEADER = "modele;quantite;nomEquipementPhysique;type;statut;paysDUtilisation;utilisateur;nbCoeur;nomCourtDatacenter;goTelecharge;nbJourUtiliseAn;consoElecAnnuelle"; + String EQUIPEMENT_PHYSIQUE_CSV_HEADER = "modele;quantite;nomEquipementPhysique;type;statut;paysDUtilisation;utilisateur;nbCoeur;nomCourtDatacenter;consoElecAnnuelle"; String CSV_SEPARATOR = ";"; String DATA_CENTER_CSV_HEADER = "nomCourtDatacenter;nomLongDatacenter;pue;localisation"; String EQUIPEMENT_VIRTUEL_CSV_HEADER = "nomEquipementPhysique;vCPU;cluster"; 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 cdb09811ef29d757887f67ef4b1435b06f757a4f..9c2275c29a7ef6b10c74014e4696c3af6d186f67 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 44eb82e2a01d5c8e8a6a502effe99c5c8c80759b..2cd2bfeab6bcefd5bc17eebfe0435d92155eb852 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 277f1e5da336ffafe3c7e5e7cd991f9f61d51e90..ac417db6b0d852b1e57828a65dbdcfd058909711 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/controller/CalculController.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java index aea43dca0a4e592315a3650ad316dbcf5c99a91d..2a40f112da19383755233fe7725d1ea14289646a 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java @@ -7,8 +7,8 @@ import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.Soumission import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.StatutPourCalculPort; import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.*; import org.mte.numecoeval.expositiondonneesentrees.generated.api.server.CalculsApi; -import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.repository.DonneesEntreesRepository; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.mapper.CalculRestMapper; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.service.DonneesEntreesService; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class CalculController implements CalculsApi { + public static final String TYPE_CALCUL_REJEU = "rejeu"; + public static final String TYPE_CALCUL_SOUMISSION = "soumission"; @Value("${regle-par-defaut-duree-usage}") private String defaultDureeUsage; @@ -27,8 +29,7 @@ public class CalculController implements CalculsApi { final SoumissionCalculSyncPort soumissionCalculSyncPort; final StatutPourCalculPort statutPourCalculPort; - - final DonneesEntreesRepository donneesEntreesRepository; + final DonneesEntreesService donneesEntreesService; @Override public ResponseEntity<StatutCalculRest> statutPourCalcul(String nomLot, String nomOrganisation) { @@ -44,10 +45,10 @@ public class CalculController implements CalculsApi { if (DureeUsage.REEL != modeDureeUsage) { modeDureeUsage = DureeUsage.FIXE; } - - log.info("Soumission de calcul pour nom_lot: {}, dureeUsage: {}, mode: {}", demandeCalculRest.getNomLot(), modeDureeUsage, mode); + log.info("Soumission de calcul pour nom_lot: {}, dureeUsage: {}, mode: {}, etapes:{}, criteres:{}", demandeCalculRest.getNomLot(), modeDureeUsage, mode, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres()); var demandeCalcul = calculRestMapper.toDomain(demandeCalculRest); - donneesEntreesRepository.updateDonneesEntreesDureeUsage(String.valueOf(modeDureeUsage), demandeCalculRest.getNomLot()); + + donneesEntreesService.manageDonneesEntrees(demandeCalculRest.getNomLot(), dureeUsage, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres(), TYPE_CALCUL_SOUMISSION); var soumission = ModeRest.ASYNC == mode ? soumissionCalculPort.soumissionCalcul(demandeCalcul) : @@ -56,11 +57,14 @@ public class CalculController implements CalculsApi { return ResponseEntity.ok(calculRestMapper.toRest(soumission)); } + @Override public ResponseEntity<RapportDemandeCalculRest> rejeuCalcul(DemandeCalculRest demandeCalculRest) { - log.info("Rejeu de calcul, nom_lot: {}", demandeCalculRest.getNomLot()); + log.info("Rejeu de calcul, nom_lot: {}, etapes:{}, criteres:{}", demandeCalculRest.getNomLot(), demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres()); var demandeCalcul = calculRestMapper.toDomain(demandeCalculRest); + donneesEntreesService.manageDonneesEntrees(demandeCalculRest.getNomLot(), null, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres(), TYPE_CALCUL_REJEU); + var soumission = soumissionCalculPort.rejeuCalcul(demandeCalcul); var responseBody = calculRestMapper.toRest(soumission); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java index bd22d5dcc795f261b2a96884559b1fde25c64c9e..cddc63a2bdb12ed5f9e9ae849d852ab4a7e12f73 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java @@ -54,4 +54,16 @@ public class DonneesEntreesEntity extends AbstractEntreeEntity { */ private String dureeUsage; + /** + * Liste des étapes pour lesquelles on veut calculer les impacts + * séparés par ## + */ + private String etapes; + /** + * Liste des critères pour lesquels on veut calculer les impacts + * séparés par ## + */ + private String criteres; + + } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java index 053371f23dee9ad46d4315f7c7b2b8c07488183a..12b6c978745c0091358c2e13fe8ec539574b7cce 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java @@ -2,23 +2,11 @@ package org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.repositor import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.entity.DonneesEntreesEntity; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; + +import java.util.List; @Repository public interface DonneesEntreesRepository extends JpaRepository<DonneesEntreesEntity, Long> { - @Transactional - @Modifying - @Query(""" - UPDATE DonneesEntreesEntity dee - SET dee.dureeUsage = :dureeUsage - WHERE dee.nomLot = :nomLot - """) - int updateDonneesEntreesDureeUsage( - @Param("dureeUsage") String dureeUsage, - @Param("nomLot") String nomLot - ); + List<DonneesEntreesEntity> findByNomLot(String nomLot); } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java new file mode 100644 index 0000000000000000000000000000000000000000..a5f0ca4fd921c47abb89d632052d7634b829253e --- /dev/null +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java @@ -0,0 +1,67 @@ +package org.mte.numecoeval.expositiondonneesentrees.infrastructure.service; + +import lombok.RequiredArgsConstructor; +import org.mte.numecoeval.expositiondonneesentrees.domain.exception.ValidationException; +import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.DureeUsage; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.adapters.ReferentielRestClient; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.entity.DonneesEntreesEntity; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.repository.DonneesEntreesRepository; +import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.CritereDTO; +import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.EtapeDTO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; + +import static org.mte.numecoeval.expositiondonneesentrees.infrastructure.controller.CalculController.TYPE_CALCUL_SOUMISSION; + +@Service +@RequiredArgsConstructor +public class DonneesEntreesService { + + @Value("${regle-par-defaut-duree-usage}") + private String defaultDureeUsage; + + final ReferentielRestClient referentielRestClient; + final DonneesEntreesRepository donneesEntreesRepository; + + public void manageDonneesEntrees(String nomLot, DureeUsage modeDureeUsage, List<String> etapes, List<String> criteres, String typeCalcul) { + var donneeEntreeEntity = donneesEntreesRepository.findByNomLot(nomLot).getFirst(); + donneeEntreeEntity = enrichi(donneeEntreeEntity, modeDureeUsage, etapes, criteres, typeCalcul); + donneesEntreesRepository.save(donneeEntreeEntity); + } + + private DonneesEntreesEntity enrichi(DonneesEntreesEntity donneeEntreeEntity, DureeUsage dureeUsage, List<String> etapes, List<String> criteres, String typeCalcul) { + if (typeCalcul.equals(TYPE_CALCUL_SOUMISSION)) { + var modeDureeUsage = dureeUsage == null ? DureeUsage.fromValue(defaultDureeUsage) : dureeUsage; + if (DureeUsage.REEL != modeDureeUsage) { + modeDureeUsage = DureeUsage.FIXE; + } + donneeEntreeEntity.setDureeUsage(String.valueOf(modeDureeUsage)); + } + if (etapes != null) { + var allEtapes = referentielRestClient.getAllEtapes().stream().map(EtapeDTO::getCode).toList(); + if (!new HashSet<>(allEtapes).containsAll(etapes)) { + throw new ValidationException( + "La liste d'étapes n'est pas valide, elle doit être comprise dans: " + allEtapes + ); + } + donneeEntreeEntity.setEtapes(String.join("##", etapes)); + } else { + donneeEntreeEntity.setEtapes(null); + } + if (criteres != null) { + var allCriteres = referentielRestClient.getAllCriteres().stream().map(CritereDTO::getNomCritere).toList(); + if (!new HashSet<>(allCriteres).containsAll(criteres)) { + throw new ValidationException( + "La liste de critères n'est pas valide, elle doit être comprise dans: " + allCriteres + ); + } + donneeEntreeEntity.setCriteres(String.join("##", criteres)); + } else { + donneeEntreeEntity.setCriteres(null); + } + return donneeEntreeEntity; + } +} 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 8ed1eabfe75d977546e740d462ac527709d939b8..f803a3fdf824a3a8d0e31b96c24108b80c22f8ce 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 ca102130363923e1592bff37a46cec6353df60e5..17909eaf2e8354a08cf4fe4336f50ef04e8611bb 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/api-expositiondonneesentrees/src/main/resources/schema.sql b/services/api-expositiondonneesentrees/src/main/resources/schema.sql index 9f3d48f38da7a19d55b0ac172e629ebafd43cec3..c5059800bae89349bc000bfc4454413bb9a87c99 100644 --- a/services/api-expositiondonneesentrees/src/main/resources/schema.sql +++ b/services/api-expositiondonneesentrees/src/main/resources/schema.sql @@ -1,17 +1,19 @@ CREATE TABLE IF NOT EXISTS en_donnees_entrees ( - id int8 NOT NULL, - date_update timestamp NULL, - date_creation timestamp NULL, - date_lot date NULL, - nom_organisation varchar(255) NULL, - nom_lot varchar(255) NULL, - nbr_applications int8 NULL, - nbr_data_center int8 NULL, - nbr_equipements_physiques int8 NULL, - nbr_equipements_virtuels int8 NULL, - nbr_messageries int8 NULL, - duree_usage varchar(255) NULL, + id int8 NOT NULL, + date_update timestamp NULL, + date_creation timestamp NULL, + date_lot date NULL, + nom_organisation varchar(255) NULL, + nom_lot varchar(255) NULL, + nbr_applications int8 NULL, + nbr_data_center int8 NULL, + nbr_equipements_physiques int8 NULL, + nbr_equipements_virtuels int8 NULL, + nbr_messageries int8 NULL, + duree_usage varchar(255) NULL, + etapes text NULL, + criteres text NULL, CONSTRAINT en_donnees_entrees_pkey PRIMARY KEY (id) ); @@ -198,6 +200,8 @@ ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS duree_usag ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS duree_usage_aval float8; ALTER TABLE IF EXISTS en_donnees_entrees ADD COLUMN IF NOT EXISTS duree_usage varchar(255); +ALTER TABLE IF EXISTS en_donnees_entrees ADD COLUMN IF NOT EXISTS etapes text; +ALTER TABLE IF EXISTS en_donnees_entrees ADD COLUMN IF NOT EXISTS criteres text; -- Creation indexes -- Accelere la recuperation des donnees depuis EquipementPhysiqueIntegrationConfig.java diff --git a/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml b/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml index 4eb839bcf5867a26c1e30279baa5c0d16fa9741f..e395cf1dc9a74f3ef4686b2e4eb4afcd7aa6ca3d 100644 --- a/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml +++ b/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml @@ -63,6 +63,9 @@ paths: <li>FIXE : La méthode de calcul de la durée de vie se base sur l'attribut 'dureeUsageInterne' de l'équipement physique (méthode utilisée par défaut si le paramètre dureeUsage n'est pas renseigné). </li> <li>REEL : La méthode de calcul de la durée de vie se base sur l'âge réel de l'équipement physique (dateRetrait-dateAchat). </li> </ul> + Vous pouvez également lancer le calcul sur uniquement quelques critères et/ou étapes spécifiques en renseignant leurs noms dans les listes "etapes" et "criteres" dans le body de la requête. + /!\ Il faut que les noms soient présents dans les tables ref_etapeacv et ref_critere (case sensitive). + Par défaut, si rien n'est renseigné, le calcul sera lancé sur toutes les étapes et tous les critères présents dans les tables ref_etapeacv et ref_critere. tags: - Calculs operationId: soumissionPourCalcul @@ -280,6 +283,16 @@ components: nomLot: description: "Nom du lot rattaché" type: string + etapes: + description: "Liste des étapes pour lesquelles on veut calculer les impacts" + type: array + items: + type: string + criteres: + description: "Liste des critères pour lesquels on veut calculer les impacts" + type: array + items: + type: string ModeRest: type: string enum: diff --git a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..76ed19eb5b3ed3f1138b9a079e963e20dbc2801c --- /dev/null +++ b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java @@ -0,0 +1,136 @@ +package org.mte.numecoeval.expositiondonneesentrees.infrastructure.service; + +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.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mte.numecoeval.expositiondonneesentrees.domain.exception.ValidationException; +import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.DureeUsage; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.adapters.ReferentielRestClient; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.entity.DonneesEntreesEntity; +import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.CritereDTO; +import org.mte.numecoeval.expositiondonneesentrees.referentiels.generated.api.model.EtapeDTO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.mte.numecoeval.expositiondonneesentrees.infrastructure.controller.CalculController.TYPE_CALCUL_SOUMISSION; + +@ExtendWith({SpringExtension.class}) +@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class) +public class DonneesEntreesServiceTest { + @InjectMocks + DonneesEntreesService donneesEntreesService; + @Mock + ReferentielRestClient referentielRestClient; + private static final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); + + @Value("${regle-par-defaut-duree-usage}") + private String defaultDureeUsage; + + @BeforeEach + void init() throws JsonProcessingException { + ReflectionTestUtils.setField(donneesEntreesService, "defaultDureeUsage", defaultDureeUsage); + + /* MOCK REFERENTIEL : Etapes */ + Mockito.lenient().when(referentielRestClient.getAllEtapes()).thenReturn(Arrays.asList(mapper.readValue(""" + [{ "code": "UTILISATION", "libelle": "Using" }, + { "code": "FABRICATION", "libelle": "Manufacturing" }, + { "code": "DISTRIBUTION", "libelle": "Transportation" }] + """, EtapeDTO[].class))); + + /* MOCK REFERENTIEL : Criteres */ + Mockito.lenient().when(referentielRestClient.getAllCriteres()).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))); + } + + @Test + void enrichiDonneesEntrees_with_dureeUsageNull() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, null, null, null, TYPE_CALCUL_SOUMISSION); + assertEquals("FIXE", actual.getDureeUsage()); + } + + @Test + void enrichiDonneesEntrees_with_dureeUsageFixe() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, null, TYPE_CALCUL_SOUMISSION); + assertEquals("FIXE", actual.getDureeUsage()); + } + + @Test + void enrichiDonneesEntrees_with_dureeUsageReel() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("REEL"), null, null, TYPE_CALCUL_SOUMISSION); + assertEquals("REEL", actual.getDureeUsage()); + } + + @Test + void enrichiDonneesEntrees_with_etapesFiltree_shouldFilter() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of("UTILISATION", "FABRICATION"), List.of(), TYPE_CALCUL_SOUMISSION); + assertEquals("UTILISATION##FABRICATION", actual.getEtapes()); + } + + @Test + void enrichiDonneesEntrees_with_etapesFiltreeNull_shouldReturnNull() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, List.of(), TYPE_CALCUL_SOUMISSION); + Assertions.assertNull(actual.getEtapes()); + } + + @Test + void enrichiDonneesEntrees_with_etapeFiltreeNotInReferentiel_shouldThrowError() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + var exception = assertThrows(ValidationException.class, () -> ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of("FAB"), List.of(), TYPE_CALCUL_SOUMISSION)); + assertEquals("La liste d'étapes n'est pas valide, elle doit être comprise dans: [UTILISATION, FABRICATION, DISTRIBUTION]", exception.getErreur()); + } + + @Test + void enrichiDonneesEntrees_with_criteresFiltree_shouldFilter() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of(), List.of("Acidification", "Ionising radiation", "Climate change"), TYPE_CALCUL_SOUMISSION); + assertEquals("Acidification##Ionising radiation##Climate change", actual.getCriteres()); + } + + @Test + void enrichiDonneesEntrees_with_criteresFiltreeNull_shouldReturnNull() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, null, TYPE_CALCUL_SOUMISSION); + Assertions.assertNull(actual.getCriteres()); + } + + @Test + void enrichiDonneesEntrees_with_critereFiltreeNotInReferentiel_shouldThrowError() { + DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); + var exception = assertThrows(ValidationException.class, () -> ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, List.of("CLIMATE CHANGE"), TYPE_CALCUL_SOUMISSION)); + Assertions.assertEquals("La liste de critères n'est pas valide, elle doit être comprise dans: [Climate change, Particulate matter and respiratory inorganics, Ionising radiation, Acidification]", exception.getErreur()); + } +} diff --git a/services/api-referentiel/pom.xml b/services/api-referentiel/pom.xml index 742f02b04b9c1fd5d13701933af051cdea2bab13..fba8b24d70c4f42f13f98d65df504a4f2cf2a079 100644 --- a/services/api-referentiel/pom.xml +++ b/services/api-referentiel/pom.xml @@ -5,12 +5,12 @@ <parent> <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>api-referentiel</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <name>api-referentiel</name> <description>API Referentiel - Lecture, chargement et exposition par API</description> diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/init/FusionFacteurCaracterisationService.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/init/FusionFacteurCaracterisationService.java deleted file mode 100644 index 986138c7ce93608e4a4ec2af88c8a9bfcf9a225d..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/init/FusionFacteurCaracterisationService.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.init; - -import jakarta.annotation.PostConstruct; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.mte.numecoeval.referentiel.domain.exception.ReferentielException; -import org.mte.numecoeval.referentiel.infrastructure.jpa.adapter.ImpactEquipementJpaAdapter; -import org.mte.numecoeval.referentiel.infrastructure.jpa.adapter.ImpactReseauJpaAdapter; -import org.mte.numecoeval.referentiel.infrastructure.jpa.adapter.MixElectriqueJpaAdapter; -import org.mte.numecoeval.referentiel.infrastructure.jpa.repository.ImpactEquipementRepository; -import org.mte.numecoeval.referentiel.infrastructure.jpa.repository.ImpactReseauRepository; -import org.mte.numecoeval.referentiel.infrastructure.jpa.repository.MixElectriqueRepository; -import org.mte.numecoeval.referentiel.infrastructure.mapper.ImpactEquipementMapper; -import org.mte.numecoeval.referentiel.infrastructure.mapper.ImpactReseauMapper; -import org.mte.numecoeval.referentiel.infrastructure.mapper.MixElectriqueMapper; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@AllArgsConstructor -public class FusionFacteurCaracterisationService { - private MixElectriqueJpaAdapter mixElectriqueJpaAdapter; - private MixElectriqueRepository mixElectriqueRepository; - private MixElectriqueMapper mixElectriqueMapper; - private ImpactReseauJpaAdapter impactReseauJpaAdapter; - private ImpactReseauRepository impactReseauRepository; - private ImpactReseauMapper impactReseauMapper; - private ImpactEquipementJpaAdapter impactEquipementJpaAdapter; - private ImpactEquipementRepository impactEquipementRepository; - private ImpactEquipementMapper impactEquipementMapper; - - @PostConstruct - public void init() throws ReferentielException { - log.info("démarrage de la fusion des tables vers ref_facteurcaracterisation"); - - var mixelecs = mixElectriqueRepository.findAll(); - if (!mixelecs.isEmpty()) { - log.info("migration des mix électriques vers la nouvelle table"); - mixElectriqueJpaAdapter.saveAll(mixElectriqueMapper.toDomains(mixelecs)); - mixElectriqueRepository.deleteAll(); - log.info("fin de la migration des mix électriques vers la nouvelle table"); - } - var impactReseaux = impactReseauRepository.findAll(); - if (!impactReseaux.isEmpty()) { - log.info("migration des impact réseaux vers la nouvelle table"); - impactReseauJpaAdapter.saveAll(impactReseauMapper.toDomains(impactReseaux)); - impactReseauRepository.deleteAll(); - log.info("fin de la migration des impact réseaux vers la nouvelle table"); - } - var impactEquipements = impactEquipementRepository.findAll(); - if (!impactEquipements.isEmpty()) { - log.info("migration des impacts équipements vers la nouvelle table"); - impactEquipementJpaAdapter.saveAll(impactEquipementMapper.toDomains(impactEquipements)); - impactEquipementRepository.deleteAll(); - log.info("fin de la migration des impacts équipements vers la nouvelle table"); - } - } -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/init/MigrationToRefTypeItem.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/init/MigrationToRefTypeItem.java deleted file mode 100644 index a4f9a4cf9a8d3d132133aff76151dbc15ca2b04d..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/init/MigrationToRefTypeItem.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.init; - -import jakarta.annotation.PostConstruct; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.mte.numecoeval.referentiel.domain.exception.ReferentielException; -import org.mte.numecoeval.referentiel.infrastructure.jpa.adapter.TypeItemJpaAdapter; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.TypeEquipementEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.repository.TypeEquipementRepository; -import org.mte.numecoeval.referentiel.infrastructure.mapper.TypeEquipementMapper; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@Slf4j -@AllArgsConstructor -public class MigrationToRefTypeItem { - - private TypeEquipementRepository typeEquipementRepository; - private TypeEquipementMapper typeEquipementMapper; - private TypeItemJpaAdapter typeItemJpaAdapter; - - @PostConstruct - public void init() throws ReferentielException { - log.info("démarrage de la migration de la table ref_type_equipement vers ref_type_item"); - List<TypeEquipementEntity> typesEquipement = typeEquipementRepository.findAll(); - if (!typesEquipement.isEmpty()) { - log.info("migration des référentiels de types d'équipements existants vers la nouvelle table"); - typeItemJpaAdapter.saveAll(typeEquipementMapper.toTypesItem(typeEquipementMapper.toDomaines(typesEquipement))); - typeEquipementRepository.deleteAll(); - log.info("fin de la migration de la table ref_type_equipement vers ref_type_item"); - } - } -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/ImpactEquipementEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/ImpactEquipementEntity.java deleted file mode 100644 index d878dc03a39a91d8a35ddd876e89641f87e7d70a..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/ImpactEquipementEntity.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity; - -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.FieldDefaults; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.ImpactEquipementIdEntity; - -@Getter -@Setter -@Accessors(chain = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -@Entity -@IdClass(ImpactEquipementIdEntity.class) -@Table(name = "REF_IMPACTEQUIPEMENT") -@EqualsAndHashCode -public class ImpactEquipementEntity implements AbstractReferentielEntity { - @Id - @Column(name = "REFEQUIPEMENT") - String refEquipement; - @Id - @Column(name = "ETAPEACV") - String etape; - @Id - @Column(name = "NOMCRITERE") - String critere; - String source; - String type; - Double valeur; - Double consoElecMoyenne; - String description; -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/ImpactReseauEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/ImpactReseauEntity.java deleted file mode 100644 index de8f5b5f4dd010912ae6b0c53617b2f6d67b9e9f..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/ImpactReseauEntity.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity; - -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.FieldDefaults; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.ImpactReseauIdEntity; - -@Getter -@Setter -@Accessors(chain = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -@Entity -@IdClass(ImpactReseauIdEntity.class) -@Table(name = "REF_IMPACTRESEAU") -@EqualsAndHashCode -public class ImpactReseauEntity implements AbstractReferentielEntity { - @Id - @Column(name = "REFRESEAU", nullable = false) - String refReseau; - @Id - @Column(name = "ETAPEACV", nullable = false) - String etape; - @Id - @Column(name = "NOMCRITERE", nullable = false) - String critere; - String source; - Double valeur; - @Column(name = "CONSOELECMOYENNE") - Double consoElecMoyenne; -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/MixElectriqueEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/MixElectriqueEntity.java deleted file mode 100644 index f73d533403dc570340ce815259518e7de0f19cbd..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/MixElectriqueEntity.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity; - -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.FieldDefaults; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.MixElectriqueIdEntity; - -@Getter -@Setter -@Accessors(chain = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -@Entity -@IdClass(MixElectriqueIdEntity.class) -@Table(name = "REF_MIXELEC") -@EqualsAndHashCode -public class MixElectriqueEntity implements AbstractReferentielEntity { - @Id - String pays; - @Id - @Column(name = "NOMCRITERE") - String critere; - @Column(name = "RACCOURCISANGLAIS") - String raccourcisAnglais; - String source; - Double valeur; -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/TypeEquipementEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/TypeEquipementEntity.java deleted file mode 100644 index dced599b8bfd87384cf40e5e1d750bb03e598406..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/TypeEquipementEntity.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity; - -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -@Builder -@Getter -@Setter -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -@Entity(name = "REF_TYPE_EQUIPEMENT") -public class TypeEquipementEntity implements AbstractReferentielEntity { - @Id - String type; - boolean serveur; - String commentaire; - Double dureeVieDefaut; - String source; - - // Référence de l'équipement par défaut, permet des correspondances en cas d'absence de correspondance direct. - String refEquipementParDefaut; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - - if (o == null || getClass() != o.getClass()) return false; - - TypeEquipementEntity that = (TypeEquipementEntity) o; - - return new EqualsBuilder().append(serveur, that.serveur).append(type, that.type).append(commentaire, that.commentaire).append(dureeVieDefaut, that.dureeVieDefaut).append(source, that.source).isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(17, 37).append(type).append(serveur).append(commentaire).append(dureeVieDefaut).append(source).toHashCode(); - } -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/ImpactEquipementIdEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/ImpactEquipementIdEntity.java deleted file mode 100644 index 2cec43b73242229117ab002d08a442c84e92273e..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/ImpactEquipementIdEntity.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.FieldDefaults; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -@Getter -@Setter -@Accessors(chain = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -@NoArgsConstructor - -public class ImpactEquipementIdEntity implements AbstractReferentieIdEntity { - String refEquipement; - String etape; - String critere; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - - if (o == null || getClass() != o.getClass()) return false; - - ImpactEquipementIdEntity that = (ImpactEquipementIdEntity) o; - - return new EqualsBuilder().append(refEquipement, that.refEquipement).append(etape, that.etape).append(critere, that.critere).isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(17, 37).append(refEquipement).append(etape).append(critere).toHashCode(); - } -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/ImpactReseauIdEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/ImpactReseauIdEntity.java deleted file mode 100644 index e43e72515a5253f3dc2dab50e0785109390202ea..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/ImpactReseauIdEntity.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.FieldDefaults; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -@Getter -@Setter -@Accessors(chain = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -@NoArgsConstructor -public class ImpactReseauIdEntity implements AbstractReferentieIdEntity { - String refReseau; - String etape; - String critere; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - - if (o == null || getClass() != o.getClass()) return false; - - ImpactReseauIdEntity that = (ImpactReseauIdEntity) o; - - return new EqualsBuilder().append(refReseau, that.refReseau).append(etape, that.etape).append(critere, that.critere).isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(17, 37).append(refReseau).append(etape).append(critere).toHashCode(); - } -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/MixElectriqueIdEntity.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/MixElectriqueIdEntity.java deleted file mode 100644 index feae6b5e6dd3e93cb85ec49839a86fd86ee09442..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/entity/id/MixElectriqueIdEntity.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.FieldDefaults; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -@Getter -@Setter -@Accessors(chain = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -@NoArgsConstructor - -public class MixElectriqueIdEntity implements AbstractReferentieIdEntity { - - String pays; - String critere; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - - if (o == null || getClass() != o.getClass()) return false; - - MixElectriqueIdEntity that = (MixElectriqueIdEntity) o; - - return new EqualsBuilder().append(pays, that.pays).append(critere, that.critere).isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(17, 37).append(pays).append(critere).toHashCode(); - } -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/ImpactEquipementRepository.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/ImpactEquipementRepository.java deleted file mode 100644 index af84c79ce5ea6c97a8382882298a9a6c1ce1ac44..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/ImpactEquipementRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.repository; - -import io.swagger.v3.oas.annotations.tags.Tag; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.ImpactEquipementEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.ImpactEquipementIdEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "ImpactEquipement" , itemResourceRel = "ImpactEquipements") -@Tag(name = "ImpactEquipement - CRUD/Spring Data REST") -public interface ImpactEquipementRepository extends JpaRepository<ImpactEquipementEntity, ImpactEquipementIdEntity> { - -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/ImpactReseauRepository.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/ImpactReseauRepository.java deleted file mode 100644 index f37f3c3a1c46539f5af638dcc465603104d6e56b..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/ImpactReseauRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.repository; - -import io.swagger.v3.oas.annotations.tags.Tag; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.ImpactReseauEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.ImpactReseauIdEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "ImpactReseau" , itemResourceRel = "ImpactReseaux") -@Tag(name = "ImpactReseau - CRUD/Spring Data REST") -public interface ImpactReseauRepository extends JpaRepository<ImpactReseauEntity, ImpactReseauIdEntity> { - -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/MixElectriqueRepository.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/MixElectriqueRepository.java deleted file mode 100644 index 448a8b3b3d58aef07ab855e05bba64785f142311..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/MixElectriqueRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.repository; - -import io.swagger.v3.oas.annotations.tags.Tag; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.MixElectriqueEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.MixElectriqueIdEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "MixElectrique" , itemResourceRel = "MixElectriques") -@Tag(name = "MixElectrique - CRUD/Spring Data REST") -public interface MixElectriqueRepository extends JpaRepository<MixElectriqueEntity, MixElectriqueIdEntity> { - -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/TypeEquipementRepository.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/TypeEquipementRepository.java deleted file mode 100644 index c924a861d9b2ee3c0419de07a61ad416d37d6e72..0000000000000000000000000000000000000000 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/jpa/repository/TypeEquipementRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.mte.numecoeval.referentiel.infrastructure.jpa.repository; - -import io.swagger.v3.oas.annotations.tags.Tag; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.TypeEquipementEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "TypeEquipement" , itemResourceRel = "TypesEquipements") -@Tag(name = "TypeEquipement - CRUD/Spring Data REST") -public interface TypeEquipementRepository extends JpaRepository<TypeEquipementEntity,String> { -} diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactEquipementMapper.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactEquipementMapper.java index 50743926e6a843acf62cf901b627bc1f4108124d..eddf92bfd29d988db0159592372975a2f18936e8 100644 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactEquipementMapper.java +++ b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactEquipementMapper.java @@ -5,28 +5,15 @@ import org.mapstruct.Mapping; import org.mte.numecoeval.referentiel.domain.model.FacteurCaracterisation; import org.mte.numecoeval.referentiel.domain.model.ImpactEquipement; import org.mte.numecoeval.referentiel.domain.model.id.ImpactEquipementId; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.ImpactEquipementEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.ImpactEquipementIdEntity; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.ImpactEquipementDTO; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.id.ImpactEquipementIdDTO; -import java.util.Collection; import java.util.List; @Mapper(componentModel = "spring") public interface ImpactEquipementMapper { ImpactEquipementId toDomainId(ImpactEquipementIdDTO id); - ImpactEquipementEntity toEntity(ImpactEquipement referentiel); - - List<ImpactEquipementEntity> toEntities(Collection<ImpactEquipement> referentiel); - - ImpactEquipementIdEntity toEntityId(ImpactEquipementId id); - - ImpactEquipement toDomain(ImpactEquipementEntity entity); - - List<ImpactEquipement> toDomains(List<ImpactEquipementEntity> entities); - ImpactEquipement toDomain(ImpactEquipementDTO dto); List<ImpactEquipement> toDomainsFromDTO(List<ImpactEquipementDTO> iesDTO); diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactReseauMapper.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactReseauMapper.java index 4bc31228316513146020b5470b7b82d481a354de..82bd261f1f475e9cfe44d9d7f1e250f1c1670f95 100644 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactReseauMapper.java +++ b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/ImpactReseauMapper.java @@ -5,37 +5,24 @@ import org.mapstruct.Mapping; import org.mte.numecoeval.referentiel.domain.model.FacteurCaracterisation; import org.mte.numecoeval.referentiel.domain.model.ImpactReseau; import org.mte.numecoeval.referentiel.domain.model.id.ImpactReseauId; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.ImpactReseauEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.ImpactReseauIdEntity; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.ImpactReseauDTO; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.id.ImpactReseauIdDTO; -import java.util.Collection; import java.util.List; @Mapper(componentModel = "spring") public interface ImpactReseauMapper { - ImpactReseauEntity toEntity(ImpactReseau impactReseau); - @Mapping(source = "etape", target = "etapeACV") ImpactReseauDTO toDTO(ImpactReseau impactReseau); - ImpactReseauIdEntity toEntityId(ImpactReseauId reseauId); - - ImpactReseau toDomain(ImpactReseauEntity reseauEntity); - @Mapping(source = "etapeACV", target = "etape") ImpactReseau toDomain(ImpactReseauDTO impactReseauDTO); @Mapping(source = "etapeACV", target = "etape") ImpactReseauId toDomainId(ImpactReseauIdDTO idImpactReseauDTO); - List<ImpactReseauEntity> toEntity(Collection<ImpactReseau> facteursImpacts); - - List<ImpactReseau> toDomains(List<ImpactReseauEntity> entities); - List<ImpactReseau> toDomainsFromDTO(List<ImpactReseauDTO> dtos); @Mapping(target = "nom", source = "refReseau") diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/MixElectriqueMapper.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/MixElectriqueMapper.java index bbafcff07fb6487f139c1a6cd78474fbb82770ad..b29345dc9d8dd087fb842d46debe2e3033c1a26f 100644 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/MixElectriqueMapper.java +++ b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/MixElectriqueMapper.java @@ -5,12 +5,9 @@ import org.mapstruct.Mapping; import org.mte.numecoeval.referentiel.domain.model.FacteurCaracterisation; import org.mte.numecoeval.referentiel.domain.model.MixElectrique; import org.mte.numecoeval.referentiel.domain.model.id.MixElectriqueId; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.MixElectriqueEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.MixElectriqueIdEntity; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.MixElectriqueDTO; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.id.MixElectriqueIdDTO; -import java.util.Collection; import java.util.List; @Mapper(componentModel = "spring") @@ -18,16 +15,6 @@ public interface MixElectriqueMapper { MixElectriqueId toDomainId(MixElectriqueIdDTO id); - MixElectriqueEntity toEntity(MixElectrique mixElecs); - - List<MixElectriqueEntity> toEntities(Collection<MixElectrique> mixElecs); - - MixElectriqueIdEntity toEntityId(MixElectriqueId id); - - MixElectrique toDomain(MixElectriqueEntity mixElec); - - List<MixElectrique> toDomains(List<MixElectriqueEntity> mixElec); - List<MixElectrique> toDomainsFromDTO(List<MixElectriqueDTO> mixElecs); MixElectriqueDTO toDTO(MixElectrique mixElectrique); diff --git a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/TypeEquipementMapper.java b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/TypeEquipementMapper.java index 5af2f6ad6fd476fb60523d75e0020af5b34cc730..87dd9b832cd097f82309d7fbe428519da2a77105 100644 --- a/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/TypeEquipementMapper.java +++ b/services/api-referentiel/src/main/java/org/mte/numecoeval/referentiel/infrastructure/mapper/TypeEquipementMapper.java @@ -4,25 +4,15 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mte.numecoeval.referentiel.domain.model.TypeEquipement; import org.mte.numecoeval.referentiel.domain.model.TypeItem; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.TypeEquipementEntity; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.TypeEquipementDTO; -import java.util.Collection; import java.util.List; @Mapper(componentModel = "spring") public interface TypeEquipementMapper { - TypeEquipement toDomaine(TypeEquipementEntity typeEquipementEntity); - - List<TypeEquipement> toDomaines(List<TypeEquipementEntity> typeEquipementEntities); - TypeEquipement toDomaine(TypeEquipementDTO typeEquipementDTO); - TypeEquipementEntity toEntity(TypeEquipement typeEquipement); - - List<TypeEquipementEntity> toEntities(Collection<TypeEquipement> typeEquipements); - TypeEquipementDTO toDto(TypeEquipement typeEquipement); @Mapping(target = "refItemParDefaut", source = "refEquipementParDefaut") diff --git a/services/api-referentiel/src/main/resources/schema.sql b/services/api-referentiel/src/main/resources/schema.sql index 1f910575e8599bc34ff0e3036a01cff8b0b4c2f7..d81d8dde24fa93687f803a52b0e38c6f16e14a2d 100644 --- a/services/api-referentiel/src/main/resources/schema.sql +++ b/services/api-referentiel/src/main/resources/schema.sql @@ -22,17 +22,6 @@ CREATE TABLE IF NOT EXISTS ref_hypothese CONSTRAINT ref_hypothese_pkey PRIMARY KEY (code) ); -CREATE TABLE IF NOT EXISTS ref_type_equipement -( - "type" varchar(255) NOT NULL, - commentaire varchar(255) NULL, - duree_vie_defaut float8 NULL, - serveur bool NOT NULL, - "source" varchar(255) NULL, - ref_equipement_par_defaut varchar(255) NULL, - CONSTRAINT ref_type_equipement_pkey PRIMARY KEY (type) -); - CREATE TABLE IF NOT EXISTS ref_type_item ( "type" varchar(255) NOT NULL, @@ -61,40 +50,6 @@ CREATE TABLE IF NOT EXISTS ref_correspondance_ref_eqp ref_equipement_cible varchar(255) NULL, CONSTRAINT ref_correspondance_ref_eqp_pkey PRIMARY KEY (modele_equipement_source) ); - -CREATE TABLE IF NOT EXISTS ref_impactequipement -( - refequipement varchar(255) NOT NULL, - conso_elec_moyenne float8 NULL, - "source" varchar(255) NULL, - "type" varchar(255) NULL, - valeur float8 NULL, - etapeacv varchar(255) NOT NULL, - nomcritere varchar(255) NOT NULL, - description varchar(255) NULL, - CONSTRAINT ref_impactequipement_pkey PRIMARY KEY (nomcritere, etapeacv, refequipement) -); - -CREATE TABLE IF NOT EXISTS ref_impactreseau -( - refreseau varchar(255) NOT NULL, - consoelecmoyenne float8 NULL, - "source" varchar(255) NULL, - valeur float8 NULL, - etapeacv varchar(255) NOT NULL, - nomcritere varchar(255) NOT NULL, - CONSTRAINT ref_impactreseau_pkey PRIMARY KEY (nomcritere, etapeacv, refreseau) -); - -CREATE TABLE IF NOT EXISTS ref_mixelec -( - pays varchar(255) NOT NULL, - raccourcisanglais varchar(255) NULL, - "source" varchar(255) NULL, - valeur float8 NULL, - nomcritere varchar(255) NOT NULL, - CONSTRAINT ref_mixelec_pkey PRIMARY KEY (nomcritere, pays) -); CREATE TABLE IF NOT EXISTS ref_facteurcaracterisation ( nom varchar(255) NOT NULL, @@ -112,9 +67,4 @@ CREATE TABLE IF NOT EXISTS ref_mixelec CONSTRAINT ref_facteurcaracterisation_pkey PRIMARY KEY (nom, etapeacv, nomcritere) ); -- suppression des contraintes de clés étrangères -ALTER TABLE ref_impactequipement DROP CONSTRAINT IF EXISTS fk5iuiwnk7rymtob1fku71uuj52; -ALTER TABLE ref_impactequipement DROP CONSTRAINT IF EXISTS fksfjum8kagn7q6vsv5uqn6kimx; -ALTER TABLE ref_impactreseau DROP CONSTRAINT IF EXISTS fk31ykp7xtj41win3ptqlr3us9s; -ALTER TABLE ref_impactreseau DROP CONSTRAINT IF EXISTS fkb8tkreu8c8s8pqqnft6vr4pnf; -ALTER TABLE ref_mixelec DROP CONSTRAINT IF EXISTS fkdncd4m2je6fbno7pkn850u1fs; ALTER TABLE ref_impact_messagerie DROP CONSTRAINT IF EXISTS fkohnlpwfp0ebk7dswmfbe5l3k0; diff --git a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/factory/TestDataFactory.java b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/factory/TestDataFactory.java index 6082c03d5e511d913efc700801eb8dbe79f3d593..62338a5db3275c4ad5f0f5771b6a87e796efc568 100644 --- a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/factory/TestDataFactory.java +++ b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/factory/TestDataFactory.java @@ -3,7 +3,9 @@ package org.mte.numecoeval.referentiel.factory; import org.mte.numecoeval.referentiel.domain.model.*; import org.mte.numecoeval.referentiel.domain.model.id.*; import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.*; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.*; +import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.CritereIdEntity; +import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.EtapeIdEntity; +import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.id.HypotheseIdEntity; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.*; import org.mte.numecoeval.referentiel.infrastructure.restapi.dto.id.*; @@ -141,9 +143,6 @@ public class TestDataFactory { .build(); } - public static TypeEquipementEntity entity(String type, boolean estUnServeur, Double dureeVieDefaut, String commentaire, String source, String refEquipementParDefaut) { - return new TypeEquipementEntity(type, estUnServeur, commentaire, dureeVieDefaut, source, refEquipementParDefaut); - } } public static class TypeItemFactory { @@ -200,15 +199,6 @@ public class TestDataFactory { .setSource(source); } - public static MixElectriqueEntity entity(CritereEntity critere, String pays, String raccourcisAnglais, Double valeur, String source) { - return new MixElectriqueEntity() - .setCritere(critere.getNomCritere()) - .setPays(pays) - .setRaccourcisAnglais(raccourcisAnglais) - .setValeur(valeur) - .setSource(source); - } - public static MixElectriqueIdDTO idDTO(CritereIdDTO critereId, String pays) { return MixElectriqueIdDTO .builder() @@ -222,12 +212,6 @@ public class TestDataFactory { .setCritere(critereId.getNomCritere()) .setPays(pays); } - - public static MixElectriqueIdEntity idEntity(CritereIdEntity critereId, String pays) { - return new MixElectriqueIdEntity() - .setCritere(critereId.getNomCritere()) - .setPays(pays); - } } public static class ImpactEquipementFactory { @@ -256,17 +240,6 @@ public class TestDataFactory { .setConsoElecMoyenne(consoElecMoyenne); } - public static ImpactEquipementEntity entity(EtapeEntity etape, CritereEntity critere, String refEquipement, String source, String type, Double valeur, Double consoElecMoyenne) { - return new ImpactEquipementEntity() - .setEtape(etape.getCode()) - .setCritere(critere.getNomCritere()) - .setRefEquipement(refEquipement) - .setSource(source) - .setType(type) - .setValeur(valeur) - .setConsoElecMoyenne(consoElecMoyenne); - } - public static ImpactEquipementIdDTO idDTO(String etapeIdDTO, String critereId, String refEquipement) { return ImpactEquipementIdDTO .builder() @@ -379,16 +352,6 @@ public class TestDataFactory { .setConsoElecMoyenne(consoElecMoyenne); } - public static ImpactReseauEntity entity(EtapeEntity etape, CritereEntity critere, String refReseau, String source, Double valeur, Double consoElecMoyenne) { - return new ImpactReseauEntity() - .setEtape(etape.getCode()) - .setCritere(critere.getNomCritere()) - .setRefReseau(refReseau) - .setSource(source) - .setValeur(valeur) - .setConsoElecMoyenne(consoElecMoyenne); - } - public static ImpactReseauIdDTO idDTO(EtapeIdDTO etapeIdDTO, CritereIdDTO critereId, String refReseau) { return ImpactReseauIdDTO .builder() @@ -404,13 +367,6 @@ public class TestDataFactory { .setCritere(critereId.getNomCritere()) .setRefReseau(refReseau); } - - public static ImpactReseauIdEntity idEntity(EtapeIdEntity etapeIdEntity, CritereIdEntity critereId, String refReseau) { - return new ImpactReseauIdEntity() - .setEtape(etapeIdEntity.getCode()) - .setCritere(critereId.getNomCritere()) - .setRefReseau(refReseau); - } } public static class ImpactMessagerieFactory { diff --git a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactEquipementCsvExportServiceTest.java b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactEquipementCsvExportServiceTest.java index dc7029687ef5f3f608ea6c95c43f459574bc3d34..175cfa440807c53da57d931ecbfe13d89a4ec4d2 100644 --- a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactEquipementCsvExportServiceTest.java +++ b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactEquipementCsvExportServiceTest.java @@ -85,33 +85,33 @@ class ImpactEquipementCsvExportServiceTest { @Test void printRecordShouldUseEntityAttributes() throws IOException { - var entity = TestDataFactory.ImpactEquipementFactory.entity( + var entity = TestDataFactory.FacteurCaracterisationFactory.entity("Laptop", TestDataFactory.EtapeFactory.entity("UTILISATION", ""), TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), - "Ref-Ecran", "RefTest", "Ecran", 0.1, 0.2 + "", Constants.EQUIPEMENT_NIVEAU, "", "Ecran", 0.1, "", 0.2, "", "NegaOctet" ); + DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); df.setMaximumFractionDigits(340); - assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, equipementMapper.toDomain(entity))); + assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, equipementMapper.toImpactEquipement(facteurCaracterisationMapper.toDomain(entity)))); - Mockito.verify(csvPrinter, times(1)).printRecord(entity.getRefEquipement(), + Mockito.verify(csvPrinter, times(1)).printRecord(entity.getNom(), entity.getEtape(), entity.getCritere(), df.format(entity.getConsoElecMoyenne()), df.format(entity.getValeur()), - entity.getSource(), entity.getType()); + entity.getSource(), null); } @Test void logRecordErrorShouldLogSpecificErrorForRecord() { - var entity = TestDataFactory.ImpactEquipementFactory.entity( + var entity = TestDataFactory.FacteurCaracterisationFactory.entity("Laptop", TestDataFactory.EtapeFactory.entity("UTILISATION", ""), TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), - "Ref-Ecran", "RefTest", "Ecran", 0.1, 0.2 + "", Constants.EQUIPEMENT_NIVEAU, "", "Ecran", 0.1, "", 0.2, "", "NegaOctet" ); - - assertDoesNotThrow(() -> exportService.logRecordError(equipementMapper.toDomain(entity), new Exception("Test"))); + assertDoesNotThrow(() -> exportService.logRecordError(equipementMapper.toImpactEquipement(facteurCaracterisationMapper.toDomain(entity)), new Exception("Test"))); } @Test diff --git a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactMixElectriqueCsvExportServiceTest.java b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactMixElectriqueCsvExportServiceTest.java index 1553433eddd5e0e4bb4a87d672acd432f1d23386..2ef28e593a5d4b3582cbdfca2e4cca475bdc0c3e 100644 --- a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactMixElectriqueCsvExportServiceTest.java +++ b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactMixElectriqueCsvExportServiceTest.java @@ -12,7 +12,6 @@ import org.mte.numecoeval.referentiel.domain.model.MixElectrique; import org.mte.numecoeval.referentiel.domain.ports.input.impl.ImportMixElectriquePortImpl; import org.mte.numecoeval.referentiel.factory.TestDataFactory; import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.FacteurCaracterisationEntity; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.MixElectriqueEntity; import org.mte.numecoeval.referentiel.infrastructure.jpa.repository.FacteurCaracterisationRepository; import org.mte.numecoeval.referentiel.infrastructure.mapper.FacteurCaracterisationMapper; import org.mte.numecoeval.referentiel.infrastructure.mapper.FacteurCaracterisationMapperImpl; @@ -68,13 +67,6 @@ class ImpactMixElectriqueCsvExportServiceTest { ); } - private MixElectriqueEntity mixElectriqueEntity() { - return TestDataFactory.MixElectriqueFactory.entity( - TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), - "France", "FR", 0.2, "Test" - ); - } - @Test void getHeadersShouldReturnSameHeadersAsImport() { Assertions.assertEquals(ImportMixElectriquePortImpl.getHeaders(), exportService.getHeaders()); @@ -91,15 +83,20 @@ class ImpactMixElectriqueCsvExportServiceTest { @Test void printRecordShouldUseEntityAttributes() throws IOException { - var entity = mixElectriqueEntity(); + var entity = TestDataFactory.FacteurCaracterisationFactory.entity("Electricity mix FR", + TestDataFactory.EtapeFactory.entity("FABRICATION", ""), + TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), + "", Constants.MIXELEC_NIVEAU, "", Constants.MIXELEC_CATEGORIE, 0.0, "France", 0.2, "", "NegaOctet" + ); + DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); df.setMaximumFractionDigits(340); - assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, mixElectriqueMapper.toDomain(entity))); + assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, mixElectriqueMapper.toMixElectrique(facteurCaracterisationMapper.toDomain(entity)))); Mockito.verify(csvPrinter, times(1)).printRecord( - entity.getPays(), - entity.getRaccourcisAnglais(), + entity.getLocalisation(), + null, entity.getCritere(), df.format(entity.getValeur()), entity.getSource()); @@ -107,9 +104,13 @@ class ImpactMixElectriqueCsvExportServiceTest { @Test void logRecordErrorShouldLogSpecificErrorForRecord() { - var entity = mixElectriqueEntity(); + var entity = TestDataFactory.FacteurCaracterisationFactory.entity("Electricity mix FR", + TestDataFactory.EtapeFactory.entity("FABRICATION", ""), + TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), + "", Constants.MIXELEC_NIVEAU, "", Constants.MIXELEC_CATEGORIE, 0.0, "France", 0.2, "", "NegaOctet" + ); - assertDoesNotThrow(() -> exportService.logRecordError(mixElectriqueMapper.toDomain(entity), new Exception("Test"))); + assertDoesNotThrow(() -> exportService.logRecordError(mixElectriqueMapper.toMixElectrique(facteurCaracterisationMapper.toDomain(entity)), new Exception("Test"))); } @Test diff --git a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactReseauCsvExportServiceTest.java b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactReseauCsvExportServiceTest.java index c398b1ec8ae31c2c3283cb413c5391cd5ba430dc..008e8f047ef5eceaa7df61d5b7746b506b66caf1 100644 --- a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactReseauCsvExportServiceTest.java +++ b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/ImpactReseauCsvExportServiceTest.java @@ -84,18 +84,18 @@ class ImpactReseauCsvExportServiceTest { @Test void printRecordShouldUseEntityAttributes() throws IOException { - var entity = TestDataFactory.ImpactReseauFactory.entity( + var entity = TestDataFactory.FacteurCaracterisationFactory.entity("Fixed-line network", TestDataFactory.EtapeFactory.entity("UTILISATION", ""), TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), - "Ref-Ecran", "RefTest", 0.1, 0.2 + "", Constants.RESEAU_NIVEAU, Constants.RESEAU_TIERS, "Ecran", 0.1, "", 0.2, "", "NegaOctet" ); DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); df.setMaximumFractionDigits(340); - assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, reseauMapper.toDomain(entity))); + assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, reseauMapper.toImpactReseau(facteurCaracterisationMapper.toDomain(entity)))); - Mockito.verify(csvPrinter, times(1)).printRecord(entity.getRefReseau(), + Mockito.verify(csvPrinter, times(1)).printRecord(entity.getNom(), entity.getEtape(), entity.getCritere(), df.format(entity.getValeur()), df.format(entity.getConsoElecMoyenne()), entity.getSource()); @@ -103,13 +103,13 @@ class ImpactReseauCsvExportServiceTest { @Test void logRecordErrorShouldLogSpecificErrorForRecord() { - var entity = TestDataFactory.ImpactReseauFactory.entity( + var entity = TestDataFactory.FacteurCaracterisationFactory.entity("Fixed-line network", TestDataFactory.EtapeFactory.entity("UTILISATION", ""), TestDataFactory.CritereFactory.entity("Changement climatique", "", ""), - "Ref-Ecran", "RefTest", 0.1, 0.2 + "", Constants.RESEAU_NIVEAU, Constants.RESEAU_TIERS, "Ecran", 0.1, "", 0.2, "", "NegaOctet" ); - assertDoesNotThrow(() -> exportService.logRecordError(reseauMapper.toDomain(entity), new Exception("Test"))); + assertDoesNotThrow(() -> exportService.logRecordError(reseauMapper.toImpactReseau(facteurCaracterisationMapper.toDomain(entity)), new Exception("Test"))); } @Test diff --git a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/TypeEquipementCsvExportServiceTest.java b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/TypeEquipementCsvExportServiceTest.java index 47eb4fcf78699fc9510401759381b478cd9d5843..434e3a8488c6ebbf4f8b2d798524cebea8864b8e 100644 --- a/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/TypeEquipementCsvExportServiceTest.java +++ b/services/api-referentiel/src/test/java/org/mte/numecoeval/referentiel/infrastructure/adapter/export/TypeEquipementCsvExportServiceTest.java @@ -11,7 +11,6 @@ import org.mockito.MockitoAnnotations; import org.mte.numecoeval.referentiel.domain.model.TypeEquipement; import org.mte.numecoeval.referentiel.domain.ports.input.impl.ImportTypeEquipementPortImpl; import org.mte.numecoeval.referentiel.factory.TestDataFactory; -import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.TypeEquipementEntity; import org.mte.numecoeval.referentiel.infrastructure.jpa.entity.TypeItemEntity; import org.mte.numecoeval.referentiel.infrastructure.jpa.repository.TypeItemRepository; import org.mte.numecoeval.referentiel.infrastructure.mapper.TypeEquipementMapper; @@ -64,10 +63,8 @@ class TypeEquipementCsvExportServiceTest { ); } - private TypeEquipementEntity typeEquipementEntity() { - return TestDataFactory.TypeEquipementFactory.entity( - "Serveur", true, 6.0, "Commentaires", "Test", - "test"); + private TypeItemEntity typeItemEntity() { + return TestDataFactory.TypeItemFactory.entity("Serveur", CATEGORIE_EQUIPEMENT_PHYSIQUE, true, null, 6.0, null, "", "Test"); } @Test @@ -86,11 +83,13 @@ class TypeEquipementCsvExportServiceTest { @Test void printRecordShouldUseEntityAttributes() throws IOException { - var entity = typeEquipementEntity(); + var entity = TestDataFactory.TypeItemFactory.entity( + "Serveur", null, true, "Exemple de serveur basique", + 6.0, null, "NegaOctet", "serveur_par_defaut"); DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); df.setMaximumFractionDigits(340); - assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, typeEquipementMapper.toDomaine(entity))); + assertDoesNotThrow(() -> exportService.printRecord(csvPrinter, typeEquipementMapper.toTypeEquipement(typeItemMapper.toDomain(entity)))); Mockito.verify(csvPrinter, times(1)).printRecord( entity.getType(), @@ -98,13 +97,13 @@ class TypeEquipementCsvExportServiceTest { entity.getCommentaire(), df.format(entity.getDureeVieDefaut()), entity.getSource(), - entity.getRefEquipementParDefaut()); + entity.getRefItemParDefaut()); } @Test void logRecordErrorShouldLogSpecificErrorForRecord() { - var entity = typeEquipementEntity(); - assertDoesNotThrow(() -> exportService.logRecordError(typeEquipementMapper.toDomaine(entity), new Exception("Test"))); + var entity = typeItemEntity(); + assertDoesNotThrow(() -> exportService.logRecordError(typeEquipementMapper.toTypeEquipement(typeItemMapper.toDomain(entity)), new Exception("Test"))); } @Test diff --git a/services/calculs/pom.xml b/services/calculs/pom.xml index 52a81e2f523005835d2327627a2d50ea70a9f8af..3d09cc0a1b9842fc545d09be20ef30b7d05f5e16 100644 --- a/services/calculs/pom.xml +++ b/services/calculs/pom.xml @@ -5,11 +5,11 @@ <parent> <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>calculs</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <name>calculs</name> <description>Module contenant l'intégralité des règles de calculs et du code métier lié aux calculs d'impact d'équipement 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 6c0da70ed89125cb7e070a24004add2322b0da59..99719512b91dc8b2651bc87afed58210cd45a71a 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 fade2b05612d66d8489bd351486c6aa6865c64b4..e0ddf3a41b7083af72a6d86d944837917daf4b67 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 4a76a7ad0a11c40ac071c8d9ac501555a609f5b5..0000000000000000000000000000000000000000 --- 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 02376c96d42f20d50e6a1e96f9c41008d03c51bc..ba2cdfafff91140a6667c23841e05242995715c1 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 0170b74f45258cdc82678b6f7839ede9316b3cfa..bf19aa676a129bc8bc1c4f489db341598617cdf8 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 7aa514cd4808e05407038779ed340d1f269dcd63..0000000000000000000000000000000000000000 --- 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 6ed08356e812f8bd1fb850973b325d6b747a3aa2..0000000000000000000000000000000000000000 --- 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 67ca444976078a561a1864094094daf591fa4207..0000000000000000000000000000000000000000 --- 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 7a762ff5acb8a82fdd5d36366bfef40ab65e81fb..0000000000000000000000000000000000000000 --- 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 a8236a86cc4aed6439fa5fc27fb7b85f97f8ab98..f3d000e3cd623fd4331f7d48a32289353516cb6b 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 5d2b8b5bd7a4c2a29f152db7e20a5fc77f3024aa..0000000000000000000000000000000000000000 --- 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 27b32aa92ebd44bd543f855aff8f1cf6d1b528e6..c6956b920be458e8645f849910b8ae1d2faed2f7 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 74f449d0d5325d86b4ff41b78e17e9c89b4e4c16..0000000000000000000000000000000000000000 --- 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 58e22f1d5c6f3f35de8e51456331ddb27debeb86..b22c5f0c53fb0e5a6d1490ab7c06cd9c270caf33 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 42560d275d9e9d154b6a87c670de2c94975b6b51..acf0260cf3a98d5fbdec96d4ff14030432919030 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 69c37222e72052206f1b300af7a8b6badfc57a67..0000000000000000000000000000000000000000 --- 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 38135838120be3bfdbcadfd63a9ebbd9b4fc2e32..a638acf629eeec2bca20005464345edccb27b1a9 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 5ae06bb4b352c4a42b7706847253c733192f4163..0000000000000000000000000000000000000000 --- 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 60969a2a1d764cb040409b99d68d32816f9c0a9c..821cc25cfc70ee290297929698cfc8ff9220361d 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 f69aaf98ece7e8df602681e8947e377c41dbaba9..25f145adad164dbe76c7f87b3a328c4a01ad3c25 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() ); diff --git a/services/common/pom.xml b/services/common/pom.xml index a7921ce6de338ff19f4bc2c7b52e2b0ece01185a..f9bf05670043cb988e60aac22a22c7b2a380b9cb 100644 --- a/services/common/pom.xml +++ b/services/common/pom.xml @@ -5,12 +5,12 @@ <parent> <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>common</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <name>common</name> <description>Module commun</description> diff --git a/services/core/pom.xml b/services/core/pom.xml index ff4444cacce16c8c3d06b2f4d4e26cb409c5c1d7..9fcdb6e45365fdea4e1254985c54c9495ff12862 100644 --- a/services/core/pom.xml +++ b/services/core/pom.xml @@ -11,7 +11,7 @@ <groupId>org.mte.numecoeval</groupId> <artifactId>core</artifactId> - <version>2.0.1</version> + <version>2.1.0-SNAPSHOT</version> <name>core</name> <packaging>pom</packaging> <description>Projet parent du projet NumEcoEval</description>