@open3cl/engine 1.0.7 → 1.0.9

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 (24) hide show
  1. package/features/dpe/domain/models/baie-vitree.model.ts +8 -6
  2. package/features/dpe/domain/models/dpe.model.ts +7 -3
  3. package/features/dpe/domain/models/{plancher-bas.model.ts → plancher.model.ts} +31 -7
  4. package/features/dpe/infrastructure/baieVitreeTv.store.js +292 -0
  5. package/features/dpe/infrastructure/baieVitreeTv.store.spec.js +352 -0
  6. package/features/dpe/infrastructure/pontThermiqueTv.store.js +112 -0
  7. package/features/dpe/infrastructure/pontThermiqueTv.store.spec.js +134 -0
  8. package/features/dpe/infrastructure/tv.store.js +0 -33
  9. package/features/dpe/infrastructure/tv.store.spec.js +0 -83
  10. package/features/engine/domain/engine.service.js +2 -1
  11. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +292 -0
  12. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +484 -0
  13. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +38 -0
  14. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +28 -0
  15. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +61 -0
  16. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +46 -0
  17. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +85 -0
  18. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +33 -0
  19. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +61 -0
  20. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +439 -0
  21. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +636 -0
  22. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +49 -0
  23. package/package.json +1 -1
  24. package/features/dpe/domain/models/plancher-haut.model.ts +0 -33
@@ -166,4 +166,50 @@ export class DeperditionPlancherBasService extends DeperditionService {
166
166
 
167
167
  return Math.round(parseFloat(upbFinal) * PRECISION) / PRECISION;
168
168
  }
169
+
170
+ /**
171
+ * Retourner le type d'isolation du plancher
172
+ * Si isolation inconnue :
173
+ * - Les planchers sur terre-plein sont considérés non isolés avant 2001 et isolés par l’extérieur (en sous-face) à partir de 2001
174
+ * - Les autres planchers sont considérés isolés par l’extérieur
175
+ *
176
+ * @param ctx {Contexte}
177
+ * @param plancherBasDE {PlancherBasDE}
178
+ * @return {number}
179
+ */
180
+ typeIsolation(ctx, plancherBasDE) {
181
+ const typeIsolation = parseInt(plancherBasDE.enum_type_isolation_id);
182
+
183
+ // Type d'isolation inconnu
184
+ if (typeIsolation === 1) {
185
+ const typeAdjacence = parseInt(plancherBasDE.enum_type_adjacence_id);
186
+ const periodeIsolation =
187
+ parseInt(plancherBasDE.enum_periode_isolation_id) ||
188
+ parseInt(ctx.enumPeriodeConstructionId);
189
+
190
+ // Plancher sur terre-plein
191
+ if (typeAdjacence === 5) {
192
+ // Année isolation / construction < 2001
193
+ if (periodeIsolation < 7) {
194
+ // Non isolé
195
+ return 2;
196
+ } else {
197
+ // Isolation ITE
198
+ return 4;
199
+ }
200
+ } else {
201
+ // Année isolation / construction < 1975
202
+ if (periodeIsolation < 3) {
203
+ // Non isolé
204
+ return 2;
205
+ } else {
206
+ // Isolation ITE
207
+ return 4;
208
+ }
209
+ }
210
+ }
211
+
212
+ // Isolation ITE si "isolé mais type d'isolation inconnu"
213
+ return typeIsolation === 9 ? 4 : typeIsolation;
214
+ }
169
215
  }
@@ -170,6 +170,91 @@ describe('Calcul de déperdition des planchers bas', () => {
170
170
  });
171
171
  });
172
172
 
