@open3cl/engine 1.0.8 → 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.
- 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/infrastructure/pontThermiqueTv.store.js +112 -0
- package/features/dpe/infrastructure/pontThermiqueTv.store.spec.js +134 -0
- package/features/engine/domain/engine.service.js +2 -1
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +22 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +28 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +61 -0
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +46 -0
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +85 -0
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +33 -0
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +61 -0
- 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/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
|
}
|
|
@@ -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
|
+
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { inject } from 'dioma';
|
|
2
2
|
import { ContexteBuilder } from './contexte.builder.js';
|
|
3
3
|
import { DeperditionEnveloppeService } from './enveloppe/deperdition-enveloppe.service.js';
|
|
4
|
+
import { logger } from '../../../core/util/logger/log-service.js';
|
|
4
5
|
|
|
5
6
|
export class EngineService {
|
|
6
7
|
/**
|
|
@@ -33,7 +34,7 @@ export class EngineService {
|
|
|
33
34
|
/** @type {Dpe} */
|
|
34
35
|
const proceededDpe = this.#removeComputedData(JSON.parse(JSON.stringify(dpe)));
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
logger.info(`Process DPE ${proceededDpe.numero_dpe}`);
|
|
37
38
|
|
|
38
39
|
proceededDpe.logement.sortie = {
|
|
39
40
|
deperdition: undefined,
|
|
@@ -5,6 +5,7 @@ import { DeperditionPlancherBasService } from './plancher_bas/deperdition-planch
|
|
|
5
5
|
import { DeperditionPlancherHautService } from './plancher_haut/deperdition-plancher-haut.service.js';
|
|
6
6
|
import { DeperditionVentilationService } from './ventilation/deperdition-ventilation.service.js';
|
|
7
7
|
import { DeperditionBaieVitreeService } from './baie_vitree/deperdition-baie-vitree.service.js';
|
|
8
|
+
import { DeperditionPontThermiqueService } from './pont_thermique/deperdition-pont-thermique.service.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Calcul des déperditions de l’enveloppe
|
|
@@ -36,6 +37,11 @@ export class DeperditionEnveloppeService {
|
|
|
36
37
|
*/
|
|
37
38
|
#deperditionBaieVitreeService;
|
|
38
39
|
|
|
40
|
+
/**
|
|
41
|
+
* @type {DeperditionPontThermiqueService}
|
|
42
|
+
*/
|
|
43
|
+
#deperditionPontThermiqueService;
|
|
44
|
+
|
|
39
45
|
/**
|
|
40
46
|
* @type {DeperditionVentilationService}
|
|
41
47
|
*/
|
|
@@ -73,6 +79,7 @@ export class DeperditionEnveloppeService {
|
|
|
73
79
|
* @param deperditionPlancherBasService {DeperditionPlancherBasService}
|
|
74
80
|
* @param deperditionPlancherHautService {DeperditionPlancherHautService}
|
|
75
81
|
* @param deperditionBaieVitreeService {DeperditionBaieVitreeService}
|
|
82
|
+
* @param deperditionPontThermiqueService {DeperditionPontThermiqueService}
|
|
76
83
|
* @param deperditionVentilationService {DeperditionVentilationService}
|
|
77
84
|
*/
|
|
78
85
|
constructor(
|
|
@@ -81,6 +88,7 @@ export class DeperditionEnveloppeService {
|
|
|
81
88
|
deperditionPlancherBasService = inject(DeperditionPlancherBasService),
|
|
82
89
|
deperditionPlancherHautService = inject(DeperditionPlancherHautService),
|
|
83
90
|
deperditionBaieVitreeService = inject(DeperditionBaieVitreeService),
|
|
91
|
+
deperditionPontThermiqueService = inject(DeperditionPontThermiqueService),
|
|
84
92
|
deperditionVentilationService = inject(DeperditionVentilationService)
|
|
85
93
|
) {
|
|
86
94
|
this.#deperditionMurService = deperditionMurService;
|
|
@@ -88,6 +96,7 @@ export class DeperditionEnveloppeService {
|
|
|
88
96
|
this.#deperditionPlancherBasService = deperditionPlancherBasService;
|
|
89
97
|
this.#deperditionPlancherHautService = deperditionPlancherHautService;
|
|
90
98
|
this.#deperditionBaieVitreeService = deperditionBaieVitreeService;
|
|
99
|
+
this.#deperditionPontThermiqueService = deperditionPontThermiqueService;
|
|
91
100
|
this.#deperditionVentilationService = deperditionVentilationService;
|
|
92
101
|
this.#surfaceDeperditive = 0;
|
|
93
102
|
this.#surfaceIsolee = 0;
|
|
@@ -145,6 +154,7 @@ export class DeperditionEnveloppeService {
|
|
|
145
154
|
deperdition_plancher_bas: 0,
|
|
146
155
|
deperdition_plancher_haut: 0,
|
|
147
156
|
deperdition_baie_vitree: 0,
|
|
157
|
+
deperdition_pont_thermique: 0,
|
|
148
158
|
deperdition_porte: 0
|
|
149
159
|
};
|
|
150
160
|
|
|
@@ -239,6 +249,18 @@ export class DeperditionEnveloppeService {
|
|
|
239
249
|
}
|
|
240
250
|
});
|
|
241
251
|
|
|
252
|
+
enveloppe.pont_thermique_collection.pont_thermique?.forEach((pt) => {
|
|
253
|
+
pt.donnee_intermediaire = this.#deperditionPontThermiqueService.execute(
|
|
254
|
+
ctx,
|
|
255
|
+
enveloppe,
|
|
256
|
+
pt.donnee_entree
|
|
257
|
+
);
|
|
258
|
+
deperditions.deperdition_pont_thermique +=
|
|
259
|
+
pt.donnee_entree.l *
|
|
260
|
+
pt.donnee_intermediaire.k *
|
|
261
|
+
(pt.donnee_entree.pourcentage_valeur_pont_thermique || 1);
|
|
262
|
+
});
|
|
263
|
+
|
|
242
264
|
return deperditions;
|
|
243
265
|
}
|
|
244
266
|
|
|
@@ -165,4 +165,32 @@ export class DeperditionMurService extends DeperditionService {
|
|
|
165
165
|
*/
|
|
166
166
|
return Math.min(2.5, Math.round(parseFloat(umur0) * PRECISION) / PRECISION);
|
|
167
167
|
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Retourner le type d'isolation du mur
|
|
171
|
+
* Si isolation inconnue, on considère isolation iti si la période d'isolation (à défaut année de construction) est > 1975
|
|
172
|
+
*
|
|
173
|
+
* @param ctx {Contexte}
|
|
174
|
+
* @param murDE {MurDE}
|
|
175
|
+
* @return {number}
|
|
176
|
+
*/
|
|
177
|
+
typeIsolation(ctx, murDE) {
|
|
178
|
+
const typeIsolation = parseInt(murDE.enum_type_isolation_id);
|
|
179
|
+
|
|
180
|
+
// Type d'isolation inconnu
|
|
181
|
+
if (typeIsolation === 1) {
|
|
182
|
+
const periodeIsolation = murDE.enum_periode_isolation_id || ctx.enumPeriodeConstructionId;
|
|
183
|
+
|
|
184
|
+
// Année isolation / construction > 1974
|
|
185
|
+
if (parseInt(periodeIsolation) >= 3) {
|
|
186
|
+
// Isolation ITI
|
|
187
|
+
return 3;
|
|
188
|
+
} else {
|
|
189
|
+
// Non isolé
|
|
190
|
+
return 2;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return typeIsolation;
|
|
195
|
+
}
|
|
168
196
|
}
|
|
@@ -315,6 +315,67 @@ describe('Calcul de déperdition des murs', () => {
|
|
|
315
315
|
});
|
|
316
316
|
});
|
|
317
317
|
|
|
318
|
+
test.each([
|
|
319
|
+
{
|
|
320
|
+
label: 'mur avec isolation inconnue et période isolation 1975',
|
|
321
|
+
enumTypeIsolationId: 1,
|
|
322
|
+
enumPeriodIsolationId: 3,
|
|
323
|
+
enumPeriodeConstructionId: undefined,
|
|
324
|
+
typeIsolationExpected: 3
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
label: 'mur avec isolation inconnue et période construction 1975',
|
|
328
|
+
enumTypeIsolationId: 1,
|
|
329
|
+
enumPeriodIsolationId: undefined,
|
|
330
|
+
enumPeriodeConstructionId: 6,
|
|
331
|
+
typeIsolationExpected: 3
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
label: 'mur avec isolation inconnue et période isolation 1974',
|
|
335
|
+
enumTypeIsolationId: 1,
|
|
336
|
+
enumPeriodIsolationId: 2,
|
|
337
|
+
enumPeriodeConstructionId: undefined,
|
|
338
|
+
typeIsolationExpected: 2
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
label: 'mur avec isolation inconnue et période construction 1974',
|
|
342
|
+
enumTypeIsolationId: 1,
|
|
343
|
+
enumPeriodIsolationId: undefined,
|
|
344
|
+
enumPeriodeConstructionId: 1,
|
|
345
|
+
typeIsolationExpected: 2
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
label: 'mur avec isolation iti+ite',
|
|
349
|
+
enumTypeIsolationId: 6,
|
|
350
|
+
enumPeriodIsolationId: 1,
|
|
351
|
+
enumPeriodeConstructionId: undefined,
|
|
352
|
+
typeIsolationExpected: 6
|
|
353
|
+
}
|
|
354
|
+
])(
|
|
355
|
+
"Récupération du type d'isolation pour $label",
|
|
356
|
+
({
|
|
357
|
+
enumTypeIsolationId,
|
|
358
|
+
enumPeriodIsolationId = undefined,
|
|
359
|
+
enumPeriodeConstructionId = undefined,
|
|
360
|
+
typeIsolationExpected
|
|
361
|
+
}) => {
|
|
362
|
+
/**
|
|
363
|
+
* @type {MurDE}
|
|
364
|
+
*/
|
|
365
|
+
let murDE = {
|
|
366
|
+
enum_type_isolation_id: enumTypeIsolationId,
|
|
367
|
+
enum_periode_isolation_id: enumPeriodIsolationId
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* @type {Contexte}
|
|
372
|
+
*/
|
|
373
|
+
const ctx = { enumPeriodeConstructionId };
|
|
374
|
+
|
|
375
|
+
expect(service.typeIsolation(ctx, murDE)).toBe(typeIsolationExpected);
|
|
376
|
+
}
|
|
377
|
+
);
|
|
378
|
+
|
|
318
379
|
describe("Test d'intégration de mur", () => {
|
|
319
380
|
test.each(corpus)('vérification des DI des murs pour dpe %s', (ademeId) => {
|
|
320
381
|
let dpeRequest = getAdemeFileJson(ademeId);
|
|
@@ -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
|
}
|
package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js
CHANGED
|
@@ -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
|
/**
|