@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.
Files changed (85) hide show
  1. package/10_besoin_fr.js +76 -0
  2. package/10_clim.js +45 -0
  3. package/11_besoin_ecs.js +25 -0
  4. package/11_ecs.js +95 -0
  5. package/11_nadeq.js +87 -0
  6. package/11_nadeq.spec.js +55 -0
  7. package/12.4_pac.js +54 -0
  8. package/13.2_generateur_combustion.js +295 -0
  9. package/13.2_generateur_combustion_bouilleur.js +173 -0
  10. package/13.2_generateur_combustion_ch.js +195 -0
  11. package/13.2_generateur_combustion_chaudiere.js +151 -0
  12. package/13.2_generateur_pac.js +36 -0
  13. package/13_rendement_distribution_ecs.js +12 -0
  14. package/14_generateur_ecs.js +388 -0
  15. package/15_conso_aux.js +257 -0
  16. package/16.2_production_enr.js +328 -0
  17. package/16.2_production_enr.spec.js +251 -0
  18. package/16_conso_eclairage.js +37 -0
  19. package/2021_04_13_confort_ete.js +61 -0
  20. package/2021_04_13_qualite_isolation.js +174 -0
  21. package/3.1_b.js +141 -0
  22. package/3.2.1_mur.js +331 -0
  23. package/3.2.1_mur.spec.js +46 -0
  24. package/3.2.2_plancher_bas.js +259 -0
  25. package/3.2.2_plancher_bas.spec.js +88 -0
  26. package/3.2.3_plancher_haut.js +158 -0
  27. package/3.3.1.4_porte.js +32 -0
  28. package/3.3_baie_vitree.js +308 -0
  29. package/3.3_baie_vitree.spec.js +333 -0
  30. package/3.4_pont_thermique.js +463 -0
  31. package/3_deperdition.js +258 -0
  32. package/4_ventilation.js +197 -0
  33. package/5_conso_ventilation.js +127 -0
  34. package/6.1_apport_gratuit.js +61 -0
  35. package/6.1_apport_gratuit.spec.js +181 -0
  36. package/6.2_surface_sud_equivalente.js +109 -0
  37. package/7_inertie.js +178 -0
  38. package/7_inertie.spec.js +263 -0
  39. package/8_intermittence.js +5 -0
  40. package/9_besoin_ch.js +198 -0
  41. package/9_chauffage.js +291 -0
  42. package/9_chauffage.spec.js +101 -0
  43. package/9_conso_ch.js +95 -0
  44. package/9_conso_ch.spec.js +255 -0
  45. package/9_emetteur_ch.js +122 -0
  46. package/9_generateur_ch.js +230 -0
  47. package/9_generateur_ch.spec.js +87 -0
  48. package/README.md +43 -0
  49. package/apport_et_besoin.js +55 -0
  50. package/conso.js +529 -0
  51. package/conso.spec.js +90 -0
  52. package/core/assets/domain/add-additionnal-ue-values-tables.js +57 -0
  53. package/core/assets/domain/synchronize-assets.js +29 -0
  54. package/core/assets/domain/synchronize-assets.spec.js +37 -0
  55. package/core/assets/domain/synchronize-c1-tables.js +61 -0
  56. package/core/assets/domain/synchronize-c1-tables.spec.js +35 -0
  57. package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +73 -0
  58. package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +72 -0
  59. package/core/assets/domain/synchronize-enum-tables.js +77 -0
  60. package/core/assets/domain/synchronize-enum-tables.spec.js +31 -0
  61. package/core/assets/domain/synchronize-solicitations-tables.js +72 -0
  62. package/core/assets/domain/synchronize-solicitations-tables.spec.js +47 -0
  63. package/core/assets/domain/synchronize-valeur-tables.js +146 -0
  64. package/core/assets/domain/synchronize-valeur-tables.spec.js +54 -0
  65. package/core/conf/infrastructure/application.config.js +33 -0
  66. package/core/file/infrastructure/adapter/file.store.js +75 -0
  67. package/core/file/infrastructure/adapter/file.store.spec.js +30 -0
  68. package/core/tv/infrastructure/assets/additional-ue-values.js +69 -0
  69. package/core/tv/infrastructure/tvs.store.js +40 -0
  70. package/core/tv/infrastructure/tvs.store.spec.js +34 -0
  71. package/core/util/infrastructure/object-util.js +23 -0
  72. package/core/util/infrastructure/object-util.spec.js +25 -0
  73. package/engine.js +503 -0
  74. package/enums.js +1155 -0
  75. package/ficheTechnique.js +86 -0
  76. package/ficheTechnique.spec.js +181 -0
  77. package/index.js +4 -0
  78. package/package.json +87 -0
  79. package/tv/18.2_sollicitations_ext.ods +0 -0
  80. package/tv/18.5_c1.ods +0 -0
  81. package/tv/dpe_ges_limit_values.ods +0 -0
  82. package/tv.js +80811 -0
  83. package/tvs.d.ts +7 -0
  84. package/utils.js +500 -0
  85. 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
+ }