173
+ test.each([
174
+ {
175
+ label:
176
+ 'plancher bas avec isolation inconnue, adjacence terre-plein et période isolation 1974',
177
+ enumTypeIsolationId: 1,
178
+ enumTypeAdjacenceId: 5,
179
+ enumPeriodIsolationId: 1,
180
+ enumPeriodeConstructionId: undefined,
181
+ typeIsolationExpected: 2
182
+ },
183
+ {
184
+ label:
185
+ 'plancher bas avec isolation inconnue, adjacence terre-plein et période construction 2000',
186
+ enumTypeIsolationId: 1,
187
+ enumTypeAdjacenceId: 5,
188
+ enumPeriodIsolationId: undefined,
189
+ enumPeriodeConstructionId: 6,
190
+ typeIsolationExpected: 2
191
+ },
192
+ {
193
+ label:
194
+ 'plancher bas avec isolation inconnue, adjacence terre-plein et période isolation 2001',
195
+ enumTypeIsolationId: 1,
196
+ enumPeriodIsolationId: 7,
197
+ enumTypeAdjacenceId: 5,
198
+ enumPeriodeConstructionId: undefined,
199
+ typeIsolationExpected: 4
200
+ },
201
+ {
202
+ label: 'plancher bas avec isolation inconnue, adjacence garage et période isolation 1974',
203
+ enumTypeIsolationId: 1,
204
+ enumPeriodIsolationId: 2,
205
+ enumTypeAdjacenceId: 8,
206
+ enumPeriodeConstructionId: undefined,
207
+ typeIsolationExpected: 2
208
+ },
209
+ {
210
+ label: 'plancher bas avec isolation inconnue, adjacence garage et période isolation 1975',
211
+ enumTypeIsolationId: 1,
212
+ enumPeriodIsolationId: 3,
213
+ enumTypeAdjacenceId: 8,
214
+ enumPeriodeConstructionId: undefined,
215
+ typeIsolationExpected: 4
216
+ },
217
+ {
218
+ label: 'plancher bas avec isolation de type "isolé mais type d\'isolation inconnu"',
219
+ enumTypeIsolationId: 9,
220
+ enumPeriodIsolationId: 1,
221
+ enumPeriodeConstructionId: undefined,
222
+ typeIsolationExpected: 4
223
+ },
224
+ {
225
+ label: 'plancher bas avec isolation iti+ite',
226
+ enumTypeIsolationId: 6,
227
+ enumPeriodIsolationId: 1,
228
+ enumPeriodeConstructionId: undefined,
229
+ typeIsolationExpected: 6
230
+ }
231
+ ])(
232
+ "Récupération du type d'isolation pour $label",
233
+ ({
234
+ enumTypeIsolationId,
235
+ enumPeriodIsolationId = undefined,
236
+ enumTypeAdjacenceId = undefined,
237
+ enumPeriodeConstructionId = undefined,
238
+ typeIsolationExpected
239
+ }) => {
240
+ /**
241
+ * @type {PlancherBasDE}
242
+ */
243
+ let plancherBasDE = {
244
+ enum_type_isolation_id: enumTypeIsolationId,
245
+ enum_type_adjacence_id: enumTypeAdjacenceId,
246
+ enum_periode_isolation_id: enumPeriodIsolationId
247
+ };
248
+
249
+ /**
250
+ * @type {Contexte}
251
+ */
252
+ const ctx = { enumPeriodeConstructionId };
253
+
254
+ expect(service.typeIsolation(ctx, plancherBasDE)).toBe(typeIsolationExpected);
255
+ }
256
+ );
257
+
173
258
  describe("Test d'intégration de plancher bas", () => {
174
259
  test.each(corpus)('vérification des DI des pb pour dpe %s', (ademeId) => {
175
260
  /**
@@ -133,4 +133,37 @@ export class DeperditionPlancherHautService extends DeperditionService {
133
133
  return 'combles';
134
134
  }
135
135
  }
136
+
137
+ /**
138
+ * Retourner le type d'isolation du plancher haut
139
+ * Si isolation inconnue :
140
+ * - Pour les bâtiments d’avant 1975, la paroi est considérée comme non isolée
141
+ * - Pour les bâtiments construits à partir de 1975, les plafonds sont considérés isolés par l’extérieur
142
+ *
143
+ * @param ctx {Contexte}
144
+ * @param plancherHautDE {PlancherHautDE}
145
+ * @return {number}
146
+ */
147
+ typeIsolation(ctx, plancherHautDE) {
148
+ const typeIsolation = parseInt(plancherHautDE.enum_type_isolation_id);
149
+
150
+ // Type d'isolation inconnu
151
+ if (typeIsolation === 1) {
152
+ const periodeIsolation =
153
+ parseInt(plancherHautDE.enum_periode_isolation_id) ||
154
+ parseInt(ctx.enumPeriodeConstructionId);
155
+
156
+ // Année isolation / construction < 1975
157
+ if (periodeIsolation < 3) {
158
+ // Non isolé
159
+ return 2;
160
+ } else {
161
+ // Isolation ITE
162
+ return 4;
163
+ }
164
+ }
165
+
166
+ // Isolation ITE si "isolé mais type d'isolation inconnu"
167
+ return typeIsolation === 9 ? 4 : typeIsolation;
168
+ }
136
169
  }
@@ -181,6 +181,67 @@ describe('Calcul de déperdition des planchers haut', () => {
181
181
  });
182
182
  });
183
183
 
184
+ test.each([
185
+ {
186
+ label: 'plafond avec isolation inconnue et période isolation 1974',
187
+ enumTypeIsolationId: 1,
188
+ enumPeriodIsolationId: 1,
189
+ enumPeriodeConstructionId: undefined,
190
+ typeIsolationExpected: 2
191
+ },
192
+ {
193
+ label: 'plafond avec isolation inconnue et période construction 1974',
194
+ enumTypeIsolationId: 1,
195
+ enumPeriodIsolationId: undefined,
196
+ enumPeriodeConstructionId: 1,
197
+ typeIsolationExpected: 2
198
+ },
199
+ {
200
+ label: 'plafond avec isolation inconnue et période isolation 1975',
201
+ enumTypeIsolationId: 1,
202
+ enumPeriodIsolationId: 3,
203
+ enumPeriodeConstructionId: undefined,
204
+ typeIsolationExpected: 4
205
+ },
206
+ {
207
+ label: 'plafond avec isolation de type "isolé mais type d\'isolation inconnu"',
208
+ enumTypeIsolationId: 9,
209
+ enumPeriodIsolationId: 1,
210
+ enumPeriodeConstructionId: undefined,
211
+ typeIsolationExpected: 4
212
+ },
213
+ {
214
+ label: 'plafond avec isolation iti+ite',
215
+ enumTypeIsolationId: 6,
216
+ enumPeriodIsolationId: 1,
217
+ enumPeriodeConstructionId: undefined,
218
+ typeIsolationExpected: 6
219
+ }
220
+ ])(
221
+ "Récupération du type d'isolation pour $label",
222
+ ({
223
+ enumTypeIsolationId,
224
+ enumPeriodIsolationId = undefined,
225
+ enumPeriodeConstructionId = undefined,
226
+ typeIsolationExpected
227
+ }) => {
228
+ /**
229
+ * @type {PlancherHautDE}
230
+ */
231
+ let plancherHautDE = {
232
+ enum_type_isolation_id: enumTypeIsolationId,
233
+ enum_periode_isolation_id: enumPeriodIsolationId
234
+ };
235
+
236
+ /**
237
+ * @type {Contexte}
238
+ */
239
+ const ctx = { enumPeriodeConstructionId };
240
+
241
+ expect(service.typeIsolation(ctx, plancherHautDE)).toBe(typeIsolationExpected);
242
+ }
243
+ );
244
+
184
245
  describe("Test d'intégration de plancher haut", () => {
185
246
  test.each(corpus)('vérification des DI des ph pour dpe %s', (ademeId) => {
186
247
  /**
@@ -0,0 +1,439 @@
1
+ import { inject } from 'dioma';
2
+ import { DeperditionService } from '../deperdition.service.js';
3
+ import { logger } from '../../../../../core/util/logger/log-service.js';
4
+ import { compareReferences } from '../../../../../utils.js';
5
+ import { DeperditionMurService } from '../mur/deperdition-mur.service.js';
6
+ import { PontThermiqueTvStore } from '../../../../dpe/infrastructure/pontThermiqueTv.store.js';
7
+ import enums from '../../../../../enums.js';
8
+ import { DeperditionPlancherHautService } from '../plancher_haut/deperdition-plancher-haut.service.js';
9
+ import { DeperditionPlancherBasService } from '../plancher_bas/deperdition-plancher-bas.service.js';
10
+
11
+ /**
12
+ * Calcul des déperditions des ponts thermiques
13
+ * Chapitre 3.4 Calcul des déperditions par les ponts thermiques
14
+ *
15
+ * Méthode de calcul 3CL-DPE 2021
16
+ * Octobre 2021
17
+ * @see consolide_anne…arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf
18
+ *
19
+ * Si le coefficient U des portes est connu et justifié, le saisir directement. Sinon, prendre les valeurs tabulées
20
+ */
21
+ export class DeperditionPontThermiqueService extends DeperditionService {
22
+ /**
23
+ * @type {DeperditionMurService}
24
+ */
25
+ #deperditionMurService;
26
+
27
+ /**
28
+ * @type {DeperditionPlancherHautService}
29
+ */
30
+ #deperditionPlancherHautService;
31
+
32
+ /**
33
+ * @type {DeperditionPlancherBasService}
34
+ */
35
+ #deperditionPlancherBasService;
36
+
37
+ /**
38
+ * @param tvStore {PontThermiqueTvStore}
39
+ * @param deperditionMurService {DeperditionMurService}
40
+ * @param deperditionPlancherHautService {DeperditionPlancherHautService}
41
+ * @param deperditionPlancherBasService {DeperditionPlancherBasService}
42
+ */
43
+ constructor(
44
+ tvStore = inject(PontThermiqueTvStore),
45
+ deperditionMurService = inject(DeperditionMurService),
46
+ deperditionPlancherHautService = inject(DeperditionPlancherHautService),
47
+ deperditionPlancherBasService = inject(DeperditionPlancherBasService)
48
+ ) {
49
+ super(tvStore);
50
+ this.#deperditionMurService = deperditionMurService;
51
+ this.#deperditionPlancherHautService = deperditionPlancherHautService;
52
+ this.#deperditionPlancherBasService = deperditionPlancherBasService;
53
+ }
54
+
55
+ /**
56
+ * @param ctx {Contexte}
57
+ * @param enveloppe {Enveloppe}
58
+ * @param pontThermiqueDE {PontThermiqueDE}
59
+ * @return {PontThermiqueDI}
60
+ */
61
+ execute(ctx, enveloppe, pontThermiqueDE) {
62
+ /** @type {PontThermiqueDI} */
63
+ const di = {
64
+ k: undefined
65
+ };
66
+
67
+ if ([2, 3].includes(parseInt(pontThermiqueDE.enum_methode_saisie_pont_thermique_id))) {
68
+ // valeur justifiée saisie à partir des documents justificatifs autorisés
69
+ // saisie direct k depuis rset/rsee( etude rt2012/re2020)
70
+ di.k = pontThermiqueDE.k_saisi;
71
+
72
+ if (!di.k) {
73
+ logger.error(`
74
+ Aucune valeur de k_saisi pour le pont thermique '${pontThermiqueDE.reference}' alors que la donnée est saisie
75
+ `);
76
+ }
77
+ } else {
78
+ // valeur forfaitaire
79
+ di.k = this.k(ctx, pontThermiqueDE, enveloppe);
80
+ }
81
+
82
+ if (di.k === undefined) {
83
+ logger.error(`
84
+ Aucune valeur k n'a été trouvée pour le pont thermique '${pontThermiqueDE.description}'.
85
+ `);
86
+ di.k = this.defaultValue(pontThermiqueDE);
87
+ }
88
+
89
+ return di;
90
+ }
91
+
92
+ /**
93
+ * Coefficient de transmission thermique du vitrage (W/(m².K))
94
+ *
95
+ * @param ctx {Contexte}
96
+ * @param pontThermiqueDE {PontThermiqueDE}
97
+ * @param enveloppe {Enveloppe}
98
+ * @return {number|undefined}
99
+ */
100
+ k(ctx, pontThermiqueDE, enveloppe) {
101
+ if (!pontThermiqueDE.reference_1) {
102
+ logger.error(`
103
+ Impossible de trouver un mur ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
104
+ `);
105
+ return this.defaultValue(pontThermiqueDE);
106
+ }
107
+
108
+ const typeLiaison = parseInt(pontThermiqueDE.enum_type_liaison_id);
109
+
110
+ /**
111
+ * @type {MurDE|undefined}
112
+ */
113
+ const mur = this.mur(pontThermiqueDE, enveloppe);
114
+
115
+ if (mur && !this.murHasPontThermique(mur, typeLiaison)) {
116
+ return 0;
117
+ }
118
+
119
+ const isolationMur = this.isolationMur(ctx, mur);
120
+
121
+ switch (typeLiaison) {
122
+ // 'plancher bas / mur'
123
+ case 1: {
124
+ return this.pontThermiquePlancherBasMur(ctx, pontThermiqueDE, enveloppe, isolationMur);
125
+ }
126
+ // 'plancher haut lourd / mur'
127
+ case 3: {
128
+ return this.pontThermiquePlancherHautMur(ctx, pontThermiqueDE, enveloppe, isolationMur);
129
+ }
130
+ // 'menuiserie / mur'
131
+ case 5: {
132
+ return this.pontThermiqueMenuiserieMur(pontThermiqueDE, enveloppe, isolationMur);
133
+ }
134
+ //'plancher intermédiaire lourd / mur'
135
+ // 'refend / mur'
136
+ case 2:
137
+ case 4: {
138
+ return this.tvStore.getKForMur(typeLiaison, enums.type_isolation[isolationMur]);
139
+ }
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Calcul de l'isolation du mur
145
+ *
146
+ * @param ctx {Contexte}
147
+ * @param murDE {MurDE}
148
+ * @return {number}
149
+ */
150
+ isolationMur(ctx, murDE) {
151
+ if (murDE) {
152
+ return this.#deperditionMurService.typeIsolation(ctx, murDE);
153
+ } else {
154
+ // Isolation ITI si le mur n'est pas défini
155
+ return 3;
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Calcul du pont thermique 'plancher bas / mur'
161
+ *
162
+ * @param ctx {Contexte}
163
+ * @param pontThermiqueDE {PontThermiqueDE}
164
+ * @param enveloppe {Enveloppe}
165
+ * @param isolationMur {number}
166
+ * @return {number|undefined}
167
+ */
168
+ pontThermiquePlancherBasMur(ctx, pontThermiqueDE, enveloppe, isolationMur) {
169
+ const plancherBasDE = this.plancherBas(pontThermiqueDE, enveloppe);
170
+
171
+ if (!plancherBasDE) {
172
+ logger.error(`
173
+ Impossible de trouver un plancher bas ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
174
+ `);
175
+ return this.defaultValue(pontThermiqueDE);
176
+ }
177
+
178
+ if (!this.plancherBasHasPontThermique(plancherBasDE)) {
179
+ return 0;
180
+ }
181
+
182
+ const isolationPlancher = this.#deperditionPlancherBasService.typeIsolation(ctx, plancherBasDE);
183
+ return this.tvStore.getKForPlancher(
184
+ 1,
185
+ enums.type_isolation[isolationMur],
186
+ enums.type_isolation[isolationPlancher]
187
+ );
188
+ }
189
+
190
+ /**
191
+ Calcul du pont thermique 'plancher haut lourd / mur'
192
+ *
193
+ * @param ctx {Contexte}
194
+ * @param pontThermiqueDE {PontThermiqueDE}
195
+ * @param enveloppe {Enveloppe}
196
+ * @param isolationMur {number}
197
+ * @return {number|undefined}
198
+ */
199
+ pontThermiquePlancherHautMur(ctx, pontThermiqueDE, enveloppe, isolationMur) {
200
+ const plancherHautDE = this.plancherHaut(pontThermiqueDE, enveloppe);
201
+
202
+ if (!plancherHautDE) {
203
+ logger.error(`
204
+ Impossible de trouver un plancher haut ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
205
+ `);
206
+ return this.defaultValue(pontThermiqueDE);
207
+ }
208
+
209
+ if (!this.plancherHautHasPontThermique(plancherHautDE)) {
210
+ return 0;
211
+ }
212
+
213
+ const isolationPlancher = this.#deperditionPlancherHautService.typeIsolation(
214
+ ctx,
215
+ plancherHautDE
216
+ );
217
+ return this.tvStore.getKForPlancher(
218
+ 3,
219
+ enums.type_isolation[isolationMur],
220
+ enums.type_isolation[isolationPlancher]
221
+ );
222
+ }
223
+
224
+ /**
225
+ Calcul du pont thermique 'menuiserie / mur'
226
+ *
227
+ * @param pontThermiqueDE {PontThermiqueDE}
228
+ * @param enveloppe {Enveloppe}
229
+ * @param isolationMur {number}
230
+ * @return {number|undefined}
231
+ */
232
+ pontThermiqueMenuiserieMur(pontThermiqueDE, enveloppe, isolationMur) {
233
+ const menuiserieDE = this.menuiserie(pontThermiqueDE, enveloppe);
234
+
235
+ if (!menuiserieDE) {
236
+ logger.error(`
237
+ Impossible de trouver une menuiserie ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
238
+ `);
239
+ return this.defaultValue(pontThermiqueDE);
240
+ }
241
+
242
+ if (parseInt(menuiserieDE.enum_type_vitrage_id) === 5) {
243
+ return 0;
244
+ }
245
+
246
+ let typePose = parseInt(menuiserieDE.enum_type_pose_id || 3);
247
+
248
+ // Pour les types sans objet
249
+ if (typePose === 4) {
250
+ typePose = 3;
251
+ }
252
+
253
+ const largeurDormant = menuiserieDE.largeur_dormant;
254
+ const presenceRetourIsolation = menuiserieDE.presence_retour_isolation;
255
+
256
+ return this.tvStore.getKForMenuiserie(
257
+ 5,
258
+ enums.type_isolation[isolationMur],
259
+ typePose,
260
+ presenceRetourIsolation,
261
+ largeurDormant
262
+ );
263
+ }
264
+
265
+ /**
266
+ * Récupération du mur sur lequel se réfère ce pont thermique à partir des références
267
+ *
268
+ * @param pontThermiqueDE {PontThermiqueDE}
269
+ * @param enveloppe {Enveloppe}
270
+ * @return {MurDE|undefined}
271
+ */
272
+ mur(pontThermiqueDE, enveloppe) {
273
+ return (enveloppe.mur_collection?.mur || []).find(
274
+ (mur) =>
275
+ compareReferences(mur.donnee_entree.reference, pontThermiqueDE.reference_1) ||
276
+ compareReferences(mur.donnee_entree.reference, pontThermiqueDE.reference_2)
277
+ )?.donnee_entree;
278
+ }
279
+
280
+ /**
281
+ * Récupération du plancher bas sur lequel se réfère ce pont thermique à partir des références
282
+ *
283
+ * @param pontThermiqueDE {PontThermiqueDE}
284
+ * @param enveloppe {Enveloppe}
285
+ * @return {PlancherBasDE|undefined}
286
+ */
287
+ plancherBas(pontThermiqueDE, enveloppe) {
288
+ return (enveloppe.plancher_bas_collection?.plancher_bas || []).find(
289
+ (plancher) =>
290
+ compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_1) ||
291
+ compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_2)
292
+ )?.donnee_entree;
293
+ }
294
+
295
+ /**
296
+ * Récupération du plancher haut sur lequel se réfère ce pont thermique à partir des références
297
+ *
298
+ * @param pontThermiqueDE {PontThermiqueDE}
299
+ * @param enveloppe {Enveloppe}
300
+ * @return {PlancherHautDE|undefined}
301
+ */
302
+ plancherHaut(pontThermiqueDE, enveloppe) {
303
+ return (enveloppe.plancher_haut_collection?.plancher_haut || []).find(
304
+ (plancher) =>
305
+ compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_1) ||
306
+ compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_2)
307
+ )?.donnee_entree;
308
+ }
309
+
310
+ /**
311
+ * Récupération de la menuiserie (baie vitrée ou porte) sur laquelle se réfère ce pont thermique
312
+ *
313
+ * @param pontThermiqueDE {PontThermiqueDE}
314
+ * @param enveloppe {Enveloppe}
315
+ * @return {BaieVitreeDE|PorteDE|undefined}
316
+ */
317
+ menuiserie(pontThermiqueDE, enveloppe) {
318
+ return (enveloppe.baie_vitree_collection?.baie_vitree || [])
319
+ .concat(enveloppe.porte_collection?.porte || [])
320
+ .find(
321
+ (menuiserie) =>
322
+ compareReferences(menuiserie.donnee_entree.reference, pontThermiqueDE.reference_1) ||
323
+ compareReferences(menuiserie.donnee_entree.reference, pontThermiqueDE.reference_2)
324
+ )?.donnee_entree;
325
+ }
326
+
327
+ /**
328
+ * Retourne true si le mur est concerné par un pont thermique
329
+ * @param murDE {MurDE}
330
+ * @param typeLiaison {number}
331
+ */
332
+ murHasPontThermique(murDE, typeLiaison) {
333
+ /**
334
+ * 3.4 Calcul des déperditions par les ponts thermiques
335
+ * Les ponts thermiques des parois au niveau des circulations communes ne sont pas pris en compte.
336
+ * 14 - Circulation sans ouverture directe sur l'extérieur
337
+ * 15 - Circulation avec ouverture directe sur l'extérieur
338
+ * 16 - Circulation avec bouche ou gaine de désenfumage ouverte en permanence
339
+ * 17 - Hall d'entrée avec dispositif de fermeture automatique
340
+ * 18 - Hall d'entrée sans dispositif de fermeture automatique
341
+ * 22 - Local non déperditif ( local à usage d'habitation chauffé)
342
+ */
343
+ // @todo vérifier la liste
344
+ if ([14, 15, 16, 17, 18, 22].includes(parseInt(murDE.enum_type_adjacence_id))) {
345
+ return false;
346
+ }
347
+
348
+ /**
349
+ * 3.4.1 Mur Plancher bas / mur
350
+ * 3.4.3 Plancher haut / mur
351
+ *
352
+ * Seuls les murs et planchers bas constitués d’un matériau lourd (béton, brique, …) sont considérés ici. Pour les autres
353
+ * cas ce pont thermique est pris nul.
354
+ *
355
+ * 5 - Murs en pan de bois sans remplissage tout venant
356
+ * 6 - Murs en pan de bois avec remplissage tout venant
357
+ * 7 - Murs bois (rondin)
358
+ * 16 - Béton cellulaire avant 2013
359
+ * 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
360
+ * 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
361
+ * 25 - Murs en ossature bois sans remplissage
362
+ * 26 - Murs en ossature bois avec isolant en remplissage <2001
363
+ * 27 - Murs en ossature bois avec remplissage tout venant
364
+ */
365
+ if (typeLiaison === 1 || typeLiaison === 3) {
366
+ return ![5, 6, 7, 16, 18, 24, 25, 26, 27].includes(
367
+ parseInt(murDE.enum_materiaux_structure_mur_id)
368
+ );
369
+ }
370
+
371
+ /**
372
+ * 3.4.5 Menuiserie / mur
373
+ * Les ponts thermiques avec les parois en structure bois (ossature bois, rondin de bois, pans de bois) sont négligés.
374
+ * enum_materiaux_structure_mur_id
375
+ *
376
+ * 5 - Murs en pan de bois sans remplissage tout venant
377
+ * 6 - Murs en pan de bois avec remplissage tout venant
378
+ * 7 - Murs bois (rondin)
379
+ * 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
380
+ * 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
381
+ * 25 - Murs en ossature bois sans remplissage
382
+ * 26 - Murs en ossature bois avec isolant en remplissage <2001
383
+ * 27 - Murs en ossature bois avec remplissage tout venant
384
+ */
385
+ if (typeLiaison === 4) {
386
+ return ![5, 6, 7, 18, 24, 25, 26, 27].includes(
387
+ parseInt(murDE.enum_materiaux_structure_mur_id)
388
+ );
389
+ }
390
+
391
+ return true;
392
+ }
393
+
394
+ /**
395
+ * Retourne true si le plancher haut est concerné par un pont thermique
396
+ * @param plancherHautDE {PlancherHautDE}
397
+ * @return {boolean}
398
+ */
399
+ plancherHautHasPontThermique(plancherHautDE) {
400
+ /**
401
+ * 3.4.3 Plancher haut / mur
402
+ *
403
+ * Les ponts thermiques des planchers haut en structure légère sont négligés.
404
+ * type_plancher_haut
405
+
406
+ * 9 - Plafond bois sur solives bois
407
+ * 10 - Plafond bois sous solives bois
408
+ */
409
+ // @todo d'autres type de plancher haut ?
410
+ return ![9, 10].includes(parseInt(plancherHautDE.enum_type_plancher_haut_id));
411
+ }
412
+
413
+ /**
414
+ * Retourne true si le plancher bas est concerné par un pont thermique
415
+ *
416
+ * @param plancherBasDE {PlancherBasDE}
417
+ */
418
+ plancherBasHasPontThermique(plancherBasDE) {
419
+ /**
420
+ * 3.4.3 Plancher haut / mur
421
+ *
422
+ * Seuls les planchers bas constitués d’un matériau lourd (béton, brique, …) sont considérés ici. Pour les autres
423
+ * cas ce pont thermique est pris nul.
424
+
425
+ * 4 - Plancher entre solives bois avec ou sans remplissage
426
+ * 10 - Plancher bois sur solives bois
427
+ */
428
+ // @todo d'autres type de plancher bas ?
429
+ return ![4, 10].includes(parseInt(plancherBasDE.enum_type_plancher_bas_id));
430
+ }
431
+
432
+ /**
433
+ *
434
+ * @param ptDE {PontThermiqueDE}
435
+ */
436
+ defaultValue(ptDE) {
437
+ return this.tvStore.getKForMurById(ptDE.tv_pont_thermique_id);
438
+ }
439
+ }