@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.
- package/features/dpe/domain/models/dpe.model.ts +7 -3
- package/features/dpe/domain/models/{plancher-bas.model.ts → plancher.model.ts} +31 -7
- package/features/dpe/domain/models/type-habitation.model.js +8 -0
- package/features/dpe/infrastructure/baieVitreeTv.store.js +70 -0
- package/features/dpe/infrastructure/baieVitreeTv.store.spec.js +106 -0
- package/features/dpe/infrastructure/pontThermiqueTv.store.js +112 -0
- package/features/dpe/infrastructure/pontThermiqueTv.store.spec.js +134 -0
- package/features/engine/domain/contexte.builder.js +59 -63
- package/features/engine/domain/contexte.builder.spec.js +41 -62
- package/features/engine/domain/engine.service.js +20 -2
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +1 -1
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +41 -0
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +3 -3
- package/features/engine/domain/enveloppe/deperdition.service.js +2 -3
- package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.js +44 -0
- package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +81 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +31 -3
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +91 -10
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +48 -2
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +103 -6
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +35 -2
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +82 -7
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +439 -0
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +636 -0
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +1 -1
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +2 -2
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +1 -1
- package/features/engine/domain/logement/nadeq.service.js +62 -0
- package/features/engine/domain/logement/nadeq.service.spec.js +71 -0
- package/features/engine/domain/logement/surface-sud-equivalente.service.js +169 -0
- package/features/engine/domain/logement/surface-sud-equivalente.service.spec.js +210 -0
- package/features/engine/domain/models/contexte.model.ts +10 -5
- package/features/engine/domain/models/deperdition.model.ts +1 -1
- package/package.json +1 -1
- 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
|
|
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
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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
|
+
});
|