@open3cl/engine 1.0.8 → 1.0.10

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 (35) hide show
  1. package/features/dpe/domain/models/dpe.model.ts +7 -3
  2. package/features/dpe/domain/models/{plancher-bas.model.ts → plancher.model.ts} +31 -7
  3. package/features/dpe/domain/models/type-habitation.model.js +8 -0
  4. package/features/dpe/infrastructure/baieVitreeTv.store.js +70 -0
  5. package/features/dpe/infrastructure/baieVitreeTv.store.spec.js +106 -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/engine/domain/contexte.builder.js +59 -63
  9. package/features/engine/domain/contexte.builder.spec.js +41 -62
  10. package/features/engine/domain/engine.service.js +20 -2
  11. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +1 -1
  12. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +41 -0
  13. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +3 -3
  14. package/features/engine/domain/enveloppe/deperdition.service.js +2 -3
  15. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.js +44 -0
  16. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +81 -0
  17. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +31 -3
  18. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +91 -10
  19. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +48 -2
  20. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +103 -6
  21. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +35 -2
  22. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +82 -7
  23. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +439 -0
  24. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +636 -0
  25. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +1 -1
  26. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +2 -2
  27. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +1 -1
  28. package/features/engine/domain/logement/nadeq.service.js +62 -0
  29. package/features/engine/domain/logement/nadeq.service.spec.js +71 -0
  30. package/features/engine/domain/logement/surface-sud-equivalente.service.js +169 -0
  31. package/features/engine/domain/logement/surface-sud-equivalente.service.spec.js +210 -0
  32. package/features/engine/domain/models/contexte.model.ts +10 -5
  33. package/features/engine/domain/models/deperdition.model.ts +1 -1
  34. package/package.json +1 -1
  35. package/features/dpe/domain/models/plancher-haut.model.ts +0 -33
@@ -4,8 +4,7 @@ import { Ets } from './ets.model';
4
4
  import { InstallationChauffage } from './installation-chauffage.model';
5
5
  import { InstallationEcs } from './installation-ecs.model';
6
6
  import { Mur } from './mur.model';
7
- import { PlancherBas } from './plancher-bas.model';
8
- import { PlancherHaut } from './plancher-haut.model';
7
+ import { PlancherBas, PlancherHaut } from './plancher.model';
9
8
  import { PontThermique } from './pont-thermique.model';
10
9
  import { Porte } from './porte.model';
11
10
  import { ProductionElecEnr } from './production-elec-enr.model';
@@ -187,7 +186,12 @@ export interface DE {
187
186
  reference?: string;
188
187
  }
189
188
 
