From f7290d960b77101dc6811027bb5d9d16925ccc56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20GAVIGNET?= Date: Tue, 28 Jan 2025 14:27:30 +0100 Subject: [PATCH] feat: Add preprocessing for epaisseur_structure on mur --- index.d.ts | 12 +- index.js | 3 + src/core/utils.js | 13 + src/core/utils.spec.js | 16 + src/dpe/domain/models/baie-ets.model.ts | 12 + src/dpe/domain/models/baie-vitree.model.ts | 95 + src/dpe/domain/models/climatisation.model.ts | 25 + src/dpe/domain/models/dpe.model.ts | 183 ++ src/dpe/domain/models/ets.model.ts | 20 + .../models/installation-chauffage.model.ts | 105 + .../domain/models/installation-ecs.model.ts | 78 + src/dpe/domain/models/mur.model.ts | 37 + src/dpe/domain/models/plancher-bas.model.ts | 38 + src/dpe/domain/models/plancher-haut.model.ts | 33 + src/dpe/domain/models/pont-thermique.model.ts | 21 + src/dpe/domain/models/porte.model.ts | 31 + .../models/production-elec-enr.model.ts | 27 + src/dpe/domain/models/sortie.model.ts | 178 ++ src/dpe/domain/models/ventilation.model.ts | 26 + .../domain/murs/pre-process-murs.service.js | 49 + .../murs/pre-process-murs.service.spec.js | 63 + src/dpe/infrastructure/dpe-element.store.js | 13 + .../infrastructure/dpe-element.store.spec.js | 13 + src/dpe/infrastructure/dpe.store.js | 25 + src/dpe/infrastructure/dpe.store.spec.js | 18 + src/dpe/infrastructure/murs/murs.store.js | 26 + .../infrastructure/murs/murs.store.spec.js | 18 + src/index.js | 1 + .../infrastructure/pre-process-dpe.store.js | 24 + .../pre-process-dpe.store.spec.js | 17 + tests/fixtures/dpe/dpe.fixture.js | 2206 +++++++++++++++++ .../errors/enveloppe.error.fixture.js | 17 + .../errors/ventilation.error.fixture.js | 18 + types.d.ts | 551 ---- 34 files changed, 3454 insertions(+), 558 deletions(-) create mode 100644 src/core/utils.js create mode 100644 src/core/utils.spec.js create mode 100644 src/dpe/domain/models/baie-ets.model.ts create mode 100644 src/dpe/domain/models/baie-vitree.model.ts create mode 100644 src/dpe/domain/models/climatisation.model.ts create mode 100644 src/dpe/domain/models/dpe.model.ts create mode 100644 src/dpe/domain/models/ets.model.ts create mode 100644 src/dpe/domain/models/installation-chauffage.model.ts create mode 100644 src/dpe/domain/models/installation-ecs.model.ts create mode 100644 src/dpe/domain/models/mur.model.ts create mode 100644 src/dpe/domain/models/plancher-bas.model.ts create mode 100644 src/dpe/domain/models/plancher-haut.model.ts create mode 100644 src/dpe/domain/models/pont-thermique.model.ts create mode 100644 src/dpe/domain/models/porte.model.ts create mode 100644 src/dpe/domain/models/production-elec-enr.model.ts create mode 100644 src/dpe/domain/models/sortie.model.ts create mode 100644 src/dpe/domain/models/ventilation.model.ts create mode 100644 src/dpe/domain/murs/pre-process-murs.service.js create mode 100644 src/dpe/domain/murs/pre-process-murs.service.spec.js create mode 100644 src/dpe/infrastructure/dpe-element.store.js create mode 100644 src/dpe/infrastructure/dpe-element.store.spec.js create mode 100644 src/dpe/infrastructure/dpe.store.js create mode 100644 src/dpe/infrastructure/dpe.store.spec.js create mode 100644 src/dpe/infrastructure/murs/murs.store.js create mode 100644 src/dpe/infrastructure/murs/murs.store.spec.js create mode 100644 src/process/infrastructure/pre-process-dpe.store.js create mode 100644 src/process/infrastructure/pre-process-dpe.store.spec.js create mode 100644 tests/fixtures/dpe/dpe.fixture.js create mode 100644 tests/fixtures/errors/enveloppe.error.fixture.js create mode 100644 tests/fixtures/errors/ventilation.error.fixture.js delete mode 100644 types.d.ts diff --git a/index.d.ts b/index.d.ts index 8c14dcc..1665faa 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,11 +1,9 @@ -declare namespace DpeValidator { - class DpeValidator { - validate(dpe: FullDpe): ValidationError[]; - } +import { Dpe } from './src/dpe/domain/models/dpe.model'; - class DpeComparator { - compare(firstDpe: FullDpe, secondDpe: FullDpe): ValidationError[]; +declare namespace DpePreProcessor { + class DpePreProcessor { + preprocess(dpe: Dpe): void; } } -export = DpeValidator; +export = DpePreProcessor; diff --git a/index.js b/index.js index e69de29..deb7bac 100644 --- a/index.js +++ b/index.js @@ -0,0 +1,3 @@ +import { DpePreProcessor } from './src/index.js'; + +export { DpePreProcessor }; diff --git a/src/core/utils.js b/src/core/utils.js new file mode 100644 index 0000000..032ca38 --- /dev/null +++ b/src/core/utils.js @@ -0,0 +1,13 @@ +/** + * Retrieve a number describing a thickness from the description + * @param description string in which to get the number + * @returns {number} if found, 0 otherwise + */ +export function getThicknessFromDescription(description) { + if (!description) { + return 0; + } + + const matching = description.match(/(\d+) cm/); + return matching && matching.length > 1 ? Number.parseFloat(matching[1]) : 0; +} diff --git a/src/core/utils.spec.js b/src/core/utils.spec.js new file mode 100644 index 0000000..8e557f5 --- /dev/null +++ b/src/core/utils.spec.js @@ -0,0 +1,16 @@ +import { getThicknessFromDescription } from './utils.js'; +import { describe, expect, it } from 'vitest'; + +describe('Utils unit tests', () => { + it.each([ + [0, null], + [0, undefined], + [0, ''], + [0, 'Mur en blocs de béton creux'], + [0, "Mur en blocs de béton creux d'épaisseur xxx cm non isolé"], + [4, "Mur en blocs de béton creux d'épaisseur 4 cm non isolé"], + [25, "Mur en blocs de béton creux d'''épaisseur ≥ 25 cm non isolé"] + ])('should get thickness %s from description %s', (thickness, description) => { + expect(getThicknessFromDescription(description)).toBe(thickness); + }); +}); diff --git a/src/dpe/domain/models/baie-ets.model.ts b/src/dpe/domain/models/baie-ets.model.ts new file mode 100644 index 0000000..57cb69d --- /dev/null +++ b/src/dpe/domain/models/baie-ets.model.ts @@ -0,0 +1,12 @@ +export interface BaieEts { + donnee_entree?: BaieEtsDE; +} + +export interface BaieEtsDE { + description?: string; + reference?: string; + enum_orientation_id?: number; + enum_inclinaison_vitrage_id?: number; // ENUM inclinaison_vitrage + surface_totale_baie?: number; + nb_baie?: number; +} diff --git a/src/dpe/domain/models/baie-vitree.model.ts b/src/dpe/domain/models/baie-vitree.model.ts new file mode 100644 index 0000000..5dc7dc2 --- /dev/null +++ b/src/dpe/domain/models/baie-vitree.model.ts @@ -0,0 +1,95 @@ +export interface BaieVitree { + donnee_entree?: BaieVitreeDE; + donnee_intermediaire?: BaieVitreeDI; + baie_vitree_double_fenetre?: BaieVitreeDoubleFenetre; +} + +export interface BaieVitreeDE { + description?: string; + reference?: string; + reference_paroi?: string; + reference_lnc?: string; + tv_coef_reduction_deperdition_id?: string; // TV + surface_aiu?: number; + surface_aue?: number; + enum_cfg_isolation_lnc_id?: string; // ENUM cfg_isolation_lnc + enum_type_adjacence_id?: string; // ENUM type_adjacence + surface_totale_baie?: number; + nb_baie?: number; + tv_ug_id?: string; // TV + enum_type_vitrage_id?: string; // ENUM type_vitrage + enum_inclinaison_vitrage_id?: string; // ENUM inclinaison_vitrage + enum_type_gaz_lame_id?: string; // ENUM type_gaz_lame + epaisseur_lame?: number; + vitrage_vir?: boolean; + enum_methode_saisie_perf_vitrage_id?: string; // ENUM methode_saisie_perf_vitrage + ug_saisi?: number; + tv_uw_id?: string; + enum_type_materiaux_menuiserie_id?: string; // ENUM type_materiaux_menuiserie + enum_type_baie_id?: string; // ENUM type_baie + uw_saisi?: number; + double_fenetre?: boolean; + uw_1?: number; + sw_1?: number; + uw_2?: number; + sw_2?: number; + tv_deltar_id?: string; + tv_ujn_id?: string; + enum_type_fermeture_id?: string; + presence_protection_solaire_hors_fermeture?: boolean; + ujn_saisi?: number; + presence_retour_isolation?: boolean; + presence_joint?: boolean; + largeur_dormant?: number; + tv_sw_id?: string; + sw_saisi?: number; + enum_type_pose_id?: string; // ENUM type_pose + enum_orientation_id?: string; + tv_coef_masque_proche_id?: string; + tv_coef_masque_lointain_homogene_id?: string; + masque_lointain_non_homogene_collection: { + masque_lointain_non_homogene: { + tv_coef_masque_lointain_non_homogene_id?: string; // TV + }; + }[]; +} + +export interface BaieVitreeDI { + b: number; + ug?: number; + uw: number; + ujn?: number; + u_menuiserie: number; + sw: number; + fe1: number; + fe2: number; +} + +export interface BaieVitreeDoubleFenetre { + donnee_entree?: BaieVitreeDoubleFenetreDE; + donnee_intermediaire?: BaieVitreeDoubleFenetreDI; +} + +export interface BaieVitreeDoubleFenetreDE { + tv_ug_id?: string; + enum_type_vitrage_id: string; + enum_inclinaison_vitrage_id: string; + enum_type_gaz_lame_id?: string; + epaisseur_lame?: number; + vitrage_vir?: boolean; + enum_methode_saisie_perf_vitrage_id: string; + ug_saisi?: number; + tv_uw_id?: string; + enum_type_materiaux_menuiserie_id: string; + enum_type_baie_id: string; + uw_saisi?: number; + tv_sw_id?: string; + sw_saisi?: number; + enum_type_pose_id: string; +} + +export interface BaieVitreeDoubleFenetreDI { + ug?: number; + uw: number; + sw: number; +} diff --git a/src/dpe/domain/models/climatisation.model.ts b/src/dpe/domain/models/climatisation.model.ts new file mode 100644 index 0000000..3058893 --- /dev/null +++ b/src/dpe/domain/models/climatisation.model.ts @@ -0,0 +1,25 @@ +export interface Climatisation { + donnee_entree?: ClimatisationDE; + donnee_intermediaire?: ClimatisationDI; +} + +export interface ClimatisationDE { + description?: string; + reference: string; + tv_seer_id?: number; + nombre_logement_echantillon?: number; + enum_methode_calcul_conso_id: number; + enum_periode_installation_fr_id: number; + cle_repartition_clim?: number; + enum_type_generateur_fr_id: number; + enum_type_energie_id?: number; + enum_methode_saisie_carac_sys_id: number; + ref_produit_fr?: string; +} + +export interface ClimatisationDI { + eer: number; + besoin_fr: number; + conso_fr: number; + conso_fr_depensier: number; +} diff --git a/src/dpe/domain/models/dpe.model.ts b/src/dpe/domain/models/dpe.model.ts new file mode 100644 index 0000000..f9bf343 --- /dev/null +++ b/src/dpe/domain/models/dpe.model.ts @@ -0,0 +1,183 @@ +import { Mur } from './mur.model'; +import { Porte } from './porte.model'; +import { PlancherBas } from './plancher-bas.model'; +import { PlancherHaut } from './plancher-haut.model'; +import { BaieVitree } from './baie-vitree.model'; +import { Ets } from './ets.model'; +import { PontThermique } from './pont-thermique.model'; +import { Ventilation } from './ventilation.model'; +import { Climatisation } from './climatisation.model'; +import { ProductionElecEnr } from './production-elec-enr.model'; +import { InstallationEcs } from './installation-ecs.model'; +import { InstallationChauffage } from './installation-chauffage.model'; +import { Sortie } from './sortie.model'; + +/** + * @see https://gitlab.com/observatoire-dpe/observatoire-dpe/-/blob/master/modele_donnee/DPE_complet.xsd?ref_type=heads + */ +export interface Dpe { + hashkey: string; + id: string; + version: string; + numero_dpe: string; + statut: string; + administratif: Administratif; + dpe_immeuble?: DpeImmeuble; + logement?: Logement; + tertiaire?: Tertiaire; + logement_neuf?: LogementNeuf; + descriptif_enr_collection: any; // Pas traité pour l'instant + descriptif_simplifie_collection: any; // Pas traité pour l'instant + fiche_technique_collection: any; // Pas traité pour l'instant + justificatif_collection: any; // Pas traité pour l'instant + descriptif_geste_entretien_collection: any; // Pas traité pour l'instant + descriptif_travaux: any; // Pas traité pour l'instant +} + +export interface Administratif { + dpe_a_remplacer?: string; + reference_interne_projet?: string; + motif_remplacement?: string; + dpe_immeuble_associe?: string; + enum_version_id: string; + date_visite_diagnostiqueur: string; + nom_proprietaire?: string; + siren_proprietaire?: string; + nom_proprietaire_installation_commune?: string; + date_etablissement_dpe: string; + enum_modele_dpe_id: string; + diagnostiqueur: Diagnostiqueur; + geolocalisation: Geolocalisation; + consentement_proprietaire?: boolean; + information_consentement_proprietaire?: InformationConsentementProprietaire; +} + +export interface Diagnostiqueur { + usr_logiciel_id: string; + version_logiciel: string; + version_moteur_calcul?: string; + nom_diagnostiqueur: string; + prenom_diagnostiqueur: string; + mail_diagnostiqueur: string; + telephone_diagnostiqueur: string; + adresse_diagnostiqueur: string; + entreprise_diagnostiqueur: string; + numero_certification_diagnostiqueur: string; + organisme_certificateur: string; +} + +export interface DpeImmeuble { + logement_visite_collection: LogementVisite[]; +} + +export interface LogementVisite { + description: string; + enum_position_etage_logement_id: string; + enum_typologie_logement_id: string; + surface_habitable_logement: number; +} + +export interface Geolocalisation { + invar_logement?: string; + numero_fiscal_local?: string; + id_batiment_rnb?: string; + rpls_log_id?: string; + rpls_org_id?: string; + idpar?: string; + immatriculation_copropriete?: string; + adresses?: { + adresse_bien: Adresse; + adresse_proprietaire: Adresse; + adresse_proprietaire_installation_commune: Adresse; + }; +} + +export interface Adresse { + adresse_brut: string; + code_postal_brut: string; + nom_commune_brut: string; + label_brut: string; + label_brut_avec_complement: string; + enum_statut_geocodage_ban_id: string; + ban_date_appel: string; + ban_id?: string; + ban_id_ban_adresse?: string; + ban_label?: string; + ban_housenumber?: string; + ban_street?: string; + ban_citycode?: string; + ban_postcode?: string; + ban_city?: string; + ban_type?: string; + ban_score?: string; + ban_x?: string; + compl_nom_residence?: string; + compl_ref_batiment?: string; + compl_etage_appartement?: string; + compl_ref_cage_escalier?: string; + compl_ref_logement?: string; +} + +export interface InformationConsentementProprietaire { + nom_proprietaire: string; + personne_morale: boolean; + siren_proprietaire?: string; + telephone?: string; + mail?: string; + label_adresse: string; + label_adresse_avec_complement: string; +} + +export interface CaracteristiqueGenerale { + annee_construction?: number; + enum_periode_construction_id: number; + enum_methode_application_dpe_log_id: number; + enum_calcul_echantillonnage_id?: number; + surface_habitable_logement?: number; + nombre_niveau_immeuble?: number; + nombre_niveau_logement?: number; + hsp: number; + surface_habitable_immeuble?: number; + surface_tertiaire_immeuble?: number; + nombre_appartement?: number; + appartement_non_visite: boolean; +} + +export interface Meteo { + enum_zone_climatique_id?: number; + altitude: number; + enum_classe_altitude_id: number; + batiment_materiaux_anciens: boolean; +} + +export interface Logement { + caracteristique_generale: CaracteristiqueGenerale; + meteo: Meteo; + enveloppe: Enveloppe; + ventilation_collection: { ventilation: Ventilation[] }; + climatisation_collection: { climatisation: Climatisation[] }; + production_elec_enr?: ProductionElecEnr; + installation_ecs_collection: { installation_ecs: InstallationEcs[] }; + installation_chauffage_collection: { installation_chauffage: InstallationChauffage[] }; + sortie: Sortie; +} + +export interface Tertiaire extends Logement {} + +export interface LogementNeuf extends Logement {} + +export interface Enveloppe { + inertie: { + inertie_plancher_bas_lourd: boolean; + inertie_plancher_haut_lourd: boolean; + inertie_paroi_verticale_lourd: boolean; + enum_classe_inertie_id: number; + }; + mur_collection: { mur: Mur[] }; + plancher_bas_collection: { plancher_bas: PlancherBas[] }; + plancher_haut_collection: { plancher_haut: PlancherHaut[] }; + baie_vitree_collection: { baie_vitree: BaieVitree[] }; + porte_collection: { porte: Porte[] }; + ets_collection: { ets: Ets }; + pont_thermique_collection: { pont_thermique: PontThermique[] }; +} diff --git a/src/dpe/domain/models/ets.model.ts b/src/dpe/domain/models/ets.model.ts new file mode 100644 index 0000000..8fd4d58 --- /dev/null +++ b/src/dpe/domain/models/ets.model.ts @@ -0,0 +1,20 @@ +import { BaieEts } from './baie-ets.model'; + +export interface Ets { + donnee_entree?: EtsDE; + donnee_intermediaire?: EtsDI; + baie_ets_collection?: { baie_ets: BaieEts[] }; +} + +export interface EtsDE { + description?: string; + reference: string; + tv_coef_reduction_deperdition_id?: number; // TV + enum_cfg_isolation_lnc_id?: number; // ENUM cfg_isolation_lnc + tv_coef_transparence_ets_id: number; // TV +} + +export interface EtsDI { + coef_transparence_ets: number; + bver: number; +} diff --git a/src/dpe/domain/models/installation-chauffage.model.ts b/src/dpe/domain/models/installation-chauffage.model.ts new file mode 100644 index 0000000..c6f4dd6 --- /dev/null +++ b/src/dpe/domain/models/installation-chauffage.model.ts @@ -0,0 +1,105 @@ +export interface InstallationChauffage { + donnee_entree?: InstallationChauffageDE; + donnee_intermediaire?: InstallationChauffageDI; + emetteur_chauffage_collection?: { emetteur_chauffage: EmetteurChauffage[] }; + generateur_chauffage_collection?: { generateur_chauffage: GenerateurChauffage[] }; +} + +export interface InstallationChauffageDE { + description?: string; + reference: string; + surface_chauffee: number; + nombre_logement_echantillon?: number; + rdim: number; + nombre_niveau_installation_ch: number; + enum_cfg_installation_ch_id: number; + ratio_virtualisation?: number; + coef_ifc?: number; + cle_repartition_ch?: number; + enum_type_installation_id: number; + enum_methode_calcul_conso_id: number; + enum_methode_saisie_fact_couv_sol_id?: number; + tv_facteur_couverture_solaire_id?: number; + fch_saisi?: number; +} + +export interface InstallationChauffageDI { + besoin_ch: number; + besoin_ch_depensier: number; + production_ch_solaire?: number; + fch?: number; + conso_ch: number; + conso_ch_depensier: number; +} + +export interface EmetteurChauffage { + donnee_entree?: EmetteurChauffageDE; + donnee_intermediaire?: EmetteurChauffageDI; +} + +export interface EmetteurChauffageDE { + description?: string; + reference: string; + surface_chauffee: number; + tv_rendement_emission_id: number; + tv_rendement_distribution_ch_id: number; + tv_rendement_regulation_id: number; + enum_type_emission_distribution_id: number; + tv_intermittence_id: number; + reseau_distribution_isole?: boolean; + enum_equipement_intermittence_id: number; + enum_type_regulation_id: number; + enum_periode_installation_emetteur_id?: number; + enum_type_chauffage_id: number; + enum_temp_distribution_ch_id: number; + enum_lien_generateur_emetteur_id: number; +} + +export interface EmetteurChauffageDI { + i0: number; + rendement_emission: number; + rendement_distribution: number; + rendement_regulation: number; +} + +export interface GenerateurChauffage { + donnee_entree?: GenerateurChauffageDE; + donnee_intermediaire?: GenerateurChauffageDI; +} + +export interface GenerateurChauffageDE { + description?: string; + reference: string; + reference_generateur_mixte?: number; + ref_produit_generateur_ch?: number; + enum_type_generateur_ch_id: number; + enum_usage_generateur_id: number; + enum_type_energie_id: number; + position_volume_chauffe: boolean; + tv_rendement_generation_id?: number; + tv_scop_id?: number; + tv_temp_fonc_100_id?: number; + tv_temp_fonc_30_id?: number; + tv_generateur_combustion_id?: number; + tv_reseau_chaleur_id?: number; + identifiant_reseau_chaleur?: string; + date_arrete_reseau_chaleur?: string; + priorite_generateur_cascade?: number; + presence_ventouse?: boolean; + presence_regulation_combustion?: boolean; + enum_methode_saisie_carac_sys_id: number; + enum_lien_generateur_emetteur_id: number; +} + +export interface GenerateurChauffageDI { + scop?: number; + pn?: number; + qp0?: number; + pveilleuse?: number; + temp_fonc_30?: number; + temp_fonc_100?: number; + rpn?: number; + rpint?: number; + conso_ch: number; + conso_ch_depensier: number; +} diff --git a/src/dpe/domain/models/installation-ecs.model.ts b/src/dpe/domain/models/installation-ecs.model.ts new file mode 100644 index 0000000..5692233 --- /dev/null +++ b/src/dpe/domain/models/installation-ecs.model.ts @@ -0,0 +1,78 @@ +export interface InstallationEcs { + donnee_entree?: InstallationEcsDE; + donnee_intermediaire?: InstallationEcsDI; + generateur_ecs_collection?: { generateur_ecs: GenerateurEcs[] }; +} + +export interface InstallationEcsDE { + description?: string; + reference: string; + enum_cfg_installation_ecs_id: number; + enum_type_installation_id: number; + enum_methode_calcul_conso_id: number; + ratio_virtualisation?: number; + cle_repartition_ecs?: number; + surface_habitable: number; + nombre_logement: number; + rdim: number; + nombre_niveau_installation_ecs: number; + fecs_saisi?: number; + tv_facteur_couverture_solaire_id?: number; + enum_methode_saisie_fact_couv_sol_id?: number; + enum_type_installation_solaire_id?: number; + tv_rendement_distribution_ecs_id: number; + enum_bouclage_reseau_ecs_id: number; + reseau_distribution_isole: boolean; +} + +export interface InstallationEcsDI { + rendement_distribution: number; + besoin_ecs: number; + besoin_ecs_depensier: number; + fecs?: number; + production_ecs_solaire?: number; + conso_ecs: number; + conso_ecs_depensier: number; +} + +export interface GenerateurEcs { + donnee_entree?: GenerateurEcsDE; + donnee_intermediaire?: GenerateurEcsDI; +} + +export interface GenerateurEcsDE { + description?: string; + reference: string; + reference_generateur_mixte?: string; + enum_type_generateur_ecs_id: number; + ref_produit_generateur_ecs?: string; + enum_usage_generateur_id: number; + enum_type_energie_id: number; + tv_generateur_combustion_id?: number; + enum_methode_saisie_carac_sys_id: number; + tv_pertes_stockage_id?: number; + tv_scop_id?: number; + enum_periode_installation_ecs_thermo_id?: number; + identifiant_reseau_chaleur?: string; + date_arrete_reseau_chaleur?: string; + tv_reseau_chaleur_id?: number; + enum_type_stockage_ecs_id: number; + position_volume_chauffe: boolean; + position_volume_chauffe_stockage?: boolean; + volume_stockage: number; + presence_ventouse?: boolean; +} + +export interface GenerateurEcsDI { + pn?: number; + qp0?: number; + pveilleuse?: number; + rpn?: number; + cop?: number; + ratio_besoin_ecs: number; + rendement_generation?: number; + rendement_generation_stockage?: number; + conso_ecs: number; + conso_ecs_depensier: number; + rendement_stockage?: number; +} diff --git a/src/dpe/domain/models/mur.model.ts b/src/dpe/domain/models/mur.model.ts new file mode 100644 index 0000000..97ac536 --- /dev/null +++ b/src/dpe/domain/models/mur.model.ts @@ -0,0 +1,37 @@ +export interface Mur { + donnee_entree?: MurDE; + donnee_intermediaire?: MurDI; +} + +export interface MurDE { + description?: string; + reference?: string; + reference_lnc?: string; + tv_coef_reduction_deperdition_id?: number; // TV + surface_aiu?: number; + surface_aue?: number; + enum_cfg_isolation_lnc_id?: number; // ENUM cfg_isolation_lnc + enum_type_adjacence_id?: number; // ENUM type_adjacence + enum_orientation_id?: number; // ENUM orientation + surface_paroi_totale?: number; + umur0_saisi?: number; + tv_umur0_id?: number; // TV + epaisseur_structure?: number; + enum_materiaux_structure_mur_id?: number; // ENUM materiaux_structure_mur + enum_methode_saisie_u0_id?: number; // ENUM methode_saisie_u0 + enduit_isolant_paroi_ancienne?: boolean; + umur_saisi?: number; + enum_type_doublage_id?: number; // ENUM type_doublage + enum_type_isolation_id?: number; // ENUM type_isolation + enum_periode_isolation_id?: number; // ENUM periode_isolation + resistance_isolation?: number; + epaisseur_isolation?: number; + tv_umur_id?: number; // TV + enum_methode_saisie_u_id?: number; // ENUM methode_saisie_u +} + +export interface MurDI { + umur: number; + umur0: number; + b: number; +} diff --git a/src/dpe/domain/models/plancher-bas.model.ts b/src/dpe/domain/models/plancher-bas.model.ts new file mode 100644 index 0000000..cd057d2 --- /dev/null +++ b/src/dpe/domain/models/plancher-bas.model.ts @@ -0,0 +1,38 @@ +export interface PlancherBas { + donnee_entree?: PlancherBasDE; + donnee_intermediaire?: PlancherBasDI; +} + +export interface PlancherBasDE { + description?: string; + reference?: string; + reference_lnc?: string; + tv_coef_reduction_deperdition_id?: string; // TV + surface_aiu?: number; + surface_aue?: number; + enum_cfg_isolation_lnc_id?: string; // ENUM cfg_isolation_lnc + enum_type_adjacence_id?: string; // ENUM type_adjacence + surface_paroi_opaque?: number; + upb0_saisi?: number; + tv_upb0_id?: string; // TV + enum_type_plancher_bas_id?: string; // ENUM type_plancher_bas + enum_methode_saisie_u0_id?: string; // ENUM methode_saisie_u0 + upb_saisi?: number; + enum_type_isolation_id?: string; // ENUM type_isolation + enum_periode_isolation_id?: string; // ENUM periode_isolation + resistance_isolation?: number; + epaisseur_isolation?: number; + tv_upb_id?: string; // TV + enum_methode_saisie_u_id?: string; // ENUM methode_saisie_u + calcul_ue: number; + perimetre_ue?: number; + surface_ue?: number; + ue?: number; +} + +export interface PlancherBasDI { + upb: number; + upb0: number; + upb_final: number; + b: number; +} diff --git a/src/dpe/domain/models/plancher-haut.model.ts b/src/dpe/domain/models/plancher-haut.model.ts new file mode 100644 index 0000000..8351d16 --- /dev/null +++ b/src/dpe/domain/models/plancher-haut.model.ts @@ -0,0 +1,33 @@ +export interface PlancherHaut { + donnee_entree?: PlancherHautDE; + donnee_intermediaire?: PlancherHautDI; +} + +export interface PlancherHautDE { + description?: string; + reference?: string; + reference_lnc?: string; + tv_coef_reduction_deperdition_id?: string; // TV + surface_aiu?: number; + surface_aue?: number; + enum_cfg_isolation_lnc_id?: string; // ENUM cfg_isolation_lnc + enum_type_adjacence_id?: string; // ENUM type_adjacence + surface_paroi_opaque?: number; + uph0_saisi?: number; + tv_uph0_id?: string; // TV + enum_type_plancher_haut_id?: string; // ENUM type_plancher_bas + enum_methode_saisie_u0_id?: string; // ENUM methode_saisie_u0 + uph_saisi?: number; + enum_type_isolation_id?: string; // ENUM type_isolation + enum_periode_isolation_id?: string; // ENUM periode_isolation + resistance_isolation?: number; + epaisseur_isolation?: number; + tv_uph_id?: string; // TV + enum_methode_saisie_u_id?: string; // ENUM methode_saisie_u +} + +export interface PlancherHautDI { + uph: number; + uph0: number; + b: number; +} diff --git a/src/dpe/domain/models/pont-thermique.model.ts b/src/dpe/domain/models/pont-thermique.model.ts new file mode 100644 index 0000000..6c16107 --- /dev/null +++ b/src/dpe/domain/models/pont-thermique.model.ts @@ -0,0 +1,21 @@ +export interface PontThermique { + donnee_entree?: PontThermiqueDE; + donnee_intermediaire?: PontThermiqueDI; +} + +export interface PontThermiqueDE { + description?: string; + reference: string; + reference_1?: string; + reference_2?: string; + tv_pont_thermique_id?: number; // TV + pourcentage_valeur_pont_thermique: number; + l: number; + enum_methode_saisie_pont_thermique_id: number; // ENUM methode_saisie_pont_thermique + enum_type_liaison_id: number; // ENUM type_liaison + k_saisi?: number; +} + +export interface PontThermiqueDI { + k: number; +} diff --git a/src/dpe/domain/models/porte.model.ts b/src/dpe/domain/models/porte.model.ts new file mode 100644 index 0000000..7285ae3 --- /dev/null +++ b/src/dpe/domain/models/porte.model.ts @@ -0,0 +1,31 @@ +export interface Porte { + donnee_entree?: PorteDE; + donnee_intermediaire?: PorteDI; +} + +export interface PorteDE { + description?: string; + reference?: string; + reference_paroi?: string; + reference_lnc?: string; + enum_cfg_isolation_lnc_id?: number; // ENUM cfg_isolation_lnc + enum_type_adjacence_id?: number; // ENUM type_adjacence + tv_coef_reduction_deperdition_id?: number; // TV + surface_aiu?: number; + surface_aue?: number; + surface_porte?: number; + tv_uporte_id?: number; // TV + enum_methode_saisie_uporte_id?: number; // ENUM methode_saisie_uporte + enum_type_porte_id?: number; // ENUM type_porte + uporte_saisi?: number; + nb_porte?: number; + largeur_dormant?: number; + presence_retour_isolation?: boolean; + presence_joint?: boolean; + enum_type_pose_id?: number; // ENUM type_pose +} + +export interface PorteDI { + uporte: number; + b: number; +} diff --git a/src/dpe/domain/models/production-elec-enr.model.ts b/src/dpe/domain/models/production-elec-enr.model.ts new file mode 100644 index 0000000..b4a6722 --- /dev/null +++ b/src/dpe/domain/models/production-elec-enr.model.ts @@ -0,0 +1,27 @@ +export interface ProductionElecEnr { + donnee_entree?: ProductionElecEnrDE; + donnee_intermediaire?: ProductionElecEnrDI; + panneaux_pv_collection?: PanneauFv[]; +} + +export interface ProductionElecEnrDE { + description?: string; + reference: string; + presence_production_pv: boolean; + enum_type_enr_id: number; +} + +export interface ProductionElecEnrDI { + taux_autoproduction?: number; + production_pv: number; + conso_elec_ac: number; +} + +export interface PanneauFv { + surface_totale_capteurs?: number; + ratio_virtualisation?: number; + nombre_module?: number; + tv_coef_orientation_pv_id?: number; + enum_orientation_pv_id?: number; + enum_inclinaison_pv_id?: number; +} diff --git a/src/dpe/domain/models/sortie.model.ts b/src/dpe/domain/models/sortie.model.ts new file mode 100644 index 0000000..d45ba1c --- /dev/null +++ b/src/dpe/domain/models/sortie.model.ts @@ -0,0 +1,178 @@ +export interface Sortie { + deperdition: Deperdition; + apport_et_besoin: ApportEtBesoin; + ef_conso: EfConso; + ep_conso: EpConso; + emission_ges: EmissionGes; + cout: Cout; + production_electricite: ProductionElectricite; + sortie_par_energie_collection: { sortie_par_energie: SortieParEnergie[] }; + confort_ete?: ConfortEte; + qualite_isolation: QualiteIsolation; +} + +export interface Deperdition { + hvent: number; + hperm: number; + deperdition_renouvellement_air: number; + deperdition_mur: number; + deperdition_plancher_bas: number; + deperdition_plancher_haut: number; + deperdition_baie_vitree: number; + deperdition_porte: number; + deperdition_pont_thermique: number; + deperdition_enveloppe: number; +} + +export interface ApportEtBesoin { + surface_sud_equivalente: number; + apport_solaire_fr: number; + apport_interne_fr: number; + apport_solaire_ch: number; + apport_interne_ch: number; + fraction_apport_gratuit_ch: number; + fraction_apport_gratuit_depensier_ch: number; + pertes_distribution_ecs_recup: number; + pertes_distribution_ecs_recup_depensier: number; + pertes_stockage_ecs_recup: number; + pertes_generateur_ch_recup: number; + pertes_generateur_ch_recup_depensier: number; + nadeq: number; + v40_ecs_journalier: number; + v40_ecs_journalier_depensier: number; + besoin_ch: number; + besoin_ch_depensier: number; + besoin_ecs: number; + besoin_ecs_depensier: number; + besoin_fr: number; + besoin_fr_depensier: number; +} + +export interface EfConso { + conso_ch: number; + conso_ch_depensier: number; + conso_ecs: number; + conso_ecs_depensier: number; + conso_eclairage: number; + conso_auxiliaire_generation_ch: number; + conso_auxiliaire_generation_ch_depensier: number; + conso_auxiliaire_distribution_ch: number; + conso_auxiliaire_generation_ecs: number; + conso_auxiliaire_generation_ecs_depensier: number; + conso_auxiliaire_distribution_ecs: number; + conso_auxiliaire_distribution_fr?: number; + conso_auxiliaire_ventilation: number; + conso_totale_auxiliaire: number; + conso_fr: number; + conso_fr_depensier: number; + conso_5_usages: number; + conso_5_usages_m2: number; +} + +export interface EpConso { + ep_conso_ch: number; + ep_conso_ch_depensier: number; + ep_conso_ecs: number; + ep_conso_ecs_depensier: number; + ep_conso_eclairage: number; + ep_conso_auxiliaire_generation_ch: number; + ep_conso_auxiliaire_generation_ch_depensier: number; + ep_conso_auxiliaire_distribution_ch: number; + ep_conso_auxiliaire_generation_ecs: number; + ep_conso_auxiliaire_generation_ecs_depensier: number; + ep_conso_auxiliaire_distribution_ecs: number; + ep_conso_auxiliaire_distribution_fr?: number; + ep_conso_auxiliaire_ventilation: number; + ep_conso_totale_auxiliaire: number; + ep_conso_fr: number; + ep_conso_fr_depensier: number; + ep_conso_5_usages: number; + ep_conso_5_usages_m2: number; + classe_bilan_dpe: string; +} + +export interface EmissionGes { + emission_ges_ch: number; + emission_ges_ch_depensier: number; + emission_ges_ecs: number; + emission_ges_ecs_depensier: number; + emission_ges_eclairage: number; + emission_ges_auxiliaire_generation_ch: number; + emission_ges_auxiliaire_generation_ch_depensier: number; + emission_ges_auxiliaire_distribution_ch: number; + emission_ges_auxiliaire_generation_ecs: number; + emission_ges_auxiliaire_generation_ecs_depensier: number; + emission_ges_auxiliaire_distribution_ecs: number; + emission_ges_auxiliaire_distribution_fr?: number; + emission_ges_auxiliaire_ventilation: number; + emission_ges_totale_auxiliaire: number; + emission_ges_fr: number; + emission_ges_fr_depensier: number; + emission_ges_5_usages: number; + emission_ges_5_usages_m2: number; + classe_emission_ges: string; +} + +export interface Cout { + cout_ch: number; + cout_ch_depensier: number; + cout_ecs: number; + cout_ecs_depensier: number; + cout_eclairage: number; + cout_auxiliaire_generation_ch: number; + cout_auxiliaire_generation_ch_depensier: number; + cout_auxiliaire_distribution_ch: number; + cout_auxiliaire_generation_ecs: number; + cout_auxiliaire_generation_ecs_depensier: number; + cout_auxiliaire_distribution_ecs: number; + cout_auxiliaire_distribution_fr?: number; + cout_auxiliaire_ventilation: number; + cout_total_auxiliaire: number; + cout_fr: number; + cout_fr_depensier: number; + cout_5_usages: number; +} + +export interface ProductionElectricite { + production_pv: number; + conso_elec_ac: number; + conso_elec_ac_ch: number; + conso_elec_ac_ecs: number; + conso_elec_ac_fr: number; + conso_elec_ac_eclairage: number; + conso_elec_ac_auxiliaire: number; + conso_elec_ac_autre_usage: number; +} + +export interface SortieParEnergie { + enum_type_energie_id: number; + conso_ch: number; + conso_ecs: number; + conso_5_usages: number; + emission_ges_ch: number; + emission_ges_ecs: number; + emission_ges_5_usages: number; + cout_ch: number; + cout_ecs: number; + cout_5_usages: number; +} + +export interface ConfortEte { + isolation_toiture?: boolean; + protection_solaire_exterieure: boolean; + aspect_traversant?: boolean; + brasseur_air?: boolean; + inertie_lourde: boolean; + enum_indicateur_confort_ete_id: number; +} + +export interface QualiteIsolation { + ubat: number; + qualite_isol_enveloppe: number; + qualite_isol_mur?: number; + qualite_isol_plancher_haut_toit_terrasse?: number; + qualite_isol_plancher_haut_comble_perdu?: number; + qualite_isol_plancher_haut_comble_amenage?: number; + qualite_isol_plancher_bas?: number; + qualite_isol_menuiserie: number; +} diff --git a/src/dpe/domain/models/ventilation.model.ts b/src/dpe/domain/models/ventilation.model.ts new file mode 100644 index 0000000..bdd5cb0 --- /dev/null +++ b/src/dpe/domain/models/ventilation.model.ts @@ -0,0 +1,26 @@ +export interface Ventilation { + donnee_entree?: VentilationDE; + donnee_intermediaire?: VentilationDI; +} + +export interface VentilationDE { + surface_ventile: number; + description?: string; + reference?: string; + plusieurs_facade_exposee: boolean; + tv_q4pa_conv_id?: number; + q4pa_conv_saisi?: number; + enum_methode_saisie_q4pa_conv_id: number; + tv_debits_ventilation_id: number; + ventilation_post_2012: boolean; + ref_produit_ventilation?: number; + cle_repartition_ventilation?: number; +} + +export interface VentilationDI { + pvent_moy?: number; + q4pa_conv: number; + conso_auxiliaire_ventilation: number; + hperm: number; + hvent: number; +} diff --git a/src/dpe/domain/murs/pre-process-murs.service.js b/src/dpe/domain/murs/pre-process-murs.service.js new file mode 100644 index 0000000..8731945 --- /dev/null +++ b/src/dpe/domain/murs/pre-process-murs.service.js @@ -0,0 +1,49 @@ +import { getThicknessFromDescription } from '../../../core/utils.js'; +import { tv } from '@open3cl/engine/utils.js'; + +export class PreProcessMursService { + constructor() {} + + /** + * Retourne si elle existe la fiche technique contenant le texte description et + * présente dans la catégorie de fiches techniques ayant pour catégorie categoryFicheTechiqueId + * + * @param dpe {Dpe} + */ + preprocess(dpe) { + const murs = dpe.logement.enveloppe?.mur_collection?.mur || []; + + murs.forEach((mur) => { + /** @type {MurDE} */ + const murDE = mur.donnee_entree; + + if (!murDE.epaisseur_structure) { + /** + * Certains logiciels omettent le champ 'epaisseur_structure' + * Récupération de cette information si elle existe dans la description via regex "(\d+) cm" + * @type {number} + */ + let epaisseurStructure = getThicknessFromDescription(murDE.description); + + /** + * Si on n'a toujours pas de valeur pour 'epaisseur_structure', récupération de la valeur utilisée dans le DPE + */ + if (murDE.tv_umur0_id && epaisseurStructure === 0) { + const rowUmur0 = tv('umur0', { + tv_umur0_id: murDE.tv_umur0_id + }); + + if (rowUmur0 && rowUmur0.epaisseur_structure) { + epaisseurStructure = parseFloat( + rowUmur0.epaisseur_structure.replace('≥ ', '').replace('≤ ', '') + ); + } + } + + if (epaisseurStructure) { + murDE.epaisseur_structure = epaisseurStructure; + } + } + }); + } +} diff --git a/src/dpe/domain/murs/pre-process-murs.service.spec.js b/src/dpe/domain/murs/pre-process-murs.service.spec.js new file mode 100644 index 0000000..d6fb638 --- /dev/null +++ b/src/dpe/domain/murs/pre-process-murs.service.spec.js @@ -0,0 +1,63 @@ +import { describe, expect, it } from 'vitest'; +import { PreProcessMursService } from './pre-process-murs.service.js'; + +describe('PreProcessMursService service tests', () => { + const service = new PreProcessMursService(); + + const dpe = { + logement: { + enveloppe: { + mur_collection: { + mur: [ + { + donnee_entree: { + description: 'Mur en blocs de béton creux Ep <=20cm avec isolant (ITI) Ep=10 cm', + enum_orientation_id: '4', + tv_umur0_id: '46', + enum_type_vitrage_id: '2', + enum_type_baie_id: '4', + enum_type_materiaux_menuiserie_id: '5' + } + } + ] + } + } + } + }; + + it('Aucun action si aucun mur spécifié', async () => { + let dpe = { logement: { enveloppe: { mur_collection: { mur: [] } } } }; + + service.preprocess(dpe); + expect(dpe.logement.enveloppe.mur_collection.mur.length).toBe(0); + + dpe = { logement: { enveloppe: { mur_collection: {} } } }; + service.preprocess(dpe); + expect(dpe.logement.enveloppe.mur_collection.mur).toBeUndefined(); + }); + + it('epaisseur_structure mis à jour à partir de la description', async () => { + delete dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure; + + service.preprocess(dpe); + expect(dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure).toBe(10); + }); + + it('epaisseur_structure mis à jour à partir des données tv_umur0_id', async () => { + delete dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure; + dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.description = ''; + service.preprocess(dpe); + + expect(dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure).toBe(23); + + delete dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure; + dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.tv_umur0_id = '38'; + service.preprocess(dpe); + expect(dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure).toBe(10); + + delete dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure; + dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.tv_umur0_id = '41'; + service.preprocess(dpe); + expect(dpe.logement.enveloppe.mur_collection.mur[0].donnee_entree.epaisseur_structure).toBe(25); + }); +}); diff --git a/src/dpe/infrastructure/dpe-element.store.js b/src/dpe/infrastructure/dpe-element.store.js new file mode 100644 index 0000000..85fc661 --- /dev/null +++ b/src/dpe/infrastructure/dpe-element.store.js @@ -0,0 +1,13 @@ +/** + * A generic store for all dpe elements + */ +export class DpeElementStore { + /** + * Redressement de certaines données du DPE + * @param dpe {Dpe} + */ + /*eslint no-unused-vars: "off"*/ + preprocess(dpe) { + throw new Error('Unsupported operation'); + } +} diff --git a/src/dpe/infrastructure/dpe-element.store.spec.js b/src/dpe/infrastructure/dpe-element.store.spec.js new file mode 100644 index 0000000..af2d71c --- /dev/null +++ b/src/dpe/infrastructure/dpe-element.store.spec.js @@ -0,0 +1,13 @@ +import { describe, expect, it } from 'vitest'; +import { DpeElementStore } from './dpe-element.store.js'; + +describe('DpeElementStore unit tests', () => { + it('should not be able to pre-process a dpe', async () => { + try { + const store = new DpeElementStore(); + store.preprocess(null); + } catch (error) { + expect(error.message).toBe('Unsupported operation'); + } + }); +}); diff --git a/src/dpe/infrastructure/dpe.store.js b/src/dpe/infrastructure/dpe.store.js new file mode 100644 index 0000000..b78fcfb --- /dev/null +++ b/src/dpe/infrastructure/dpe.store.js @@ -0,0 +1,25 @@ +import { inject } from 'dioma'; +import { MursStore } from './murs/murs.store.js'; + +export class DpeStore { + /** + * @type {DpeElementStore[]} + */ + #dpeElementsStore; + + /** + * @param mursStore {MursStore} + */ + constructor(mursStore = inject(MursStore)) { + this.#dpeElementsStore = [mursStore]; + } + + /** + * Redressement de certaines données du DPE + * @param dpe {Dpe} + */ + /*eslint no-unused-vars: "off"*/ + preprocess(dpe) { + return this.#dpeElementsStore.flatMap((store) => store.preprocess(dpe)); + } +} diff --git a/src/dpe/infrastructure/dpe.store.spec.js b/src/dpe/infrastructure/dpe.store.spec.js new file mode 100644 index 0000000..6bdf7e2 --- /dev/null +++ b/src/dpe/infrastructure/dpe.store.spec.js @@ -0,0 +1,18 @@ +import { describe, expect, it, vi } from 'vitest'; +import { DpeStore } from './dpe.store.js'; +import { DpeDataFixture } from '../../../tests/fixtures/dpe/dpe.fixture.js'; +import { MursStore } from './murs/murs.store.js'; + +describe('DpeStore tests', () => { + it('should pre process a DPE', async () => { + const mursStore = new MursStore(); + + const store = new DpeStore(mursStore); + const dpe = DpeDataFixture.aFullDpe(); + + vi.spyOn(mursStore, 'preprocess').mockReturnValue(null); + + store.preprocess(dpe); + expect(mursStore.preprocess).toHaveBeenCalledWith(dpe); + }); +}); diff --git a/src/dpe/infrastructure/murs/murs.store.js b/src/dpe/infrastructure/murs/murs.store.js new file mode 100644 index 0000000..ffb6a4f --- /dev/null +++ b/src/dpe/infrastructure/murs/murs.store.js @@ -0,0 +1,26 @@ +import { DpeElementStore } from '../dpe-element.store.js'; +import { PreProcessMursService } from '../../domain/murs/pre-process-murs.service.js'; +import { inject } from 'dioma'; + +export class MursStore extends DpeElementStore { + /** + * @type {PreProcessMursService} + */ + #preProcessMursService; + + /** + * @param preProcessMursService {PreProcessMursService} + */ + constructor(preProcessMursService = inject(PreProcessMursService)) { + super(); + this.#preProcessMursService = preProcessMursService; + } + + /** + * @param dpe {Dpe} + */ + /*eslint no-unused-vars: "off"*/ + preprocess(dpe) { + this.#preProcessMursService.preprocess(dpe); + } +} diff --git a/src/dpe/infrastructure/murs/murs.store.spec.js b/src/dpe/infrastructure/murs/murs.store.spec.js new file mode 100644 index 0000000..6ba7423 --- /dev/null +++ b/src/dpe/infrastructure/murs/murs.store.spec.js @@ -0,0 +1,18 @@ +import { MursStore } from './murs.store.js'; +import { describe, expect, it, vi } from 'vitest'; +import { DpeDataFixture } from '../../../../tests/fixtures/dpe/dpe.fixture.js'; +import { PreProcessMursService } from '../../domain/murs/pre-process-murs.service.js'; + +describe('VentilationService validator tests', () => { + const preProcessMursService = new PreProcessMursService(); + const store = new MursStore(preProcessMursService); + + it('should pre-process a DPE', async () => { + const dpe = DpeDataFixture.aFullDpe(); + + vi.spyOn(preProcessMursService, 'preprocess').mockReturnValue(null); + + store.preprocess(dpe); + expect(preProcessMursService.preprocess).toBeCalledWith(dpe); + }); +}); diff --git a/src/index.js b/src/index.js index e69de29..b951d51 100644 --- a/src/index.js +++ b/src/index.js @@ -0,0 +1 @@ +export { PreProcessDpeStore as DpePreProcessor } from './process/infrastructure/pre-process-dpe.store.js'; diff --git a/src/process/infrastructure/pre-process-dpe.store.js b/src/process/infrastructure/pre-process-dpe.store.js new file mode 100644 index 0000000..246576f --- /dev/null +++ b/src/process/infrastructure/pre-process-dpe.store.js @@ -0,0 +1,24 @@ +import { inject } from 'dioma'; +import { DpeStore } from '../../dpe/infrastructure/dpe.store.js'; + +export class PreProcessDpeStore { + /** + * @type {DpeStore} + */ + #dpeStore; + + /** + * @param dpeStore {DpeStore} + */ + constructor(dpeStore = inject(DpeStore)) { + this.#dpeStore = dpeStore; + } + + /** + * @param dpe {Dpe} + * @return {ValidationError[]} + */ + preprocess(dpe) { + return this.#dpeStore.preprocess(dpe); + } +} diff --git a/src/process/infrastructure/pre-process-dpe.store.spec.js b/src/process/infrastructure/pre-process-dpe.store.spec.js new file mode 100644 index 0000000..fef6e00 --- /dev/null +++ b/src/process/infrastructure/pre-process-dpe.store.spec.js @@ -0,0 +1,17 @@ +import { describe, expect, it, vi } from 'vitest'; +import { DpeStore } from '../../dpe/infrastructure/dpe.store.js'; +import { PreProcessDpeStore } from './pre-process-dpe.store.js'; +import { DpeDataFixture } from '../../../tests/fixtures/dpe/dpe.fixture.js'; + +describe('ProcessDpeStore tests', () => { + it('should pre-process a DPE', async () => { + const dpeStore = new DpeStore(); + + const service = new PreProcessDpeStore(dpeStore); + + vi.spyOn(dpeStore, 'preprocess').mockReturnValue(null); + + const errors = service.preprocess(DpeDataFixture.aFullDpe()); + expect(errors).toBeNull(); + }); +}); diff --git a/tests/fixtures/dpe/dpe.fixture.js b/tests/fixtures/dpe/dpe.fixture.js new file mode 100644 index 0000000..b0a95b0 --- /dev/null +++ b/tests/fixtures/dpe/dpe.fixture.js @@ -0,0 +1,2206 @@ +export class DpeDataFixture { + /** + * @return {Partial} + */ + static aFullDpe() { + return { + numero_dpe: '2344E0308327N', + statut: 'ACTIF', + administratif: { + dpe_a_remplacer: '2344E0308141J', + motif_remplacement: 'Modification à apporter', + dpe_immeuble_associe: '', + enum_version_id: '2.2', + date_visite_diagnostiqueur: '2023-01-31', + date_etablissement_dpe: '2023-01-31', + enum_modele_dpe_id: '1', + diagnostiqueur: { + usr_logiciel_id: 26615, + version_logiciel: 'LICIEL Diagnostics v4 [Version XML:214]', + version_moteur_calcul: '3cl_tribu_1.4.25.1' + }, + geolocalisation: { + invar_logement: '', + rpls_log_id: '', + rpls_org_id: '', + idpar: '', + immatriculation_copropriete: '', + adresses: { + adresse_bien: { + adresse_brut: '38 Avenue du Maréchal Foch', + code_postal_brut: 44730, + nom_commune_brut: 'ST MICHEL CHEF CHEF', + label_brut: '38 Avenue du Maréchal Foch 44730 ST MICHEL CHEF CHEF', + enum_statut_geocodage_ban_id: '1', + ban_date_appel: '2023-01-31', + ban_id: '44182_0800_00038', + ban_label: '38 Avenue Foch 44730 Saint-Michel-Chef-Chef', + ban_housenumber: 38, + ban_street: 'Avenue Foch', + ban_citycode: 44182, + ban_postcode: 44730, + ban_city: 'Saint-Michel-Chef-Chef', + ban_type: 'housenumber', + ban_score: 0.6146499999999999, + ban_x: 309154.97, + ban_y: 6686833.96, + compl_nom_residence: '', + compl_ref_batiment: '23/01/0880', + compl_etage_appartement: 0, + compl_ref_cage_escalier: '', + compl_ref_logement: 'palier porte de droite' + } + } + } + }, + logement: { + caracteristique_generale: { + annee_construction: 1949, + enum_periode_construction_id: '2', + enum_methode_application_dpe_log_id: '2', + surface_habitable_logement: 40.94, + nombre_niveau_logement: 1, + hsp: 2.5, + nombre_appartement: 1 + }, + meteo: { + enum_zone_climatique_id: '5', + enum_classe_altitude_id: '1', + batiment_materiaux_anciens: 0 + }, + enveloppe: { + inertie: { + inertie_plancher_bas_lourd: 0, + inertie_plancher_haut_lourd: 0, + inertie_paroi_verticale_lourd: 0, + enum_classe_inertie_id: '4' + }, + mur_collection: { + mur: [ + { + donnee_entree: { + description: + "Mur 1 Sud - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur des circulations avec ouverture directe sur l'extérieur", + reference: '2023_01_31_12_13_08_05242480060202', + reference_lnc: 'LNC2023_01_31_12_13_08_05242480060202', + tv_coef_reduction_deperdition_id: 100, + surface_aiu: 20, + surface_aue: 2.5, + enum_cfg_isolation_lnc_id: '2', + enum_type_adjacence_id: '15', + enum_orientation_id: '1', + surface_paroi_totale: 6.94, + surface_paroi_opaque: 6.94, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 0.15, + umur: 0.5, + umur0: 2 + } + }, + { + donnee_entree: { + description: + 'Mur 2 Sud - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure donnant sur un local chauffé', + reference: '2023_01_31_12_17_54_5145061003417626', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 283, + enum_type_adjacence_id: '22', + enum_orientation_id: '1', + surface_paroi_totale: 8.63, + surface_paroi_opaque: 8.63, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 0, + umur: 0.5, + umur0: 2 + } + }, + { + donnee_entree: { + description: + "Mur 3 Ouest - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur l'extérieur", + reference: '2023_01_31_12_15_58_3841799001196565', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 1, + enum_type_adjacence_id: '1', + enum_orientation_id: '4', + surface_paroi_totale: 10.76, + surface_paroi_opaque: 10.76, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 1, + umur: 0.5, + umur0: 2 + } + }, + { + donnee_entree: { + description: + 'Mur 4 Nord - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure donnant sur un local chauffé', + reference: '2023_01_31_12_16_14_7749184003431753', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 283, + enum_type_adjacence_id: '22', + enum_orientation_id: '2', + surface_paroi_totale: 22.35, + surface_paroi_opaque: 22.35, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 0, + umur: 0.5, + umur0: 2 + } + }, + { + donnee_entree: { + description: + "Mur 5 Est - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur l'extérieur", + reference: '2023_01_31_12_21_30_5626136006974349', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 1, + enum_type_adjacence_id: '1', + enum_orientation_id: '3', + surface_paroi_totale: 10.58, + surface_paroi_opaque: 10.58, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 1, + umur: 0.5, + umur0: 2 + } + }, + { + donnee_entree: { + description: + 'Mur 6 Sud - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure donnant sur un local chauffé', + reference: '2023_01_31_12_21_55_07518810005182618', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 283, + enum_type_adjacence_id: '22', + enum_orientation_id: '1', + surface_paroi_totale: 2.9, + surface_paroi_opaque: 2.9, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 0, + umur: 0.5, + umur0: 2 + } + }, + { + donnee_entree: { + description: + "Mur 7 Ouest - Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur des circulations avec ouverture directe sur l'extérieur", + reference: '2023_01_31_12_22_13_7696213009787799', + reference_lnc: 'LNC2023_01_31_12_22_13_7696213009787799', + tv_coef_reduction_deperdition_id: 101, + surface_aiu: 22.5, + surface_aue: 2.5, + enum_cfg_isolation_lnc_id: '2', + enum_type_adjacence_id: '15', + enum_orientation_id: '4', + surface_paroi_totale: 2.78, + surface_paroi_opaque: 2.78, + tv_umur0_id: 1, + enum_materiaux_structure_mur_id: '1', + enum_methode_saisie_u0_id: '2', + paroi_ancienne: 0, + enum_type_doublage_id: '3', + enum_type_isolation_id: '3', + epaisseur_isolation: 6, + enum_methode_saisie_u_id: '3' + }, + donnee_intermediaire: { + b: 0.1, + umur: 0.5, + umur0: 2 + } + } + ] + }, + plancher_bas_collection: { + plancher_bas: [ + { + donnee_entree: { + description: + 'Plancher 1 - Plancher avec ou sans remplissage donnant sur un local chauffé', + reference: '2023_01_31_12_24_03_1563399009530591', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 283, + enum_type_adjacence_id: '22', + surface_paroi_opaque: 40.17, + tv_upb0_id: 2, + enum_type_plancher_bas_id: '2', + enum_methode_saisie_u0_id: '2', + enum_type_isolation_id: '1', + enum_periode_isolation_id: '1', + tv_upb_id: 3, + enum_methode_saisie_u_id: '7', + calcul_ue: 0 + }, + donnee_intermediaire: { + b: 0, + upb: 1.45, + upb_final: 1.45, + upb0: 1.45 + } + }, + { + donnee_entree: { + description: + "Plancher 2 - Plancher avec ou sans remplissage donnant sur des circulations avec ouverture directe sur l'extérieur", + reference: '2023_01_31_12_25_12_0932367004354051', + reference_lnc: 'LNC2023_01_31_12_25_12_0932367004354051', + tv_coef_reduction_deperdition_id: 101, + surface_aiu: 20.63, + surface_aue: 2.5, + enum_cfg_isolation_lnc_id: '2', + enum_type_adjacence_id: '15', + surface_paroi_opaque: 1.28, + tv_upb0_id: 2, + enum_type_plancher_bas_id: '2', + enum_methode_saisie_u0_id: '2', + enum_type_isolation_id: '1', + enum_periode_isolation_id: '1', + tv_upb_id: 3, + enum_methode_saisie_u_id: '7', + calcul_ue: 0 + }, + donnee_intermediaire: { + b: 0.1, + upb: 1.45, + upb_final: 1.45, + upb0: 1.45 + } + } + ] + }, + plancher_haut_collection: { + plancher_haut: [ + { + donnee_entree: { + description: + 'Plafond - Plafond avec ou sans remplissage donnant sur un local chauffé', + reference: '2023_01_31_12_23_23_52494070005245668', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 283, + enum_type_adjacence_id: '22', + surface_paroi_opaque: 40.94, + tv_uph0_id: 2, + enum_type_plancher_haut_id: '2', + enum_methode_saisie_u0_id: '2', + enum_type_isolation_id: '1', + enum_periode_isolation_id: '1', + tv_uph_id: 51, + enum_methode_saisie_u_id: '7' + }, + donnee_intermediaire: { + b: 0, + uph: 1.45, + uph0: 1.45 + } + } + ] + }, + baie_vitree_collection: { + baie_vitree: [ + { + donnee_entree: { + description: + "Fenêtre 1 Ouest - Fenêtres battantes pvc, orientées Ouest, double vitrage avec lame d'air 14 mm", + reference: '2023_01_31_12_26_06_9403465002513371', + reference_paroi: '2023_01_31_12_15_58_3841799001196565', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 1, + enum_type_adjacence_id: '1', + surface_totale_baie: 3.8, + nb_baie: 2, + tv_ug_id: 6, + enum_type_vitrage_id: '2', + enum_inclinaison_vitrage_id: '3', + enum_type_gaz_lame_id: '1', + epaisseur_lame: 14, + vitrage_vir: 0, + enum_methode_saisie_perf_vitrage_id: '1', + tv_uw_id: 348, + enum_type_materiaux_menuiserie_id: '5', + enum_type_baie_id: '4', + double_fenetre: 0, + uw_1: 2.7, + sw_1: 0.44000000000000006, + enum_type_fermeture_id: '1', + presence_retour_isolation: 0, + largeur_dormant: 5, + tv_sw_id: 110, + enum_type_pose_id: '2', + enum_orientation_id: '4', + tv_coef_masque_proche_id: 19, + masque_lointain_non_homogene_collection: '' + }, + donnee_intermediaire: { + b: 1, + ug: 2.8, + uw: 2.7, + u_menuiserie: 2.7, + sw: 0.44, + fe1: 1, + fe2: 1 + } + }, + { + donnee_entree: { + description: + "Fenêtre 2 Est - Fenêtres battantes pvc, orientées Est, double vitrage avec lame d'air 14 mm", + reference: '2023_01_31_12_28_28_1566482003995953', + reference_paroi: '2023_01_31_12_21_30_5626136006974349', + reference_lnc: '', + tv_coef_reduction_deperdition_id: 1, + enum_type_adjacence_id: '1', + surface_totale_baie: 3.8, + nb_baie: 2, + tv_ug_id: 6, + enum_type_vitrage_id: '2', + enum_inclinaison_vitrage_id: '3', + enum_type_gaz_lame_id: '1', + epaisseur_lame: 14, + vitrage_vir: 0, + enum_methode_saisie_perf_vitrage_id: '1', + tv_uw_id: 348, + enum_type_materiaux_menuiserie_id: '5', + enum_type_baie_id: '4', + double_fenetre: 0, + uw_1: 2.7, + sw_1: 0.44000000000000006, + enum_type_fermeture_id: '1', + presence_retour_isolation: 0, + largeur_dormant: 5, + tv_sw_id: 110, + enum_type_pose_id: '2', + enum_orientation_id: '3', + tv_coef_masque_proche_id: 19, + masque_lointain_non_homogene_collection: '' + }, + donnee_intermediaire: { + b: 1, + ug: 2.8, + uw: 2.7, + u_menuiserie: 2.7, + sw: 0.44, + fe1: 1, + fe2: 1 + } + } + ] + }, + porte_collection: { + porte: [ + { + donnee_entree: { + description: 'Porte - Porte(s) bois opaque pleine', + reference: '2023_01_31_12_28_52_2339669002432305', + reference_paroi: '2023_01_31_12_13_08_05242480060202', + reference_lnc: 'LNC2023_01_31_12_28_52_2339669002432305', + enum_cfg_isolation_lnc_id: '2', + enum_type_adjacence_id: '15', + tv_coef_reduction_deperdition_id: 100, + surface_aiu: 20, + surface_aue: 2.5, + surface_porte: 1.49, + tv_uporte_id: 1, + enum_methode_saisie_uporte_id: '1', + enum_type_porte_id: '1', + nb_porte: 1, + largeur_dormant: 5, + presence_retour_isolation: 0, + enum_type_pose_id: '2' + }, + donnee_intermediaire: { + uporte: 3.5, + b: 0.15 + } + } + ] + }, + ets_collection: '', + pont_thermique_collection: '' + }, + ventilation_collection: { + ventilation: [ + { + donnee_entree: { + surface_ventile: 40.94, + description: 'VMC SF Auto réglable avant 1982', + reference: '2023_01_31_12_30_50_1712689004447582', + data_complementaires: '', + plusieurs_facade_exposee: 1, + tv_q4pa_conv_id: 11, + enum_methode_saisie_q4pa_conv_id: '1', + tv_debits_ventilation_id: 3, + enum_type_ventilation_id: '3', + ventilation_post_2012: 0, + ref_produit_ventilation: '' + }, + donnee_intermediaire: { + pvent_moy: 37.09983, + q4pa_conv: 1.9, + conso_auxiliaire_ventilation: 325, + hperm: 3.05042, + hvent: 27.42161 + } + } + ] + }, + climatisation_collection: '', + production_elec_enr: '', + installation_ecs_collection: { + installation_ecs: [ + { + donnee_entree: { + description: + 'Ballon électrique à accumulation vertical (autres catégorie ou inconnue), contenance ballon 50 L', + reference: '2023_01_31_12_32_01_3225469008727224', + enum_cfg_installation_ecs_id: '1', + enum_type_installation_id: '1', + enum_methode_calcul_conso_id: '1', + surface_habitable: 40.94, + nombre_logement: 1, + nombre_niveau_installation_ecs: 1, + tv_rendement_distribution_ecs_id: 1, + enum_bouclage_reseau_ecs_id: '1' + }, + donnee_intermediaire: { + rendement_distribution: 0.93, + besoin_ecs: 999.0436877099, + besoin_ecs_depensier: 1409.3652023050372, + conso_ecs: 1332.0005244192473, + conso_ecs_depensier: 1773.2064540914378 + }, + generateur_ecs_collection: { + generateur_ecs: [ + { + donnee_entree: { + description: + 'Electrique - Ballon électrique à accumulation vertical (autres catégorie ou inconnue)', + reference: 'Generateur:2023_01_31_12_32_01_3225469008727224', + reference_generateur_mixte: '', + enum_type_generateur_ecs_id: '69', + ref_produit_generateur_ecs: '', + enum_usage_generateur_id: '2', + enum_type_energie_id: '1', + enum_methode_saisie_carac_sys_id: '1', + tv_pertes_stockage_id: 2, + identifiant_reseau_chaleur: '', + enum_type_stockage_ecs_id: '3', + position_volume_chauffe: 1, + volume_stockage: 50 + }, + donnee_intermediaire: { + ratio_besoin_ecs: 1, + rendement_generation: 1, + conso_ecs: 1332.0005244192473, + conso_ecs_depensier: 1773.2064540914378, + rendement_stockage: 0.806487 + } + } + ] + } + } + ] + }, + installation_chauffage_collection: { + installation_chauffage: [ + { + donnee_entree: { + description: + 'Panneau rayonnant électrique NFC, NF** et NF*** avec programmateur pièce par pièce (système individuel)', + reference: '2023_01_31_12_29_20_695867000781047', + surface_chauffee: 40.94, + nombre_niveau_installation_ch: 1, + enum_cfg_installation_ch_id: '1', + enum_type_installation_id: '1', + enum_methode_calcul_conso_id: '1' + }, + donnee_intermediaire: { + besoin_ch: 1790.872039366649, + besoin_ch_depensier: 2334.0446192817185, + conso_ch: 1667.4570673134315, + conso_ch_depensier: 2173.1978110633668 + }, + emetteur_chauffage_collection: { + emetteur_chauffage: [ + { + donnee_entree: { + description: '', + reference: 'Emetteur:2023_01_31_12_29_20_695867000781047#1', + surface_chauffee: 40.94, + tv_rendement_emission_id: 2, + tv_rendement_distribution_ch_id: 1, + tv_rendement_regulation_id: 2, + enum_type_emission_distribution_id: '2', + tv_intermittence_id: 138, + reseau_distribution_isole: 0, + enum_equipement_intermittence_id: '4', + enum_type_regulation_id: '2', + enum_periode_installation_emetteur_id: '1', + enum_type_chauffage_id: '1', + enum_temp_distribution_ch_id: '1', + enum_lien_generateur_emetteur_id: '1' + }, + donnee_intermediaire: { + i0: 0.86, + rendement_emission: 0.97, + rendement_distribution: 1, + rendement_regulation: 0.99 + } + } + ] + }, + generateur_chauffage_collection: { + generateur_chauffage: [ + { + donnee_entree: { + description: 'Electrique - Panneau rayonnant électrique NFC, NF** et NF***', + reference: 'Generateur:2023_01_31_12_29_20_695867000781047#1', + data_complementaires: '', + reference_generateur_mixte: '', + ref_produit_generateur_ch: 'Sans Objet', + enum_type_generateur_ch_id: '99', + enum_usage_generateur_id: '1', + enum_type_energie_id: '1', + position_volume_chauffe: 1, + tv_rendement_generation_id: 29, + identifiant_reseau_chaleur: '', + enum_methode_saisie_carac_sys_id: '1', + enum_lien_generateur_emetteur_id: '1' + }, + donnee_intermediaire: { + rendement_generation: 1, + conso_ch: 1667.4570673134315, + conso_ch_depensier: 2173.1978110633668 + } + } + ] + } + } + ] + }, + sortie: { + deperdition: { + hvent: 27.421612, + hperm: 3.050416982269853, + deperdition_renouvellement_air: 30.47202898226985, + deperdition_mur: 11.3295, + deperdition_plancher_bas: 0.1856, + deperdition_plancher_haut: 0, + deperdition_baie_vitree: 20.52, + deperdition_porte: 0.78225, + deperdition_pont_thermique: 0, + deperdition_enveloppe: 63.28937898226985 + }, + apport_et_besoin: { + surface_sud_equivalente: 29.94552, + apport_solaire_fr: 0, + apport_interne_fr: 0, + apport_solaire_ch: 1215.9069912, + apport_interne_ch: 1438.6232428464284, + fraction_apport_gratuit_ch: 0.4627139116970541, + fraction_apport_gratuit_depensier_ch: 0.4225758311750647, + pertes_distribution_ecs_recup: 30.781494005439825, + pertes_distribution_ecs_recup_depensier: 44.57455313810781, + pertes_stockage_ecs_recup: 79.41832767123286, + pertes_generateur_ch_recup: 0, + pertes_generateur_ch_recup_depensier: 0, + nadeq: 1.580125, + v40_ecs_journalier: 88.487, + v40_ecs_journalier_depensier: 124.829875, + besoin_ch: 1790.872039366649, + besoin_ch_depensier: 2334.0446192817185, + besoin_ecs: 999.0436877099, + besoin_ecs_depensier: 1409.3652023050372, + besoin_fr: 0, + besoin_fr_depensier: 0 + }, + ef_conso: { + conso_ch: 1667.4570673134315, + conso_ch_depensier: 2173.1978110633668, + conso_ecs: 1332.0005244192473, + conso_ecs_depensier: 1773.2064540914378, + conso_eclairage: 78.9757164, + conso_auxiliaire_generation_ch: 0, + conso_auxiliaire_generation_ch_depensier: 0, + conso_auxiliaire_distribution_ch: 0, + conso_auxiliaire_generation_ecs: 0, + conso_auxiliaire_generation_ecs_depensier: 0, + conso_auxiliaire_distribution_ecs: 0, + conso_auxiliaire_ventilation: 324.99449328000003, + conso_totale_auxiliaire: 324.99449328000003, + conso_fr: 0, + conso_fr_depensier: 0, + conso_5_usages: 3403.4278014126785, + conso_5_usages_m2: 83 + }, + ep_conso: { + ep_conso_ch: 3835.151254820892, + ep_conso_ch_depensier: 3835.151254820892, + ep_conso_ecs: 3063.6012061642687, + ep_conso_ecs_depensier: 3063.6012061642687, + ep_conso_eclairage: 181.64414771999998, + ep_conso_auxiliaire_generation_ch: 0, + ep_conso_auxiliaire_generation_ch_depensier: 0, + ep_conso_auxiliaire_distribution_ch: 0, + ep_conso_auxiliaire_generation_ecs: 0, + ep_conso_auxiliaire_generation_ecs_depensier: 0, + ep_conso_auxiliaire_distribution_ecs: 0, + ep_conso_auxiliaire_ventilation: 747.487334544, + ep_conso_totale_auxiliaire: 747.487334544, + ep_conso_fr: 0, + ep_conso_fr_depensier: 0, + ep_conso_5_usages: 7827.88394324916, + ep_conso_5_usages_m2: 191, + classe_bilan_dpe: 'D' + }, + emission_ges: { + emission_ges_ch: 131.72910831776107, + emission_ges_ch_depensier: 131.72910831776107, + emission_ges_ecs: 86.58003408725108, + emission_ges_ecs_depensier: 86.58003408725108, + emission_ges_eclairage: 5.4493244316, + emission_ges_auxiliaire_generation_ch: 0, + emission_ges_auxiliaire_generation_ch_depensier: 0, + emission_ges_auxiliaire_distribution_ch: 0, + emission_ges_auxiliaire_generation_ecs: 0, + emission_ges_auxiliaire_generation_ecs_depensier: 0, + emission_ges_auxiliaire_distribution_ecs: 0, + emission_ges_auxiliaire_ventilation: 20.79964756992, + emission_ges_totale_auxiliaire: 20.79964756992, + emission_ges_fr: 0, + emission_ges_fr_depensier: 0, + emission_ges_5_usages: 244.55811440653216, + emission_ges_5_usages_m2: 5, + classe_emission_ges: 'A' + }, + cout: { + cout_ch: 312.82530676783693, + cout_ch_depensier: 312.82530676783693, + cout_ecs: 249.8915749223586, + cout_ecs_depensier: 249.8915749223586, + cout_eclairage: 14.81633512150618, + cout_auxiliaire_generation_ch: 0, + cout_auxiliaire_generation_ch_depensier: 0, + cout_auxiliaire_distribution_ch: 0, + cout_auxiliaire_generation_ecs: 0, + cout_auxiliaire_generation_ecs_depensier: 0, + cout_auxiliaire_distribution_ecs: 0, + cout_auxiliaire_ventilation: 60.970986330686436, + cout_total_auxiliaire: 60.970986330686436, + cout_fr: 0, + cout_fr_depensier: 0, + cout_5_usages: 638.5042031423882 + }, + production_electricite: { + production_pv: 0, + conso_elec_ac: 0, + conso_elec_ac_ch: 0, + conso_elec_ac_ecs: 0, + conso_elec_ac_fr: 0, + conso_elec_ac_eclairage: 0, + conso_elec_ac_auxiliaire: 0, + conso_elec_ac_autre_usage: 0 + }, + sortie_par_energie_collection: { + sortie_par_energie: [ + { + enum_type_energie_id: '1', + conso_ch: 1667.4570673134315, + conso_ecs: 1332.0005244192473, + conso_5_usages: 3403.4278014126785, + emission_ges_ch: 131.72910831776107, + emission_ges_ecs: 86.58003408725108, + emission_ges_5_usages: 244.55811440653216, + cout_ch: 312.82530676783693, + cout_ecs: 249.8915749223586, + cout_5_usages: 638.5042031423882 + } + ] + }, + confort_ete: { + isolation_toiture: 0, + protection_solaire_exterieure: 0, + aspect_traversant: 1, + brasseur_air: 0, + inertie_lourde: 0, + enum_indicateur_confort_ete_id: '1' + }, + qualite_isolation: { + ubat: 0.7921156167028722, + qualite_isol_enveloppe: 3, + qualite_isol_mur: 3, + qualite_isol_plancher_haut_comble_perdu: 1, + qualite_isol_plancher_bas: 4, + qualite_isol_menuiserie: 3 + } + } + }, + descriptif_enr_collection: '', + descriptif_simplifie_collection: { + descriptif_simplifie: [ + { + description: + "Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur des circulations avec ouverture directe sur l'extérieur", + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: + 'Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure donnant sur un local chauffé', + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: + "Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur l'extérieur", + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: + 'Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure donnant sur un local chauffé', + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: + "Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur l'extérieur", + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: + 'Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure donnant sur un local chauffé', + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: + "Inconnu (à structure lourde) avec un doublage rapporté avec isolation intérieure (6 cm) donnant sur des circulations avec ouverture directe sur l'extérieur", + enum_categorie_descriptif_simplifie_id: '1' + }, + { + description: 'Plafond avec ou sans remplissage donnant sur un local chauffé', + enum_categorie_descriptif_simplifie_id: '3' + }, + { + description: 'Plancher avec ou sans remplissage donnant sur un local chauffé', + enum_categorie_descriptif_simplifie_id: '2' + }, + { + description: + "Plancher avec ou sans remplissage donnant sur des circulations avec ouverture directe sur l'extérieur", + enum_categorie_descriptif_simplifie_id: '2' + }, + { + description: + "Fenêtres battantes pvc, orientées Ouest, double vitrage avec lame d'air 14 mm", + enum_categorie_descriptif_simplifie_id: '4' + }, + { + description: + "Fenêtres battantes pvc, orientées Est, double vitrage avec lame d'air 14 mm", + enum_categorie_descriptif_simplifie_id: '4' + }, + { + description: 'Porte(s) bois opaque pleine', + enum_categorie_descriptif_simplifie_id: '4' + }, + { + description: + 'Panneau rayonnant électrique NFC, NF** et NF*** avec programmateur pièce par pièce (système individuel)', + enum_categorie_descriptif_simplifie_id: '5' + }, + { + description: + 'Panneau rayonnant électrique NFC, NF** et NF*** avec programmateur pièce par pièce (système individuel)', + enum_categorie_descriptif_simplifie_id: '9' + }, + { + description: 'VMC SF Auto réglable avant 1982', + enum_categorie_descriptif_simplifie_id: '8' + }, + { + description: + 'Ballon électrique à accumulation vertical (autres catégorie ou inconnue), contenance ballon 50 L', + enum_categorie_descriptif_simplifie_id: '6' + } + ] + }, + fiche_technique_collection: { + fiche_technique: [ + { + enum_categorie_fiche_technique_id: '11', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Département: 44 Loire Atlantique', + valeur: '44 Loire Atlantique', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Altitude: 14 m', + valeur: '14 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '4' + }, + { + description: 'Type de bien: Appartement', + valeur: 'Appartement', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Année de construction: 1949', + valeur: 1949, + detail_origine_donnee: '', + enum_origine_donnee_id: '5' + }, + { + description: 'Surface habitable du logement: 40,94 m²', + valeur: '40,94 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '3' + }, + { + description: 'Nombre de niveaux du logement: 1', + valeur: 1, + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Hauteur moyenne sous plafond: 2,5 m', + valeur: '2,5 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 6,94 m²', + valeur: '6,94 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + "Type de local adjacent: des circulations avec ouverture directe sur l'extérieur", + valeur: "des circulations avec ouverture directe sur l'extérieur", + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aiu: 20 m²', + valeur: '20 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aiu: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aue: 2,5 m²', + valeur: '2,5 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aue: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + }, + { + description: 'Commentaires: 1949', + valeur: 1949, + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 8,63 m²', + valeur: '8,63 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de local adjacent: un local chauffé', + valeur: 'un local chauffé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 10,76 m²', + valeur: '10,76 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Type de local adjacent: l'extérieur", + valeur: "l'extérieur", + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: 'PhDPE001', + enum_origine_donnee_id: '3' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 22,35 m²', + valeur: '22,35 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de local adjacent: un local chauffé', + valeur: 'un local chauffé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 10,58 m²', + valeur: '10,58 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Type de local adjacent: l'extérieur", + valeur: "l'extérieur", + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 2,9 m²', + valeur: '2,9 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de local adjacent: un local chauffé', + valeur: 'un local chauffé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '1', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface du mur: 2,78 m²', + valeur: '2,78 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + "Type de local adjacent: des circulations avec ouverture directe sur l'extérieur", + valeur: "des circulations avec ouverture directe sur l'extérieur", + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aiu: 22.5 m²', + valeur: '22.5 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aiu: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aue: 2.5 m²', + valeur: '2.5 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aue: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Matériau mur: Inconnu (à structure lourde)', + valeur: 'Inconnu (à structure lourde)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur isolant: 6 cm', + valeur: '6 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Doublage rapporté avec lame d'air: moins de 15mm ou inconnu", + valeur: 'moins de 15mm ou inconnu', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Umur0 (paroi inconnue): 2,5 W/m².K', + valeur: '2,5 W/m².K', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '2', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface de plancher bas: 40,17 m²', + valeur: '40,17 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de local adjacent: un local chauffé', + valeur: 'un local chauffé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de pb: Plancher avec ou sans remplissage', + valeur: 'Plancher avec ou sans remplissage', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation : oui / non / inconnue: inconnue', + valeur: 'inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Année de construction/rénovation: Avant 1948', + valeur: 'Avant 1948', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '2', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface de plancher bas: 1,28 m²', + valeur: '1,28 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + "Type de local adjacent: des circulations avec ouverture directe sur l'extérieur", + valeur: "des circulations avec ouverture directe sur l'extérieur", + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aiu: 20.63 m²', + valeur: '20.63 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aiu: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aue: 2,5 m²', + valeur: '2,5 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aue: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de pb: Plancher avec ou sans remplissage', + valeur: 'Plancher avec ou sans remplissage', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation : oui / non / inconnue: inconnue', + valeur: 'inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Année de construction/rénovation: Avant 1948', + valeur: 'Avant 1948', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '3', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface de plancher haut: 40,94 m²', + valeur: '40,94 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de local adjacent: un local chauffé', + valeur: 'un local chauffé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de ph: Plafond avec ou sans remplissage', + valeur: 'Plafond avec ou sans remplissage', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Isolation: inconnue', + valeur: 'inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Année de construction/rénovation: Avant 1948', + valeur: 'Avant 1948', + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '4', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface de baies: 3,8 m²', + valeur: '3,8 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Placement: Mur 3 Ouest', + valeur: 'Mur 3 Ouest', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Orientation des baies: Ouest', + valeur: 'Ouest', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Inclinaison vitrage: vertical', + valeur: 'vertical', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type ouverture: Fenêtres battantes', + valeur: 'Fenêtres battantes', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type menuiserie: PVC', + valeur: 'PVC', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de vitrage: double vitrage', + valeur: 'double vitrage', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur lame air: 14 mm', + valeur: '14 mm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Présence couche peu émissive: non', + valeur: 'non', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Gaz de remplissage: Air', + valeur: 'Air', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur Pont Thermique: 9,6 m', + valeur: '9,6 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Positionnement de la menuiserie: au nu intérieur', + valeur: 'au nu intérieur', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Largeur du dormant menuiserie: Lp: 5 cm', + valeur: 'Lp: 5 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de masques proches: Absence de masque proche', + valeur: 'Absence de masque proche', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de masques lointains: Absence de masque lointain', + valeur: 'Absence de masque lointain', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '4', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface de baies: 3,8 m²', + valeur: '3,8 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Placement: Mur 5 Est', + valeur: 'Mur 5 Est', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Orientation des baies: Est', + valeur: 'Est', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Inclinaison vitrage: vertical', + valeur: 'vertical', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type ouverture: Fenêtres battantes', + valeur: 'Fenêtres battantes', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type menuiserie: PVC', + valeur: 'PVC', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de vitrage: double vitrage', + valeur: 'double vitrage', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Epaisseur lame air: 14 mm', + valeur: '14 mm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Présence couche peu émissive: non', + valeur: 'non', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Gaz de remplissage: Air', + valeur: 'Air', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur Pont Thermique: 9,6 m', + valeur: '9,6 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Positionnement de la menuiserie: au nu intérieur', + valeur: 'au nu intérieur', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Largeur du dormant menuiserie: Lp: 5 cm', + valeur: 'Lp: 5 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de masques proches: Absence de masque proche', + valeur: 'Absence de masque proche', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de masques lointains: Absence de masque lointain', + valeur: 'Absence de masque lointain', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '5', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Surface de porte: 1,49 m²', + valeur: '1,49 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Placement: Mur 1 Sud', + valeur: 'Mur 1 Sud', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + "Type de local adjacent: des circulations avec ouverture directe sur l'extérieur", + valeur: "des circulations avec ouverture directe sur l'extérieur", + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aiu: 20 m²', + valeur: '20 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aiu: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface Aue: 2,5 m²', + valeur: '2,5 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Etat isolation des parois Aue: non isolé', + valeur: 'non isolé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Nature de la menuiserie: Porte simple en bois', + valeur: 'Porte simple en bois', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de porte: Porte opaque pleine', + valeur: 'Porte opaque pleine', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: "Présence de joints d'étanchéité: non", + valeur: 'non', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur Pont Thermique: 4,81 m', + valeur: '4,81 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Positionnement de la menuiserie: au nu intérieur', + valeur: 'au nu intérieur', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Largeur du dormant menuiserie: Lp: 5 cm', + valeur: 'Lp: 5 cm', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 1 Sud / Plafond', + valeur: 'Mur 1 Sud / Plafond', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 3,4 m', + valeur: '3,4 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 1 Sud / Plancher 1', + valeur: 'Mur 1 Sud / Plancher 1', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 3,4 m', + valeur: '3,4 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 3 Ouest / Plafond', + valeur: 'Mur 3 Ouest / Plafond', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 5,8 m', + valeur: '5,8 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 3 Ouest / Plancher 1', + valeur: 'Mur 3 Ouest / Plancher 1', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 5,8 m', + valeur: '5,8 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 5 Est / Plafond', + valeur: 'Mur 5 Est / Plafond', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 5,8 m', + valeur: '5,8 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 5 Est / Plancher 1', + valeur: 'Mur 5 Est / Plancher 1', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 5,8 m', + valeur: '5,8 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 7 Ouest / Plafond', + valeur: 'Mur 7 Ouest / Plafond', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 1,1 m', + valeur: '1,1 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '6', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type PT: Mur 7 Ouest / Plancher 1', + valeur: 'Mur 7 Ouest / Plancher 1', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type isolation: ITI / inconnue', + valeur: 'ITI / inconnue', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Longueur du PT: 1,1 m', + valeur: '1,1 m', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '10', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Type de ventilation: VMC SF Auto réglable avant 1982', + valeur: 'VMC SF Auto réglable avant 1982', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Année installation: 1949', + valeur: 1949, + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + }, + { + description: 'Energie utilisée: Electrique', + valeur: 'Electrique', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Façades exposées: plusieurs', + valeur: 'plusieurs', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Logement Traversant: oui', + valeur: 'oui', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '7', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: "Type d'installation de chauffage: Installation de chauffage simple", + valeur: 'Installation de chauffage simple', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Surface chauffée: 40,94 m²', + valeur: '40,94 m²', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + 'Type générateur: Electrique - Panneau rayonnant électrique NFC, NF** et NF***', + valeur: 'Electrique - Panneau rayonnant électrique NFC, NF** et NF***', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + 'Année installation générateur: 2015 (estimée en fonction de la marque et du modèle)', + valeur: '2015 (estimée en fonction de la marque et du modèle)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Energie utilisée: Electrique', + valeur: 'Electrique', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type émetteur: Panneau rayonnant électrique NFC, NF** et NF***', + valeur: 'Panneau rayonnant électrique NFC, NF** et NF***', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de chauffage: divisé', + valeur: 'divisé', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + 'Equipement intermittence: Avec intermittence pièce par pièce avec minimum de température', + valeur: 'Avec intermittence pièce par pièce avec minimum de température', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + }, + { + enum_categorie_fiche_technique_id: '8', + sous_fiche_technique_collection: { + sous_fiche_technique: [ + { + description: 'Nombre de niveaux desservis: 1', + valeur: 1, + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + 'Type générateur: Electrique - Ballon électrique à accumulation vertical (autres catégorie ou inconnue)', + valeur: + 'Electrique - Ballon électrique à accumulation vertical (autres catégorie ou inconnue)', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Année installation générateur: 1949', + valeur: 1949, + detail_origine_donnee: '', + enum_origine_donnee_id: '1' + }, + { + description: 'Energie utilisée: Electrique', + valeur: 'Electrique', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Chaudière murale: non', + valeur: 'non', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: + 'Type de distribution: production en volume habitable alimentant des pièces contiguës', + valeur: 'production en volume habitable alimentant des pièces contiguës', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Type de production: accumulation', + valeur: 'accumulation', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + }, + { + description: 'Volume de stockage: 50 L', + valeur: '50 L', + detail_origine_donnee: '', + enum_origine_donnee_id: '2' + } + ] + } + } + ] + }, + justificatif_collection: { + justificatif: { + description: 'PhDPE001', + enum_type_justificatif_id: '10' + } + }, + descriptif_geste_entretien_collection: { + descriptif_geste_entretien: [ + { + description: + "Vérifier la température d'eau du ballon (55°C-60°C) pour éviter le risque de développement de la légionnelle (en dessous de 50°C).", + enum_picto_geste_entretien_id: '9', + categorie_geste_entretien: 'Chauffe-eau' + }, + { + description: "Eteindre les lumières lorsque personne n'utilise la pièce.", + enum_picto_geste_entretien_id: '4', + categorie_geste_entretien: 'Eclairage' + }, + { + description: 'Faire vérifier les isolants et les compléter tous les 20 ans.', + enum_picto_geste_entretien_id: '13', + categorie_geste_entretien: 'Isolation' + }, + { + description: 'Ne jamais placer un meuble devant un émetteur de chaleur.', + enum_picto_geste_entretien_id: '3', + categorie_geste_entretien: 'Radiateur' + }, + { + description: + "Nettoyage et réglage de l'installation tous les 3 ans par un professionnel.", + enum_picto_geste_entretien_id: '1', + categorie_geste_entretien: 'Ventilation' + }, + { + description: 'Nettoyer régulièrement les bouches.', + enum_picto_geste_entretien_id: '1', + categorie_geste_entretien: 'Ventilation' + }, + { + description: 'Veiller à ouvrir les fenêtres de chaque pièce très régulièrement', + enum_picto_geste_entretien_id: '1', + categorie_geste_entretien: 'Ventilation' + } + ] + }, + descriptif_travaux: { + pack_travaux_collection: { + pack_travaux: [ + { + enum_num_pack_travaux_id: '1', + conso_5_usages_apres_travaux: 116, + emission_ges_5_usages_apres_travaux: 3, + cout_pack_travaux_min: 100, + cout_pack_travaux_max: 150, + travaux_collection: { + travaux: [ + { + description_travaux: + "Isolation des murs par l'intérieur.\nAvant d'isoler un mur, vérifier qu'il ne présente aucune trace d'humidité.", + enum_lot_travaux_id: '1', + avertissement_travaux: '', + performance_recommande: 'R > 4,5 m².K/W' + }, + { + description_travaux: + 'Remplacer le système actuel par un appareil de type pompe à chaleur.', + enum_lot_travaux_id: '6', + avertissement_travaux: '', + performance_recommande: 'COP = 3' + } + ] + } + }, + { + enum_num_pack_travaux_id: '3', + conso_5_usages_apres_travaux: 54, + emission_ges_5_usages_apres_travaux: 1, + cout_pack_travaux_min: 100, + cout_pack_travaux_max: 150, + travaux_collection: { + travaux: [ + { + description_travaux: + 'Remplacer les fenêtres par des fenêtres double vitrage à isolation renforcée.', + enum_lot_travaux_id: '4', + avertissement_travaux: '', + performance_recommande: 'Uw = 1,3 W/m².K, Sw = 0,42' + }, + { + description_travaux: + "Remplacer le système de chauffage par une pompe à chaleur air/air non réversible (la climatisation n'est pas considérée, en cas de mise en place votre étiquette énergie augmentera sensiblement).", + enum_lot_travaux_id: '5', + avertissement_travaux: '', + performance_recommande: 'SCOP = 4' + } + ] + } + } + ] + }, + commentaire_travaux: '' + } + }; + } +} diff --git a/tests/fixtures/errors/enveloppe.error.fixture.js b/tests/fixtures/errors/enveloppe.error.fixture.js new file mode 100644 index 0000000..2bbeb1e --- /dev/null +++ b/tests/fixtures/errors/enveloppe.error.fixture.js @@ -0,0 +1,17 @@ +import { ValidationErrorCode, ValidationErrorLevel } from '../../../src/core/domain/error.model.js'; + +export class EnveloppeErrorFixture { + /** + * @return {ValidationError} + */ + static anEnveloppeError() { + return { + code: ValidationErrorCode.UNSUPPORTED_VERSION, + level: ValidationErrorLevel.ERROR, + metadata: { + originalValue: '3', + expectedValue: '1' + } + }; + } +} diff --git a/tests/fixtures/errors/ventilation.error.fixture.js b/tests/fixtures/errors/ventilation.error.fixture.js new file mode 100644 index 0000000..557dfbb --- /dev/null +++ b/tests/fixtures/errors/ventilation.error.fixture.js @@ -0,0 +1,18 @@ +import { ValidationErrorCode, ValidationErrorLevel } from '../../../src/core/domain/error.model.js'; + +export class VentilationErrorFixture { + /** + * @return {ValidationError} + */ + static aVentilationError() { + return { + code: ValidationErrorCode.WRONG_PFE_ONCE, + level: ValidationErrorLevel.FATAL, + metadata: { + originalValue: 0, + expectedValue: 1, + property: 'plusieurs_facades_exposees' + } + }; + } +} diff --git a/types.d.ts b/types.d.ts deleted file mode 100644 index 4512dc5..0000000 --- a/types.d.ts +++ /dev/null @@ -1,551 +0,0 @@ -interface FullDpe { - numero_dpe: string; - statut: string; - administratif: Administratif; - logement: Logement; - descriptif_enr_collection: string; - descriptif_simplifie_collection: Descriptif_simplifie_collection; - fiche_technique_collection: Fiche_technique_collection; - justificatif_collection: Justificatif_collection; - descriptif_geste_entretien_collection: Descriptif_geste_entretien_collection; - descriptif_travaux: Descriptif_travaux; -} -interface Administratif { - dpe_a_remplacer: string; - motif_remplacement: string; - dpe_immeuble_associe: string; - enum_version_id: string; - date_visite_diagnostiqueur: string; - date_etablissement_dpe: string; - enum_modele_dpe_id: string; - diagnostiqueur: Diagnostiqueur; - geolocalisation: Geolocalisation; -} -interface Diagnostiqueur { - usr_logiciel_id: number; - version_logiciel: string; - version_moteur_calcul: string; -} -interface Geolocalisation { - invar_logement: string; - rpls_log_id: string; - rpls_org_id: string; - idpar: string; - immatriculation_copropriete: string; - adresses: Adresses; -} -interface Adresses { - adresse_bien: Adresse_bien; -} -interface Adresse_bien { - adresse_brut: string; - code_postal_brut: number; - nom_commune_brut: string; - label_brut: string; - enum_statut_geocodage_ban_id: string; - ban_date_appel: string; - ban_id: string; - ban_label: string; - ban_housenumber: number; - ban_street: string; - ban_citycode: number; - ban_postcode: number; - ban_city: string; - ban_type: string; - ban_score: number; - ban_x: number; - ban_y: number; - compl_nom_residence: string; - compl_ref_batiment: string; - compl_etage_appartement: number; - compl_ref_cage_escalier: string; - compl_ref_logement: string; -} -interface Logement { - caracteristique_generale: Caracteristique_generale; - meteo: Meteo; - enveloppe: Enveloppe; - ventilation_collection: Ventilation_collection; - climatisation_collection: string; - production_elec_enr: string; - installation_ecs_collection: Installation_ecs_collection; - installation_chauffage_collection: Installation_chauffage_collection; - sortie: Sortie; -} -interface Caracteristique_generale { - annee_construction: number; - enum_periode_construction_id: string; - enum_methode_application_dpe_log_id: string; - surface_habitable_logement: number; - nombre_niveau_logement: number; - hsp: number; - nombre_appartement: number; -} -interface Meteo { - enum_zone_climatique_id: string; - enum_classe_altitude_id: string; - batiment_materiaux_anciens: number; -} -interface Enveloppe { - inertie: Inertie; - mur_collection: Mur_collection; - plancher_bas_collection: Plancher_bas_collection; - plancher_haut_collection: Plancher_haut_collection; - baie_vitree_collection: Baie_vitree_collection; - porte_collection: Porte_collection; - ets_collection: string; - pont_thermique_collection: string; -} -interface Inertie { - inertie_plancher_bas_lourd: number; - inertie_plancher_haut_lourd: number; - inertie_paroi_verticale_lourd: number; - enum_classe_inertie_id: string; -} -interface Mur_collection { - mur: MurItem[]; -} -interface MurItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Donnee_entree { - description: string; - reference: string; - reference_lnc?: string; - tv_coef_reduction_deperdition_id?: number; - surface_aiu?: number; - surface_aue?: number; - enum_cfg_isolation_lnc_id?: string; - enum_type_adjacence_id?: string; - enum_orientation_id?: string; - surface_paroi_totale?: number; - surface_paroi_opaque?: number; - tv_umur0_id?: number; - enum_materiaux_structure_mur_id?: string; - enum_methode_saisie_u0_id?: string; - paroi_ancienne?: number; - enum_type_doublage_id?: string; - enum_type_isolation_id?: string; - epaisseur_isolation?: number; - enum_methode_saisie_u_id?: string; - tv_upb0_id?: number; - enum_type_plancher_bas_id?: string; - enum_periode_isolation_id?: string; - tv_upb_id?: number; - calcul_ue?: number; - tv_uph0_id?: number; - enum_type_plancher_haut_id?: string; - tv_uph_id?: number; - reference_paroi?: string; - surface_totale_baie?: number; - nb_baie?: number; - tv_ug_id?: number; - enum_type_vitrage_id?: string; - enum_inclinaison_vitrage_id?: string; - enum_type_gaz_lame_id?: string; - epaisseur_lame?: number; - vitrage_vir?: number; - enum_methode_saisie_perf_vitrage_id?: string; - tv_uw_id?: number; - enum_type_materiaux_menuiserie_id?: string; - enum_type_baie_id?: string; - double_fenetre?: number; - uw_1?: number; - sw_1?: number; - enum_type_fermeture_id?: string; - presence_retour_isolation?: number; - largeur_dormant?: number; - tv_sw_id?: number; - enum_type_pose_id?: string; - tv_coef_masque_proche_id?: number; - masque_lointain_non_homogene_collection?: string; - surface_porte?: number; - tv_uporte_id?: number; - enum_methode_saisie_uporte_id?: string; - enum_type_porte_id?: string; - nb_porte?: number; - surface_ventile?: number; - data_complementaires?: string; - plusieurs_facade_exposee?: number; - tv_q4pa_conv_id?: number; - enum_methode_saisie_q4pa_conv_id?: string; - tv_debits_ventilation_id?: number; - enum_type_ventilation_id?: string; - ventilation_post_2012?: number; - ref_produit_ventilation?: string; - enum_cfg_installation_ecs_id?: string; - enum_type_installation_id?: string; - enum_methode_calcul_conso_id?: string; - surface_habitable?: number; - nombre_logement?: number; - nombre_niveau_installation_ecs?: number; - tv_rendement_distribution_ecs_id?: number; - enum_bouclage_reseau_ecs_id?: string; - reference_generateur_mixte?: string; - enum_type_generateur_ecs_id?: string; - ref_produit_generateur_ecs?: string; - enum_usage_generateur_id?: string; - enum_type_energie_id?: string; - enum_methode_saisie_carac_sys_id?: string; - tv_pertes_stockage_id?: number; - identifiant_reseau_chaleur?: string; - enum_type_stockage_ecs_id?: string; - position_volume_chauffe?: number; - volume_stockage?: number; - surface_chauffee?: number; - nombre_niveau_installation_ch?: number; - enum_cfg_installation_ch_id?: string; - tv_rendement_emission_id?: number; - tv_rendement_distribution_ch_id?: number; - tv_rendement_regulation_id?: number; - enum_type_emission_distribution_id?: string; - tv_intermittence_id?: number; - reseau_distribution_isole?: number; - enum_equipement_intermittence_id?: string; - enum_type_regulation_id?: string; - enum_periode_installation_emetteur_id?: string; - enum_type_chauffage_id?: string; - enum_temp_distribution_ch_id?: string; - enum_lien_generateur_emetteur_id?: string; - ref_produit_generateur_ch?: string; - enum_type_generateur_ch_id?: string; - tv_rendement_generation_id?: number; -} -interface Donnee_intermediaire { - b?: number; - umur?: number; - umur0?: number; - upb?: number; - upb_final?: number; - upb0?: number; - uph?: number; - uph0?: number; - ug?: number; - uw?: number; - u_menuiserie?: number; - sw?: number; - fe1?: number; - fe2?: number; - uporte?: number; - pvent_moy?: number; - q4pa_conv?: number; - conso_auxiliaire_ventilation?: number; - hperm?: number; - hvent?: number; - rendement_distribution?: number; - besoin_ecs?: number; - besoin_ecs_depensier?: number; - conso_ecs?: number; - conso_ecs_depensier?: number; - ratio_besoin_ecs?: number; - rendement_generation?: number; - rendement_stockage?: number; - besoin_ch?: number; - besoin_ch_depensier?: number; - conso_ch?: number; - conso_ch_depensier?: number; - i0?: number; - rendement_emission?: number; - rendement_regulation?: number; -} -interface Plancher_bas_collection { - plancher_bas: PlancherBasItem[]; -} -interface PlancherBasItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Plancher_haut_collection { - plancher_haut: PlancherHautItem[]; -} -interface PlancherHautItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Baie_vitree_collection { - baie_vitree: BaieVitreeItem[]; -} -interface BaieVitreeItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Porte_collection { - porte: PorteItem[]; -} -interface PorteItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Ventilation_collection { - ventilation: VentilationItem[]; -} -interface VentilationItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Installation_ecs_collection { - installation_ecs: InstallationEcsItem[]; -} -interface InstallationEcsItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; - generateur_ecs_collection: Generateur_ecs_collection; -} -interface Generateur_ecs_collection { - generateur_ecs: GenerateurEcsItem[]; -} -interface GenerateurEcsItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Installation_chauffage_collection { - installation_chauffage: InstallationChauffageItem[]; -} -interface InstallationChauffageItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; - emetteur_chauffage_collection: Emetteur_chauffage_collection; - generateur_chauffage_collection: Generateur_chauffage_collection; -} -interface Emetteur_chauffage_collection { - emetteur_chauffage: EmetteurChauffageItem[]; -} -interface EmetteurChauffageItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Generateur_chauffage_collection { - generateur_chauffage: GenerateurChauffageItem[]; -} -interface GenerateurChauffageItem { - donnee_entree: Donnee_entree; - donnee_intermediaire: Donnee_intermediaire; -} -interface Sortie { - deperdition: Deperdition; - apport_et_besoin: Apport_et_besoin; - ef_conso: Ef_conso; - ep_conso: Ep_conso; - emission_ges: Emission_ges; - cout: Cout; - production_electricite: Production_electricite; - sortie_par_energie_collection: Sortie_par_energie_collection; - confort_ete: Confort_ete; - qualite_isolation: Qualite_isolation; -} -interface Deperdition { - hvent: number; - hperm: number; - deperdition_renouvellement_air: number; - deperdition_mur: number; - deperdition_plancher_bas: number; - deperdition_plancher_haut: number; - deperdition_baie_vitree: number; - deperdition_porte: number; - deperdition_pont_thermique: number; - deperdition_enveloppe: number; -} -interface Apport_et_besoin { - surface_sud_equivalente: number; - apport_solaire_fr: number; - apport_interne_fr: number; - apport_solaire_ch: number; - apport_interne_ch: number; - fraction_apport_gratuit_ch: number; - fraction_apport_gratuit_depensier_ch: number; - pertes_distribution_ecs_recup: number; - pertes_distribution_ecs_recup_depensier: number; - pertes_stockage_ecs_recup: number; - pertes_generateur_ch_recup: number; - pertes_generateur_ch_recup_depensier: number; - nadeq: number; - v40_ecs_journalier: number; - v40_ecs_journalier_depensier: number; - besoin_ch: number; - besoin_ch_depensier: number; - besoin_ecs: number; - besoin_ecs_depensier: number; - besoin_fr: number; - besoin_fr_depensier: number; -} -interface Ef_conso { - conso_ch: number; - conso_ch_depensier: number; - conso_ecs: number; - conso_ecs_depensier: number; - conso_eclairage: number; - conso_auxiliaire_generation_ch: number; - conso_auxiliaire_generation_ch_depensier: number; - conso_auxiliaire_distribution_ch: number; - conso_auxiliaire_generation_ecs: number; - conso_auxiliaire_generation_ecs_depensier: number; - conso_auxiliaire_distribution_ecs: number; - conso_auxiliaire_ventilation: number; - conso_totale_auxiliaire: number; - conso_fr: number; - conso_fr_depensier: number; - conso_5_usages: number; - conso_5_usages_m2: number; -} -interface Ep_conso { - ep_conso_ch: number; - ep_conso_ch_depensier: number; - ep_conso_ecs: number; - ep_conso_ecs_depensier: number; - ep_conso_eclairage: number; - ep_conso_auxiliaire_generation_ch: number; - ep_conso_auxiliaire_generation_ch_depensier: number; - ep_conso_auxiliaire_distribution_ch: number; - ep_conso_auxiliaire_generation_ecs: number; - ep_conso_auxiliaire_generation_ecs_depensier: number; - ep_conso_auxiliaire_distribution_ecs: number; - ep_conso_auxiliaire_ventilation: number; - ep_conso_totale_auxiliaire: number; - ep_conso_fr: number; - ep_conso_fr_depensier: number; - ep_conso_5_usages: number; - ep_conso_5_usages_m2: number; - classe_bilan_dpe: string; -} -interface Emission_ges { - emission_ges_ch: number; - emission_ges_ch_depensier: number; - emission_ges_ecs: number; - emission_ges_ecs_depensier: number; - emission_ges_eclairage: number; - emission_ges_auxiliaire_generation_ch: number; - emission_ges_auxiliaire_generation_ch_depensier: number; - emission_ges_auxiliaire_distribution_ch: number; - emission_ges_auxiliaire_generation_ecs: number; - emission_ges_auxiliaire_generation_ecs_depensier: number; - emission_ges_auxiliaire_distribution_ecs: number; - emission_ges_auxiliaire_ventilation: number; - emission_ges_totale_auxiliaire: number; - emission_ges_fr: number; - emission_ges_fr_depensier: number; - emission_ges_5_usages: number; - emission_ges_5_usages_m2: number; - classe_emission_ges: string; -} -interface Cout { - cout_ch: number; - cout_ch_depensier: number; - cout_ecs: number; - cout_ecs_depensier: number; - cout_eclairage: number; - cout_auxiliaire_generation_ch: number; - cout_auxiliaire_generation_ch_depensier: number; - cout_auxiliaire_distribution_ch: number; - cout_auxiliaire_generation_ecs: number; - cout_auxiliaire_generation_ecs_depensier: number; - cout_auxiliaire_distribution_ecs: number; - cout_auxiliaire_ventilation: number; - cout_total_auxiliaire: number; - cout_fr: number; - cout_fr_depensier: number; - cout_5_usages: number; -} -interface Production_electricite { - production_pv: number; - conso_elec_ac: number; - conso_elec_ac_ch: number; - conso_elec_ac_ecs: number; - conso_elec_ac_fr: number; - conso_elec_ac_eclairage: number; - conso_elec_ac_auxiliaire: number; - conso_elec_ac_autre_usage: number; -} -interface Sortie_par_energie_collection { - sortie_par_energie: SortieParEnergieItem[]; -} -interface SortieParEnergieItem { - enum_type_energie_id: string; - conso_ch: number; - conso_ecs: number; - conso_5_usages: number; - emission_ges_ch: number; - emission_ges_ecs: number; - emission_ges_5_usages: number; - cout_ch: number; - cout_ecs: number; - cout_5_usages: number; -} -interface Confort_ete { - isolation_toiture: number; - protection_solaire_exterieure: number; - aspect_traversant: number; - brasseur_air: number; - inertie_lourde: number; - enum_indicateur_confort_ete_id: string; -} -interface Qualite_isolation { - ubat: number; - qualite_isol_enveloppe: number; - qualite_isol_mur: number; - qualite_isol_plancher_haut_comble_perdu: number; - qualite_isol_plancher_bas: number; - qualite_isol_menuiserie: number; -} -interface Descriptif_simplifie_collection { - descriptif_simplifie: DescriptifSimplifieItem[]; -} -interface DescriptifSimplifieItem { - description: string; - enum_categorie_descriptif_simplifie_id: string; -} -interface Fiche_technique_collection { - fiche_technique: FicheTechniqueItem[]; -} -interface FicheTechniqueItem { - enum_categorie_fiche_technique_id: string; - sous_fiche_technique_collection: Sous_fiche_technique_collection; -} -interface Sous_fiche_technique_collection { - sous_fiche_technique: SousFicheTechniqueItem[]; -} -interface SousFicheTechniqueItem { - description: string; - valeur: string | number; - detail_origine_donnee: string; - enum_origine_donnee_id: string; -} -interface Justificatif_collection { - justificatif: Justificatif; -} -interface Justificatif { - description: string; - enum_type_justificatif_id: string; -} -interface Descriptif_geste_entretien_collection { - descriptif_geste_entretien: DescriptifGesteEntretienItem[]; -} -interface DescriptifGesteEntretienItem { - description: string; - enum_picto_geste_entretien_id: string; - categorie_geste_entretien: string; -} -interface Descriptif_travaux { - pack_travaux_collection: Pack_travaux_collection; - commentaire_travaux: string; -} -interface Pack_travaux_collection { - pack_travaux: PackTravauxItem[]; -} -interface PackTravauxItem { - enum_num_pack_travaux_id: string; - conso_5_usages_apres_travaux: number; - emission_ges_5_usages_apres_travaux: number; - cout_pack_travaux_min: number; - cout_pack_travaux_max: number; - travaux_collection: Travaux_collection; -} -interface Travaux_collection { - travaux: TravauxItem[]; -} -interface TravauxItem { - description_travaux: string; - enum_lot_travaux_id: string; - avertissement_travaux: string; - performance_recommande: string; -}