From b055f3b5148bfff59d7fa7edef6219fd4e1a511a Mon Sep 17 00:00:00 2001 From: OURY Sarah <sarah.oury@soprasteria.com> Date: Thu, 13 Jun 2024 08:49:19 +0000 Subject: [PATCH] =?UTF-8?q?[SOY]=20doc=20=C3=A0=20jour=20et=20changement?= =?UTF-8?q?=20calcul=20dureeDeVie=20pour=20opNonIT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/MoteurDeCalculG4IT_V1.1.adoc | 40 ++++-- docs/Traces.plantuml | 2 +- services/.workspace/.idea/modules.xml | 1 - .../.workspace/.idea/saveactions_settings.xml | 1 + .../CalculImpactOperationNonITService.java | 4 + ...CalculImpactOperationNonITServiceImpl.java | 54 +++++--- ...reeDeVieEquipementPhysiqueServiceImpl.java | 65 ++++----- ...CalculImpactOperationNonITServiceTest.java | 128 +++++++++++++++++- ...reeDeVieEquipementPhysiqueServiceTest.java | 4 +- 9 files changed, 230 insertions(+), 69 deletions(-) diff --git a/docs/MoteurDeCalculG4IT_V1.1.adoc b/docs/MoteurDeCalculG4IT_V1.1.adoc index d993a1b9..a529f9cd 100644 --- a/docs/MoteurDeCalculG4IT_V1.1.adoc +++ b/docs/MoteurDeCalculG4IT_V1.1.adoc @@ -424,46 +424,58 @@ Elle est exprimée en années et autorise les décimales. [pseudocode] ---- -Règle RG_DureeVieItem(equipementPhysique,dureeVieItem,methodeDureeUsage) { +Règle RG_DureeVieItem(equipementPhysique) { SI methodeDureeUsage=="REEL" ALORS 'dans le cas où il est possible de calculer l'age réel de l'item, ce dernier fait foi SI equipementPhysique.DateAchat est correcte et renseignée ET equipementPhysique.DateRetrait est correcte et renseignée ALORS - SI (equipementPhysique.DateRetrait - equipementPhysique.DateAchat) < 1 - ALORS RENVOYER (1 + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SI ((equipementPhysique.DateRetrait - equipementPhysique.DateAchat) / 365 + equipementPhysique.dureeUsageAmont + equipementPhysique.dureeUsageAval < 1) + ' si la durée de vie totale de l'équipement est inférieure à 1 an, on la fixe à 1 an car : + ' comme impact = facteurCaracterisation/dureeDeVie, si la dureeDeVie est inférieure à 1, on prendrait + de 100% de l'impact de l'équipement pour sa première année ce qui n'est pas logique + ALORS RENVOYER 1 SINON RENVOYER (((equipementPhysique.DateRetrait - equipementPhysique.DateAchat) / 365) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) 'dans le cas où seul la date d'achat est disponible, la règle du "Pseudo-amortissement" prévaut (impact de 100% sur l'année d'achat, 50% l'année 2, 33% l'année 3, etc... ) SINON SI equipementPhysique.DateAchat est correcte et equipementPhysique.DateRetrait non reseignée - ALORS RENVOYER (((equipementPhysique.DateAchat - date du jour) / 365) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) - + SI ((equipementPhysique.DateRetrait - date du jour) / 365 + equipementPhysique.dureeUsageAmont + equipementPhysique.dureeUsageAval < 1) + ALORS RENVOYER 1 + SINON RENVOYER (((equipementPhysique.DateAchat - date du jour) / 365) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) 'dans les autres cas, une durée de vie moyenne de l'équipement est déduite SINON - RENVOYER (RG_DureeVieEqP_Defaut(equipementPhysique)+ equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SI (RG_DureeVieItem_Defaut(equipementPhysique) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval < 1) + ALORS RENVOYER 1 + SINON RENVOYER (RG_DureeVieItem_Defaut(equipementPhysique) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) FIN SI + 'par défaut, la méthode de calcul de la durée de vie est la méthode "FIXE" SINON 'dans le cas où nous connaissons la durée d'usage interne par défaut, cette dernière fait foi SI equipementPhysique.DureeUsageInterne est renseignée et supérieure à 0 ALORS - SI (equipementPhysique.DureeUsageInterne<1) - ALORS RENVOYER (1 + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SI (equipementPhysique.DureeUsageInterne + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval < 1) + ALORS RENVOYER 1 SINON RENVOYER (equipementPhysique.DureeUsageInterne + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) SINON - RENVOYER (RG_DureeVieEqP_Defaut(equipementPhysique)+ equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SI (RG_DureeVieItem_Defaut(equipementPhysique) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval < 1) + ALORS RENVOYER 1 + SINON RENVOYER (RG_DureeVieItem_Defaut(equipementPhysique) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) FIN SI FIN SI } -Règle RG_DureeVieItem(operationNonIT,dureeVieItem) { +Règle RG_DureeVieItem(operationNonIT) { 'dans le cas où il est possible de calculer l'age réel de l'item, ce dernier fait foi SI operationNonIT.dureeDeVie est correcte et renseignée ALORS - RENVOYER operationNonIT.dureeDeVie + SI operationNonIT.dureeDeVie < 1 + ALORS RENVOYER 1 + SINON RENVOYER operationNonIT.dureeDeVie 'dans les autres cas, une durée de vie moyenne de l'équipement est déduite SINON - RENVOYER RG_DureeVieItem_Defaut(operationNonIT) + SI RG_DureeVieItem_Defaut(operationNonIT) < 1 + ALORS RENVOYER 1 + SINON RENVOYER RG_DureeVieItem_Defaut(operationNonIT) FIN SI } ---- @@ -675,7 +687,7 @@ refEquipementRetenu = RG_correspondanceRefEquipement(nomOrganisation, equipement 'récupération de l'impact pour le critère et l'étape ACV en cours, de la référence de l'équipement retenue x Ref_FacteurCaracterisation(refEquipementretenu, EtapeACV, Critere).valeur - / RG_DureeVieEqP + / RG_DureeVieItem_Defaut(equipementPhysique) 'conso electrique retenue est null ind_ImpactEquipementPhysique.consoElecMoyenne = null @@ -854,7 +866,7 @@ Règle calculIndicateurImpactOperationNonIT(critere, etape, nomOrganisation, OpN / ref_Hypothese.valeur(CAPACITE_LIGNE_FIXE_LOCALISATION) SINON SI OpNIT.categorie = "BATIMENT" - / dureeDeVie + / RG_DureeVieItem_Defaut(operationNonIT) FIN SI SINON SI OpNIT.categorie = "DEPLACEMENT_ELECTRIQUE" OU "DEPLACEMENT_ESSENCE" OU DEPLACEMENT_HYBRIDE diff --git a/docs/Traces.plantuml b/docs/Traces.plantuml index b5242f95..c93a5382 100644 --- a/docs/Traces.plantuml +++ b/docs/Traces.plantuml @@ -69,7 +69,7 @@ class ConsoElecAnMoyenne { } class DureeDeVie { - Double valeur + Double valeurRetenue private String methodeDureeUsage private Double dureeUsageInterne private Double dureeUsageAmont diff --git a/services/.workspace/.idea/modules.xml b/services/.workspace/.idea/modules.xml index b4f71b36..bdb48735 100644 --- a/services/.workspace/.idea/modules.xml +++ b/services/.workspace/.idea/modules.xml @@ -2,7 +2,6 @@ <project version="4"> <component name="ProjectModuleManager"> <modules> - <module fileurl="file://$PROJECT_DIR$/../../e2e/e2e.iml" filepath="$PROJECT_DIR$/../../e2e/e2e.iml" /> </modules> </component> </project> \ No newline at end of file diff --git a/services/.workspace/.idea/saveactions_settings.xml b/services/.workspace/.idea/saveactions_settings.xml index 898dbf85..b1eaeeab 100644 --- a/services/.workspace/.idea/saveactions_settings.xml +++ b/services/.workspace/.idea/saveactions_settings.xml @@ -11,6 +11,7 @@ <option name="configurationPath" value="" /> <option name="exclusions"> <set> + <option value=".*\.adoc" /> <option value=".*\.yaml" /> <option value=".*\.yml" /> </set> diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactOperationNonITService.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactOperationNonITService.java index 41024a34..b78d55ff 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactOperationNonITService.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/CalculImpactOperationNonITService.java @@ -2,9 +2,13 @@ package org.mte.numecoeval.calculs.domain.port.input.service; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactOperationNonIT; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactOperationNonIT; +import org.mte.numecoeval.calculs.domain.data.trace.DureeDeVie; +import org.mte.numecoeval.calculs.domain.exception.CalculImpactException; public interface CalculImpactOperationNonITService { ImpactOperationNonIT calculerImpactOperationNonIT(DemandeCalculImpactOperationNonIT demandeCalcul); + DureeDeVie getDureeVie(DemandeCalculImpactOperationNonIT demandeCalcul) throws CalculImpactException; + } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java index 3ef4e6bf..8390463e 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java @@ -119,7 +119,7 @@ public class CalculImpactOperationNonITServiceImpl implements CalculImpactOperat } MetadataCalcul metadataCalcul = getFormule(demandeCalcul); DureeDeVie dureeDeVie = getDureeVie(demandeCalcul); - Double dureeDeVieValeur = (dureeDeVie.getValeurRetenue() == null) ? dureeDeVie.getDureeDeVieParDefaut().getValeur() : dureeDeVie.getValeurRetenue(); + Double dureeDeVieValeur = dureeDeVie.getValeurRetenue(); Double valeurImpactUnitaire = metadataCalcul.valeurImpactUnitaire() / dureeDeVieValeur; TraceCalculImpactOperationNonIT traceCalculImpactOperationNonIT = metadataCalcul.traceCalculImpactOperationNonIT(); String traceFormuleBase = traceCalculImpactOperationNonIT.getFormule(); @@ -320,33 +320,53 @@ public class CalculImpactOperationNonITServiceImpl implements CalculImpactOperat * * @param demandeCalcul la demande de calcul * @return dureeDeVie - * @throws CalculImpactException + * @throws CalculImpactException sinon */ public DureeDeVie getDureeVie(DemandeCalculImpactOperationNonIT demandeCalcul) throws CalculImpactException { - var refHypotheseOpt = demandeCalcul.getHypotheseFromCode("dureeVieBatimentParDefaut"); + var dureeDeVie = DureeDeVie.builder().build(); - if (demandeCalcul.getOperationNonIT().getDureeDeVie() != null) { - dureeDeVie.setValeurRetenue(demandeCalcul.getOperationNonIT().getDureeDeVie()); + Double dureeInventaire = demandeCalcul.getOperationNonIT().getDureeDeVie(); + if (dureeInventaire != null) { + dureeDeVie.setValeurRetenue(dureeInventaire < 1 ? 1.0 : dureeInventaire); + return dureeDeVie; + } - } else if (demandeCalcul.getTypeItem() != null && demandeCalcul.getTypeItem().getDureeVieDefaut() != null) { - dureeDeVie.setDureeDeVieParDefaut(DureeDeVieParDefaut.builder() - .valeurTypeItemDureeVieDefaut(demandeCalcul.getTypeItem().getDureeVieDefaut()) - .valeur(demandeCalcul.getTypeItem().getDureeVieDefaut()) - .sourceTypeItemDureeVieDefaut(demandeCalcul.getTypeItem().getSource()) - .build()); + // dureeInventaire est null + // recuperation duree de vie via typeItem + if (demandeCalcul.getTypeItem() != null) { + var dureeVieDefaut = demandeCalcul.getTypeItem().getDureeVieDefaut(); + + if (dureeVieDefaut != null) { + Double duree = dureeVieDefaut < 1 ? 1 : dureeVieDefaut; + dureeDeVie.setDureeDeVieParDefaut(DureeDeVieParDefaut.builder() + .valeurTypeItemDureeVieDefaut(duree) + .valeur(duree) + .sourceTypeItemDureeVieDefaut(demandeCalcul.getTypeItem().getSource()) + .build()); + + dureeDeVie.setValeurRetenue(duree); + return dureeDeVie; + } + } + + // dureeInventaire est null + // typeItem est null + // recuperation duree de vie via hypothese 'dureeVieBatimentParDefaut' + var hypothese = demandeCalcul.getHypotheseFromCode("dureeVieBatimentParDefaut") + .orElseThrow(() -> new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée de vie par défaut de l'item n'a pas pu être déterminée")); - } else if (refHypotheseOpt.isPresent() && refHypotheseOpt.get().getValeur() != null) { - ReferentielHypothese hypothese = refHypotheseOpt.get(); + if (hypothese.getValeur() != null) { + Double duree = hypothese.getValeur() < 1 ? 1 : hypothese.getValeur(); dureeDeVie.setDureeDeVieParDefaut(DureeDeVieParDefaut.builder() - .valeurReferentielHypothese(hypothese.getValeur()) + .valeurReferentielHypothese(duree) .sourceReferentielHypothese(hypothese.getSource()) - .valeur(hypothese.getValeur()) + .valeur(duree) .build()); - } else { - throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée de vie par défaut de l'item n'a pas pu être déterminée"); + dureeDeVie.setValeurRetenue(duree); } + return dureeDeVie; } } 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 d690e679..58e22f1d 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 @@ -44,6 +44,7 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe } else { result.setDureeUsageAmont(0.0); } + Double dureeUsageAval = demandeCalcul.getEquipementPhysique().getDureeUsageAval(); if (dureeUsageAval != null) { if (dureeUsageAval < 0) { @@ -62,36 +63,34 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe result.setMethodeDureeUsage("REEL"); var dateAchat = demandeCalcul.getEquipementPhysique().getDateAchat(); var dateRetrait = demandeCalcul.getEquipementPhysique().getDateRetrait(); - if (dateAchat != null && dateRetrait != null) { - if (dateAchat.isBefore(dateRetrait)) { - Double valeur; - if ((double) ChronoUnit.MONTHS.between(dateAchat, dateRetrait) / 12 + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { - result.setValeurRetenue(1.0); - } else { - valeur = ChronoUnit.DAYS.between(dateAchat, dateRetrait) / 365d; - result.setValeurRetenue(result.getValeurRetenue() + valeur); - } - result.setDateAchat(dateAchat.format(DateTimeFormatter.ISO_DATE)); - result.setDateRetrait(dateRetrait.format(DateTimeFormatter.ISO_DATE)); - } else { + + if (dateAchat != null) { + // Si la date d'achat est présente et non la date de retrait, la date du jour devient la date de retrait pour le calcul + var dateRetraitReelle = dateRetrait == null ? LocalDate.now() : dateRetrait; + if (!dateAchat.isBefore(dateRetraitReelle)) { throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée de vie de l'équipement n'a pas pu être déterminée"); } - } - // Taiga#864 - Si la date d'achat est présente et non la date de retrait, on prend la date du jour devient la date de retrait pour le calcul - else if (dateAchat != null) { - result.setValeurRetenue(result.getValeurRetenue() + - ChronoUnit.DAYS.between(dateAchat, LocalDate.now()) / 365d - ); - result.setDateAchat(dateAchat.format(DateTimeFormatter.ISO_DATE)); - result.setDateRetrait(LocalDate.now().format(DateTimeFormatter.ISO_DATE)); - } else { - var dureeDeVieParDefaut = calculerDureeVieDefaut(demandeCalcul); - result.setDureeDeVieParDefaut(dureeDeVieParDefaut); - if (dureeDeVieParDefaut.getValeur() + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + + var dureeAnneeUtilisation = ChronoUnit.DAYS.between(dateAchat, dateRetraitReelle) / 365d; + + if (dureeAnneeUtilisation + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { result.setValeurRetenue(1.0); + } else { + result.setValeurRetenue(result.getValeurRetenue() + dureeAnneeUtilisation); } - result.setValeurRetenue(result.getValeurRetenue() + dureeDeVieParDefaut.getValeur()); + + result.setDateAchat(dateAchat.format(DateTimeFormatter.ISO_DATE)); + result.setDateRetrait(dateRetraitReelle.format(DateTimeFormatter.ISO_DATE)); + return result; } + + // dateAchat et dateRetrait sont null + var dureeDeVieParDefaut = calculerDureeVieDefaut(demandeCalcul); + result.setDureeDeVieParDefaut(dureeDeVieParDefaut); + if (dureeDeVieParDefaut.getValeur() + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + result.setValeurRetenue(1.0); + } + result.setValeurRetenue(result.getValeurRetenue() + dureeDeVieParDefaut.getValeur()); return result; } @@ -109,14 +108,16 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe } else { result.setValeurRetenue(result.getValeurRetenue() + dureeUsageInterne); } + return result; + } + + // dureeUsageInterne est null + var dureeDeVieParDefaut = calculerDureeVieDefaut(demandeCalcul); + result.setDureeDeVieParDefaut(dureeDeVieParDefaut); + if (dureeDeVieParDefaut.getValeur() + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + result.setValeurRetenue(1.0); } else { - var dureeDeVieParDefaut = calculerDureeVieDefaut(demandeCalcul); - result.setDureeDeVieParDefaut(dureeDeVieParDefaut); - if (dureeDeVieParDefaut.getValeur() + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { - result.setValeurRetenue(1.0); - } else { - result.setValeurRetenue(result.getValeurRetenue() + dureeDeVieParDefaut.getValeur()); - } + result.setValeurRetenue(result.getValeurRetenue() + dureeDeVieParDefaut.getValeur()); } return result; } diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java index c6fd52c3..e9340db0 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java @@ -9,6 +9,7 @@ import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactOperationNonIT; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielFacteurCaracterisation; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielHypothese; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielTypeItem; +import org.mte.numecoeval.calculs.domain.exception.CalculImpactException; import org.mte.numecoeval.calculs.domain.port.input.service.CalculImpactOperationNonITService; import org.mte.numecoeval.calculs.domain.port.input.service.impl.CalculImpactOperationNonITServiceImpl; @@ -53,6 +54,127 @@ class CalculImpactOperationNonITServiceTest { } } + /** + * Tests de la fonction getDureeVie() + */ + @Test + void shouldCalculerDureeDeVie_fromInventaire() throws CalculImpactException { + // Given + DemandeCalculImpactOperationNonIT demandeCalcul = createDemande(); + demandeCalcul.getOperationNonIT().setType("Batiment non DC"); + demandeCalcul.getOperationNonIT().setDureeDeVie(2.0); + + // When + var actual = calculImpactOperationNonITService.getDureeVie(demandeCalcul); + + // Then + assertEquals(2.0, actual.getValeurRetenue(), 2.0); + assertNull(actual.getDureeDeVieParDefaut()); + } + + @Test + void shouldCalculerDureeDeVie_fromInventaireInf1() throws CalculImpactException { + // Given + DemandeCalculImpactOperationNonIT demandeCalcul = createDemande(); + demandeCalcul.getOperationNonIT().setType("Batiment non DC"); + demandeCalcul.getOperationNonIT().setDureeDeVie(0.6); + + // When + var actual = calculImpactOperationNonITService.getDureeVie(demandeCalcul); + + // Then + assertEquals(1.0, actual.getValeurRetenue(), 2.0); + } + + @Test + void shouldCalculerDureeDeVie_fromTypeItem() throws JsonProcessingException, CalculImpactException { + // Given + DemandeCalculImpactOperationNonIT demandeCalcul = createDemande(); + demandeCalcul.getOperationNonIT().setType("Batiment non DC"); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "Batiment non DC", + "categorie": "BATIMENT", + "dureeVieDefaut": "3.0", + "refItemParDefaut": "batiment-fr", + "source": "source" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "dureeVieBatimentParDefaut", + "valeur": "10.0", + "source": "sourceDefault" + } + ] + """, ReferentielHypothese[].class))); + // When + var actual = calculImpactOperationNonITService.getDureeVie(demandeCalcul); + + // Then + assertEquals(3.0, actual.getValeurRetenue(), 2.0); + assertEquals(3.0, actual.getDureeDeVieParDefaut().getValeurTypeItemDureeVieDefaut(), 2.0); + assertEquals("source", actual.getDureeDeVieParDefaut().getSourceTypeItemDureeVieDefaut()); + } + + @Test + void shouldCalculerDureeDeVie_fromTypeItemInf1() throws JsonProcessingException, CalculImpactException { + // Given + DemandeCalculImpactOperationNonIT demandeCalcul = createDemande(); + demandeCalcul.getOperationNonIT().setType("Batiment non DC"); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "Batiment non DC", + "categorie": "BATIMENT", + "dureeVieDefaut": "0.6", + "refItemParDefaut": "batiment-fr", + "source": "source" + } + """, ReferentielTypeItem.class)); + // When + var actual = calculImpactOperationNonITService.getDureeVie(demandeCalcul); + + // Then + assertEquals(1.0, actual.getValeurRetenue(), 2.0); + assertEquals(0.6, actual.getDureeDeVieParDefaut().getValeurTypeItemDureeVieDefaut(), 2.0); + assertEquals("source", actual.getDureeDeVieParDefaut().getSourceTypeItemDureeVieDefaut()); + } + + @Test + void shouldCalculerDureeDeVie_fromHypothese() throws JsonProcessingException, CalculImpactException { + // Given + DemandeCalculImpactOperationNonIT demandeCalcul = createDemande(); + demandeCalcul.getOperationNonIT().setType("Batiment non DC"); + + demandeCalcul.setTypeItem(objectMapper.readValue(""" + { + "type": "Batiment non DC", + "categorie": "BATIMENT", + "refItemParDefaut": "batiment-fr", + "source": "source" + } + """, ReferentielTypeItem.class)); + demandeCalcul.setHypotheses(List.of(objectMapper.readValue(""" + [ + { + "code": "dureeVieBatimentParDefaut", + "valeur": "10.0", + "source": "sourceDefault" + } + ] + """, ReferentielHypothese[].class))); + // When + var actual = calculImpactOperationNonITService.getDureeVie(demandeCalcul); + + // Then + assertEquals(10.0, actual.getValeurRetenue(), 2.0); + assertEquals(10.0, actual.getDureeDeVieParDefaut().getValeurReferentielHypothese(), 2.0); + assertEquals("sourceDefault", actual.getDureeDeVieParDefaut().getSourceReferentielHypothese()); + } + /** * Tests de la fonction getFormuleDefaut() */ @@ -678,7 +800,8 @@ class CalculImpactOperationNonITServiceTest { "sourceTypeItemDureeVieDefaut" : "sourceDefault", "valeur" : 30.0, "valeurTypeItemDureeVieDefaut" : 30.0 - } + }, + "valeurRetenue" : 30.0 }, "formule" : "ImpactOperationNonIT = (Quantité(1.0) * ReferentielFacteurCaracterisation(0.1)) / DureeDeVie(30.0)", "valeurReferentielFacteurCaracterisation" : 0.1 @@ -736,7 +859,8 @@ class CalculImpactOperationNonITServiceTest { "sourceReferentielHypothese" : "sourceDefault", "valeur" : 50.0, "valeurReferentielHypothese" : 50.0 - } + }, + "valeurRetenue" : 50.0 }, "formule" : "ImpactOperationNonIT = (Quantité(1.0) * ReferentielFacteurCaracterisation(0.1)) / DureeDeVie(50.0)", "valeurReferentielFacteurCaracterisation" : 0.1 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 e92e8cc7..60969a2a 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 @@ -105,7 +105,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { @Test void taiga864_whenEquipementPhysiqueDateRetraitIsNullShouldUseCurrentDayAsDateRetrait() throws Exception { //Given - LocalDate dateAchat = LocalDate.now().minusDays(30); + LocalDate dateAchat = LocalDate.now().minusDays(370); var equipement = EquipementPhysique.builder() .dateAchat(dateAchat) .dateRetrait(null) @@ -118,7 +118,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { .build(); //When var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); - var expected = 30 / 365d; + var expected = 370 / 365d; //Then assertEquals(expected, actual.getValeurRetenue()); assertEquals(dateAchat.format(DateTimeFormatter.ISO_DATE), actual.getDateAchat()); -- GitLab