190
- enum TypeHabitation {
189
+ export enum TypeHabitation {
190
+ MAISON = 'MAISON',
191
+ APPARTEMENT = 'APPARTEMENT',
192
+ IMMEUBLE = 'IMMEUBLE'
193
+ }
194
+ export enum TypeDpe {
191
195
  MAISON = 'MAISON',
192
196
  APPARTEMENT = 'APPARTEMENT',
193
197
  IMMEUBLE = 'IMMEUBLE'
@@ -5,7 +5,12 @@ export interface PlancherBas {
5
5
  donnee_intermediaire?: PlancherBasDI;
6
6
  }
7
7
 
8
- export interface PlancherBasDE extends DE {
8
+ export interface PlancherHaut {
9
+ donnee_entree?: PlancherHautDE;
10
+ donnee_intermediaire?: PlancherHautDI;
11
+ }
12
+
13
+ export interface PlancherDE extends DE {
9
14
  reference_lnc?: string;
10
15
  tv_coef_reduction_deperdition_id?: string; // TV
11
16
  surface_aiu?: number;
@@ -13,26 +18,45 @@ export interface PlancherBasDE extends DE {
13
18
  enum_cfg_isolation_lnc_id?: string; // ENUM cfg_isolation_lnc
14
19
  enum_type_adjacence_id?: string; // ENUM type_adjacence
15
20
  surface_paroi_opaque?: number;
16
- upb0_saisi?: number;
17
- tv_upb0_id?: string; // TV
18
- enum_type_plancher_bas_id?: string; // ENUM type_plancher_bas
19
21
  enum_methode_saisie_u0_id?: string; // ENUM methode_saisie_u0
20
- upb_saisi?: number;
22
+
21
23
  enum_type_isolation_id?: string; // ENUM type_isolation
22
24
  enum_periode_isolation_id?: string; // ENUM periode_isolation
23
25
  resistance_isolation?: number;
24
26
  epaisseur_isolation?: number;
25
- tv_upb_id?: string; // TV
26
27
  enum_methode_saisie_u_id?: string; // ENUM methode_saisie_u
28
+ }
29
+
30
+ export interface PlancherDI {
31
+ b: number;
32
+ }
33
+
34
+ export interface PlancherBasDE extends PlancherDE {
35
+ upb0_saisi?: number;
36
+ tv_upb0_id?: string; // TV
37
+ enum_type_plancher_bas_id?: string; // ENUM type_plancher_bas
38
+ upb_saisi?: number;
39
+ tv_upb_id?: string; // TV
27
40
  calcul_ue: number;
28
41
  perimetre_ue?: number;
29
42
  surface_ue?: number;
30
43
  ue?: number;
31
44
  }
32
45
 
33
- export interface PlancherBasDI {
46
+ export interface PlancherBasDI extends PlancherDI {
34
47
  upb: number;
35
48
  upb0: number;
36
49
  upb_final: number;
50
+ }
51
+
52
+ export interface PlancherHautDE extends PlancherDE {
53
+ uph0_saisi?: number;
54
+ tv_uph0_id?: string; // TV
55
+ enum_type_plancher_haut_id?: string; // ENUM type_plancher_bas
56
+ uph_saisi?: number;
57
+ tv_uph_id?: string; // TV
58
+ }
59
+
60
+ export interface PlancherHautDI extends PlancherDI {
37
61
  b: number;
38
62
  }
@@ -6,3 +6,11 @@ export const TypeHabitation = {
6
6
  APPARTEMENT: 'APPARTEMENT',
7
7
  IMMEUBLE: 'IMMEUBLE'
8
8
  };
9
+ /**
10
+ * @type {{[key: string]: string}}
11
+ */
12
+ export const TypeDpe = {
13
+ MAISON: 'MAISON',
14
+ APPARTEMENT: 'APPARTEMENT',
15
+ IMMEUBLE: 'IMMEUBLE'
16
+ };
@@ -2,6 +2,7 @@ import { tvs as tv } from '../../../tv-v2.js';
2
2
  import { getRange } from '../../../utils.js';
3
3
  import { logger } from '../../../core/util/logger/log-service.js';
4
4
  import { TvStore } from './tv.store.js';
5
+ import enums from '../../../enums.js';
5
6
 
6
7
  /**
7
8
  * Accès aux données des tables de valeurs pour les baies vitrées
@@ -289,4 +290,73 @@ export class BaieVitreeTvStore extends TvStore {
289
290
 
290
291
  return parseFloat(fe2);
291
292
  }
293
+
294
+ /**
295
+ * Calcul des coefficients de réduction de température des espaces tampons
296
+ *
297
+ * @param zoneClimatique {string}
298
+ * @param enumCfgIsolationLncId {number}
299
+ * @return {number|undefined}
300
+ */
301
+ getBver(zoneClimatique, enumCfgIsolationLncId) {
302
+ const bver = tv['coef_reduction_deperdition'].find(
303
+ (v) =>
304
+ zoneClimatique.toLowerCase().startsWith(v.zone_climatique?.toLowerCase()) &&
305
+ parseInt(v.enum_cfg_isolation_lnc_id) === parseInt(enumCfgIsolationLncId)
306
+ )?.b;
307
+
308
+ if (!bver) {
309
+ logger.error(
310
+ `Pas de valeur b pour zoneClimatique:${zoneClimatique}, enumCfgIsolationLncId:${enumCfgIsolationLncId}`
311
+ );
312
+ return;
313
+ }
314
+
315
+ return parseFloat(bver);
316
+ }
317
+
318
+ /**
319
+ * Calcul des coefficients de transparence des espaces tampons
320
+ *
321
+ * @param tvCoefTransparenceEtsId {number}
322
+ * @return {number|undefined}
323
+ */
324
+ getCoefTransparenceEts(tvCoefTransparenceEtsId) {
325
+ const coefTransparence = tv['coef_transparence_ets'].find(
326
+ (v) => parseInt(v.tv_coef_transparence_ets_id) === parseInt(tvCoefTransparenceEtsId)
327
+ )?.coef_transparence_ets;
328
+
329
+ if (!coefTransparence) {
330
+ logger.error(
331
+ `Pas de valeur coef_transparence_ets pour tvCoefTransparenceEtsId:${tvCoefTransparenceEtsId}`
332
+ );
333
+ return;
334
+ }
335
+
336
+ return parseFloat(coefTransparence);
337
+ }
338
+
339
+ /**
340
+ * @see 18.5 - Coefficients d’orientation et d’inclinaison des parois vitrées : C1
341
+ *
342
+ * @param enumOrientationId {number}
343
+ * @param enumInclinaisonVitrageId {number}
344
+ * @param zoneClimatiqueId {number}
345
+ * @param mois {string}
346
+ *
347
+ * @return {number|undefined}
348
+ */
349
+ getCoefficientBaieVitree(enumOrientationId, enumInclinaisonVitrageId, zoneClimatiqueId, mois) {
350
+ const orientation = enums.orientation[enumOrientationId];
351
+ const inclinaison = enums.inclinaison_vitrage[enumInclinaisonVitrageId];
352
+ const zoneClimatique = enums.zone_climatique[zoneClimatiqueId];
353
+
354
+ const c1ZoneClimatique = tv['c1'][zoneClimatique][mois];
355
+
356
+ if (inclinaison === 'horizontal') {
357
+ return c1ZoneClimatique[inclinaison];
358
+ }
359
+
360
+ return c1ZoneClimatique[`${orientation} ${inclinaison}`];
361
+ }
292
362
  }
@@ -345,6 +345,112 @@ describe('Lecture des tables de valeurs', () => {
345
345
  });
346
346
  });
347
347
 
348
+ describe('lecture des valeurs coefficients de réduction de température des espaces tampons', () => {
349
+ test.each([
350
+ {
351
+ label: 'lc non isolé + espace tampon solarisé orienté nord',
352
+ zoneClimatique: 'H1a',
353
+ enumCfgIsolationLncId: '9',
354
+ expected: 0.85
355
+ },
356
+ {
357
+ label: 'lc isolé + espace tampon solarisé orienté sud',
358
+ zoneClimatique: 'H2C',
359
+ enumCfgIsolationLncId: '7',
360
+ expected: 0.57
361
+ }
362
+ ])(
363
+ `incidence masque proche pour baie vitrée $label`,
364
+ ({ zoneClimatique, enumCfgIsolationLncId, expected }) => {
365
+ expect(tvStore.getBver(zoneClimatique, enumCfgIsolationLncId)).toBe(expected);
366
+ }
367
+ );
368
+
369
+ test('pas de valeur de coefficients de réduction de température', () => {
370
+ const ug = tvStore.getBver('h3C', 1);
371
+ expect(ug).toBeUndefined();
372
+ });
373
+ });
374
+
375
+ describe('lecture des valeurs de coefficients de transparence des espaces tampons', () => {
376
+ test.each([
377
+ {
378
+ label: 'Parois en polycarbonate',
379
+ tvCoefTransparenceEtsId: '9',
380
+ expected: 0.39
381
+ },
382
+ {
383
+ label: 'Parois triple vitrage en Bois / Bois-métal',
384
+ tvCoefTransparenceEtsId: '5',
385
+ expected: 0.49
386
+ }
387
+ ])(
388
+ `incidence masque proche pour baie vitrée $label`,
389
+ ({ tvCoefTransparenceEtsId, expected }) => {
390
+ expect(tvStore.getCoefTransparenceEts(tvCoefTransparenceEtsId)).toBe(expected);
391
+ }
392
+ );
393
+
394
+ test('pas de valeur de coefficients de transparence', () => {
395
+ const ug = tvStore.getCoefTransparenceEts(0);
396
+ expect(ug).toBeUndefined();
397
+ });
398
+ });
399
+
400
+ describe("lecture des coefficients d'orientation et inclinaison des parois vitrées", () => {
401
+ test.each([
402
+ {
403
+ label: 'Baie vitrée orientée nord, inclinaison inf25°',
404
+ enumOrientationId: '2',
405
+ enumInclinaisonVitrageId: '1',
406
+ zoneClimatiqueId: '1',
407
+ mois: 'Janvier',
408
+ expected: 0.52
409
+ },
410
+ {
411
+ label: 'Baie vitrée orientée nord, inclinaison inf25°',
412
+ enumOrientationId: '2',
413
+ enumInclinaisonVitrageId: '1',
414
+ zoneClimatiqueId: '1',
415
+ mois: 'Juillet',
416
+ expected: 1.98
417
+ },
418
+ {
419
+ label: 'Baie vitrée orientée sud, inclinaison sup75°',
420
+ enumOrientationId: '1',
421
+ enumInclinaisonVitrageId: '3',
422
+ zoneClimatiqueId: '2',
423
+ mois: 'Janvier',
424
+ expected: 1
425
+ },
426
+ {
427
+ label: 'Baie vitrée orientée sud, inclinaison horizontale',
428
+ enumOrientationId: '1',
429
+ enumInclinaisonVitrageId: '4',
430
+ zoneClimatiqueId: '2',
431
+ mois: 'Janvier',
432
+ expected: 0.58
433
+ }
434
+ ])(
435
+ `coefficient pour $label`,
436
+ ({ enumOrientationId, enumInclinaisonVitrageId, zoneClimatiqueId, mois, expected }) => {
437
+ expect(
438
+ tvStore.getCoefficientBaieVitree(
439
+ enumOrientationId,
440
+ enumInclinaisonVitrageId,
441
+ zoneClimatiqueId,
442
+ mois
443
+ )
444
+ ).toMatchObject(expected);
445
+ }
446
+ );
447
+ });
448
+
449
+ test('lecture des épaisseurs disponibles pour les coefficients de transmission thermique ug', () => {
450
+ const ug = tvStore.getEpaisseurAvailableForUg();
451
+ expect(ug).toStrictEqual([0, 6, 8, 10, 12, 14, 15, 16, 18, 20]);
452
+ });
453
+
348
454
  test('lecture des épaisseurs disponibles pour les coefficients de transmission thermique ug', () => {
349
455
  const ug = tvStore.getEpaisseurAvailableForUg();
350
456
  expect(ug).toStrictEqual([0, 6, 8, 10, 12, 14, 15, 16, 18, 20]);
@@ -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
+ });