@open3cl/engine 1.0.7 → 1.0.8

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.
@@ -28,7 +28,7 @@ export interface BaieVitreeDE extends DE {
28
28
  enum_type_materiaux_menuiserie_id?: string; // ENUM type_materiaux_menuiserie
29
29
  enum_type_baie_id?: string; // ENUM type_baie
30
30
  uw_saisi?: number;
31
- double_fenetre?: boolean;
31
+ double_fenetre?: number;
32
32
  uw_1?: number;
33
33
  sw_1?: number;
34
34
  uw_2?: number;
@@ -45,12 +45,10 @@ export interface BaieVitreeDE extends DE {
45
45
  sw_saisi?: number;
46
46
  enum_type_pose_id?: string; // ENUM type_pose
47
47
  enum_orientation_id?: string;
48
- tv_coef_masque_proche_id?: string;
49
- tv_coef_masque_lointain_homogene_id?: string;
48
+ tv_coef_masque_proche_id?: number;
49
+ tv_coef_masque_lointain_homogene_id?: number;
50
50
  masque_lointain_non_homogene_collection: {
51
- masque_lointain_non_homogene: {
52
- tv_coef_masque_lointain_non_homogene_id?: string; // TV
53
- };
51
+ masque_lointain_non_homogene: MasqueLointainNonHomogene;
54
52
  }[];
55
53
  }
56
54
 
@@ -93,3 +91,7 @@ export interface BaieVitreeDoubleFenetreDI {
93
91
  uw: number;
94
92
  sw: number;
95
93
  }
94
+
95
+ export interface MasqueLointainNonHomogene {
96
+ tv_coef_masque_lointain_non_homogene_id?: string;
97
+ }
@@ -0,0 +1,292 @@
1
+ import { tvs as tv } from '../../../tv-v2.js';
2
+ import { getRange } from '../../../utils.js';
3
+ import { logger } from '../../../core/util/logger/log-service.js';
4
+ import { TvStore } from './tv.store.js';
5
+
6
+ /**
7
+ * Accès aux données des tables de valeurs pour les baies vitrées
8
+ */
9
+ export class BaieVitreeTvStore extends TvStore {
10
+ /**
11
+ * Coefficient de transmission thermique du vitrage (W/(m².K))
12
+ *
13
+ * @param enumTypeVitrageId {string}
14
+ * @param enumTypeGazLameId {string|undefined}
15
+ * @param enumInclinaisonVitrageId {string|undefined}
16
+ * @param vitrageVir {number|undefined}
17
+ * @param epaisseurLame {number|undefined}
18
+ * @return {number|undefined}
19
+ */
20
+ getUg(enumTypeVitrageId, enumTypeGazLameId, enumInclinaisonVitrageId, vitrageVir, epaisseurLame) {
21
+ const ug = tv['ug'].find(
22
+ (v) =>
23
+ v.enum_type_vitrage_id.split('|').includes(enumTypeVitrageId) &&
24
+ (!enumTypeGazLameId || v.enum_type_gaz_lame_id?.split('|').includes(enumTypeGazLameId)) &&
25
+ (!enumInclinaisonVitrageId ||
26
+ v.enum_inclinaison_vitrage_id?.split('|').includes(enumInclinaisonVitrageId)) &&
27
+ (!vitrageVir || parseInt(vitrageVir) === parseInt(v.vitrage_vir)) &&
28
+ (!epaisseurLame || parseFloat(v.epaisseur_lame) === epaisseurLame)
29
+ )?.ug;
30
+
31
+ if (!ug) {
32
+ logger.error(
33
+ `Pas de valeur forfaitaire ug pour enumTypeVitrageId:${enumTypeVitrageId}, enumTypeGazLameId:${enumTypeGazLameId}, enumInclinaisonVitrageId:${enumInclinaisonVitrageId}, vitrageVir:${vitrageVir}, epaisseurLame:${epaisseurLame}`
34
+ );
35
+ return;
36
+ }
37
+
38
+ return parseFloat(ug);
39
+ }
40
+
41
+ /**
42
+ * Épaisseurs disponibles pour les coefficients de transmission thermique du vitrage (W/(m².K))
43
+ *
44
+ * @return {number[]}
45
+ */
46
+ getEpaisseurAvailableForUg() {
47
+ return [
48
+ ...new Set(tv['ug'].map((value) => parseInt(value.epaisseur_lame) || 0).sort((a, b) => a - b))
49
+ ];
50
+ }
51
+
52
+ /**
53
+ * Proportion d’énergie solaire incidente qui pénètre dans le logement par la paroi vitrée
54
+ *
55
+ * @param enumTypeVitrageId {string}
56
+ * @param enumTypeBaieId {string}
57
+ * @param enumTypeMateriauxMenuiserieId {string}
58
+ * @param vitrageVir {number|undefined}
59
+ * @param enumTypePoseId {string|undefined}
60
+ * @return {number|undefined}
61
+ */
62
+ getSw(
63
+ enumTypeVitrageId,
64
+ enumTypeBaieId,
65
+ enumTypeMateriauxMenuiserieId,
66
+ vitrageVir,
67
+ enumTypePoseId
68
+ ) {
69
+ const sw = tv['sw'].find(
70
+ (v) =>
71
+ (!v.enum_type_vitrage_id ||
72
+ v.enum_type_vitrage_id.split('|').includes(enumTypeVitrageId)) &&
73
+ v.enum_type_baie_id.split('|').includes(enumTypeBaieId) &&
74
+ v.enum_type_materiaux_menuiserie_id.split('|').includes(enumTypeMateriauxMenuiserieId) &&
75
+ (!vitrageVir || parseInt(vitrageVir) === parseInt(v.vitrage_vir)) &&
76
+ (!enumTypePoseId || v.enum_type_pose_id.split('|').includes(enumTypePoseId))
77
+ )?.sw;
78
+
79
+ if (!sw) {
80
+ logger.error(
81
+ `Pas de valeur forfaitaire sw pour enumTypeVitrageId:${enumTypeVitrageId}, enumTypeBaieId:${enumTypeBaieId}, enumTypeMateriauxMenuiserieId:${enumTypeMateriauxMenuiserieId}, vitrageVir:${vitrageVir}, enumTypePoseId:${enumTypePoseId}`
82
+ );
83
+ return;
84
+ }
85
+
86
+ return parseFloat(sw);
87
+ }
88
+
89
+ /**
90
+ * Coefficient de transmission thermique des fenêtres
91
+ *
92
+ * @param enumTypeVitrageId {string}
93
+ * @param enumTypeBaieId {string}
94
+ * @param enumTypeMateriauxMenuiserieId {string}
95
+ * @param ug {number|undefined}
96
+ * @return {number|undefined}
97
+ */
98
+ getUw(enumTypeBaieId, enumTypeMateriauxMenuiserieId, ug) {
99
+ let uw;
100
+
101
+ /**
102
+ * Pas de notion de ug pour les parois polycarbonate ou verre
103
+ * enum_type_baie_id
104
+ * 1 - paroi en brique de verre pleine
105
+ * 2 - paroi en brique de verre creuse
106
+ * 3 - paroi en polycarbonnate
107
+ */
108
+ if (['1', '2', '3'].includes(enumTypeBaieId)) {
109
+ uw = tv['uw'].find((v) => v.enum_type_baie_id.split('|').includes(enumTypeBaieId))?.uw;
110
+ } else {
111
+ /**
112
+ * 3.3.2 Coefficients Uw des fenêtres / portes-fenêtres
113
+ * Les Uw associés à des Ug non présents dans les tableaux peuvent être obtenus par interpolation ou
114
+ * extrapolation avec les deux Ug tabulés les plus proches.
115
+ */
116
+ const ugValues =
117
+ tv['uw'].filter(
118
+ (v) =>
119
+ v.enum_type_baie_id.split('|').includes(enumTypeBaieId) &&
120
+ v.enum_type_materiaux_menuiserie_id.split('|').includes(enumTypeMateriauxMenuiserieId)
121
+ ) || [];
122
+
123
+ let ug1, ug2;
124
+
125
+ if (ugValues.length) {
126
+ [ug1, ug2] = getRange(ug, [...new Set(ugValues.map((value) => value.ug).sort())]);
127
+
128
+ const uw1 = ugValues.find((value) => value.ug === ug1)?.uw || 0;
129
+ const uw2 = ugValues.find((value) => value.ug === ug2)?.uw || 0;
130
+
131
+ const delta_uw = Number(uw2) - Number(uw1);
132
+ const delta_ug = ug2 - ug1 || 0;
133
+
134
+ if (delta_ug === 0) {
135
+ uw = Number(uw1);
136
+ } else {
137
+ // Interpolation linéaire si upb n'est pas une valeur connue
138
+ uw = Number(uw1) + (delta_uw * (ug - ug1)) / delta_ug;
139
+ }
140
+ }
141
+ }
142
+
143
+ if (!uw) {
144
+ logger.error(
145
+ `Pas de valeur forfaitaire uw pour enumTypeBaieId:${enumTypeBaieId}, enumTypeMateriauxMenuiserieId:${enumTypeMateriauxMenuiserieId}, ug:${ug}`
146
+ );
147
+ return;
148
+ }
149
+
150
+ return parseFloat(uw);
151
+ }
152
+
153
+ /**
154
+ * La présence de volets aux fenêtres et portes-fenêtres leur apporte un supplément d’isolation avec une résistance
155
+ * additionnelle ΔR
156
+ *
157
+ * @param enumTypeFermetureId {string}
158
+ * @return {number|undefined}
159
+ */
160
+ getDeltar(enumTypeFermetureId) {
161
+ const deltar = tv['deltar'].find((v) =>
162
+ v.enum_type_fermeture_id.split('|').includes(enumTypeFermetureId)
163
+ )?.deltar;
164
+
165
+ if (!deltar) {
166
+ logger.error(
167
+ `Pas de valeur forfaitaire deltar pour enumTypeFermetureId:${enumTypeFermetureId}`
168
+ );
169
+ return;
170
+ }
171
+
172
+ return parseFloat(deltar);
173
+ }
174
+
175
+ /**
176
+ * La présence de volets aux fenêtres et portes-fenêtres leur apporte un supplément d’isolation avec une résistance
177
+ * additionnelle ΔR
178
+ *
179
+ * @param enumTypeFermetureId {string}
180
+ * @param uw {number}
181
+ *
182
+ * @return {number|undefined}
183
+ */
184
+ getUjn(enumTypeFermetureId, uw) {
185
+ let ujn;
186
+ /**
187
+ * 3.3.3 Coefficients Ujn des fenêtres/portes-fenêtres
188
+ * Dans la suite, les Ujn associés à des Uw non présents dans les tableaux peuvent être obtenus par interpolation ou
189
+ * extrapolation avec les deux Uw tabulés les plus proches.
190
+ */
191
+ const deltar = this.getDeltar(enumTypeFermetureId);
192
+ const uwValues =
193
+ tv['ujn'].filter((v) => Number(v.deltar).toPrecision(2) === Number(deltar).toPrecision(2)) ||
194
+ [];
195
+
196
+ let uw1, uw2;
197
+
198
+ if (uwValues.length) {
199
+ [uw1, uw2] = getRange(uw, [...new Set(uwValues.map((value) => value.uw).sort())]);
200
+
201
+ const ujn1 =
202
+ uwValues.find((value) => Number(value.uw).toPrecision(2) === Number(uw1).toPrecision(2))
203
+ ?.ujn || 0;
204
+ const ujn2 =
205
+ uwValues.find((value) => Number(value.uw).toPrecision(2) === Number(uw2).toPrecision(2))
206
+ ?.ujn || 0;
207
+
208
+ const delta_ujn = Number(ujn2) - Number(ujn1);
209
+ const delta_uw = uw2 - uw1 || 0;
210
+
211
+ if (delta_uw === 0) {
212
+ ujn = Number(ujn1);
213
+ } else {
214
+ // Interpolation linéaire si uw n'est pas une valeur connue
215
+ ujn = Number(ujn1) + (delta_ujn * (uw - uw1)) / delta_uw;
216
+ }
217
+
218
+ if (!ujn) {
219
+ logger.error(
220
+ `Pas de valeur forfaitaire ujn pour enumTypeFermetureId:${enumTypeFermetureId}, uw:${uw}`
221
+ );
222
+ return;
223
+ }
224
+
225
+ return parseFloat(ujn);
226
+ }
227
+ }
228
+
229
+ /**
230
+ * Calcul de l’ombrage créé par un obstacle sur une paroi
231
+ *
232
+ * @param tvCoeffMasqueLointainNonHomogeneId {number}
233
+ * @return {number|undefined}
234
+ */
235
+ getOmbre(tvCoeffMasqueLointainNonHomogeneId) {
236
+ const ombre = tv['coef_masque_lointain_non_homoge'].find(
237
+ (v) =>
238
+ parseInt(v.tv_coef_masque_lointain_non_homogene_id) ===
239
+ parseInt(tvCoeffMasqueLointainNonHomogeneId)
240
+ )?.omb;
241
+
242
+ if (!ombre) {
243
+ logger.error(
244
+ `Pas de valeur forfaitaire ombre pour tvCoeffMasqueLointainNonHomogeneId:${tvCoeffMasqueLointainNonHomogeneId}`
245
+ );
246
+ return;
247
+ }
248
+
249
+ return parseFloat(ombre);
250
+ }
251
+
252
+ /**
253
+ * Calcul de l'incidence d'un masque proche sur une paroi
254
+ *
255
+ * @param tvCoefMasqueProcheId {number}
256
+ * @return {number|undefined}
257
+ */
258
+ getMasqueProche(tvCoefMasqueProcheId) {
259
+ const fe1 = tv['coef_masque_proche'].find(
260
+ (v) => parseInt(v.tv_coef_masque_proche_id) === parseInt(tvCoefMasqueProcheId)
261
+ )?.fe1;
262
+
263
+ if (!fe1) {
264
+ logger.error(`Pas de valeur fe1 pour tvCoefMasqueProcheId:${tvCoefMasqueProcheId}`);
265
+ return;
266
+ }
267
+
268
+ return parseFloat(fe1);
269
+ }
270
+
271
+ /**
272
+ * Calcul de l'incidence d'un masque lointain homogène sur une paroi
273
+ *
274
+ * @param tvCoefMasqueLointainHomogeneId {number}
275
+ * @return {number|undefined}
276
+ */
277
+ getMasqueLointainHomogene(tvCoefMasqueLointainHomogeneId) {
278
+ const fe2 = tv['coef_masque_lointain_homogene'].find(
279
+ (v) =>
280
+ parseInt(v.tv_coef_masque_lointain_homogene_id) === parseInt(tvCoefMasqueLointainHomogeneId)
281
+ )?.fe2;
282
+
283
+ if (!fe2) {
284
+ logger.error(
285
+ `Pas de valeur fe2 pour tvCoefMasqueLointainHomogeneId:${tvCoefMasqueLointainHomogeneId}`
286
+ );
287
+ return;
288
+ }
289
+
290
+ return parseFloat(fe2);
291
+ }
292
+ }
@@ -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
+ });