@open3cl/engine 1.0.0
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/10_besoin_fr.js +76 -0
- package/10_clim.js +45 -0
- package/11_besoin_ecs.js +25 -0
- package/11_ecs.js +95 -0
- package/11_nadeq.js +87 -0
- package/11_nadeq.spec.js +55 -0
- package/12.4_pac.js +54 -0
- package/13.2_generateur_combustion.js +295 -0
- package/13.2_generateur_combustion_bouilleur.js +173 -0
- package/13.2_generateur_combustion_ch.js +195 -0
- package/13.2_generateur_combustion_chaudiere.js +151 -0
- package/13.2_generateur_pac.js +36 -0
- package/13_rendement_distribution_ecs.js +12 -0
- package/14_generateur_ecs.js +388 -0
- package/15_conso_aux.js +257 -0
- package/16.2_production_enr.js +328 -0
- package/16.2_production_enr.spec.js +251 -0
- package/16_conso_eclairage.js +37 -0
- package/2021_04_13_confort_ete.js +61 -0
- package/2021_04_13_qualite_isolation.js +174 -0
- package/3.1_b.js +141 -0
- package/3.2.1_mur.js +331 -0
- package/3.2.1_mur.spec.js +46 -0
- package/3.2.2_plancher_bas.js +259 -0
- package/3.2.2_plancher_bas.spec.js +88 -0
- package/3.2.3_plancher_haut.js +158 -0
- package/3.3.1.4_porte.js +32 -0
- package/3.3_baie_vitree.js +308 -0
- package/3.3_baie_vitree.spec.js +333 -0
- package/3.4_pont_thermique.js +463 -0
- package/3_deperdition.js +258 -0
- package/4_ventilation.js +197 -0
- package/5_conso_ventilation.js +127 -0
- package/6.1_apport_gratuit.js +61 -0
- package/6.1_apport_gratuit.spec.js +181 -0
- package/6.2_surface_sud_equivalente.js +109 -0
- package/7_inertie.js +178 -0
- package/7_inertie.spec.js +263 -0
- package/8_intermittence.js +5 -0
- package/9_besoin_ch.js +198 -0
- package/9_chauffage.js +291 -0
- package/9_chauffage.spec.js +101 -0
- package/9_conso_ch.js +95 -0
- package/9_conso_ch.spec.js +255 -0
- package/9_emetteur_ch.js +122 -0
- package/9_generateur_ch.js +230 -0
- package/9_generateur_ch.spec.js +87 -0
- package/README.md +43 -0
- package/apport_et_besoin.js +55 -0
- package/conso.js +529 -0
- package/conso.spec.js +90 -0
- package/core/assets/domain/add-additionnal-ue-values-tables.js +57 -0
- package/core/assets/domain/synchronize-assets.js +29 -0
- package/core/assets/domain/synchronize-assets.spec.js +37 -0
- package/core/assets/domain/synchronize-c1-tables.js +61 -0
- package/core/assets/domain/synchronize-c1-tables.spec.js +35 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +73 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +72 -0
- package/core/assets/domain/synchronize-enum-tables.js +77 -0
- package/core/assets/domain/synchronize-enum-tables.spec.js +31 -0
- package/core/assets/domain/synchronize-solicitations-tables.js +72 -0
- package/core/assets/domain/synchronize-solicitations-tables.spec.js +47 -0
- package/core/assets/domain/synchronize-valeur-tables.js +146 -0
- package/core/assets/domain/synchronize-valeur-tables.spec.js +54 -0
- package/core/conf/infrastructure/application.config.js +33 -0
- package/core/file/infrastructure/adapter/file.store.js +75 -0
- package/core/file/infrastructure/adapter/file.store.spec.js +30 -0
- package/core/tv/infrastructure/assets/additional-ue-values.js +69 -0
- package/core/tv/infrastructure/tvs.store.js +40 -0
- package/core/tv/infrastructure/tvs.store.spec.js +34 -0
- package/core/util/infrastructure/object-util.js +23 -0
- package/core/util/infrastructure/object-util.spec.js +25 -0
- package/engine.js +503 -0
- package/enums.js +1155 -0
- package/ficheTechnique.js +86 -0
- package/ficheTechnique.spec.js +181 -0
- package/index.js +4 -0
- package/package.json +87 -0
- package/tv/18.2_sollicitations_ext.ods +0 -0
- package/tv/18.5_c1.ods +0 -0
- package/tv/dpe_ges_limit_values.ods +0 -0
- package/tv.js +80811 -0
- package/tvs.d.ts +7 -0
- package/utils.js +500 -0
- package/utils.spec.js +36 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import enums from './enums.js';
|
|
2
|
+
import { tv, requestInput, compareReferences, bug_for_bug_compat } from './utils.js';
|
|
3
|
+
|
|
4
|
+
function defaultValue(type_liaison, pt_di, de) {
|
|
5
|
+
if (pt_di.k === 0) {
|
|
6
|
+
return 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const row = tv('pont_thermique', {
|
|
10
|
+
tv_pont_thermique_id: de.tv_pont_thermique_id
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const k = row ? row.k : pt_di.k;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Si la valeur décrite par tv_pont_thermique_id est différente de celle donnée en valeur intermédiaire
|
|
17
|
+
* et différente de la moitié de celle-ci (prise en compte du facteur pourcentage_valeur_pont_thermique = 0.5 dans les cas où le
|
|
18
|
+
* pt ne sépare pas 2 pièces du même lot) alors on prend la valeur intermédiaire saisie
|
|
19
|
+
*/
|
|
20
|
+
if (parseFloat(pt_di.k) !== parseFloat(k) && parseFloat(pt_di.k) !== parseFloat(k) / 2) {
|
|
21
|
+
console.error(
|
|
22
|
+
`Incohérence pour le pont thermique ${de.description}, décrit avec tv_pont_thermique_id = ${de.tv_pont_thermique_id} mais k = ${pt_di.k}.
|
|
23
|
+
tv_pont_thermique_id est ignoré, la valeur k = ${pt_di.k} est conservée`
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return pourcentageValeurPontThermique(type_liaison, de, pt_di.k, pt_di);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return pourcentageValeurPontThermique(type_liaison, de, k, pt_di);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function tv_k(pt_di, di, de, du, pc_id, logement) {
|
|
33
|
+
const enveloppe = logement.enveloppe;
|
|
34
|
+
|
|
35
|
+
const mur_list = enveloppe.mur_collection.mur || [];
|
|
36
|
+
const pb_list = enveloppe.plancher_bas_collection.plancher_bas || [];
|
|
37
|
+
const ph_list = enveloppe.plancher_haut_collection.plancher_haut || [];
|
|
38
|
+
const bv_list = enveloppe.baie_vitree_collection.baie_vitree || [];
|
|
39
|
+
const porte_list = enveloppe.porte_collection.porte || [];
|
|
40
|
+
|
|
41
|
+
const type_liaison = requestInput(de, du, 'type_liaison');
|
|
42
|
+
|
|
43
|
+
if (!de.reference_1) {
|
|
44
|
+
console.warn(`BUG: pas de reference pour le pont thermique ${de.description}...`);
|
|
45
|
+
// on trouve les references grace a la description
|
|
46
|
+
const desc = de.description;
|
|
47
|
+
let desc_1, desc_2;
|
|
48
|
+
|
|
49
|
+
if (desc?.match(/(.+) \/ (.+)/)) {
|
|
50
|
+
desc_1 = desc.match(/(.+) \/ (.+)/)[1];
|
|
51
|
+
desc_2 = desc.match(/(.+) \/ (.+)/)[2];
|
|
52
|
+
} else if (desc?.match(/(.+)-(.+)/)) {
|
|
53
|
+
desc_1 = desc.match(/(.+)-(.+)/)[1];
|
|
54
|
+
desc_2 = desc.match(/(.+)-(.+)/)[2];
|
|
55
|
+
} else {
|
|
56
|
+
di.k = defaultValue(type_liaison, pt_di, de);
|
|
57
|
+
console.error(
|
|
58
|
+
`BUG: description '${desc}' non reconnue pour le pont thermique.
|
|
59
|
+
La valeur de k est prise dans les données intermédiaires du DPE`
|
|
60
|
+
);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let ptMur = mur_list.find(
|
|
65
|
+
(mur) =>
|
|
66
|
+
mur.donnee_entree.description?.includes(desc_1) ||
|
|
67
|
+
mur.donnee_entree.description?.includes(desc_2)
|
|
68
|
+
);
|
|
69
|
+
if (ptMur) {
|
|
70
|
+
de.reference_1 = ptMur.donnee_entree.reference;
|
|
71
|
+
} else {
|
|
72
|
+
di.k = defaultValue(type_liaison, pt_di, de);
|
|
73
|
+
console.error(
|
|
74
|
+
`BUG: descriptions '${desc_1}' ou '${desc_2}' du pont thermique non reconnue dans les descriptions des murs.
|
|
75
|
+
La valeur de k est prise dans les données intermédiaires du DPE`
|
|
76
|
+
);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let list_2;
|
|
81
|
+
switch (type_liaison) {
|
|
82
|
+
case 'refend / mur':
|
|
83
|
+
list_2 = null;
|
|
84
|
+
break;
|
|
85
|
+
case 'plancher intermédiaire lourd / mur':
|
|
86
|
+
// TODO
|
|
87
|
+
console.warn(`Pont thermique ${type_liaison} non supporté`);
|
|
88
|
+
break;
|
|
89
|
+
case 'plancher bas / mur':
|
|
90
|
+
case 'plancher haut lourd / mur':
|
|
91
|
+
list_2 = pb_list.concat(ph_list);
|
|
92
|
+
break;
|
|
93
|
+
case 'menuiserie / mur':
|
|
94
|
+
list_2 = bv_list.concat(porte_list);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
if (list_2) {
|
|
98
|
+
ptMur = list_2.find(
|
|
99
|
+
(men) =>
|
|
100
|
+
men.donnee_entree.description?.includes(desc_2) ||
|
|
101
|
+
men.donnee_entree.description?.includes(desc_1)
|
|
102
|
+
);
|
|
103
|
+
if (ptMur) {
|
|
104
|
+
de.reference_2 = ptMur.donnee_entree.reference;
|
|
105
|
+
} else {
|
|
106
|
+
di.k = defaultValue(type_liaison, pt_di, de);
|
|
107
|
+
console.error(
|
|
108
|
+
`BUG: descriptions '${desc_1}' ou '${desc_2}' du pont thermique non reconnue dans '${type_liaison}'.
|
|
109
|
+
La valeur de k est prise dans les données intermédiaires du DPE`
|
|
110
|
+
);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const mur = mur_list.find(
|
|
117
|
+
(mur) =>
|
|
118
|
+
compareReferences(mur.donnee_entree.reference, de.reference_1) ||
|
|
119
|
+
compareReferences(mur.donnee_entree.reference, de.reference_2)
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const matcher = {
|
|
123
|
+
enum_type_liaison_id: de.enum_type_liaison_id
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const pc = enums.periode_construction[pc_id];
|
|
127
|
+
|
|
128
|
+
let type_isolation_mur;
|
|
129
|
+
|
|
130
|
+
if (mur) {
|
|
131
|
+
/**
|
|
132
|
+
* 3.4 Calcul des déperditions par les ponts thermiques
|
|
133
|
+
* Les ponts thermiques des parois au niveau des circulations communes ne sont pas pris en compte.
|
|
134
|
+
* 14 - Circulation sans ouverture directe sur l'extérieur
|
|
135
|
+
* 15 - Circulation avec ouverture directe sur l'extérieur
|
|
136
|
+
* 16 - Circulation avec bouche ou gaine de désenfumage ouverte en permanence
|
|
137
|
+
* 17 - Hall d'entrée avec dispositif de fermeture automatique
|
|
138
|
+
* 18 - Hall d'entrée sans dispositif de fermeture automatique
|
|
139
|
+
* 22 - Local non déperditif ( local à usage d'habitation chauffé)
|
|
140
|
+
*/
|
|
141
|
+
if (
|
|
142
|
+
mur &&
|
|
143
|
+
['14', '15', '16', '17', '18', '22'].includes(mur.donnee_entree.enum_type_adjacence_id)
|
|
144
|
+
) {
|
|
145
|
+
/**
|
|
146
|
+
* Certains ponts thermiques de type 'plancher bas / mur' ou 'plancher haut lourd / mur', bien que sur des circulations doivent être pris en compte
|
|
147
|
+
* Certaines configurations du logement n'étant pas définissable, on doit se baser sur les données décrites dans le DPE
|
|
148
|
+
*/
|
|
149
|
+
if (pt_di.k === 0) {
|
|
150
|
+
di.k = 0;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
type_isolation_mur = requestInput(mur.donnee_entree, mur.donnee_utilisateur, 'type_isolation');
|
|
156
|
+
|
|
157
|
+
const pi = requestInput(mur.donnee_entree, mur.donnee_utilisateur, 'periode_isolation') || pc;
|
|
158
|
+
|
|
159
|
+
if (type_isolation_mur.includes('inconnu')) {
|
|
160
|
+
if (['avant 1948', '1948-1974'].includes(pi)) type_isolation_mur = 'non isolé';
|
|
161
|
+
else type_isolation_mur = 'iti';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
matcher.isolation_mur = `^${type_isolation_mur}$`;
|
|
165
|
+
} else {
|
|
166
|
+
matcher.isolation_mur = `^iti`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
switch (type_liaison) {
|
|
170
|
+
case 'plancher bas / mur':
|
|
171
|
+
case 'plancher haut lourd / mur': {
|
|
172
|
+
const plancher_list = ph_list.concat(pb_list);
|
|
173
|
+
const plancher = plancher_list.find(
|
|
174
|
+
(plancher) =>
|
|
175
|
+
compareReferences(plancher.donnee_entree.reference, de.reference_1) ||
|
|
176
|
+
compareReferences(plancher.donnee_entree.reference, de.reference_2)
|
|
177
|
+
);
|
|
178
|
+
if (!plancher) {
|
|
179
|
+
di.k = defaultValue(type_liaison, pt_di, de);
|
|
180
|
+
console.error(
|
|
181
|
+
`Impossible de trouver un plancher ayant pour référence '${de.reference_1}' ou '${de.reference_2}'.
|
|
182
|
+
La valeur de k est prise dans les données intermédiaires du DPE`
|
|
183
|
+
);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 3.4.3 Plancher haut / mur
|
|
189
|
+
* Les ponts thermiques des planchers haut en structure légère sont négligés.
|
|
190
|
+
* type_plancher_haut
|
|
191
|
+
* enum_type_plancher_haut_id
|
|
192
|
+
* 9 - Plafond bois sur solives bois
|
|
193
|
+
* 10 - Plafond bois sous solives bois
|
|
194
|
+
*
|
|
195
|
+
* enum_materiaux_structure_mur_id
|
|
196
|
+
* 5 - Murs en pan de bois sans remplissage tout venant
|
|
197
|
+
* 6 - Murs en pan de bois avec remplissage tout venant
|
|
198
|
+
* 7 - Murs bois (rondin)
|
|
199
|
+
* 16 - Béton cellulaire avant 2013
|
|
200
|
+
* 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
|
|
201
|
+
* 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
|
|
202
|
+
* 25 - Murs en ossature bois sans remplissage
|
|
203
|
+
* 26 - Murs en ossature bois avec isolant en remplissage <2001
|
|
204
|
+
* 27 - Murs en ossature bois avec remplissage tout venant
|
|
205
|
+
*/
|
|
206
|
+
if (
|
|
207
|
+
mur &&
|
|
208
|
+
type_liaison === 'plancher haut lourd / mur' &&
|
|
209
|
+
([9, 10].includes(parseInt(plancher.donnee_entree.enum_type_plancher_haut_id)) ||
|
|
210
|
+
[5, 6, 7, 16, 18, 24, 25, 26, 27].includes(
|
|
211
|
+
parseInt(mur.donnee_entree.enum_materiaux_structure_mur_id)
|
|
212
|
+
))
|
|
213
|
+
) {
|
|
214
|
+
di.k = 0;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* 3.4.1 Mur Plancher bas / mur
|
|
220
|
+
* Seuls les murs et planchers bas constitués d’un matériau lourd (béton, brique, …) sont considérés ici. Pour les autres
|
|
221
|
+
* cas ce pont thermique est pris nul.
|
|
222
|
+
* enum_type_plancher_bas_id
|
|
223
|
+
* 4 - Plancher entre solives bois avec ou sans remplissage
|
|
224
|
+
* 10 - Plancher bois sur solives bois
|
|
225
|
+
*
|
|
226
|
+
* enum_materiaux_structure_mur_id
|
|
227
|
+
* 5 - Murs en pan de bois sans remplissage tout venant
|
|
228
|
+
* 6 - Murs en pan de bois avec remplissage tout venant
|
|
229
|
+
* 7 - Murs bois (rondin)
|
|
230
|
+
* 16 - Béton cellulaire avant 2013
|
|
231
|
+
* 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
|
|
232
|
+
* 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
|
|
233
|
+
* 25 - Murs en ossature bois sans remplissage
|
|
234
|
+
* 26 - Murs en ossature bois avec isolant en remplissage <2001
|
|
235
|
+
* 27 - Murs en ossature bois avec remplissage tout venant
|
|
236
|
+
*/
|
|
237
|
+
if (
|
|
238
|
+
mur &&
|
|
239
|
+
type_liaison === 'plancher bas / mur' &&
|
|
240
|
+
([4, 10].includes(parseInt(plancher.donnee_entree.enum_type_plancher_bas_id)) ||
|
|
241
|
+
[5, 6, 7, 16, 18, 24, 25, 26, 27].includes(
|
|
242
|
+
parseInt(mur.donnee_entree.enum_materiaux_structure_mur_id)
|
|
243
|
+
))
|
|
244
|
+
) {
|
|
245
|
+
di.k = 0;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const isolation_plancher = requestInput(
|
|
250
|
+
plancher.donnee_entree,
|
|
251
|
+
plancher.donnee_utilisateur,
|
|
252
|
+
'type_isolation'
|
|
253
|
+
);
|
|
254
|
+
matcher.isolation_plancher = `^${isolation_plancher}$`;
|
|
255
|
+
if (isolation_plancher === 'inconnu') {
|
|
256
|
+
const type_adjacence_plancher = requestInput(
|
|
257
|
+
plancher.donnee_entree,
|
|
258
|
+
plancher.donnee_utilisateur,
|
|
259
|
+
'type_adjacence'
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
const pi =
|
|
263
|
+
requestInput(plancher.donnee_entree, plancher.donnee_utilisateur, 'periode_isolation') ||
|
|
264
|
+
pc;
|
|
265
|
+
|
|
266
|
+
let cutoff;
|
|
267
|
+
if (type_adjacence_plancher === 'terre-plein') {
|
|
268
|
+
cutoff = ['avant 1948', '1948-1974', '1975-1977', '1978-1982', '1983-1988', '1989-2000'];
|
|
269
|
+
} else cutoff = ['avant 1948', '1948-1974'];
|
|
270
|
+
|
|
271
|
+
if (cutoff.includes(pi)) matcher.isolation_plancher = 'non isolé';
|
|
272
|
+
else matcher.isolation_plancher = '^ite$';
|
|
273
|
+
} else if (isolation_plancher === "isolé mais type d'isolation inconnu") {
|
|
274
|
+
matcher.isolation_plancher = '^ite$';
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case 'plancher intermédiaire lourd / mur':
|
|
279
|
+
// TODO
|
|
280
|
+
console.warn(`Pont thermique ${type_liaison} non supporté`);
|
|
281
|
+
break;
|
|
282
|
+
case 'refend / mur':
|
|
283
|
+
break;
|
|
284
|
+
case 'menuiserie / mur': {
|
|
285
|
+
/**
|
|
286
|
+
* 3.4.5 Menuiserie / mur
|
|
287
|
+
* Les ponts thermiques avec les parois en structure bois (ossature bois, rondin de bois, pans de bois) sont négligés.
|
|
288
|
+
* enum_materiaux_structure_mur_id
|
|
289
|
+
* 5 - Murs en pan de bois sans remplissage tout venant
|
|
290
|
+
* 6 - Murs en pan de bois avec remplissage tout venant
|
|
291
|
+
* 7 - Murs bois (rondin)
|
|
292
|
+
* 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
|
|
293
|
+
* 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
|
|
294
|
+
* 25 - Murs en ossature bois sans remplissage
|
|
295
|
+
* 26 - Murs en ossature bois avec isolant en remplissage <2001
|
|
296
|
+
* 27 - Murs en ossature bois avec remplissage tout venant
|
|
297
|
+
*/
|
|
298
|
+
if (
|
|
299
|
+
mur &&
|
|
300
|
+
['5', '6', '7', '18', '24', '25', '26', '27'].includes(
|
|
301
|
+
mur.donnee_entree.enum_materiaux_structure_mur_id
|
|
302
|
+
)
|
|
303
|
+
) {
|
|
304
|
+
di.k = 0;
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Si isolation ITR, k = 0.2, pas besoin des informations de la fenêtre
|
|
309
|
+
if (type_isolation_mur === 'itr') {
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const menuiserie_list = bv_list.concat(porte_list);
|
|
314
|
+
const menuiserie = menuiserie_list.find(
|
|
315
|
+
(men) =>
|
|
316
|
+
compareReferences(men.donnee_entree.reference, de.reference_1) ||
|
|
317
|
+
compareReferences(men.donnee_entree.reference, de.reference_2)
|
|
318
|
+
);
|
|
319
|
+
if (!menuiserie) {
|
|
320
|
+
di.k = defaultValue(type_liaison, pt_di, de);
|
|
321
|
+
console.error(
|
|
322
|
+
`Impossible de trouver une menuiserie ayant pour référence '${de.reference_1}' ou '${de.reference_2}'.
|
|
323
|
+
La valeur de k est prise dans les données intermédiaires du DPE`
|
|
324
|
+
);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const mde = menuiserie.donnee_entree;
|
|
328
|
+
const mdu = menuiserie.donnee_utilisateur;
|
|
329
|
+
|
|
330
|
+
let type_pose = requestInput(mde, mdu, 'type_pose');
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Si le type de pose n'est pas connu, on va récupérer l'information grâce à tv_pont_thermique_id
|
|
334
|
+
*/
|
|
335
|
+
if (!type_pose) {
|
|
336
|
+
if (bug_for_bug_compat) {
|
|
337
|
+
const tvPontThermique = tv('pont_thermique', {
|
|
338
|
+
tv_pont_thermique_id: de.tv_pont_thermique_id
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
console.error(
|
|
342
|
+
`La menuiserie '${mde.description}' n'a pas de type de pose. Récupération de celui-ci à partir de tv_pont_thermique_id`
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
if (tvPontThermique) {
|
|
346
|
+
type_pose = tvPontThermique.type_pose;
|
|
347
|
+
} else {
|
|
348
|
+
type_pose = 'tunnel';
|
|
349
|
+
}
|
|
350
|
+
} else {
|
|
351
|
+
type_pose = 'tunnel';
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
if (type_pose.includes('sans objet')) {
|
|
356
|
+
type_pose = 'tunnel';
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
matcher.type_pose = type_pose;
|
|
360
|
+
matcher.presence_retour_isolation = requestInput(
|
|
361
|
+
mde,
|
|
362
|
+
mdu,
|
|
363
|
+
'presence_retour_isolation',
|
|
364
|
+
'bool'
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
if (bug_for_bug_compat) {
|
|
368
|
+
// Certains logiciels n'utilisent le boolean presence_retour_isolation de la même manière
|
|
369
|
+
// 0 = oui pour certains, 1 = oui pour d'autres
|
|
370
|
+
const tvPontThermique = tv('pont_thermique', {
|
|
371
|
+
tv_pont_thermique_id: de.tv_pont_thermique_id
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
if (
|
|
375
|
+
tvPontThermique &&
|
|
376
|
+
parseInt(matcher.presence_retour_isolation) !==
|
|
377
|
+
parseInt(tvPontThermique.presence_retour_isolation)
|
|
378
|
+
) {
|
|
379
|
+
matcher.presence_retour_isolation = parseInt(tvPontThermique.presence_retour_isolation);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
matcher.largeur_dormant = requestInput(mde, mdu, 'largeur_dormant', 'float');
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const row = tv('pont_thermique', matcher);
|
|
388
|
+
if (row) {
|
|
389
|
+
di.k = Number(row.k);
|
|
390
|
+
de.tv_pont_thermique_id = Number(row.tv_pont_thermique_id);
|
|
391
|
+
|
|
392
|
+
pourcentageValeurPontThermique(type_liaison, de, di, pt_di);
|
|
393
|
+
} else {
|
|
394
|
+
console.error('!! pas de valeur forfaitaire trouvée pour pont_thermique (k) !!');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Calcul du facteur de prise en compte du pont thermique
|
|
400
|
+
*
|
|
401
|
+
* 3.4.4 Refend / mur
|
|
402
|
+
* Lorsque le refend ne sépare pas deux volumes du même lot faisant l’objet du DPE, il faut prendre en compte dans les
|
|
403
|
+
* calculs seulement la moitié de la valeur tabulée ci-dessus.
|
|
404
|
+
*
|
|
405
|
+
* 3.4.2 Plancher intermédiaire / mur
|
|
406
|
+
* Lorsque le plancher intermédiaire ne sépare pas deux niveaux du lot faisant l’objet du DPE, il faut prendre en compte
|
|
407
|
+
* dans les calculs seulement la moitié de la valeur tabulée ci-dessus
|
|
408
|
+
*
|
|
409
|
+
* Par défaut on prend 0.5 si la valeur n'est pas spécifiée, qu'il n'y a qu'un seul étage au logement.
|
|
410
|
+
* Si la valeur k calculée est égale au à celle spécifiée, le facteur est déjà pris en compte
|
|
411
|
+
*
|
|
412
|
+
* @param type_liaison {string} type de liaison du pont thermique en cours d'étude
|
|
413
|
+
* @param de {Donnee_entree} données d'entrée du pont thermique en cours d'étude
|
|
414
|
+
* @param k {string} valeur calculée pour k
|
|
415
|
+
* @param pt_di {Donnee_intermediaire} données intermédiaires du pont thermique en cours d'étude
|
|
416
|
+
*/
|
|
417
|
+
function pourcentageValeurPontThermique(type_liaison, de, k, pt_di) {
|
|
418
|
+
if (
|
|
419
|
+
!de.pourcentage_valeur_pont_thermique &&
|
|
420
|
+
(type_liaison === 'refend / mur' || type_liaison === 'plancher intermédiaire lourd / mur') &&
|
|
421
|
+
(parseFloat(k) !== parseFloat(pt_di.k) || pt_di.k > 1)
|
|
422
|
+
) {
|
|
423
|
+
de.pourcentage_valeur_pont_thermique = 0.5;
|
|
424
|
+
console.warn(
|
|
425
|
+
`Le pont thermique ${de.description} n'a aucune valeur pour pourcentage_valeur_pont_thermique.
|
|
426
|
+
Le bien n'ayant qu'un seul étage, on prend 0.5 dans la suite du calcul car ce pont thermique ne sépare pas deux niveaux du lot`
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return k;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
export default function calc_pont_thermique(pt, pc_id, logement) {
|
|
434
|
+
const de = pt.donnee_entree;
|
|
435
|
+
const di = {};
|
|
436
|
+
const du = {};
|
|
437
|
+
|
|
438
|
+
const methode_saisie_pont_thermique = parseInt(de.enum_methode_saisie_pont_thermique_id);
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Si la valeur de k est directement saisie, prendre cette valeur
|
|
442
|
+
* enum_methode_saisie_pont_thermique_id
|
|
443
|
+
* 1 - valeur forfaitaire
|
|
444
|
+
* 2 - valeur justifiée saisie à partir des documents justificatifs autorisés
|
|
445
|
+
* 3 - saisie direct k depuis rset/rsee( etude rt2012/re2020)
|
|
446
|
+
*/
|
|
447
|
+
if (methode_saisie_pont_thermique === 1) {
|
|
448
|
+
tv_k(pt.donnee_intermediaire, di, de, du, pc_id, logement);
|
|
449
|
+
} else if (methode_saisie_pont_thermique === 2 || methode_saisie_pont_thermique === 3) {
|
|
450
|
+
if (de.k_saisi) {
|
|
451
|
+
di.k = de.k_saisi;
|
|
452
|
+
} else {
|
|
453
|
+
console.error(
|
|
454
|
+
`Aucune valeur de k_saisi pour le pont thermique '${pt.donnee_entree.reference}' alors que la donnée est saisie`
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
} else {
|
|
458
|
+
console.error('methode_saisie_pont_thermique non reconnu:' + methode_saisie_pont_thermique);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
pt.donnee_utilisateur = du;
|
|
462
|
+
pt.donnee_intermediaire = di;
|
|
463
|
+
}
|