diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ec9081d11b59bebe3eb3d1e120b1a894f2c98dc..367f5fa005bcf6001e83086def1efd5fa1bdfa39 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 2d89935287f5c2d4dd1d7b0a3a93de2b91e2aabc..ee9534217e6312b54dd6dee6b46a4f3e963da2b2 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 84ef4b302bbb160e83644c87d42be31f5ed5ef19..c7e4b02bededc17bb99c41a5aac17a8c1fcb7624 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 eefa835665859654c22bd4bc92cb65da3e8e3690..499beb9a7fa598530fcbdcbb84ad3d0706889ff4 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 a638acf629eeec2bca20005464345edccb27b1a9..16273e0d6ed0c2a075f2fc9cd39446c7e3b9aae6 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