@open3cl/engine 1.7.0 → 1.7.2
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/10_besoin_fr.spec.js +1 -0
- package/10_clim.spec.js +1 -0
- package/11_besoin_ecs.spec.js +1 -0
- package/11_ecs.spec.js +1 -0
- package/12.4_pac.spec.js +1 -0
- package/13.2_generateur_combustion.js +2 -10
- package/13.2_generateur_combustion.spec.js +3 -3
- package/13.2_generateur_combustion_ch.spec.js +3 -3
- package/14_generateur_ecs.spec.js +1 -0
- package/15_conso_aux.spec.js +3 -3
- package/2021_04_13_confort_ete.spec.js +1 -0
- package/3.1_b.js +45 -33
- package/3.1_b.spec.js +1 -0
- package/3.2.1_mur.spec.js +1 -0
- package/3.2.2_plancher_bas.spec.js +1 -0
- package/3.2.3_plancher_haut.spec.js +1 -0
- package/3.3.1.4_porte.spec.js +1 -0
- package/3.3_baie_vitree.js +32 -10
- package/3.3_baie_vitree.spec.js +1 -0
- package/3.4_pont_thermique.js +21 -13
- package/3.4_pont_thermique.spec.js +2 -1
- package/4_ventilation.spec.js +1 -0
- package/5_conso_ventilation.spec.js +1 -0
- package/6.2_surface_sud_equivalente.spec.js +1 -0
- package/9_besoin_ch.spec.js +1 -0
- package/9_chauffage.spec.js +3 -3
- package/9_conso_ch.spec.js +1 -0
- package/9_emetteur_ch.spec.js +1 -0
- package/9_generateur_ch.spec.js +1 -0
- package/README.md +442 -291
- package/conso.spec.js +1 -0
- package/engine.js +3 -1
- package/engine.spec.js +1 -0
- package/ficheTechnique.js +133 -53
- package/ficheTechnique.spec.js +46 -14
- package/formula.js +251 -0
- package/formula.spec.js +99 -0
- package/package.json +15 -15
- package/utils.js +195 -44
- package/utils.spec.js +69 -0
- package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
- package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
- package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
- package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
- package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
- package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
- package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
- package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
- package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
- package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +0 -508
|
@@ -1,550 +0,0 @@
|
|
|
1
|
-
import { DeperditionEnveloppeService } from './deperdition-enveloppe.service.js';
|
|
2
|
-
import corpus from '../../../../../test/corpus-sano.json';
|
|
3
|
-
import { getAdemeFileJson } from '../../../../../test/test-helpers.js';
|
|
4
|
-
import { ContexteBuilder } from '../contexte.builder.js';
|
|
5
|
-
import { DeperditionPlancherBasService } from './plancher_bas/deperdition-plancher-bas.service.js';
|
|
6
|
-
import { DeperditionMurService } from './mur/deperdition-mur.service.js';
|
|
7
|
-
import { DeperditionPorteService } from './porte/deperdition-porte.service.js';
|
|
8
|
-
import { DeperditionPlancherHautService } from './plancher_haut/deperdition-plancher-haut.service.js';
|
|
9
|
-
import { DpeNormalizerService } from '../../../normalizer/domain/dpe-normalizer.service.js';
|
|
10
|
-
import { TvStore } from '../../../dpe/infrastructure/tv.store.js';
|
|
11
|
-
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
12
|
-
import b from '../../../../3.1_b.js';
|
|
13
|
-
import { describeIntegration } from '../../../../../test/helpers/integration-test.js';
|
|
14
|
-
|
|
15
|
-
/** @type {DeperditionPorteService} **/
|
|
16
|
-
let deperditionPorteService;
|
|
17
|
-
|
|
18
|
-
/** @type {DeperditionMurService} **/
|
|
19
|
-
let deperditionMurService;
|
|
20
|
-
|
|
21
|
-
/** @type {DeperditionPlancherBasService} **/
|
|
22
|
-
let deperditionPlancherBasService;
|
|
23
|
-
|
|
24
|
-
/** @type {DeperditionPlancherHautService} **/
|
|
25
|
-
let deperditionPlancherHautService;
|
|
26
|
-
|
|
27
|
-
/** @type {DpeNormalizerService} **/
|
|
28
|
-
let normalizerService;
|
|
29
|
-
|
|
30
|
-
/** @type {ContexteBuilder} **/
|
|
31
|
-
let contexteBuilder;
|
|
32
|
-
|
|
33
|
-
/** @type {TvStore} **/
|
|
34
|
-
let tvStore;
|
|
35
|
-
|
|
36
|
-
/** @type {DeperditionEnveloppeService} **/
|
|
37
|
-
let service;
|
|
38
|
-
|
|
39
|
-
describe('Calcul des déperditions', () => {
|
|
40
|
-
beforeEach(() => {
|
|
41
|
-
tvStore = new TvStore();
|
|
42
|
-
deperditionPorteService = new DeperditionPorteService(tvStore);
|
|
43
|
-
deperditionMurService = new DeperditionMurService(tvStore);
|
|
44
|
-
deperditionPlancherBasService = new DeperditionPlancherBasService(tvStore);
|
|
45
|
-
deperditionPlancherHautService = new DeperditionPlancherHautService(tvStore);
|
|
46
|
-
normalizerService = new DpeNormalizerService();
|
|
47
|
-
contexteBuilder = new ContexteBuilder();
|
|
48
|
-
|
|
49
|
-
service = new DeperditionEnveloppeService(
|
|
50
|
-
deperditionMurService,
|
|
51
|
-
deperditionPorteService,
|
|
52
|
-
deperditionPlancherBasService,
|
|
53
|
-
deperditionPlancherHautService
|
|
54
|
-
);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe('Détermination du coefficient de réduction des déperditions b', () => {
|
|
58
|
-
test.each([
|
|
59
|
-
{ enumTypeAdjacenceId: '1', label: 'extérieur', bExpected: 1 },
|
|
60
|
-
{ enumTypeAdjacenceId: '2', label: 'paroi enterrée', bExpected: 1 },
|
|
61
|
-
{ enumTypeAdjacenceId: '3', label: 'vide sanitaire', bExpected: 1 },
|
|
62
|
-
{
|
|
63
|
-
enumTypeAdjacenceId: '4',
|
|
64
|
-
label: "bâtiment ou local à usage autre que d'habitation",
|
|
65
|
-
bExpected: 0.2
|
|
66
|
-
},
|
|
67
|
-
{ enumTypeAdjacenceId: '5', label: 'terre-plein', bExpected: 1 },
|
|
68
|
-
{ enumTypeAdjacenceId: '6', label: 'sous-sol non chauffé', bExpected: 1 },
|
|
69
|
-
{
|
|
70
|
-
enumTypeAdjacenceId: '7',
|
|
71
|
-
enumCfgIsolationLncId: '1',
|
|
72
|
-
label: 'locaux non chauffés non accessible',
|
|
73
|
-
bExpected: 0.95
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
enumTypeAdjacenceId: '8',
|
|
77
|
-
surfaceAiu: 14.75,
|
|
78
|
-
surfaceAue: 300,
|
|
79
|
-
enumCfgIsolationLncId: '2',
|
|
80
|
-
label: 'garage',
|
|
81
|
-
bExpected: 0.9
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
enumTypeAdjacenceId: '9',
|
|
85
|
-
surfaceAiu: 8.14,
|
|
86
|
-
surfaceAue: 22.8,
|
|
87
|
-
enumCfgIsolationLncId: '4',
|
|
88
|
-
label: 'cellier',
|
|
89
|
-
bExpected: 0.95
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
enumTypeAdjacenceId: '10',
|
|
93
|
-
surfaceAiu: 8.14,
|
|
94
|
-
surfaceAue: 22.8,
|
|
95
|
-
enumCfgIsolationLncId: '9',
|
|
96
|
-
label: 'espace tampon solarisé (véranda,loggia fermée)',
|
|
97
|
-
bExpected: undefined
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
enumTypeAdjacenceId: '10',
|
|
101
|
-
surfaceAiu: 8.14,
|
|
102
|
-
surfaceAue: 22.8,
|
|
103
|
-
zoneClimatique: 'h2c',
|
|
104
|
-
enumCfgIsolationLncId: '9',
|
|
105
|
-
label: 'espace tampon solarisé (véranda,loggia fermée)',
|
|
106
|
-
bExpected: 0.85
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
enumTypeAdjacenceId: '11',
|
|
110
|
-
surfaceAiu: 50.2,
|
|
111
|
-
surfaceAue: 60,
|
|
112
|
-
enumCfgIsolationLncId: '4',
|
|
113
|
-
label: 'comble fortement ventilé',
|
|
114
|
-
bExpected: 0.95
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
enumTypeAdjacenceId: '12',
|
|
118
|
-
surfaceAiu: 74,
|
|
119
|
-
surfaceAue: 110,
|
|
120
|
-
enumCfgIsolationLncId: '4',
|
|
121
|
-
label: 'comble faiblement ventilé',
|
|
122
|
-
bExpected: 0.95
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
enumTypeAdjacenceId: '13',
|
|
126
|
-
surfaceAiu: 30,
|
|
127
|
-
surfaceAue: 45,
|
|
128
|
-
enumCfgIsolationLncId: '2',
|
|
129
|
-
label: 'comble très faiblement ventilé',
|
|
130
|
-
bExpected: 0.65
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
enumTypeAdjacenceId: '14',
|
|
134
|
-
surfaceAiu: 22,
|
|
135
|
-
surfaceAue: 15,
|
|
136
|
-
enumCfgIsolationLncId: '2',
|
|
137
|
-
label: "circulation sans ouverture directe sur l'extérieur",
|
|
138
|
-
bExpected: 0.35
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
enumTypeAdjacenceId: '15',
|
|
142
|
-
surfaceAiu: 20,
|
|
143
|
-
surfaceAue: 2.5,
|
|
144
|
-
enumCfgIsolationLncId: '2',
|
|
145
|
-
label: "circulation avec ouverture directe sur l'extérieur",
|
|
146
|
-
bExpected: 0.15
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
enumTypeAdjacenceId: '16',
|
|
150
|
-
surfaceAiu: 120,
|
|
151
|
-
surfaceAue: 300,
|
|
152
|
-
enumCfgIsolationLncId: '3',
|
|
153
|
-
label: 'circulation avec bouche ou gaine de désenfumage ouverte en permanence',
|
|
154
|
-
bExpected: 0.7
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
enumTypeAdjacenceId: '17',
|
|
158
|
-
label: "hall d'entrée avec dispositif de fermeture automatique",
|
|
159
|
-
bExpected: 0
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
enumTypeAdjacenceId: '18',
|
|
163
|
-
surfaceAiu: 335.22,
|
|
164
|
-
surfaceAue: 29.18,
|
|
165
|
-
enumCfgIsolationLncId: '2',
|
|
166
|
-
label: "hall d'entrée sans dispositif de fermeture automatique",
|
|
167
|
-
bExpected: 0.15
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
enumTypeAdjacenceId: '19',
|
|
171
|
-
surfaceAiu: 49,
|
|
172
|
-
surfaceAue: 65,
|
|
173
|
-
enumCfgIsolationLncId: '2',
|
|
174
|
-
label: 'garage privé collectif',
|
|
175
|
-
bExpected: 0.7
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
enumTypeAdjacenceId: '20',
|
|
179
|
-
label: "local tertiaire à l'intérieur de l'immeuble en contact avec l'appartement",
|
|
180
|
-
bExpected: 0.2
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
enumTypeAdjacenceId: '21',
|
|
184
|
-
surfaceAiu: 4.94,
|
|
185
|
-
surfaceAue: 8.8,
|
|
186
|
-
enumCfgIsolationLncId: '2',
|
|
187
|
-
label: 'autres dépendances',
|
|
188
|
-
bExpected: 0.75
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
enumTypeAdjacenceId: '22',
|
|
192
|
-
label: "local non déperditif (local à usage d'habitation chauffé)",
|
|
193
|
-
bExpected: 0
|
|
194
|
-
}
|
|
195
|
-
])(
|
|
196
|
-
'$label (id:$enumTypeAdjacenceId)',
|
|
197
|
-
({
|
|
198
|
-
enumTypeAdjacenceId,
|
|
199
|
-
surfaceAiu = undefined,
|
|
200
|
-
surfaceAue = undefined,
|
|
201
|
-
zoneClimatique = undefined,
|
|
202
|
-
enumCfgIsolationLncId = undefined,
|
|
203
|
-
bExpected
|
|
204
|
-
}) => {
|
|
205
|
-
const data = {
|
|
206
|
-
enumTypeAdjacenceId,
|
|
207
|
-
surfaceAiu,
|
|
208
|
-
surfaceAue,
|
|
209
|
-
enumCfgIsolationLncId,
|
|
210
|
-
zoneClimatique
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
const b = deperditionMurService.b(data);
|
|
214
|
-
expect(b).toBe(bExpected);
|
|
215
|
-
}
|
|
216
|
-
);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
describe('deperditions (agrégation GV + ventilation) avec des doubles de test', () => {
|
|
220
|
-
/**
|
|
221
|
-
* Construit un service avec huit doubles de test dont la méthode `execute`
|
|
222
|
-
* renvoie le `__di` (donnée intermédiaire) attaché à chaque donnée d'entrée.
|
|
223
|
-
*/
|
|
224
|
-
const buildService = () => {
|
|
225
|
-
const murService = { execute: vi.fn((ctx, de) => de.__di) };
|
|
226
|
-
const porteService = { execute: vi.fn((ctx, de) => de.__di) };
|
|
227
|
-
const plancherBasService = { execute: vi.fn((ctx, de) => de.__di) };
|
|
228
|
-
const plancherHautService = { execute: vi.fn((ctx, de) => de.__di) };
|
|
229
|
-
const baieVitreeService = { execute: vi.fn((ctx, bv) => bv.donnee_entree.__di) };
|
|
230
|
-
const espaceTamponService = { execute: vi.fn(() => ({ tag: 'ets-di' })) };
|
|
231
|
-
const pontThermiqueService = { execute: vi.fn((ctx, env, de) => de.__di) };
|
|
232
|
-
const ventilationService = { execute: vi.fn((ctx, de) => de.__di) };
|
|
233
|
-
|
|
234
|
-
const service = new DeperditionEnveloppeService(
|
|
235
|
-
murService,
|
|
236
|
-
porteService,
|
|
237
|
-
plancherBasService,
|
|
238
|
-
plancherHautService,
|
|
239
|
-
baieVitreeService,
|
|
240
|
-
espaceTamponService,
|
|
241
|
-
pontThermiqueService,
|
|
242
|
-
ventilationService
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
return {
|
|
246
|
-
service,
|
|
247
|
-
murService,
|
|
248
|
-
porteService,
|
|
249
|
-
plancherBasService,
|
|
250
|
-
plancherHautService,
|
|
251
|
-
baieVitreeService,
|
|
252
|
-
espaceTamponService,
|
|
253
|
-
pontThermiqueService,
|
|
254
|
-
ventilationService
|
|
255
|
-
};
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
test('somme les contributions de chaque paroi et alimente la ventilation avec les surfaces', () => {
|
|
259
|
-
const { service, espaceTamponService, ventilationService } = buildService();
|
|
260
|
-
|
|
261
|
-
const enveloppe = {
|
|
262
|
-
mur_collection: {
|
|
263
|
-
mur: [
|
|
264
|
-
{
|
|
265
|
-
// déperditif, isolé "connu" (1) => surfaceNonIsolee
|
|
266
|
-
donnee_entree: {
|
|
267
|
-
surface_paroi_opaque: 10,
|
|
268
|
-
enum_type_adjacence_id: '1',
|
|
269
|
-
enum_type_isolation_id: '1',
|
|
270
|
-
__di: { b: 0.5, umur: 2 }
|
|
271
|
-
}
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
// b > 0 mais adjacence 22 (local non déperditif) => non compté en surface déperditive,
|
|
275
|
-
// isolation hors ['1','2'] => surfaceIsolee
|
|
276
|
-
donnee_entree: {
|
|
277
|
-
surface_paroi_opaque: 20,
|
|
278
|
-
enum_type_adjacence_id: '22',
|
|
279
|
-
enum_type_isolation_id: '3',
|
|
280
|
-
__di: { b: 0.8, umur: 1 }
|
|
281
|
-
}
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
// b = 0 => aucune surface comptée
|
|
285
|
-
donnee_entree: {
|
|
286
|
-
surface_paroi_opaque: 5,
|
|
287
|
-
enum_type_adjacence_id: '1',
|
|
288
|
-
enum_type_isolation_id: '2',
|
|
289
|
-
__di: { b: 0, umur: 3 }
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
]
|
|
293
|
-
},
|
|
294
|
-
porte_collection: {
|
|
295
|
-
porte: [
|
|
296
|
-
{
|
|
297
|
-
donnee_entree: {
|
|
298
|
-
surface_porte: 2,
|
|
299
|
-
presence_joint: true,
|
|
300
|
-
__di: { b: 0.5, uporte: 3 }
|
|
301
|
-
}
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
donnee_entree: {
|
|
305
|
-
surface_porte: 4,
|
|
306
|
-
presence_joint: false,
|
|
307
|
-
__di: { b: 0, uporte: 2 }
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
]
|
|
311
|
-
},
|
|
312
|
-
plancher_bas_collection: {
|
|
313
|
-
plancher_bas: [
|
|
314
|
-
{
|
|
315
|
-
donnee_entree: {
|
|
316
|
-
surface_paroi_opaque: 8,
|
|
317
|
-
__di: { b: 0.9, upb_final: 1.5 }
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
]
|
|
321
|
-
},
|
|
322
|
-
plancher_haut_collection: {
|
|
323
|
-
plancher_haut: [
|
|
324
|
-
{
|
|
325
|
-
donnee_entree: {
|
|
326
|
-
surface_paroi_opaque: 12,
|
|
327
|
-
enum_type_adjacence_id: '1',
|
|
328
|
-
enum_type_isolation_id: '1',
|
|
329
|
-
__di: { b: 0.7, uph: 1 }
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
{
|
|
333
|
-
donnee_entree: {
|
|
334
|
-
surface_paroi_opaque: 6,
|
|
335
|
-
enum_type_adjacence_id: '22',
|
|
336
|
-
enum_type_isolation_id: '5',
|
|
337
|
-
__di: { b: 0.5, uph: 2 }
|
|
338
|
-
}
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
donnee_entree: {
|
|
342
|
-
surface_paroi_opaque: 3,
|
|
343
|
-
enum_type_adjacence_id: '1',
|
|
344
|
-
enum_type_isolation_id: '1',
|
|
345
|
-
__di: { b: 0, uph: 1 }
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
]
|
|
349
|
-
},
|
|
350
|
-
baie_vitree_collection: {
|
|
351
|
-
baie_vitree: [
|
|
352
|
-
{
|
|
353
|
-
donnee_entree: {
|
|
354
|
-
surface_totale_baie: 5,
|
|
355
|
-
presence_joint: true,
|
|
356
|
-
__di: { b: 0.6, u_menuiserie: 2 }
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
{
|
|
360
|
-
donnee_entree: {
|
|
361
|
-
surface_totale_baie: 3,
|
|
362
|
-
presence_joint: false,
|
|
363
|
-
__di: { b: 0, u_menuiserie: 1 }
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
]
|
|
367
|
-
},
|
|
368
|
-
ets_collection: {
|
|
369
|
-
ets: { donnee_entree: {} }
|
|
370
|
-
},
|
|
371
|
-
pont_thermique_collection: {
|
|
372
|
-
pont_thermique: [
|
|
373
|
-
{
|
|
374
|
-
// pourcentage explicite
|
|
375
|
-
donnee_entree: { l: 4, pourcentage_valeur_pont_thermique: 0.5, __di: { k: 0.2 } }
|
|
376
|
-
},
|
|
377
|
-
{
|
|
378
|
-
// pourcentage absent => 1 par défaut
|
|
379
|
-
donnee_entree: { l: 2, __di: { k: 0.3 } }
|
|
380
|
-
}
|
|
381
|
-
]
|
|
382
|
-
}
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
const logement = {
|
|
386
|
-
enveloppe,
|
|
387
|
-
ventilation_collection: {
|
|
388
|
-
ventilation: [{ donnee_entree: { __di: { hvent: 100, hperm: 50 } } }]
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
|
|
392
|
-
const ctx = { zoneClimatique: { value: 'h1a' } };
|
|
393
|
-
const resultat = service.deperditions(ctx, logement);
|
|
394
|
-
|
|
395
|
-
// Contributions GV (b * surface * u)
|
|
396
|
-
expect(resultat.deperdition_mur).toBeCloseTo(0.5 * 10 * 2 + 0.8 * 20 * 1 + 0, 9); // 26
|
|
397
|
-
expect(resultat.deperdition_porte).toBeCloseTo(0.5 * 2 * 3, 9); // 3
|
|
398
|
-
expect(resultat.deperdition_plancher_bas).toBeCloseTo(0.9 * 8 * 1.5, 9); // 10.8
|
|
399
|
-
expect(resultat.deperdition_plancher_haut).toBeCloseTo(0.7 * 12 * 1 + 0.5 * 6 * 2, 9); // 14.4
|
|
400
|
-
expect(resultat.deperdition_baie_vitree).toBeCloseTo(0.6 * 5 * 2, 9); // 6
|
|
401
|
-
expect(resultat.deperdition_pont_thermique).toBeCloseTo(4 * 0.2 * 0.5 + 2 * 0.3 * 1, 9); // 1
|
|
402
|
-
expect(resultat.hvent).toBe(100);
|
|
403
|
-
expect(resultat.hperm).toBe(50);
|
|
404
|
-
|
|
405
|
-
// deperdition_enveloppe = somme GV + hvent + hperm
|
|
406
|
-
expect(resultat.deperdition_enveloppe).toBeCloseTo(
|
|
407
|
-
26 + 3 + 10.8 + 14.4 + 6 + 1 + 100 + 50,
|
|
408
|
-
9
|
|
409
|
-
);
|
|
410
|
-
|
|
411
|
-
// L'espace tampon a bien été calculé et stocké
|
|
412
|
-
expect(espaceTamponService.execute).toHaveBeenCalledOnce();
|
|
413
|
-
expect(enveloppe.ets_collection.ets.donnee_intermediaire).toStrictEqual({ tag: 'ets-di' });
|
|
414
|
-
|
|
415
|
-
// La ventilation reçoit les surfaces agrégées :
|
|
416
|
-
// déperditive = 10 (mur A) + 2 (porte A) + 12 (ph A) + 5 (baie A) = 29
|
|
417
|
-
// isolée = 20 (mur B) + 6 (ph B) = 26
|
|
418
|
-
// non isolée = 10 (mur A) + 12 (ph A) = 22
|
|
419
|
-
// menuiserie avec joint = 2 (porte A) + 5 (baie A) = 7
|
|
420
|
-
// menuiserie sans joint = 4 (porte B) + 3 (baie B) = 7
|
|
421
|
-
expect(ventilationService.execute).toHaveBeenCalledWith(
|
|
422
|
-
ctx,
|
|
423
|
-
{ __di: { hvent: 100, hperm: 50 } },
|
|
424
|
-
29,
|
|
425
|
-
26,
|
|
426
|
-
22,
|
|
427
|
-
7,
|
|
428
|
-
7
|
|
429
|
-
);
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
test('utilise la première véranda lorsque les ETS sont dupliqués (tableau)', () => {
|
|
433
|
-
const { service, espaceTamponService } = buildService();
|
|
434
|
-
|
|
435
|
-
const premierEts = { donnee_entree: { reference: 'ets-1' } };
|
|
436
|
-
const enveloppe = {
|
|
437
|
-
mur_collection: {},
|
|
438
|
-
porte_collection: {},
|
|
439
|
-
plancher_bas_collection: {},
|
|
440
|
-
plancher_haut_collection: {},
|
|
441
|
-
baie_vitree_collection: {},
|
|
442
|
-
ets_collection: { ets: [premierEts, { donnee_entree: { reference: 'ets-2' } }] },
|
|
443
|
-
pont_thermique_collection: {}
|
|
444
|
-
};
|
|
445
|
-
const logement = { enveloppe, ventilation_collection: {} };
|
|
446
|
-
|
|
447
|
-
service.deperditions({ zoneClimatique: { value: 'h1a' } }, logement);
|
|
448
|
-
|
|
449
|
-
// Seule la première véranda est traitée
|
|
450
|
-
expect(espaceTamponService.execute).toHaveBeenCalledOnce();
|
|
451
|
-
expect(premierEts.donnee_intermediaire).toStrictEqual({ tag: 'ets-di' });
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
test('renvoie des déperditions nulles pour une enveloppe et une ventilation vides', () => {
|
|
455
|
-
const { service, espaceTamponService, ventilationService } = buildService();
|
|
456
|
-
|
|
457
|
-
const enveloppe = {
|
|
458
|
-
mur_collection: {},
|
|
459
|
-
porte_collection: {},
|
|
460
|
-
plancher_bas_collection: {},
|
|
461
|
-
plancher_haut_collection: {},
|
|
462
|
-
baie_vitree_collection: {},
|
|
463
|
-
pont_thermique_collection: {}
|
|
464
|
-
};
|
|
465
|
-
const logement = { enveloppe, ventilation_collection: {} };
|
|
466
|
-
|
|
467
|
-
const resultat = service.deperditions({ zoneClimatique: { value: 'h1a' } }, logement);
|
|
468
|
-
|
|
469
|
-
// Aucune paroi, aucun ETS, aucune ventilation
|
|
470
|
-
expect(espaceTamponService.execute).not.toHaveBeenCalled();
|
|
471
|
-
expect(ventilationService.execute).not.toHaveBeenCalled();
|
|
472
|
-
expect(resultat).toStrictEqual({
|
|
473
|
-
deperdition_mur: 0,
|
|
474
|
-
deperdition_plancher_bas: 0,
|
|
475
|
-
deperdition_plancher_haut: 0,
|
|
476
|
-
deperdition_baie_vitree: 0,
|
|
477
|
-
deperdition_pont_thermique: 0,
|
|
478
|
-
deperdition_porte: 0,
|
|
479
|
-
hperm: 0,
|
|
480
|
-
hvent: 0,
|
|
481
|
-
deperdition_enveloppe: 0
|
|
482
|
-
});
|
|
483
|
-
});
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
describe.skip('Benchmark', () => {
|
|
487
|
-
test('reworked', () => {
|
|
488
|
-
const data = {
|
|
489
|
-
enumTypeAdjacenceId: '8',
|
|
490
|
-
surfaceAiu: 2.82,
|
|
491
|
-
surfaceAue: 300,
|
|
492
|
-
enumCfgIsolationLncId: '2',
|
|
493
|
-
label: 'garage'
|
|
494
|
-
};
|
|
495
|
-
|
|
496
|
-
for (let i = 0; i < 1000; i++) {
|
|
497
|
-
const b = deperditionMurService.b(data);
|
|
498
|
-
expect(b).toBe(0.9);
|
|
499
|
-
}
|
|
500
|
-
});
|
|
501
|
-
|
|
502
|
-
test('legacy', () => {
|
|
503
|
-
const di = { b: undefined };
|
|
504
|
-
const de = {
|
|
505
|
-
enum_type_adjacence_id: '8',
|
|
506
|
-
surface_aiu: 2.82,
|
|
507
|
-
surface_aue: 300,
|
|
508
|
-
enum_cfg_isolation_lnc_id: '2'
|
|
509
|
-
};
|
|
510
|
-
const du = {};
|
|
511
|
-
const zc = '1';
|
|
512
|
-
|
|
513
|
-
for (let i = 0; i < 1000; i++) {
|
|
514
|
-
b(di, de, du, zc);
|
|
515
|
-
expect(di.b).toBe(0.9);
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
describeIntegration("Test d'intégration de calcul des deperditions", () => {
|
|
521
|
-
test.each(corpus)('deperditions pour dpe %s', (ademeId) => {
|
|
522
|
-
let dpeRequest = getAdemeFileJson(ademeId);
|
|
523
|
-
dpeRequest = normalizerService.normalize(dpeRequest);
|
|
524
|
-
|
|
525
|
-
/** @type {Contexte} */
|
|
526
|
-
const ctx = contexteBuilder.fromDpe(dpeRequest);
|
|
527
|
-
/** @type {Logement} */
|
|
528
|
-
const logement = dpeRequest.logement;
|
|
529
|
-
/** @type {Deperdition} */
|
|
530
|
-
const deperditions = service.deperditions(ctx, logement);
|
|
531
|
-
|
|
532
|
-
expect(deperditions.deperdition_mur).toBeCloseTo(
|
|
533
|
-
dpeRequest.logement.sortie.deperdition.deperdition_mur,
|
|
534
|
-
1
|
|
535
|
-
);
|
|
536
|
-
expect(deperditions.deperdition_porte).toBeCloseTo(
|
|
537
|
-
dpeRequest.logement.sortie.deperdition.deperdition_porte,
|
|
538
|
-
1
|
|
539
|
-
);
|
|
540
|
-
expect(deperditions.deperdition_plancher_bas).toBeCloseTo(
|
|
541
|
-
dpeRequest.logement.sortie.deperdition.deperdition_plancher_bas,
|
|
542
|
-
1
|
|
543
|
-
);
|
|
544
|
-
expect(deperditions.deperdition_plancher_haut).toBeCloseTo(
|
|
545
|
-
dpeRequest.logement.sortie.deperdition.deperdition_plancher_haut,
|
|
546
|
-
1
|
|
547
|
-
);
|
|
548
|
-
});
|
|
549
|
-
});
|
|
550
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { ContexteBuilder } from '../../contexte.builder.js';
|
|
2
|
-
import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js';
|
|
3
|
-
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
4
|
-
import { BaieVitreeTvStore } from '../../../../dpe/infrastructure/enveloppe/baieVitreeTv.store.js';
|
|
5
|
-
import { EspaceTamponService } from './espace-tampon.service.js';
|
|
6
|
-
import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
|
|
7
|
-
import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
|
|
8
|
-
|
|
9
|
-
/** @type {EspaceTamponService} **/
|
|
10
|
-
let service;
|
|
11
|
-
|
|
12
|
-
/** @type {DpeNormalizerService} **/
|
|
13
|
-
let normalizerService;
|
|
14
|
-
|
|
15
|
-
/** @type {BaieVitreeTvStore} **/
|
|
16
|
-
let tvStore;
|
|
17
|
-
|
|
18
|
-
/** @type {ContexteBuilder} **/
|
|
19
|
-
let contexteBuilder;
|
|
20
|
-
|
|
21
|
-
describe('Calcul de déperdition des baies vitrées', () => {
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
tvStore = new BaieVitreeTvStore();
|
|
24
|
-
service = new EspaceTamponService(tvStore);
|
|
25
|
-
normalizerService = new DpeNormalizerService();
|
|
26
|
-
contexteBuilder = new ContexteBuilder();
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe('Determination des données intermédiaires', () => {
|
|
30
|
-
test('Doit retourner bver et directement', () => {
|
|
31
|
-
vi.spyOn(tvStore, 'getBver').mockReturnValue(0.55);
|
|
32
|
-
vi.spyOn(tvStore, 'getCoefTransparenceEts').mockReturnValue(0.62);
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @type {Contexte}
|
|
36
|
-
*/
|
|
37
|
-
const ctx = {
|
|
38
|
-
zoneClimatique: { value: 'h1a' }
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* @type {Ets}
|
|
43
|
-
*/
|
|
44
|
-
const ets = {
|
|
45
|
-
donnee_entree: {
|
|
46
|
-
enum_cfg_isolation_lnc_id: '10',
|
|
47
|
-
tv_coef_transparence_ets_id: '2'
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
let etsDI = service.execute(ctx, ets);
|
|
52
|
-
expect(tvStore.getBver).toHaveBeenCalledWith('h1a', 10);
|
|
53
|
-
expect(tvStore.getCoefTransparenceEts).toHaveBeenCalledWith(2);
|
|
54
|
-
expect(etsDI).toStrictEqual({ bver: 0.55, coef_transparence_ets: 0.62 });
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describeIntegration("Test d'intégration des ets", () => {
|
|
59
|
-
test.each(['2273E0303205P', '2364E0984413P', '2283E0131604Y'])(
|
|
60
|
-
'vérification des DI des ets pour dpe %s',
|
|
61
|
-
(ademeId) => {
|
|
62
|
-
let dpeRequest = getAdemeFileJson(ademeId);
|
|
63
|
-
dpeRequest = normalizerService.normalize(dpeRequest);
|
|
64
|
-
|
|
65
|
-
/** @type {Contexte} */
|
|
66
|
-
const ctx = contexteBuilder.fromDpe(dpeRequest);
|
|
67
|
-
|
|
68
|
-
let ets = dpeRequest.logement.enveloppe.ets_collection?.ets || {};
|
|
69
|
-
if (ets && Array.isArray(ets)) {
|
|
70
|
-
ets = ets[0];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const di = service.execute(ctx, ets);
|
|
74
|
-
expect(di.bver).toBeCloseTo(ets.donnee_intermediaire.bver, 2);
|
|
75
|
-
expect(di.coef_transparence_ets).toBeCloseTo(
|
|
76
|
-
ets.donnee_intermediaire.coef_transparence_ets,
|
|
77
|
-
2
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
);
|
|
81
|
-
});
|
|
82
|
-
});
|