From 0728a30f291fef57468360d9e2bc3441b7bf65b2 Mon Sep 17 00:00:00 2001 From: LEMERCIER Denis <denis.lemercier@soprasteria.com> Date: Wed, 13 Nov 2024 11:05:54 +0000 Subject: [PATCH] Ajout du champ duree de vie dans la libraire de calcul --- CHANGELOG.md | 1 + docs/MoteurDeCalculG4IT_V1.1.adoc | 2 ++ .../indicateurs/ImpactEquipementPhysique.java | 1 + ...ulImpactEquipementPhysiqueServiceImpl.java | 30 ++++++++++++++----- ...ulImpactEquipementPhysiqueServiceTest.java | 1 + 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ec9081d..367f5fa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tous les changements de ce projet seront documentés dans ce document. ## [Non livré] +- Librairie de calculs : Ajout du champ DureeDeVie dans l'objet ImpactEquipementPhysique - Correction : Trace du calcul de l'utilisation d'un équipement physique : suppression de '/ 365' - Nettoyage : Suppression complète du calcul de l'impact du réseau à partir d'un équipement physique de type réseau (donc suppression des champs goTelecharge et nbJourUtiliseAn dans l'inventaire des équipements physiques). Désormais, l'impact du réseau se calcule grâce aux opérations non IT -> [Issue10](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/10) - Customisation des référentiels par organisation : les référentiels TypeItem, FacteurCaracterisation, CorrespondanceRefEquipement et Hypotheses peuvent être personnalisés par une organisation -> [Issue9](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/9) diff --git a/docs/MoteurDeCalculG4IT_V1.1.adoc b/docs/MoteurDeCalculG4IT_V1.1.adoc index 2d899352..ee953421 100644 --- a/docs/MoteurDeCalculG4IT_V1.1.adoc +++ b/docs/MoteurDeCalculG4IT_V1.1.adoc @@ -12,6 +12,7 @@ |majeur|22/02/2023|Intégrer des nouveaux impact au référentiel(déplacements collaborateurs, bâtiments) -> Création d'une nouvelle API facteurscaracterisation |majeur|02/05/2023|Charger et lancer un calcul sur les nouveaux impacts (réseau, déplacements, bâtiments, maintenance) -> import de nouveaux csv OperationNonIT puis création d'indicateurs associés |majeur|17/05/2023|Inclure dans l'évaluation d'impact des informations sur la qualité des données -> ajout d'un champ qualité à l'import puis transmission de la qualité jusqu'aux indicateurs en sortie +|mineur|12/11/2024|Inclure dans le résultat du calcul d'impact la durée de vie retenue -> ajout d'un champ dureeDeVie aux indicateurs de sortie |=== @@ -604,6 +605,7 @@ Cette règle permet le calcul de l'impact moyen d'un équipement physique sur un |ind_ImpactEquipementPhysique.unite|sortie|l'unité présente dans le référentiel correspondant au critère en cours |ind_ImpactEquipementPhysique.consoElecMoyenne|sortie|la consommation électrique déterminée par la règle suivante |ind_ImpactEquipementPhysique.qualite|sortie|la qualité de la donnée d'inventaire +|ind_ImpactEquipementPhysique.dureeDeVie|sortie|la durée de vie retenue d'un équipement physique en année |=== diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/indicateurs/ImpactEquipementPhysique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/indicateurs/ImpactEquipementPhysique.java index 84ef4b30..c7e4b02b 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/indicateurs/ImpactEquipementPhysique.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/indicateurs/ImpactEquipementPhysique.java @@ -34,4 +34,5 @@ public class ImpactEquipementPhysique { Double quantite; String statutEquipementPhysique; String qualite; + Double dureeDeVie; } 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 eefa8356..499beb9a 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 @@ -59,36 +59,48 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq TraceCalculImpactEquipementPhysique traceCalculImpactEquipementPhysique; var quantite = demandeCalcul.getEquipementPhysique().getQuantite(); double tauxUtilisationEqPhysique = getTauxUtilisationEqPhysique(demandeCalcul); + Double dureeDeVieRetenue = null; + if ("UTILISATION".equals(demandeCalcul.getEtape().getCode())) { var consoElecAnMoyenne = getConsoElecAnMoyenne(demandeCalcul); var mixElectrique = getMixElectrique(demandeCalcul); valeurImpactUnitaire = quantite * consoElecAnMoyenne.getValeur() * mixElectrique.getValeur() - * tauxUtilisationEqPhysique - ; + * tauxUtilisationEqPhysique; + consoElecMoyenne = consoElecAnMoyenne.getValeur(); traceCalculImpactEquipementPhysique = TraceCalculImpactEquipementPhysiqueUtils.buildTracePremierScenario(quantite, consoElecAnMoyenne, mixElectrique, tauxUtilisationEqPhysique); + + // duree de vie remontee sur l'impact, non necessaire pour les calculs en etape UTILISATION + try { + DureeDeVie dureeVie = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); + dureeDeVieRetenue = dureeVie == null ? null : dureeVie.getValeurRetenue(); + } catch (CalculImpactException ignored) { + } } else { var refImpactEquipementOpt = getFacteurCaracterisation(demandeCalcul); if (refImpactEquipementOpt.isPresent()) { ReferentielFacteurCaracterisation referentielImpactEquipement = refImpactEquipementOpt.get(); var valeurReferentiel = referentielImpactEquipement.getValeur(); valeurImpactUnitaire = quantite * valeurReferentiel * tauxUtilisationEqPhysique; + DureeDeVie dureeVie = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); - if (dureeVie != null && dureeVie.getValeurRetenue() != null && dureeVie.getValeurRetenue() > 0) { - var valeurDureeVie = dureeVie.getValeurRetenue(); - valeurImpactUnitaire = valeurImpactUnitaire / valeurDureeVie; - traceCalculImpactEquipementPhysique = TraceCalculImpactEquipementPhysiqueUtils.buildTraceSecondScenario(quantite, valeurReferentiel, referentielImpactEquipement.getSource(), dureeVie, tauxUtilisationEqPhysique); + dureeDeVieRetenue = dureeVie == null ? null : dureeVie.getValeurRetenue(); + + if (dureeDeVieRetenue != null && dureeDeVieRetenue > 0) { + valeurImpactUnitaire = valeurImpactUnitaire / dureeDeVieRetenue; } else { throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Durée de vie de l'équipement inconnue"); } + + traceCalculImpactEquipementPhysique = TraceCalculImpactEquipementPhysiqueUtils.buildTraceSecondScenario(quantite, valeurReferentiel, referentielImpactEquipement.getSource(), dureeVie, tauxUtilisationEqPhysique); } else { throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "Référentiel Facteur Caracterisation inconnu"); } } - var calcul = buildCalculImpactEquipementPhysique(demandeCalcul, valeurImpactUnitaire, consoElecMoyenne); + var calcul = buildCalculImpactEquipementPhysique(demandeCalcul, valeurImpactUnitaire, consoElecMoyenne, dureeDeVieRetenue); calcul.setTrace(TraceUtils.getTraceFromTraceur(traceCalculImpactEquipementPhysique)); return calcul; } @@ -109,7 +121,8 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq return resultFromRefEquipementCible; } - private ImpactEquipementPhysique buildCalculImpactEquipementPhysique(DemandeCalculImpactEquipementPhysique demandeCalcul, Double valeurImpactUnitaire, Double consoElecMoyenne) { + private ImpactEquipementPhysique buildCalculImpactEquipementPhysique(DemandeCalculImpactEquipementPhysique demandeCalcul, + Double valeurImpactUnitaire, Double consoElecMoyenne, Double dureeDeVie) { return ImpactEquipementPhysique .builder() .nomEquipement(demandeCalcul.getEquipementPhysique().getNomEquipementPhysique()) @@ -131,6 +144,7 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq .nomEntite(demandeCalcul.getEquipementPhysique().getNomEntite()) .nomOrganisation(demandeCalcul.getEquipementPhysique().getNomOrganisation()) .qualite(demandeCalcul.getEquipementPhysique().getQualite()) + .dureeDeVie(dureeDeVie) .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 a638acf6..16273e0d 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 @@ -522,6 +522,7 @@ class CalculImpactEquipementPhysiqueServiceTest { assertEquals(28.4, actualImpactUnitaireLimited); verify(dureeDeVieEquipementPhysiqueService, times(1)).calculerDureeVie(demandeCalcul); assertNull(actual.getConsoElecMoyenne()); + assertEquals(5.0d, actual.getDureeDeVie()); } @Test -- GitLab