@open3cl/engine 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/11_nadeq.spec.js +3 -2
- package/16.2_production_enr.spec.js +1 -0
- package/3.2.1_mur.spec.js +1 -0
- package/3.2.2_plancher_bas.spec.js +1 -0
- package/3.3_baie_vitree.spec.js +1 -0
- package/6.1_apport_gratuit.spec.js +1 -0
- package/7_inertie.spec.js +4 -3
- package/9_chauffage.spec.js +1 -0
- package/9_conso_ch.spec.js +1 -0
- package/9_generateur_ch.spec.js +1 -0
- package/conso.spec.js +1 -0
- package/core/assets/domain/synchronize-assets.spec.js +9 -9
- package/core/assets/domain/synchronize-c1-tables.spec.js +4 -4
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +6 -6
- package/core/assets/domain/synchronize-enum-tables.spec.js +10 -10
- package/core/assets/domain/synchronize-solicitations-tables.spec.js +6 -6
- package/core/assets/domain/synchronize-valeur-tables.spec.js +14 -14
- package/core/file/infrastructure/adapter/file.store.spec.js +5 -4
- package/core/tv/infrastructure/tvs.store.spec.js +3 -2
- package/core/util/infrastructure/object-util.spec.js +2 -1
- package/core/util/logger/log-service.js +47 -0
- package/features/dpe/domain/models/baie-ets.model.ts +12 -0
- package/features/dpe/domain/models/baie-vitree.model.ts +95 -0
- package/features/dpe/domain/models/climatisation.model.ts +25 -0
- package/features/dpe/domain/models/dpe.model.ts +194 -0
- package/features/dpe/domain/models/ets.model.ts +19 -0
- package/features/dpe/domain/models/installation-chauffage.model.ts +101 -0
- package/features/dpe/domain/models/installation-ecs.model.ts +76 -0
- package/features/dpe/domain/models/mur.model.ts +37 -0
- package/features/dpe/domain/models/plancher-bas.model.ts +38 -0
- package/features/dpe/domain/models/plancher-haut.model.ts +33 -0
- package/features/dpe/domain/models/pont-thermique.model.ts +21 -0
- package/features/dpe/domain/models/porte.model.ts +31 -0
- package/features/dpe/domain/models/production-elec-enr.model.ts +27 -0
- package/features/dpe/domain/models/sortie.model.ts +178 -0
- package/features/dpe/domain/models/type-habitation.model.js +8 -0
- package/features/dpe/domain/models/type-ventilation.model.js +8 -0
- package/features/dpe/domain/models/ventilation.model.ts +33 -0
- package/features/dpe/infrastructure/tv.store.js +389 -0
- package/features/dpe/infrastructure/tv.store.spec.js +690 -0
- package/features/engine/domain/constants.js +1 -0
- package/features/engine/domain/contexte.builder.js +140 -0
- package/features/engine/domain/contexte.builder.spec.js +152 -0
- package/features/engine/domain/engine.service.js +139 -0
- package/features/engine/domain/engine.service.spec.js +7 -0
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +262 -0
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +282 -0
- package/features/engine/domain/enveloppe/deperdition.service.js +101 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +168 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +345 -0
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +169 -0
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +200 -0
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +136 -0
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +211 -0
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +56 -0
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +116 -0
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +338 -0
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +393 -0
- package/features/engine/domain/models/contexte.model.ts +10 -0
- package/features/engine/domain/models/deperdition.model.ts +8 -0
- package/features/normalizer/domain/dpe-normalizer.service.js +24 -0
- package/features/normalizer/domain/dpe-normalizer.service.spec.js +3 -0
- package/ficheTechnique.spec.js +4 -3
- package/output.js +1 -0
- package/package.json +9 -8
- package/tv-v2.js +79121 -0
- package/utils.js +4 -8
- package/utils.spec.js +4 -3
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
export interface Sortie {
|
|
2
|
+
deperdition: Deperdition;
|
|
3
|
+
apport_et_besoin: ApportEtBesoin;
|
|
4
|
+
ef_conso: EfConso;
|
|
5
|
+
ep_conso: EpConso;
|
|
6
|
+
emission_ges: EmissionGes;
|
|
7
|
+
cout: Cout;
|
|
8
|
+
production_electricite: ProductionElectricite;
|
|
9
|
+
sortie_par_energie_collection: { sortie_par_energie: SortieParEnergie[] };
|
|
10
|
+
confort_ete?: ConfortEte;
|
|
11
|
+
qualite_isolation: QualiteIsolation;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface Deperdition {
|
|
15
|
+
hvent: number;
|
|
16
|
+
hperm: number;
|
|
17
|
+
deperdition_renouvellement_air: number;
|
|
18
|
+
deperdition_mur: number;
|
|
19
|
+
deperdition_plancher_bas: number;
|
|
20
|
+
deperdition_plancher_haut: number;
|
|
21
|
+
deperdition_baie_vitree: number;
|
|
22
|
+
deperdition_porte: number;
|
|
23
|
+
deperdition_pont_thermique: number;
|
|
24
|
+
deperdition_enveloppe: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ApportEtBesoin {
|
|
28
|
+
surface_sud_equivalente: number;
|
|
29
|
+
apport_solaire_fr: number;
|
|
30
|
+
apport_interne_fr: number;
|
|
31
|
+
apport_solaire_ch: number;
|
|
32
|
+
apport_interne_ch: number;
|
|
33
|
+
fraction_apport_gratuit_ch: number;
|
|
34
|
+
fraction_apport_gratuit_depensier_ch: number;
|
|
35
|
+
pertes_distribution_ecs_recup: number;
|
|
36
|
+
pertes_distribution_ecs_recup_depensier: number;
|
|
37
|
+
pertes_stockage_ecs_recup: number;
|
|
38
|
+
pertes_generateur_ch_recup: number;
|
|
39
|
+
pertes_generateur_ch_recup_depensier: number;
|
|
40
|
+
nadeq: number;
|
|
41
|
+
v40_ecs_journalier: number;
|
|
42
|
+
v40_ecs_journalier_depensier: number;
|
|
43
|
+
besoin_ch: number;
|
|
44
|
+
besoin_ch_depensier: number;
|
|
45
|
+
besoin_ecs: number;
|
|
46
|
+
besoin_ecs_depensier: number;
|
|
47
|
+
besoin_fr: number;
|
|
48
|
+
besoin_fr_depensier: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface EfConso {
|
|
52
|
+
conso_ch: number;
|
|
53
|
+
conso_ch_depensier: number;
|
|
54
|
+
conso_ecs: number;
|
|
55
|
+
conso_ecs_depensier: number;
|
|
56
|
+
conso_eclairage: number;
|
|
57
|
+
conso_auxiliaire_generation_ch: number;
|
|
58
|
+
conso_auxiliaire_generation_ch_depensier: number;
|
|
59
|
+
conso_auxiliaire_distribution_ch: number;
|
|
60
|
+
conso_auxiliaire_generation_ecs: number;
|
|
61
|
+
conso_auxiliaire_generation_ecs_depensier: number;
|
|
62
|
+
conso_auxiliaire_distribution_ecs: number;
|
|
63
|
+
conso_auxiliaire_distribution_fr?: number;
|
|
64
|
+
conso_auxiliaire_ventilation: number;
|
|
65
|
+
conso_totale_auxiliaire: number;
|
|
66
|
+
conso_fr: number;
|
|
67
|
+
conso_fr_depensier: number;
|
|
68
|
+
conso_5_usages: number;
|
|
69
|
+
conso_5_usages_m2: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface EpConso {
|
|
73
|
+
ep_conso_ch: number;
|
|
74
|
+
ep_conso_ch_depensier: number;
|
|
75
|
+
ep_conso_ecs: number;
|
|
76
|
+
ep_conso_ecs_depensier: number;
|
|
77
|
+
ep_conso_eclairage: number;
|
|
78
|
+
ep_conso_auxiliaire_generation_ch: number;
|
|
79
|
+
ep_conso_auxiliaire_generation_ch_depensier: number;
|
|
80
|
+
ep_conso_auxiliaire_distribution_ch: number;
|
|
81
|
+
ep_conso_auxiliaire_generation_ecs: number;
|
|
82
|
+
ep_conso_auxiliaire_generation_ecs_depensier: number;
|
|
83
|
+
ep_conso_auxiliaire_distribution_ecs: number;
|
|
84
|
+
ep_conso_auxiliaire_distribution_fr?: number;
|
|
85
|
+
ep_conso_auxiliaire_ventilation: number;
|
|
86
|
+
ep_conso_totale_auxiliaire: number;
|
|
87
|
+
ep_conso_fr: number;
|
|
88
|
+
ep_conso_fr_depensier: number;
|
|
89
|
+
ep_conso_5_usages: number;
|
|
90
|
+
ep_conso_5_usages_m2: number;
|
|
91
|
+
classe_bilan_dpe: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface EmissionGes {
|
|
95
|
+
emission_ges_ch: number;
|
|
96
|
+
emission_ges_ch_depensier: number;
|
|
97
|
+
emission_ges_ecs: number;
|
|
98
|
+
emission_ges_ecs_depensier: number;
|
|
99
|
+
emission_ges_eclairage: number;
|
|
100
|
+
emission_ges_auxiliaire_generation_ch: number;
|
|
101
|
+
emission_ges_auxiliaire_generation_ch_depensier: number;
|
|
102
|
+
emission_ges_auxiliaire_distribution_ch: number;
|
|
103
|
+
emission_ges_auxiliaire_generation_ecs: number;
|
|
104
|
+
emission_ges_auxiliaire_generation_ecs_depensier: number;
|
|
105
|
+
emission_ges_auxiliaire_distribution_ecs: number;
|
|
106
|
+
emission_ges_auxiliaire_distribution_fr?: number;
|
|
107
|
+
emission_ges_auxiliaire_ventilation: number;
|
|
108
|
+
emission_ges_totale_auxiliaire: number;
|
|
109
|
+
emission_ges_fr: number;
|
|
110
|
+
emission_ges_fr_depensier: number;
|
|
111
|
+
emission_ges_5_usages: number;
|
|
112
|
+
emission_ges_5_usages_m2: number;
|
|
113
|
+
classe_emission_ges: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface Cout {
|
|
117
|
+
cout_ch: number;
|
|
118
|
+
cout_ch_depensier: number;
|
|
119
|
+
cout_ecs: number;
|
|
120
|
+
cout_ecs_depensier: number;
|
|
121
|
+
cout_eclairage: number;
|
|
122
|
+
cout_auxiliaire_generation_ch: number;
|
|
123
|
+
cout_auxiliaire_generation_ch_depensier: number;
|
|
124
|
+
cout_auxiliaire_distribution_ch: number;
|
|
125
|
+
cout_auxiliaire_generation_ecs: number;
|
|
126
|
+
cout_auxiliaire_generation_ecs_depensier: number;
|
|
127
|
+
cout_auxiliaire_distribution_ecs: number;
|
|
128
|
+
cout_auxiliaire_distribution_fr?: number;
|
|
129
|
+
cout_auxiliaire_ventilation: number;
|
|
130
|
+
cout_total_auxiliaire: number;
|
|
131
|
+
cout_fr: number;
|
|
132
|
+
cout_fr_depensier: number;
|
|
133
|
+
cout_5_usages: number;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface ProductionElectricite {
|
|
137
|
+
production_pv: number;
|
|
138
|
+
conso_elec_ac: number;
|
|
139
|
+
conso_elec_ac_ch: number;
|
|
140
|
+
conso_elec_ac_ecs: number;
|
|
141
|
+
conso_elec_ac_fr: number;
|
|
142
|
+
conso_elec_ac_eclairage: number;
|
|
143
|
+
conso_elec_ac_auxiliaire: number;
|
|
144
|
+
conso_elec_ac_autre_usage: number;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface SortieParEnergie {
|
|
148
|
+
enum_type_energie_id: number;
|
|
149
|
+
conso_ch: number;
|
|
150
|
+
conso_ecs: number;
|
|
151
|
+
conso_5_usages: number;
|
|
152
|
+
emission_ges_ch: number;
|
|
153
|
+
emission_ges_ecs: number;
|
|
154
|
+
emission_ges_5_usages: number;
|
|
155
|
+
cout_ch: number;
|
|
156
|
+
cout_ecs: number;
|
|
157
|
+
cout_5_usages: number;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface ConfortEte {
|
|
161
|
+
isolation_toiture?: boolean;
|
|
162
|
+
protection_solaire_exterieure: boolean;
|
|
163
|
+
aspect_traversant?: boolean;
|
|
164
|
+
brasseur_air?: boolean;
|
|
165
|
+
inertie_lourde: boolean;
|
|
166
|
+
enum_indicateur_confort_ete_id: number;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface QualiteIsolation {
|
|
170
|
+
ubat: number;
|
|
171
|
+
qualite_isol_enveloppe: number;
|
|
172
|
+
qualite_isol_mur?: number;
|
|
173
|
+
qualite_isol_plancher_haut_toit_terrasse?: number;
|
|
174
|
+
qualite_isol_plancher_haut_comble_perdu?: number;
|
|
175
|
+
qualite_isol_plancher_haut_comble_amenage?: number;
|
|
176
|
+
qualite_isol_plancher_bas?: number;
|
|
177
|
+
qualite_isol_menuiserie: number;
|
|
178
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DE } from './dpe.model';
|
|
2
|
+
|
|
3
|
+
export interface Ventilation {
|
|
4
|
+
donnee_entree?: VentilationDE;
|
|
5
|
+
donnee_intermediaire?: VentilationDI;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface VentilationDE extends DE {
|
|
9
|
+
enum_type_ventilation_id: number;
|
|
10
|
+
surface_ventile: number;
|
|
11
|
+
plusieurs_facade_exposee: boolean;
|
|
12
|
+
tv_q4pa_conv_id?: number;
|
|
13
|
+
q4pa_conv_saisi?: number;
|
|
14
|
+
enum_methode_saisie_q4pa_conv_id: number;
|
|
15
|
+
tv_debits_ventilation_id: number;
|
|
16
|
+
ventilation_post_2012: boolean;
|
|
17
|
+
ref_produit_ventilation?: number;
|
|
18
|
+
cle_repartition_ventilation?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface VentilationDI {
|
|
22
|
+
pvent_moy?: number;
|
|
23
|
+
q4pa_conv: number;
|
|
24
|
+
conso_auxiliaire_ventilation: number;
|
|
25
|
+
hperm: number;
|
|
26
|
+
hvent: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
enum TypeVentilation {
|
|
30
|
+
SIMPLE_FLUX_AUTO = 'SIMPLE_FLUX_AUTO',
|
|
31
|
+
SIMPLE_FLUX_HYGRO = 'SIMPLE_FLUX_HYGRO',
|
|
32
|
+
DOUBLE_FLUX = 'DOUBLE_FLUX'
|
|
33
|
+
}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { tvs as tv } from '../../../tv-v2.js';
|
|
2
|
+
import { getRange } from '../../../utils.js';
|
|
3
|
+
import { logger } from '../../../core/util/logger/log-service.js';
|
|
4
|
+
import { TypeHabitation } from '../domain/models/type-habitation.model.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Accès aux données des tables de valeurs
|
|
8
|
+
*
|
|
9
|
+
* /!\ Les tableaux des valeurs doivent souvent être ordonnés (ex: epaisseur_structure pour umur0)
|
|
10
|
+
*/
|
|
11
|
+
export class TvStore {
|
|
12
|
+
/**
|
|
13
|
+
* Coefficients U des portes
|
|
14
|
+
* Si le coefficient U des portes est connu et justifié, le saisir directement. Sinon, prendre les valeurs forfaitaires
|
|
15
|
+
*
|
|
16
|
+
* @see Chapitre 3.3.4
|
|
17
|
+
*
|
|
18
|
+
* @param enumTypePorteId {string} Identifiant du type de porte
|
|
19
|
+
* @return {number|undefined} Uporte si trouvé, sinon undefined
|
|
20
|
+
*/
|
|
21
|
+
getUPorte(enumTypePorteId) {
|
|
22
|
+
const uPorte = tv['uporte'].find((v) =>
|
|
23
|
+
v.enum_type_porte_id.split('|').includes(enumTypePorteId)
|
|
24
|
+
)?.uporte;
|
|
25
|
+
|
|
26
|
+
if (!uPorte) {
|
|
27
|
+
logger.error(`Pas de valeur forfaitaire uPorte pour enumTypePorteId:${enumTypePorteId}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
logger.debug(`uPorte pour type ${enumTypePorteId} = ${uPorte}`);
|
|
32
|
+
return parseFloat(uPorte);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Coefficient de réduction des déperditions b
|
|
37
|
+
* @param enumTypeAdjacenceId {string}
|
|
38
|
+
* @param uVue {number|undefined}
|
|
39
|
+
* @param enumCfgIsolationLncId {string|undefined}
|
|
40
|
+
* @param rAiuAue {number|undefined}
|
|
41
|
+
* @param zc {string|undefined}
|
|
42
|
+
* @return {number|undefined}
|
|
43
|
+
*/
|
|
44
|
+
getB(
|
|
45
|
+
enumTypeAdjacenceId,
|
|
46
|
+
uVue = undefined,
|
|
47
|
+
enumCfgIsolationLncId = undefined,
|
|
48
|
+
rAiuAue = undefined,
|
|
49
|
+
zc = undefined
|
|
50
|
+
) {
|
|
51
|
+
const b = tv['coef_reduction_deperdition'].find(
|
|
52
|
+
(v) =>
|
|
53
|
+
(!enumTypeAdjacenceId ||
|
|
54
|
+
v.enum_type_adjacence_id.split('|').includes(enumTypeAdjacenceId)) &&
|
|
55
|
+
(!uVue || !v.uvue || parseFloat(v.uvue) === uVue) &&
|
|
56
|
+
(!enumCfgIsolationLncId ||
|
|
57
|
+
!v.enum_cfg_isolation_lnc_id ||
|
|
58
|
+
v.enum_cfg_isolation_lnc_id === enumCfgIsolationLncId) &&
|
|
59
|
+
(!zc ||
|
|
60
|
+
!v.zone_climatique ||
|
|
61
|
+
zc.toLowerCase().startsWith(v.zone_climatique.toLowerCase())) &&
|
|
62
|
+
(!rAiuAue ||
|
|
63
|
+
((!v.aiu_aue_min || v.aiu_aue_min < rAiuAue) &&
|
|
64
|
+
(!v.aiu_aue_max || v.aiu_aue_max >= rAiuAue)))
|
|
65
|
+
)?.b;
|
|
66
|
+
|
|
67
|
+
if (!b) {
|
|
68
|
+
logger.error(`Pas de valeur forfaitaire b pour enumTypeAdjacenceId:${enumTypeAdjacenceId}`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
logger.debug(`b pour enumTypeAdjacenceId ${enumTypeAdjacenceId} = ${b}`);
|
|
73
|
+
return parseFloat(b);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Coefficient surfacique équivalent
|
|
78
|
+
* @param enumTypeAdjacenceId {string}
|
|
79
|
+
* @return {number|undefined}
|
|
80
|
+
*/
|
|
81
|
+
getUVue(enumTypeAdjacenceId) {
|
|
82
|
+
const uvue = tv['uvue'].find((v) => v.enum_type_adjacence_id === enumTypeAdjacenceId)?.uvue;
|
|
83
|
+
|
|
84
|
+
if (!uvue) {
|
|
85
|
+
logger.error(
|
|
86
|
+
`Pas de valeur forfaitaire uVue pour enumTypeAdjacenceId:${enumTypeAdjacenceId}`
|
|
87
|
+
);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
logger.debug(`uvue pour enumTypeAdjacenceId ${enumTypeAdjacenceId} = ${uvue}`);
|
|
92
|
+
return parseFloat(uvue);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Coefficient de transmission thermique du mur non isolé
|
|
97
|
+
* @param enumMateriauxStructureMurId {string}
|
|
98
|
+
* @param epaisseurStructure {number|undefined}
|
|
99
|
+
* @return {number|undefined}
|
|
100
|
+
*/
|
|
101
|
+
getUmur0(enumMateriauxStructureMurId, epaisseurStructure = undefined) {
|
|
102
|
+
const umur0 = tv['umur0']
|
|
103
|
+
.filter((v) => v.enum_materiaux_structure_mur_id === enumMateriauxStructureMurId)
|
|
104
|
+
.find(
|
|
105
|
+
(v, idx, items) =>
|
|
106
|
+
!v.epaisseur_structure ||
|
|
107
|
+
!epaisseurStructure ||
|
|
108
|
+
!items[idx + 1] ||
|
|
109
|
+
epaisseurStructure < parseFloat(items[idx + 1].epaisseur_structure)
|
|
110
|
+
)?.umur0;
|
|
111
|
+
|
|
112
|
+
if (!umur0) {
|
|
113
|
+
logger.error(
|
|
114
|
+
`Pas de valeur forfaitaire umur0 pour enumMateriauxStructureMurId:${enumMateriauxStructureMurId}`
|
|
115
|
+
);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
logger.debug(
|
|
120
|
+
`umur0 pour enumMateriauxStructureMurId ${enumMateriauxStructureMurId} = ${umur0}`
|
|
121
|
+
);
|
|
122
|
+
return parseFloat(umur0);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Coefficient de transmission thermique du mur
|
|
127
|
+
* @param enumPeriodeConstructionId {string}
|
|
128
|
+
* @param enumZoneClimatiqueId {string}
|
|
129
|
+
* @param effetJoule {boolean}
|
|
130
|
+
* @return {number|undefined}
|
|
131
|
+
*/
|
|
132
|
+
getUmur(enumPeriodeConstructionId, enumZoneClimatiqueId, effetJoule = false) {
|
|
133
|
+
const umur = tv['umur'].find(
|
|
134
|
+
(v) =>
|
|
135
|
+
v.enum_periode_construction_id.split('|').includes(enumPeriodeConstructionId) &&
|
|
136
|
+
v.enum_zone_climatique_id.split('|').includes(enumZoneClimatiqueId) &&
|
|
137
|
+
effetJoule === (parseInt(v.effet_joule) === 1)
|
|
138
|
+
)?.umur;
|
|
139
|
+
|
|
140
|
+
if (!umur) {
|
|
141
|
+
logger.error(
|
|
142
|
+
`Pas de valeur forfaitaire umur pour enumPeriodeConstructionId:${enumPeriodeConstructionId}, enumPeriodeConstructionId:${enumPeriodeConstructionId}`
|
|
143
|
+
);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
logger.debug(
|
|
148
|
+
`umur pour enumPeriodeConstructionId:${enumPeriodeConstructionId}, enumPeriodeConstructionId:${enumPeriodeConstructionId} = ${umur}`
|
|
149
|
+
);
|
|
150
|
+
return parseFloat(umur);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Coefficient de transmission thermique du plancher bas
|
|
155
|
+
* @param enumTypePlancherBasId {string}
|
|
156
|
+
* @return {number|undefined}
|
|
157
|
+
*/
|
|
158
|
+
getUpb0(enumTypePlancherBasId) {
|
|
159
|
+
const upbO = tv['upb0'].find(
|
|
160
|
+
(v) => v.enum_type_plancher_bas_id === enumTypePlancherBasId
|
|
161
|
+
)?.upb0;
|
|
162
|
+
|
|
163
|
+
if (!upbO) {
|
|
164
|
+
logger.error(
|
|
165
|
+
`Pas de valeur forfaitaire upbO pour enumTypePlancherBasId:${enumTypePlancherBasId}`
|
|
166
|
+
);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
logger.debug(`upbO pour enumTypePlancherBasId ${enumTypePlancherBasId} = ${upbO}`);
|
|
171
|
+
return parseFloat(upbO);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Coefficient de transmission thermique du plancher bas
|
|
176
|
+
* @param enumPeriodeConstructionId {string}
|
|
177
|
+
* @param enumZoneClimatiqueId {string}
|
|
178
|
+
* @param effetJoule {boolean}
|
|
179
|
+
* @return {number|undefined}
|
|
180
|
+
*/
|
|
181
|
+
getUpb(enumPeriodeConstructionId, enumZoneClimatiqueId, effetJoule = false) {
|
|
182
|
+
const upb = tv['upb'].find(
|
|
183
|
+
(v) =>
|
|
184
|
+
v.enum_zone_climatique_id.split('|').includes(enumZoneClimatiqueId) &&
|
|
185
|
+
v.enum_periode_construction_id.split('|').includes(enumPeriodeConstructionId) &&
|
|
186
|
+
effetJoule === (parseInt(v.effet_joule) === 1)
|
|
187
|
+
)?.upb;
|
|
188
|
+
|
|
189
|
+
if (!upb) {
|
|
190
|
+
logger.error(
|
|
191
|
+
`Pas de valeur forfaitaire upb pour enumPeriodeConstructionId:${enumPeriodeConstructionId}, enumPeriodeConstructionId:${enumPeriodeConstructionId}`
|
|
192
|
+
);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
logger.debug(
|
|
197
|
+
`upb pour enumPeriodeConstructionId:${enumPeriodeConstructionId}, enumPeriodeConstructionId:${enumPeriodeConstructionId} = ${upb}`
|
|
198
|
+
);
|
|
199
|
+
return parseFloat(upb);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Retourne la valeur UE la plus proche
|
|
204
|
+
* @param enumTypeAdjacenceId {string}
|
|
205
|
+
* @param enumPeriodeConstructionId {string}
|
|
206
|
+
* @param dsp {number} Valeur entière la plus proche de 2S/P
|
|
207
|
+
* @param upb {number} Valeur de upb
|
|
208
|
+
* @return {number|undefined}
|
|
209
|
+
*/
|
|
210
|
+
getUeByUpd(enumTypeAdjacenceId, enumPeriodeConstructionId, dsp, upb) {
|
|
211
|
+
const ueValues =
|
|
212
|
+
tv['ue'].filter(
|
|
213
|
+
(v) =>
|
|
214
|
+
parseInt(v['2s_p']) === dsp &&
|
|
215
|
+
v.enum_type_adjacence_id.split('|').includes(enumTypeAdjacenceId) &&
|
|
216
|
+
v.enum_periode_construction_id.split('|').includes(enumPeriodeConstructionId)
|
|
217
|
+
) || [];
|
|
218
|
+
|
|
219
|
+
const ueRange = [...new Set(ueValues.map((value) => value.upb).sort())];
|
|
220
|
+
let ue;
|
|
221
|
+
let upb1, upb2;
|
|
222
|
+
|
|
223
|
+
if (ueValues.length) {
|
|
224
|
+
[upb1, upb2] = getRange(upb, ueRange);
|
|
225
|
+
|
|
226
|
+
const ue1 = ueValues.find((value) => value.upb === upb1)?.ue || 0;
|
|
227
|
+
const ue2 = ueValues.find((value) => value.upb === upb2)?.ue || 0;
|
|
228
|
+
|
|
229
|
+
const delta_ue = Number(ue2) - Number(ue1);
|
|
230
|
+
const delta_upb = upb2 - upb1 || 0;
|
|
231
|
+
|
|
232
|
+
if (delta_upb === 0) {
|
|
233
|
+
ue = Number(ue1);
|
|
234
|
+
} else {
|
|
235
|
+
// Interpolation linéaire si upb n'est pas une valeur connue
|
|
236
|
+
ue = Number(ue1) + (delta_ue * (upb - upb1)) / delta_upb;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (ue === undefined) {
|
|
241
|
+
logger.error(
|
|
242
|
+
`Pas de valeur forfaitaire ue pour enumTypeAdjacenceId:${enumTypeAdjacenceId}, enumPeriodeConstructionId:${enumPeriodeConstructionId}, 2S/P:${dsp}`
|
|
243
|
+
);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
logger.debug(
|
|
248
|
+
`ue pour enumTypeAdjacenceId:${enumTypeAdjacenceId}, enumPeriodeConstructionId:${enumPeriodeConstructionId}, 2S/P:${dsp} = ${ue}`
|
|
249
|
+
);
|
|
250
|
+
return parseFloat(ue);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Coefficient de transmission thermique du plancher haut
|
|
255
|
+
* @param enumTypePlancherHautId {string}
|
|
256
|
+
* @return {number|undefined}
|
|
257
|
+
*/
|
|
258
|
+
getUph0(enumTypePlancherHautId) {
|
|
259
|
+
const uph0 = tv['uph0'].find((v) =>
|
|
260
|
+
v.enum_type_plancher_haut_id.split('|').includes(enumTypePlancherHautId)
|
|
261
|
+
)?.uph0;
|
|
262
|
+
|
|
263
|
+
if (!uph0) {
|
|
264
|
+
logger.error(
|
|
265
|
+
`Pas de valeur forfaitaire uph0 pour enumTypePlancherHautId:${enumTypePlancherHautId}`
|
|
266
|
+
);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
logger.debug(`upbO pour enumTypePlancherHautId ${enumTypePlancherHautId} = ${uph0}`);
|
|
271
|
+
return parseFloat(uph0);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Coefficient de transmission thermique du plancher bas
|
|
276
|
+
* @param enumPeriodeConstructionId {string}
|
|
277
|
+
* @param typeToiture {('combles'|'terrasse')}
|
|
278
|
+
* @param enumZoneClimatiqueId {string}
|
|
279
|
+
* @param effetJoule {boolean}
|
|
280
|
+
* @return {number|undefined}
|
|
281
|
+
*/
|
|
282
|
+
getUph(enumPeriodeConstructionId, typeToiture, enumZoneClimatiqueId, effetJoule = false) {
|
|
283
|
+
const uph = tv['uph'].find(
|
|
284
|
+
(v) =>
|
|
285
|
+
v.enum_periode_construction_id.split('|').includes(enumPeriodeConstructionId) &&
|
|
286
|
+
v.enum_zone_climatique_id.split('|').includes(enumZoneClimatiqueId) &&
|
|
287
|
+
v.type_toiture === typeToiture &&
|
|
288
|
+
effetJoule === (parseInt(v.effet_joule) === 1)
|
|
289
|
+
)?.uph;
|
|
290
|
+
|
|
291
|
+
if (!uph) {
|
|
292
|
+
logger.error(
|
|
293
|
+
`Pas de valeur forfaitaire uph pour enumPeriodeConstructionId:${enumPeriodeConstructionId}, enumPeriodeConstructionId:${enumPeriodeConstructionId}, typeToiture:${typeToiture}`
|
|
294
|
+
);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
logger.debug(
|
|
299
|
+
`uph pour enumPeriodeConstructionId:${enumPeriodeConstructionId}, enumPeriodeConstructionId:${enumPeriodeConstructionId}, typeToiture:${typeToiture} = ${uph}`
|
|
300
|
+
);
|
|
301
|
+
return parseFloat(uph);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Coefficient de transmission thermique du plancher bas
|
|
306
|
+
* @param enumTypeVitrageId {string}
|
|
307
|
+
* @param enumTypeGazLameId {string|undefined}
|
|
308
|
+
* @param enumInclinaisonVitrageId {string|undefined}
|
|
309
|
+
* @param vitrageVir {boolean|undefined}
|
|
310
|
+
* @param epaisseurLame {number|undefined}
|
|
311
|
+
* @return {number|undefined}
|
|
312
|
+
*/
|
|
313
|
+
getUg(enumTypeVitrageId, enumTypeGazLameId, enumInclinaisonVitrageId, vitrageVir, epaisseurLame) {
|
|
314
|
+
const ug = tv['ug'].find(
|
|
315
|
+
(v) =>
|
|
316
|
+
v.enum_type_vitrage_id.split('|').includes(enumTypeVitrageId) &&
|
|
317
|
+
(!enumInclinaisonVitrageId ||
|
|
318
|
+
v.enum_inclinaison_vitrage_id.split('|').includes(enumInclinaisonVitrageId)) &&
|
|
319
|
+
(!enumTypeGazLameId || v.enum_type_gaz_lame_id.split('|').includes(enumTypeGazLameId)) &&
|
|
320
|
+
(!epaisseurLame || parseFloat(v.epaisseur_lame) === epaisseurLame) &&
|
|
321
|
+
(!vitrageVir || vitrageVir === (parseInt(v.vitrage_vir) === 1))
|
|
322
|
+
)?.ug;
|
|
323
|
+
|
|
324
|
+
if (!ug) {
|
|
325
|
+
logger.error(
|
|
326
|
+
`Pas de valeur forfaitaire ug pour enumTypeVitrageId:${enumTypeVitrageId}, enumTypeGazLameId:${enumTypeGazLameId}, enumInclinaisonVitrageId:${enumInclinaisonVitrageId}, vitrageVir:${vitrageVir}, epaisseurLame:${epaisseurLame}`
|
|
327
|
+
);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
logger.debug(
|
|
332
|
+
`ug pour enumTypeVitrageId:${enumTypeVitrageId}, enumTypeGazLameId:${enumTypeGazLameId}, enumInclinaisonVitrageId:${enumInclinaisonVitrageId}, vitrageVir:${vitrageVir}, epaisseurLame:${epaisseurLame} = ${ug}`
|
|
333
|
+
);
|
|
334
|
+
return parseFloat(ug);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Débits de la ventilation
|
|
339
|
+
* @param typeVentilation {number}
|
|
340
|
+
* @return {object|undefined}
|
|
341
|
+
*/
|
|
342
|
+
getDebitsVentilation(typeVentilation) {
|
|
343
|
+
const debitsVentilation = tv['debits_ventilation'].find((v) =>
|
|
344
|
+
v.enum_type_ventilation_id.split('|').includes(typeVentilation)
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
if (!debitsVentilation) {
|
|
348
|
+
logger.error(
|
|
349
|
+
`Pas de valeur forfaitaire debits_ventilation pour enumTypeVentilationId: ${typeVentilation}`
|
|
350
|
+
);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return debitsVentilation;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Valeur conventionnelle de la perméabilité sous 4Pa
|
|
359
|
+
* @see Chapitre 4 - Calcul des déperditions par renouvellement d’air
|
|
360
|
+
*
|
|
361
|
+
* @param periodConstruction {string}
|
|
362
|
+
* @param typeHabitation {TypeHabitation}
|
|
363
|
+
* @param isolationSurface {string | undefined}
|
|
364
|
+
* @param presenceJointsMenuiserie {string | undefined}
|
|
365
|
+
*
|
|
366
|
+
* @return {object|undefined}
|
|
367
|
+
*/
|
|
368
|
+
getQ4paConv(periodConstruction, typeHabitation, isolationSurface, presenceJointsMenuiserie) {
|
|
369
|
+
const q4paConv = tv['q4pa_conv'].find(
|
|
370
|
+
(v) =>
|
|
371
|
+
v.enum_periode_construction_id.split('|').includes(periodConstruction) &&
|
|
372
|
+
v.type_habitation.split('/').includes(TypeHabitation[typeHabitation].toLowerCase()) &&
|
|
373
|
+
(isolationSurface === undefined || v.isolation_surfaces === isolationSurface) &&
|
|
374
|
+
(presenceJointsMenuiserie === undefined ||
|
|
375
|
+
v.presence_joints_menuiserie === presenceJointsMenuiserie)
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
if (!q4paConv) {
|
|
379
|
+
logger.error(
|
|
380
|
+
`Pas de valeur forfaitaire q4pa_conv pour periodConstruction: ${periodConstruction},
|
|
381
|
+
typeHabitation: ${typeHabitation}, isolationSurface: ${isolationSurface},
|
|
382
|
+
presenceJointsMenuiserie: ${presenceJointsMenuiserie}`
|
|
383
|
+
);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return q4paConv;
|
|
388
|
+
}
|
|
389
|
+
}
|