diff --git a/docs/MoteurDeCalculG4IT_V1.1.adoc b/docs/MoteurDeCalculG4IT_V1.1.adoc index d993a1b931b412f85cbf165b4e930a9a5f3adb9b..a529f9cded3f9e22a37b086f02d51887d58b6040 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 b5242f95d7b3a696ba624b9b080c0470e9fba154..c93a538230b5865aa6b33bae3c5dab8835e3e027 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 b4f71b368614e1b88ac4fdfbdd5ea72860dd5bb4..bdb487351f4aba3d5223de9577c0844150a2daab 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 898dbf8532d66ffc2f4694b0f05eb607626ebe1d..b1eaeeab18d419ba2edb687ca7b8b0943d6b3cee 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 41024a3465b453ab5607b4b044f7e45ebb507052..b78d55ffeee5ca2d1b9b69690dc47b51c0ae5ad0 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 3ef4e6bf777a1a5a6248a49845b9666151439939..8390463ed6dff00641f10cb1221469fd4217e942 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 d690e679fb6d9b67e0a694d0b1a0b31dbcbef943..58e22f1d5c6f3f35de8e51456331ddb27debeb86 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 c6fd52c3fa46095808606ac342a0083eed1a5cb9..e9340db028c3166bec2728721e8cece2ed24ae7c 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 e92e8cc7843d68ce3de9c2e98450d5bfb5806764..60969a2a1d764cb040409b99d68d32816f9c0a9c 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());