@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
@@ -0,0 +1,352 @@
1
+ import { beforeEach, describe, expect, test } from 'vitest';
2
+ import { BaieVitreeTvStore } from './baieVitreeTv.store.js';
3
+
4
+ /** @type {BaieVitreeTvStore} **/
5
+ let tvStore;
6
+
7
+ describe('Lecture des tables de valeurs', () => {
8
+ beforeEach(() => {
9
+ tvStore = new BaieVitreeTvStore();
10
+ });
11
+
12
+ describe('lecture des valeurs de ug', () => {
13
+ test.each([
14
+ {
15
+ label: 'Simple vitrage',
16
+ enumTypeVitrageId: '1',
17
+ expected: 5.8
18
+ },
19
+ {
20
+ label: "Survitrage non traité avec lame d'air 6mm",
21
+ enumTypeVitrageId: '4',
22
+ epaisseurLame: 6,
23
+ expected: 3.4
24
+ },
25
+ {
26
+ label: "Survitrage non traité avec lame d'air 20mm",
27
+ enumTypeVitrageId: '4',
28
+ epaisseurLame: 20,
29
+ expected: 2.8
30
+ },
31
+ {
32
+ label: "Double vitrage vertical traité avec lame d'air argon 14mm",
33
+ enumTypeVitrageId: '2',
34
+ epaisseurLame: 14,
35
+ enumTypeGazLameId: '2',
36
+ enumInclinaisonVitrageId: '1',
37
+ vitrageVir: '1',
38
+ expected: 1.2
39
+ },
40
+ {
41
+ label: "Double vitrage vertical non traité avec lame d'air argon 14mm",
42
+ enumTypeVitrageId: '2',
43
+ epaisseurLame: 14,
44
+ enumTypeGazLameId: '2',
45
+ enumInclinaisonVitrageId: '1',
46
+ vitrageVir: '0',
47
+ expected: 2.8
48
+ },
49
+ {
50
+ label: "Double vitrage horizontal non traité avec lame d'air inconnu 15mm",
51
+ enumTypeVitrageId: '2',
52
+ epaisseurLame: 15,
53
+ enumTypeGazLameId: '3',
54
+ enumInclinaisonVitrageId: '4',
55
+ vitrageVir: '0',
56
+ expected: 2.9
57
+ },
58
+ {
59
+ label: "Double vitrage horizontal non traité avec lame d'air inconnu 12mm",
60
+ enumTypeVitrageId: '2',
61
+ epaisseurLame: 12,
62
+ enumTypeGazLameId: '3',
63
+ enumInclinaisonVitrageId: '4',
64
+ vitrageVir: '0',
65
+ expected: 3.1
66
+ }
67
+ ])(
68
+ `ug pour baie vitrée $label`,
69
+ ({
70
+ enumTypeVitrageId,
71
+ enumTypeGazLameId = undefined,
72
+ enumInclinaisonVitrageId = undefined,
73
+ vitrageVir = undefined,
74
+ epaisseurLame = undefined,
75
+ expected
76
+ }) => {
77
+ expect(
78
+ tvStore.getUg(
79
+ enumTypeVitrageId,
80
+ enumTypeGazLameId,
81
+ enumInclinaisonVitrageId,
82
+ vitrageVir,
83
+ epaisseurLame
84
+ )
85
+ ).toBe(expected);
86
+ }
87
+ );
88
+
89
+ test('Récupération des valeurs des épaisseurs disponibles pour les valeurs de ug', () => {
90
+ expect(tvStore.getEpaisseurAvailableForUg()).toStrictEqual([
91
+ 0, 6, 8, 10, 12, 14, 15, 16, 18, 20
92
+ ]);
93
+ });
94
+
95
+ test('pas de valeur de ug', () => {
96
+ const ug = tvStore.getUg('0', '0', '0', false, 0);
97
+ expect(ug).toBeUndefined();
98
+ });
99
+ });
100
+
101
+ describe('lecture des valeurs de sw', () => {
102
+ test.each([
103
+ {
104
+ label: 'Paroi en brique de verre pleine',
105
+ enumTypeBaieId: '1',
106
+ enumTypeMateriauxMenuiserieId: '1',
107
+ expected: 0.4
108
+ },
109
+ {
110
+ label: 'Paroi en polycarbonnate',
111
+ enumTypeBaieId: '3',
112
+ enumTypeMateriauxMenuiserieId: '2',
113
+ expected: 0.4
114
+ },
115
+ {
116
+ label: 'Fenêtres battantes',
117
+ enumTypeBaieId: '4',
118
+ enumTypeMateriauxMenuiserieId: '3',
119
+ enumTypeVitrageId: '1',
120
+ expected: 0.58
121
+ },
122
+ {
123
+ label: 'Fenêtres coulissantes',
124
+ enumTypeBaieId: '5',
125
+ enumTypeMateriauxMenuiserieId: '3',
126
+ enumTypeVitrageId: '3',
127
+ enumTypePoseId: '2',
128
+ expected: 0.41
129
+ },
130
+ {
131
+ label: 'Fenêtres coulissantes',
132
+ enumTypeBaieId: '5',
133
+ enumTypeMateriauxMenuiserieId: '3',
134
+ enumTypeVitrageId: '3',
135
+ enumTypePoseId: '2',
136
+ vitrageVir: 1,
137
+ expected: 0.37
138
+ },
139
+ {
140
+ label: 'Fenêtres coulissantes',
141
+ enumTypeBaieId: '5',
142
+ enumTypeMateriauxMenuiserieId: '3',
143
+ enumTypeVitrageId: '3',
144
+ enumTypePoseId: '2',
145
+ vitrageVir: '1',
146
+ expected: 0.37
147
+ }
148
+ ])(
149
+ `sw pour baie vitrée $label`,
150
+ ({
151
+ enumTypeVitrageId = undefined,
152
+ enumTypeBaieId,
153
+ enumTypeMateriauxMenuiserieId,
154
+ vitrageVir = undefined,
155
+ enumTypePoseId = undefined,
156
+ expected
157
+ }) => {
158
+ expect(
159
+ tvStore.getSw(
160
+ enumTypeVitrageId,
161
+ enumTypeBaieId,
162
+ enumTypeMateriauxMenuiserieId,
163
+ vitrageVir,
164
+ enumTypePoseId
165
+ )
166
+ ).toBe(expected);
167
+ }
168
+ );
169
+
170
+ test('pas de valeur de sw', () => {
171
+ const ug = tvStore.getSw('0', '0', '0', '0', '0');
172
+ expect(ug).toBeUndefined();
173
+ });
174
+ });
175
+
176
+ describe('lecture des valeurs de uw', () => {
177
+ test.each([
178
+ {
179
+ label: 'Paroi en brique de verre pleine',
180
+ enumTypeBaieId: '1',
181
+ enumTypeMateriauxMenuiserieId: '1',
182
+ expected: 3.5
183
+ },
184
+ {
185
+ label: 'Paroi en polycarbonnate',
186
+ enumTypeBaieId: '3',
187
+ enumTypeMateriauxMenuiserieId: '2',
188
+ expected: 3
189
+ },
190
+ {
191
+ label: 'uw non extrapolé pour Fenêtres battantes',
192
+ enumTypeBaieId: '4',
193
+ enumTypeMateriauxMenuiserieId: '6',
194
+ ug: 0.5,
195
+ expected: 1.3
196
+ },
197
+ {
198
+ label: 'uw extrapolé pour Fenêtres coulissantes',
199
+ enumTypeBaieId: '5',
200
+ enumTypeMateriauxMenuiserieId: '6',
201
+ ug: '2.45',
202
+ expected: 3.05
203
+ },
204
+ {
205
+ label: 'uw extrapolé pour Fenêtres coulissantes',
206
+ enumTypeBaieId: '5',
207
+ enumTypeMateriauxMenuiserieId: '6',
208
+ ug: '8',
209
+ expected: 8
210
+ }
211
+ ])(
212
+ `uw pour baie vitrée $label`,
213
+ ({ enumTypeBaieId, enumTypeMateriauxMenuiserieId, ug = undefined, expected }) => {
214
+ expect(tvStore.getUw(enumTypeBaieId, enumTypeMateriauxMenuiserieId, ug)).toBeCloseTo(
215
+ expected,
216
+ 2
217
+ );
218
+ }
219
+ );
220
+
221
+ test('pas de valeur de uw', () => {
222
+ const ug = tvStore.getSw('0', '0', 0);
223
+ expect(ug).toBeUndefined();
224
+ });
225
+ });
226
+
227
+ describe('lecture des valeurs de ujn', () => {
228
+ test.each([
229
+ {
230
+ label: 'ujn non extrapolé',
231
+ enumTypeFermetureId: '2',
232
+ uw: 0.8,
233
+ expected: '0.8'
234
+ },
235
+ {
236
+ label: 'ujn extrapolé',
237
+ enumTypeFermetureId: '2',
238
+ uw: 0.85,
239
+ expected: '0.85'
240
+ },
241
+ {
242
+ label: 'ujn extrapolé > à la borne maximale des valeurs connues',
243
+ enumTypeFermetureId: '2',
244
+ uw: 7,
245
+ expected: '5.9'
246
+ }
247
+ ])(`ujn pour baie vitrée $label`, ({ enumTypeFermetureId, uw, expected }) => {
248
+ expect(tvStore.getUjn(enumTypeFermetureId, uw)).toBeCloseTo(expected, 2);
249
+ });
250
+
251
+ test('pas de valeur de ujn', () => {
252
+ const ug = tvStore.getUjn('0', 0);
253
+ expect(ug).toBeUndefined();
254
+ });
255
+ });
256
+
257
+ describe('lecture des valeurs de deltar', () => {
258
+ test.each([
259
+ {
260
+ label: 'Jalousie accordéon',
261
+ enumTypeFermetureId: '2',
262
+ expected: 0.08
263
+ },
264
+ {
265
+ label: 'Fermeture isolée sans ajours',
266
+ enumTypeFermetureId: '8',
267
+ expected: 0.25
268
+ }
269
+ ])(`deltar pour baie vitrée $label`, ({ enumTypeFermetureId, expected }) => {
270
+ expect(tvStore.getDeltar(enumTypeFermetureId)).toBe(expected);
271
+ });
272
+
273
+ test('pas de valeur de deltar', () => {
274
+ const ug = tvStore.getDeltar('0');
275
+ expect(ug).toBeUndefined();
276
+ });
277
+ });
278
+
279
+ describe('lecture des valeurs des masques lointains non homogènes', () => {
280
+ test.each([
281
+ {
282
+ label: '2 secteurs lateraux',
283
+ tvCoeffMasqueLointainNonHomogeneId: '1',
284
+ expected: 0
285
+ },
286
+ {
287
+ label: '2 secteurs lateraux',
288
+ tvCoeffMasqueLointainNonHomogeneId: '4',
289
+ expected: 15
290
+ }
291
+ ])(`ombre pour baie vitrée $label`, ({ tvCoeffMasqueLointainNonHomogeneId, expected }) => {
292
+ expect(tvStore.getOmbre(tvCoeffMasqueLointainNonHomogeneId)).toBe(expected);
293
+ });
294
+
295
+ test('pas de valeur de masque lointain non homogène', () => {
296
+ const ug = tvStore.getOmbre('0');
297
+ expect(ug).toBeUndefined();
298
+ });
299
+ });
300
+
301
+ describe('lecture des valeurs des masques proches', () => {
302
+ test.each([
303
+ {
304
+ label: 'Baie en fond de balcon ou fond et flanc de loggias',
305
+ tvCoefMasqueProcheId: '1',
306
+ expected: 0.4
307
+ },
308
+ {
309
+ label: 'Baie sous un balcon ou auvent',
310
+ tvCoefMasqueProcheId: '13',
311
+ expected: 0.8
312
+ }
313
+ ])(`incidence masque proche pour baie vitrée $label`, ({ tvCoefMasqueProcheId, expected }) => {
314
+ expect(tvStore.getMasqueProche(tvCoefMasqueProcheId)).toBe(expected);
315
+ });
316
+
317
+ test('pas de valeur de masque proche', () => {
318
+ const ug = tvStore.getMasqueProche('0');
319
+ expect(ug).toBeUndefined();
320
+ });
321
+ });
322
+
323
+ describe('lecture des valeurs des masques lointains homogènes', () => {
324
+ test.each([
325
+ {
326
+ label: 'Orientation nord, hauteur 15 ≤….< 30',
327
+ tvCoefMasqueLointainHomogeneId: '2',
328
+ expected: 0.82
329
+ },
330
+ {
331
+ label: 'Orientation sud, hauteur 60 ≤….< 90',
332
+ tvCoefMasqueLointainHomogeneId: '8',
333
+ expected: 0.1
334
+ }
335
+ ])(
336
+ `incidence masque proche pour baie vitrée $label`,
337
+ ({ tvCoefMasqueLointainHomogeneId, expected }) => {
338
+ expect(tvStore.getMasqueLointainHomogene(tvCoefMasqueLointainHomogeneId)).toBe(expected);
339
+ }
340
+ );
341
+
342
+ test('pas de valeur de masque lointain homogène', () => {
343
+ const ug = tvStore.getMasqueLointainHomogene('0');
344
+ expect(ug).toBeUndefined();
345
+ });
346
+ });
347
+
348
+ test('lecture des épaisseurs disponibles pour les coefficients de transmission thermique ug', () => {
349
+ const ug = tvStore.getEpaisseurAvailableForUg();
350
+ expect(ug).toStrictEqual([0, 6, 8, 10, 12, 14, 15, 16, 18, 20]);
351
+ });
352
+ });
@@ -0,0 +1,112 @@
1
+ import { tvs as tv } from '../../../tv-v2.js';
2
+ import { logger } from '../../../core/util/logger/log-service.js';
3
+ import { TvStore } from './tv.store.js';
4
+
5
+ /**
6
+ * Accès aux données des tables de valeurs pour les baies vitrées
7
+ */
8
+ export class PontThermiqueTvStore extends TvStore {
9
+ /**
10
+ * Valeur du pont thermique (W/(m.K)) via tv_pont_thermique_id
11
+ *
12
+ * @param tvPontThermiqueId {number}
13
+ * @return {number|undefined}
14
+ */
15
+ getKForMurById(tvPontThermiqueId) {
16
+ const k = tv['pont_thermique'].find(
17
+ (v) => parseInt(v.tv_pont_thermique_id) === tvPontThermiqueId
18
+ )?.k;
19
+
20
+ if (!k) {
21
+ logger.error(`Pas de valeur forfaitaire k pour tvPontThermiqueId:${tvPontThermiqueId}`);
22
+ return 0;
23
+ }
24
+
25
+ return parseFloat(k);
26
+ }
27
+
28
+ /**
29
+ * Valeur du pont thermique (W/(m.K))
30
+ *
31
+ * @param enumTypeLiaisonId {number}
32
+ * @param isolationMur {string}
33
+ * @return {number|undefined}
34
+ */
35
+ getKForMur(enumTypeLiaisonId, isolationMur) {
36
+ const k = tv['pont_thermique'].find(
37
+ (v) =>
38
+ parseInt(v.enum_type_liaison_id) === enumTypeLiaisonId &&
39
+ v.isolation_mur.toLowerCase() === isolationMur.toLowerCase()
40
+ )?.k;
41
+
42
+ if (!k) {
43
+ logger.error(`Pas de valeur forfaitaire k pour isolationMur:${isolationMur}`);
44
+ return;
45
+ }
46
+
47
+ return parseFloat(k);
48
+ }
49
+
50
+ /**
51
+ * Valeur du pont thermique (W/(m.K))
52
+ *
53
+ * @param enumTypeLiaisonId {number}
54
+ * @param isolationMur {string}
55
+ * @param isolationPlancher {string}
56
+ * @return {number|undefined}
57
+ */
58
+ getKForPlancher(enumTypeLiaisonId, isolationMur, isolationPlancher) {
59
+ const k = tv['pont_thermique'].find(
60
+ (v) =>
61
+ parseInt(v.enum_type_liaison_id) === enumTypeLiaisonId &&
62
+ v.isolation_mur.toLowerCase() === isolationMur.toLowerCase() &&
63
+ v.isolation_plancher.toLowerCase() === isolationPlancher.toLowerCase()
64
+ )?.k;
65
+
66
+ if (!k) {
67
+ logger.error(
68
+ `Pas de valeur forfaitaire k pour isolationMur:${isolationMur}, isolationPlancher:${isolationPlancher}`
69
+ );
70
+ return;
71
+ }
72
+
73
+ return parseFloat(k);
74
+ }
75
+
76
+ /**
77
+ * Valeur du pont thermique (W/(m.K))
78
+ *
79
+ * @param enumTypeLiaisonId {number}
80
+ * @param isolationMur {string}
81
+ * @param typePose {number}
82
+ * @param presenceRetourIsolation {number}
83
+ * @param largeurDormant {number}
84
+ * @return {number|undefined}
85
+ */
86
+ getKForMenuiserie(
87
+ enumTypeLiaisonId,
88
+ isolationMur,
89
+ typePose,
90
+ presenceRetourIsolation,
91
+ largeurDormant
92
+ ) {
93
+ const k = tv['pont_thermique'].find(
94
+ (v) =>
95
+ parseInt(v.enum_type_liaison_id) === enumTypeLiaisonId &&
96
+ v.isolation_mur.toLowerCase() === isolationMur.toLowerCase() &&
97
+ (!v.enum_type_pose_id || parseInt(v.enum_type_pose_id) === typePose) &&
98
+ (!v.presence_retour_isolation ||
99
+ parseInt(v.presence_retour_isolation) === presenceRetourIsolation) &&
100
+ (!v.largeur_dormant || !largeurDormant || parseInt(v.largeur_dormant) === largeurDormant)
101
+ )?.k;
102
+
103
+ if (!k) {
104
+ logger.error(
105
+ `Pas de valeur forfaitaire k pour isolationMur:${isolationMur}, typePose:${typePose}, presenceRetourIsolation:${presenceRetourIsolation}, largeurDormant:${largeurDormant}`
106
+ );
107
+ return;
108
+ }
109
+
110
+ return parseFloat(k);
111
+ }
112
+ }
@@ -0,0 +1,134 @@
1
+ import { beforeEach, describe, expect, test } from 'vitest';
2
+ import { PontThermiqueTvStore } from './pontThermiqueTv.store.js';
3
+
4
+ /** @type {PontThermiqueTvStore} **/
5
+ let tvStore;
6
+
7
+ describe('Lecture des tables de valeurs', () => {
8
+ beforeEach(() => {
9
+ tvStore = new PontThermiqueTvStore();
10
+ });
11
+
12
+ describe('lecture des valeurs de k', () => {
13
+ test.each([
14
+ {
15
+ label: 'tv_pont_thermique_id existant',
16
+ tvPontThermiqueId: 1,
17
+ expected: 0.39
18
+ },
19
+ {
20
+ label: 'tv_pont_thermique_id inexistant',
21
+ tvPontThermiqueId: 0,
22
+ expected: 0
23
+ }
24
+ ])(
25
+ `k via tv_pont_thermique_id pour un pont thermique avec $label`,
26
+ ({ tvPontThermiqueId, expected }) => {
27
+ expect(tvStore.getKForMurById(tvPontThermiqueId)).toBe(expected);
28
+ }
29
+ );
30
+
31
+ test.each([
32
+ {
33
+ label: 'enum_type_liaison_id et isolation_mur qui correspondent',
34
+ enumTypeLiaisonId: 1,
35
+ isolationMur: 'Non isolé',
36
+ expected: 0.39
37
+ },
38
+ {
39
+ label: 'enum_type_liaison_id et isolation_mur qui ne correspondent à aucune entrée',
40
+ enumTypeLiaisonId: 0,
41
+ isolationMur: '',
42
+ expected: undefined
43
+ }
44
+ ])(`k pour un pont thermique via $label`, ({ enumTypeLiaisonId, isolationMur, expected }) => {
45
+ expect(tvStore.getKForMur(enumTypeLiaisonId, isolationMur)).toBe(expected);
46
+ });
47
+
48
+ test.each([
49
+ {
50
+ label: 'enum_type_liaison_id, isolation_mur et isolationPlancher qui correspondent',
51
+ enumTypeLiaisonId: 1,
52
+ isolationMur: 'Non isolé',
53
+ isolationPlancher: 'iti',
54
+ expected: 0.47
55
+ },
56
+ {
57
+ label: 'enum_type_liaison_id et isolation_mur qui ne correspondent à aucune entrée',
58
+ enumTypeLiaisonId: 0,
59
+ isolationMur: 'Non isolé',
60
+ isolationPlancher: 'iti',
61
+ expected: undefined
62
+ }
63
+ ])(
64
+ `k pour un pont thermique via $label`,
65
+ ({ enumTypeLiaisonId, isolationMur, isolationPlancher, expected }) => {
66
+ expect(tvStore.getKForPlancher(enumTypeLiaisonId, isolationMur, isolationPlancher)).toBe(
67
+ expected
68
+ );
69
+ }
70
+ );
71
+ });
72
+
73
+ test.each([
74
+ {
75
+ label:
76
+ 'enum_type_liaison_id, isolation_mur, typePose, largeurDormant, sans largeurDormant et presenceRetourIsolation qui correspondent',
77
+ enumTypeLiaisonId: 5,
78
+ isolationMur: 'Non isolé',
79
+ typePose: 1,
80
+ presenceRetourIsolation: undefined,
81
+ largeurDormant: undefined,
82
+ expected: 0.43
83
+ },
84
+ {
85
+ label:
86
+ 'enum_type_liaison_id, isolation_mur, typePose, largeurDormant, sans presenceRetourIsolation qui correspondent',
87
+ enumTypeLiaisonId: 5,
88
+ isolationMur: 'Non isolé',
89
+ typePose: 1,
90
+ presenceRetourIsolation: undefined,
91
+ largeurDormant: 5,
92
+ expected: 0.43
93
+ },
94
+ {
95
+ label:
96
+ 'enum_type_liaison_id, isolation_mur, typePose, largeurDormant, presenceRetourIsolation qui correspondent',
97
+ enumTypeLiaisonId: 5,
98
+ isolationMur: 'iti',
99
+ typePose: 3,
100
+ presenceRetourIsolation: 1,
101
+ largeurDormant: 10,
102
+ expected: 0.13
103
+ },
104
+ {
105
+ label: 'enum_type_liaison_id et isolation_mur qui ne correspondent à aucune entrée',
106
+ enumTypeLiaisonId: 5,
107
+ isolationMur: 'undefined',
108
+ typePose: 1,
109
+ presenceRetourIsolation: '1',
110
+ largeurDormant: 5,
111
+ expected: undefined
112
+ }
113
+ ])(
114
+ `k pour un pont thermique via $label`,
115
+ ({
116
+ enumTypeLiaisonId,
117
+ isolationMur,
118
+ typePose,
119
+ presenceRetourIsolation,
120
+ largeurDormant,
121
+ expected
122
+ }) => {
123
+ expect(
124
+ tvStore.getKForMenuiserie(
125
+ enumTypeLiaisonId,
126
+ isolationMur,
127
+ typePose,
128
+ presenceRetourIsolation,
129
+ largeurDormant
130
+ )
131
+ ).toBe(expected);
132
+ }
133
+ );
134
+ });
@@ -301,39 +301,6 @@ export class TvStore {
301
301
  return parseFloat(uph);
302
302
  }
303
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
304
  /**
338
305
  * Débits de la ventilation
339
306
  * @param typeVentilation {number}