@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.
- package/features/dpe/domain/models/baie-vitree.model.ts +8 -6
- 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/baieVitreeTv.store.js +292 -0
- package/features/dpe/infrastructure/baieVitreeTv.store.spec.js +352 -0
- package/features/dpe/infrastructure/pontThermiqueTv.store.js +112 -0
- package/features/dpe/infrastructure/pontThermiqueTv.store.spec.js +134 -0
- package/features/dpe/infrastructure/tv.store.js +0 -33
- package/features/dpe/infrastructure/tv.store.spec.js +0 -83
- package/features/engine/domain/engine.service.js +2 -1
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +292 -0
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +484 -0
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +38 -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/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +49 -0
- package/package.json +1 -1
- package/features/dpe/domain/models/plancher-haut.model.ts +0 -33
|
@@ -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
|
/**
|
|
@@ -133,4 +133,37 @@ export class DeperditionPlancherHautService extends DeperditionService {
|
|
|
133
133
|
return 'combles';
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Retourner le type d'isolation du plancher haut
|
|
139
|
+
* Si isolation inconnue :
|
|
140
|
+
* - Pour les bâtiments d’avant 1975, la paroi est considérée comme non isolée
|
|
141
|
+
* - Pour les bâtiments construits à partir de 1975, les plafonds sont considérés isolés par l’extérieur
|
|
142
|
+
*
|
|
143
|
+
* @param ctx {Contexte}
|
|
144
|
+
* @param plancherHautDE {PlancherHautDE}
|
|
145
|
+
* @return {number}
|
|
146
|
+
*/
|
|
147
|
+
typeIsolation(ctx, plancherHautDE) {
|
|
148
|
+
const typeIsolation = parseInt(plancherHautDE.enum_type_isolation_id);
|
|
149
|
+
|
|
150
|
+
// Type d'isolation inconnu
|
|
151
|
+
if (typeIsolation === 1) {
|
|
152
|
+
const periodeIsolation =
|
|
153
|
+
parseInt(plancherHautDE.enum_periode_isolation_id) ||
|
|
154
|
+
parseInt(ctx.enumPeriodeConstructionId);
|
|
155
|
+
|
|
156
|
+
// Année isolation / construction < 1975
|
|
157
|
+
if (periodeIsolation < 3) {
|
|
158
|
+
// Non isolé
|
|
159
|
+
return 2;
|
|
160
|
+
} else {
|
|
161
|
+
// Isolation ITE
|
|
162
|
+
return 4;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Isolation ITE si "isolé mais type d'isolation inconnu"
|
|
167
|
+
return typeIsolation === 9 ? 4 : typeIsolation;
|
|
168
|
+
}
|
|
136
169
|
}
|
package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js
CHANGED
|
@@ -181,6 +181,67 @@ describe('Calcul de déperdition des planchers haut', () => {
|
|
|
181
181
|
});
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
+
test.each([
|
|
185
|
+
{
|
|
186
|
+
label: 'plafond avec isolation inconnue et période isolation 1974',
|
|
187
|
+
enumTypeIsolationId: 1,
|
|
188
|
+
enumPeriodIsolationId: 1,
|
|
189
|
+
enumPeriodeConstructionId: undefined,
|
|
190
|
+
typeIsolationExpected: 2
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
label: 'plafond avec isolation inconnue et période construction 1974',
|
|
194
|
+
enumTypeIsolationId: 1,
|
|
195
|
+
enumPeriodIsolationId: undefined,
|
|
196
|
+
enumPeriodeConstructionId: 1,
|
|
197
|
+
typeIsolationExpected: 2
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
label: 'plafond avec isolation inconnue et période isolation 1975',
|
|
201
|
+
enumTypeIsolationId: 1,
|
|
202
|
+
enumPeriodIsolationId: 3,
|
|
203
|
+
enumPeriodeConstructionId: undefined,
|
|
204
|
+
typeIsolationExpected: 4
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
label: 'plafond avec isolation de type "isolé mais type d\'isolation inconnu"',
|
|
208
|
+
enumTypeIsolationId: 9,
|
|
209
|
+
enumPeriodIsolationId: 1,
|
|
210
|
+
enumPeriodeConstructionId: undefined,
|
|
211
|
+
typeIsolationExpected: 4
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
label: 'plafond avec isolation iti+ite',
|
|
215
|
+
enumTypeIsolationId: 6,
|
|
216
|
+
enumPeriodIsolationId: 1,
|
|
217
|
+
enumPeriodeConstructionId: undefined,
|
|
218
|
+
typeIsolationExpected: 6
|
|
219
|
+
}
|
|
220
|
+
])(
|
|
221
|
+
"Récupération du type d'isolation pour $label",
|
|
222
|
+
({
|
|
223
|
+
enumTypeIsolationId,
|
|
224
|
+
enumPeriodIsolationId = undefined,
|
|
225
|
+
enumPeriodeConstructionId = undefined,
|
|
226
|
+
typeIsolationExpected
|
|
227
|
+
}) => {
|
|
228
|
+
/**
|
|
229
|
+
* @type {PlancherHautDE}
|
|
230
|
+
*/
|
|
231
|
+
let plancherHautDE = {
|
|
232
|
+
enum_type_isolation_id: enumTypeIsolationId,
|
|
233
|
+
enum_periode_isolation_id: enumPeriodIsolationId
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* @type {Contexte}
|
|
238
|
+
*/
|
|
239
|
+
const ctx = { enumPeriodeConstructionId };
|
|
240
|
+
|
|
241
|
+
expect(service.typeIsolation(ctx, plancherHautDE)).toBe(typeIsolationExpected);
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
|
|
184
245
|
describe("Test d'intégration de plancher haut", () => {
|
|
185
246
|
test.each(corpus)('vérification des DI des ph pour dpe %s', (ademeId) => {
|
|
186
247
|
/**
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { inject } from 'dioma';
|
|
2
|
+
import { DeperditionService } from '../deperdition.service.js';
|
|
3
|
+
import { logger } from '../../../../../core/util/logger/log-service.js';
|
|
4
|
+
import { compareReferences } from '../../../../../utils.js';
|
|
5
|
+
import { DeperditionMurService } from '../mur/deperdition-mur.service.js';
|
|
6
|
+
import { PontThermiqueTvStore } from '../../../../dpe/infrastructure/pontThermiqueTv.store.js';
|
|
7
|
+
import enums from '../../../../../enums.js';
|
|
8
|
+
import { DeperditionPlancherHautService } from '../plancher_haut/deperdition-plancher-haut.service.js';
|
|
9
|
+
import { DeperditionPlancherBasService } from '../plancher_bas/deperdition-plancher-bas.service.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Calcul des déperditions des ponts thermiques
|
|
13
|
+
* Chapitre 3.4 Calcul des déperditions par les ponts thermiques
|
|
14
|
+
*
|
|
15
|
+
* Méthode de calcul 3CL-DPE 2021
|
|
16
|
+
* Octobre 2021
|
|
17
|
+
* @see consolide_anne…arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf
|
|
18
|
+
*
|
|
19
|
+
* Si le coefficient U des portes est connu et justifié, le saisir directement. Sinon, prendre les valeurs tabulées
|
|
20
|
+
*/
|
|
21
|
+
export class DeperditionPontThermiqueService extends DeperditionService {
|
|
22
|
+
/**
|
|
23
|
+
* @type {DeperditionMurService}
|
|
24
|
+
*/
|
|
25
|
+
#deperditionMurService;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @type {DeperditionPlancherHautService}
|
|
29
|
+
*/
|
|
30
|
+
#deperditionPlancherHautService;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @type {DeperditionPlancherBasService}
|
|
34
|
+
*/
|
|
35
|
+
#deperditionPlancherBasService;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param tvStore {PontThermiqueTvStore}
|
|
39
|
+
* @param deperditionMurService {DeperditionMurService}
|
|
40
|
+
* @param deperditionPlancherHautService {DeperditionPlancherHautService}
|
|
41
|
+
* @param deperditionPlancherBasService {DeperditionPlancherBasService}
|
|
42
|
+
*/
|
|
43
|
+
constructor(
|
|
44
|
+
tvStore = inject(PontThermiqueTvStore),
|
|
45
|
+
deperditionMurService = inject(DeperditionMurService),
|
|
46
|
+
deperditionPlancherHautService = inject(DeperditionPlancherHautService),
|
|
47
|
+
deperditionPlancherBasService = inject(DeperditionPlancherBasService)
|
|
48
|
+
) {
|
|
49
|
+
super(tvStore);
|
|
50
|
+
this.#deperditionMurService = deperditionMurService;
|
|
51
|
+
this.#deperditionPlancherHautService = deperditionPlancherHautService;
|
|
52
|
+
this.#deperditionPlancherBasService = deperditionPlancherBasService;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @param ctx {Contexte}
|
|
57
|
+
* @param enveloppe {Enveloppe}
|
|
58
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
59
|
+
* @return {PontThermiqueDI}
|
|
60
|
+
*/
|
|
61
|
+
execute(ctx, enveloppe, pontThermiqueDE) {
|
|
62
|
+
/** @type {PontThermiqueDI} */
|
|
63
|
+
const di = {
|
|
64
|
+
k: undefined
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
if ([2, 3].includes(parseInt(pontThermiqueDE.enum_methode_saisie_pont_thermique_id))) {
|
|
68
|
+
// valeur justifiée saisie à partir des documents justificatifs autorisés
|
|
69
|
+
// saisie direct k depuis rset/rsee( etude rt2012/re2020)
|
|
70
|
+
di.k = pontThermiqueDE.k_saisi;
|
|
71
|
+
|
|
72
|
+
if (!di.k) {
|
|
73
|
+
logger.error(`
|
|
74
|
+
Aucune valeur de k_saisi pour le pont thermique '${pontThermiqueDE.reference}' alors que la donnée est saisie
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
// valeur forfaitaire
|
|
79
|
+
di.k = this.k(ctx, pontThermiqueDE, enveloppe);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (di.k === undefined) {
|
|
83
|
+
logger.error(`
|
|
84
|
+
Aucune valeur k n'a été trouvée pour le pont thermique '${pontThermiqueDE.description}'.
|
|
85
|
+
`);
|
|
86
|
+
di.k = this.defaultValue(pontThermiqueDE);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return di;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Coefficient de transmission thermique du vitrage (W/(m².K))
|
|
94
|
+
*
|
|
95
|
+
* @param ctx {Contexte}
|
|
96
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
97
|
+
* @param enveloppe {Enveloppe}
|
|
98
|
+
* @return {number|undefined}
|
|
99
|
+
*/
|
|
100
|
+
k(ctx, pontThermiqueDE, enveloppe) {
|
|
101
|
+
if (!pontThermiqueDE.reference_1) {
|
|
102
|
+
logger.error(`
|
|
103
|
+
Impossible de trouver un mur ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
|
|
104
|
+
`);
|
|
105
|
+
return this.defaultValue(pontThermiqueDE);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const typeLiaison = parseInt(pontThermiqueDE.enum_type_liaison_id);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @type {MurDE|undefined}
|
|
112
|
+
*/
|
|
113
|
+
const mur = this.mur(pontThermiqueDE, enveloppe);
|
|
114
|
+
|
|
115
|
+
if (mur && !this.murHasPontThermique(mur, typeLiaison)) {
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const isolationMur = this.isolationMur(ctx, mur);
|
|
120
|
+
|
|
121
|
+
switch (typeLiaison) {
|
|
122
|
+
// 'plancher bas / mur'
|
|
123
|
+
case 1: {
|
|
124
|
+
return this.pontThermiquePlancherBasMur(ctx, pontThermiqueDE, enveloppe, isolationMur);
|
|
125
|
+
}
|
|
126
|
+
// 'plancher haut lourd / mur'
|
|
127
|
+
case 3: {
|
|
128
|
+
return this.pontThermiquePlancherHautMur(ctx, pontThermiqueDE, enveloppe, isolationMur);
|
|
129
|
+
}
|
|
130
|
+
// 'menuiserie / mur'
|
|
131
|
+
case 5: {
|
|
132
|
+
return this.pontThermiqueMenuiserieMur(pontThermiqueDE, enveloppe, isolationMur);
|
|
133
|
+
}
|
|
134
|
+
//'plancher intermédiaire lourd / mur'
|
|
135
|
+
// 'refend / mur'
|
|
136
|
+
case 2:
|
|
137
|
+
case 4: {
|
|
138
|
+
return this.tvStore.getKForMur(typeLiaison, enums.type_isolation[isolationMur]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Calcul de l'isolation du mur
|
|
145
|
+
*
|
|
146
|
+
* @param ctx {Contexte}
|
|
147
|
+
* @param murDE {MurDE}
|
|
148
|
+
* @return {number}
|
|
149
|
+
*/
|
|
150
|
+
isolationMur(ctx, murDE) {
|
|
151
|
+
if (murDE) {
|
|
152
|
+
return this.#deperditionMurService.typeIsolation(ctx, murDE);
|
|
153
|
+
} else {
|
|
154
|
+
// Isolation ITI si le mur n'est pas défini
|
|
155
|
+
return 3;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Calcul du pont thermique 'plancher bas / mur'
|
|
161
|
+
*
|
|
162
|
+
* @param ctx {Contexte}
|
|
163
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
164
|
+
* @param enveloppe {Enveloppe}
|
|
165
|
+
* @param isolationMur {number}
|
|
166
|
+
* @return {number|undefined}
|
|
167
|
+
*/
|
|
168
|
+
pontThermiquePlancherBasMur(ctx, pontThermiqueDE, enveloppe, isolationMur) {
|
|
169
|
+
const plancherBasDE = this.plancherBas(pontThermiqueDE, enveloppe);
|
|
170
|
+
|
|
171
|
+
if (!plancherBasDE) {
|
|
172
|
+
logger.error(`
|
|
173
|
+
Impossible de trouver un plancher bas ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
|
|
174
|
+
`);
|
|
175
|
+
return this.defaultValue(pontThermiqueDE);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (!this.plancherBasHasPontThermique(plancherBasDE)) {
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const isolationPlancher = this.#deperditionPlancherBasService.typeIsolation(ctx, plancherBasDE);
|
|
183
|
+
return this.tvStore.getKForPlancher(
|
|
184
|
+
1,
|
|
185
|
+
enums.type_isolation[isolationMur],
|
|
186
|
+
enums.type_isolation[isolationPlancher]
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
Calcul du pont thermique 'plancher haut lourd / mur'
|
|
192
|
+
*
|
|
193
|
+
* @param ctx {Contexte}
|
|
194
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
195
|
+
* @param enveloppe {Enveloppe}
|
|
196
|
+
* @param isolationMur {number}
|
|
197
|
+
* @return {number|undefined}
|
|
198
|
+
*/
|
|
199
|
+
pontThermiquePlancherHautMur(ctx, pontThermiqueDE, enveloppe, isolationMur) {
|
|
200
|
+
const plancherHautDE = this.plancherHaut(pontThermiqueDE, enveloppe);
|
|
201
|
+
|
|
202
|
+
if (!plancherHautDE) {
|
|
203
|
+
logger.error(`
|
|
204
|
+
Impossible de trouver un plancher haut ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
|
|
205
|
+
`);
|
|
206
|
+
return this.defaultValue(pontThermiqueDE);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (!this.plancherHautHasPontThermique(plancherHautDE)) {
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const isolationPlancher = this.#deperditionPlancherHautService.typeIsolation(
|
|
214
|
+
ctx,
|
|
215
|
+
plancherHautDE
|
|
216
|
+
);
|
|
217
|
+
return this.tvStore.getKForPlancher(
|
|
218
|
+
3,
|
|
219
|
+
enums.type_isolation[isolationMur],
|
|
220
|
+
enums.type_isolation[isolationPlancher]
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
Calcul du pont thermique 'menuiserie / mur'
|
|
226
|
+
*
|
|
227
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
228
|
+
* @param enveloppe {Enveloppe}
|
|
229
|
+
* @param isolationMur {number}
|
|
230
|
+
* @return {number|undefined}
|
|
231
|
+
*/
|
|
232
|
+
pontThermiqueMenuiserieMur(pontThermiqueDE, enveloppe, isolationMur) {
|
|
233
|
+
const menuiserieDE = this.menuiserie(pontThermiqueDE, enveloppe);
|
|
234
|
+
|
|
235
|
+
if (!menuiserieDE) {
|
|
236
|
+
logger.error(`
|
|
237
|
+
Impossible de trouver une menuiserie ayant pour référence '${pontThermiqueDE.reference_1}' ou '${pontThermiqueDE.reference_2}'.
|
|
238
|
+
`);
|
|
239
|
+
return this.defaultValue(pontThermiqueDE);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (parseInt(menuiserieDE.enum_type_vitrage_id) === 5) {
|
|
243
|
+
return 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
let typePose = parseInt(menuiserieDE.enum_type_pose_id || 3);
|
|
247
|
+
|
|
248
|
+
// Pour les types sans objet
|
|
249
|
+
if (typePose === 4) {
|
|
250
|
+
typePose = 3;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const largeurDormant = menuiserieDE.largeur_dormant;
|
|
254
|
+
const presenceRetourIsolation = menuiserieDE.presence_retour_isolation;
|
|
255
|
+
|
|
256
|
+
return this.tvStore.getKForMenuiserie(
|
|
257
|
+
5,
|
|
258
|
+
enums.type_isolation[isolationMur],
|
|
259
|
+
typePose,
|
|
260
|
+
presenceRetourIsolation,
|
|
261
|
+
largeurDormant
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Récupération du mur sur lequel se réfère ce pont thermique à partir des références
|
|
267
|
+
*
|
|
268
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
269
|
+
* @param enveloppe {Enveloppe}
|
|
270
|
+
* @return {MurDE|undefined}
|
|
271
|
+
*/
|
|
272
|
+
mur(pontThermiqueDE, enveloppe) {
|
|
273
|
+
return (enveloppe.mur_collection?.mur || []).find(
|
|
274
|
+
(mur) =>
|
|
275
|
+
compareReferences(mur.donnee_entree.reference, pontThermiqueDE.reference_1) ||
|
|
276
|
+
compareReferences(mur.donnee_entree.reference, pontThermiqueDE.reference_2)
|
|
277
|
+
)?.donnee_entree;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Récupération du plancher bas sur lequel se réfère ce pont thermique à partir des références
|
|
282
|
+
*
|
|
283
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
284
|
+
* @param enveloppe {Enveloppe}
|
|
285
|
+
* @return {PlancherBasDE|undefined}
|
|
286
|
+
*/
|
|
287
|
+
plancherBas(pontThermiqueDE, enveloppe) {
|
|
288
|
+
return (enveloppe.plancher_bas_collection?.plancher_bas || []).find(
|
|
289
|
+
(plancher) =>
|
|
290
|
+
compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_1) ||
|
|
291
|
+
compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_2)
|
|
292
|
+
)?.donnee_entree;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Récupération du plancher haut sur lequel se réfère ce pont thermique à partir des références
|
|
297
|
+
*
|
|
298
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
299
|
+
* @param enveloppe {Enveloppe}
|
|
300
|
+
* @return {PlancherHautDE|undefined}
|
|
301
|
+
*/
|
|
302
|
+
plancherHaut(pontThermiqueDE, enveloppe) {
|
|
303
|
+
return (enveloppe.plancher_haut_collection?.plancher_haut || []).find(
|
|
304
|
+
(plancher) =>
|
|
305
|
+
compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_1) ||
|
|
306
|
+
compareReferences(plancher.donnee_entree.reference, pontThermiqueDE.reference_2)
|
|
307
|
+
)?.donnee_entree;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Récupération de la menuiserie (baie vitrée ou porte) sur laquelle se réfère ce pont thermique
|
|
312
|
+
*
|
|
313
|
+
* @param pontThermiqueDE {PontThermiqueDE}
|
|
314
|
+
* @param enveloppe {Enveloppe}
|
|
315
|
+
* @return {BaieVitreeDE|PorteDE|undefined}
|
|
316
|
+
*/
|
|
317
|
+
menuiserie(pontThermiqueDE, enveloppe) {
|
|
318
|
+
return (enveloppe.baie_vitree_collection?.baie_vitree || [])
|
|
319
|
+
.concat(enveloppe.porte_collection?.porte || [])
|
|
320
|
+
.find(
|
|
321
|
+
(menuiserie) =>
|
|
322
|
+
compareReferences(menuiserie.donnee_entree.reference, pontThermiqueDE.reference_1) ||
|
|
323
|
+
compareReferences(menuiserie.donnee_entree.reference, pontThermiqueDE.reference_2)
|
|
324
|
+
)?.donnee_entree;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Retourne true si le mur est concerné par un pont thermique
|
|
329
|
+
* @param murDE {MurDE}
|
|
330
|
+
* @param typeLiaison {number}
|
|
331
|
+
*/
|
|
332
|
+
murHasPontThermique(murDE, typeLiaison) {
|
|
333
|
+
/**
|
|
334
|
+
* 3.4 Calcul des déperditions par les ponts thermiques
|
|
335
|
+
* Les ponts thermiques des parois au niveau des circulations communes ne sont pas pris en compte.
|
|
336
|
+
* 14 - Circulation sans ouverture directe sur l'extérieur
|
|
337
|
+
* 15 - Circulation avec ouverture directe sur l'extérieur
|
|
338
|
+
* 16 - Circulation avec bouche ou gaine de désenfumage ouverte en permanence
|
|
339
|
+
* 17 - Hall d'entrée avec dispositif de fermeture automatique
|
|
340
|
+
* 18 - Hall d'entrée sans dispositif de fermeture automatique
|
|
341
|
+
* 22 - Local non déperditif ( local à usage d'habitation chauffé)
|
|
342
|
+
*/
|
|
343
|
+
// @todo vérifier la liste
|
|
344
|
+
if ([14, 15, 16, 17, 18, 22].includes(parseInt(murDE.enum_type_adjacence_id))) {
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* 3.4.1 Mur Plancher bas / mur
|
|
350
|
+
* 3.4.3 Plancher haut / mur
|
|
351
|
+
*
|
|
352
|
+
* Seuls les murs et planchers bas constitués d’un matériau lourd (béton, brique, …) sont considérés ici. Pour les autres
|
|
353
|
+
* cas ce pont thermique est pris nul.
|
|
354
|
+
*
|
|
355
|
+
* 5 - Murs en pan de bois sans remplissage tout venant
|
|
356
|
+
* 6 - Murs en pan de bois avec remplissage tout venant
|
|
357
|
+
* 7 - Murs bois (rondin)
|
|
358
|
+
* 16 - Béton cellulaire avant 2013
|
|
359
|
+
* 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
|
|
360
|
+
* 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
|
|
361
|
+
* 25 - Murs en ossature bois sans remplissage
|
|
362
|
+
* 26 - Murs en ossature bois avec isolant en remplissage <2001
|
|
363
|
+
* 27 - Murs en ossature bois avec remplissage tout venant
|
|
364
|
+
*/
|
|
365
|
+
if (typeLiaison === 1 || typeLiaison === 3) {
|
|
366
|
+
return ![5, 6, 7, 16, 18, 24, 25, 26, 27].includes(
|
|
367
|
+
parseInt(murDE.enum_materiaux_structure_mur_id)
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* 3.4.5 Menuiserie / mur
|
|
373
|
+
* Les ponts thermiques avec les parois en structure bois (ossature bois, rondin de bois, pans de bois) sont négligés.
|
|
374
|
+
* enum_materiaux_structure_mur_id
|
|
375
|
+
*
|
|
376
|
+
* 5 - Murs en pan de bois sans remplissage tout venant
|
|
377
|
+
* 6 - Murs en pan de bois avec remplissage tout venant
|
|
378
|
+
* 7 - Murs bois (rondin)
|
|
379
|
+
* 18 - Murs en ossature bois avec isolant en remplissage ≥ 2006
|
|
380
|
+
* 24 - Murs en ossature bois avec isolant en remplissage 2001-2005
|
|
381
|
+
* 25 - Murs en ossature bois sans remplissage
|
|
382
|
+
* 26 - Murs en ossature bois avec isolant en remplissage <2001
|
|
383
|
+
* 27 - Murs en ossature bois avec remplissage tout venant
|
|
384
|
+
*/
|
|
385
|
+
if (typeLiaison === 4) {
|
|
386
|
+
return ![5, 6, 7, 18, 24, 25, 26, 27].includes(
|
|
387
|
+
parseInt(murDE.enum_materiaux_structure_mur_id)
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Retourne true si le plancher haut est concerné par un pont thermique
|
|
396
|
+
* @param plancherHautDE {PlancherHautDE}
|
|
397
|
+
* @return {boolean}
|
|
398
|
+
*/
|
|
399
|
+
plancherHautHasPontThermique(plancherHautDE) {
|
|
400
|
+
/**
|
|
401
|
+
* 3.4.3 Plancher haut / mur
|
|
402
|
+
*
|
|
403
|
+
* Les ponts thermiques des planchers haut en structure légère sont négligés.
|
|
404
|
+
* type_plancher_haut
|
|
405
|
+
|
|
406
|
+
* 9 - Plafond bois sur solives bois
|
|
407
|
+
* 10 - Plafond bois sous solives bois
|
|
408
|
+
*/
|
|
409
|
+
// @todo d'autres type de plancher haut ?
|
|
410
|
+
return ![9, 10].includes(parseInt(plancherHautDE.enum_type_plancher_haut_id));
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Retourne true si le plancher bas est concerné par un pont thermique
|
|
415
|
+
*
|
|
416
|
+
* @param plancherBasDE {PlancherBasDE}
|
|
417
|
+
*/
|
|
418
|
+
plancherBasHasPontThermique(plancherBasDE) {
|
|
419
|
+
/**
|
|
420
|
+
* 3.4.3 Plancher haut / mur
|
|
421
|
+
*
|
|
422
|
+
* Seuls les planchers bas constitués d’un matériau lourd (béton, brique, …) sont considérés ici. Pour les autres
|
|
423
|
+
* cas ce pont thermique est pris nul.
|
|
424
|
+
|
|
425
|
+
* 4 - Plancher entre solives bois avec ou sans remplissage
|
|
426
|
+
* 10 - Plancher bois sur solives bois
|
|
427
|
+
*/
|
|
428
|
+
// @todo d'autres type de plancher bas ?
|
|
429
|
+
return ![4, 10].includes(parseInt(plancherBasDE.enum_type_plancher_bas_id));
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
*
|
|
434
|
+
* @param ptDE {PontThermiqueDE}
|
|
435
|
+
*/
|
|
436
|
+
defaultValue(ptDE) {
|
|
437
|
+
return this.tvStore.getKForMurById(ptDE.tv_pont_thermique_id);
|
|
438
|
+
}
|
|
439
|
+
}
|