@open3cl/engine 1.7.0 → 1.7.1

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.
Files changed (48) hide show
  1. package/10_besoin_fr.spec.js +1 -0
  2. package/10_clim.spec.js +1 -0
  3. package/11_besoin_ecs.spec.js +1 -0
  4. package/11_ecs.spec.js +1 -0
  5. package/12.4_pac.spec.js +1 -0
  6. package/13.2_generateur_combustion.spec.js +3 -3
  7. package/13.2_generateur_combustion_ch.spec.js +3 -3
  8. package/14_generateur_ecs.spec.js +1 -0
  9. package/15_conso_aux.spec.js +3 -3
  10. package/2021_04_13_confort_ete.spec.js +1 -0
  11. package/3.1_b.spec.js +1 -0
  12. package/3.2.1_mur.spec.js +1 -0
  13. package/3.2.2_plancher_bas.spec.js +1 -0
  14. package/3.2.3_plancher_haut.spec.js +1 -0
  15. package/3.3.1.4_porte.spec.js +1 -0
  16. package/3.3_baie_vitree.spec.js +1 -0
  17. package/3.4_pont_thermique.spec.js +1 -0
  18. package/4_ventilation.spec.js +1 -0
  19. package/5_conso_ventilation.spec.js +1 -0
  20. package/6.2_surface_sud_equivalente.spec.js +1 -0
  21. package/9_besoin_ch.spec.js +1 -0
  22. package/9_chauffage.spec.js +3 -3
  23. package/9_conso_ch.spec.js +1 -0
  24. package/9_emetteur_ch.spec.js +1 -0
  25. package/9_generateur_ch.spec.js +1 -0
  26. package/README.md +412 -291
  27. package/conso.spec.js +1 -0
  28. package/engine.js +3 -1
  29. package/engine.spec.js +1 -0
  30. package/package.json +15 -14
  31. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
  32. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
  33. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
  34. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
  35. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
  36. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
  37. package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
  38. package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
  39. package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
  40. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
  41. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
  42. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
  43. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
  44. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
  45. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
  46. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
  47. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
  48. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +0 -508
@@ -1,117 +0,0 @@
1
- import { DeperditionPorteService } from './deperdition-porte.service.js';
2
- import corpus from '../../../../../../test/corpus-sano.json';
3
- import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
4
- import { beforeEach, describe, expect, test } from 'vitest';
5
- import { TvStore } from '../../../../dpe/infrastructure/tv.store.js';
6
- import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
7
-
8
- /** @type {DeperditionPorteService} **/
9
- let service;
10
-
11
- describe('Calcul de déperdition des portes', () => {
12
- beforeEach(() => {
13
- service = new DeperditionPorteService(new TvStore());
14
- });
15
-
16
- describe('Determination de uPorte', () => {
17
- /** @type {Contexte} */
18
- const ctx = { zoneClimatique: { id: 1 } };
19
-
20
- test.each([
21
- { type: '1', label: 'porte simple en bois porte opaque pleine', uPorteExpected: 3.5 },
22
- {
23
- type: '2',
24
- label: 'porte simple en bois porte avec moins de 30% de vitrage simple',
25
- uPorteExpected: 4
26
- },
27
- {
28
- type: '3',
29
- label: 'porte simple en bois porte avec 30-60% de vitrage simple',
30
- uPorteExpected: 4.5
31
- },
32
- { type: '4', label: 'porte simple en bois porte avec double vitrage', uPorteExpected: 3.3 },
33
- { type: '5', label: 'porte simple en pvc porte opaque pleine', uPorteExpected: 3.5 },
34
- {
35
- type: '6',
36
- label: 'porte simple en pvc porte avec moins de 30% de vitrage simple',
37
- uPorteExpected: 4
38
- },
39
- {
40
- type: '7',
41
- label: 'porte simple en pvc porte avec 30-60% de vitrage simple',
42
- uPorteExpected: 4.5
43
- },
44
- { type: '8', label: 'porte simple en pvc porte avec double vitrage', uPorteExpected: 3.3 },
45
-
46
- { type: '9', label: 'porte simple en métal porte opaque pleine', uPorteExpected: 5.8 },
47
- { type: '10', label: 'porte simple en métal porte avec vitrage simple', uPorteExpected: 5.8 },
48
- {
49
- type: '11',
50
- label: 'porte simple en métal porte avec moins de 30% de double vitrage',
51
- uPorteExpected: 5.5
52
- },
53
- {
54
- type: '12',
55
- label: 'porte simple en métal porte avec 30-60% de double vitrage',
56
- uPorteExpected: 4.8
57
- },
58
-
59
- { type: '13', label: 'toute menuiserie porte opaque pleine isolée', uPorteExpected: 1.5 },
60
- { type: '14', label: 'toute menuiserie porte précédée d’un sas', uPorteExpected: 1.5 },
61
- {
62
- type: '15',
63
- label: 'toute menuiserie porte isolée avec double vitrage',
64
- uPorteExpected: 1.5
65
- },
66
-
67
- { type: '16', label: 'autre type de porte', uPorteExpected: undefined }
68
- ])('$label (id:$type)', ({ type, uPorteExpected }) => {
69
- /** @type {PorteDE} */
70
- const de = {
71
- enum_type_porte_id: type
72
- };
73
-
74
- const di = service.execute(ctx, de);
75
- expect(di.uporte).toBe(uPorteExpected);
76
- });
77
-
78
- test('autre porte Uporte saisie manuellement ', () => {
79
- /** @type {PorteDE} */
80
- const de = {
81
- enum_type_porte_id: '16',
82
- enum_methode_saisie_uporte_id: '2',
83
- uporte_saisi: 1.6
84
- };
85
-
86
- const di = service.execute(ctx, de);
87
- expect(di.uporte).toBe(de.uporte_saisi);
88
- });
89
-
90
- test('autre porte Uporte saisie manuellement et justifié', () => {
91
- /** @type {PorteDE} */
92
- const de = {
93
- enum_type_porte_id: '16',
94
- enum_methode_saisie_uporte_id: '3',
95
- uporte_saisi: 1.88
96
- };
97
-
98
- const di = service.execute(ctx, de);
99
- expect(di.uporte).toBe(de.uporte_saisi);
100
- });
101
- });
102
-
103
- describeIntegration("Test d'intégration de porte", () => {
104
- test.each(corpus)('vérification des DI des portes pour dpe %s', (ademeId) => {
105
- const dpeRequest = getAdemeFileJson(ademeId);
106
- /** @type {Contexte} */
107
- const ctx = { zoneClimatique: { id: dpeRequest.logement.meteo.enum_zone_climatique_id } };
108
- const portes = dpeRequest.logement.enveloppe.porte_collection?.porte || [];
109
-
110
- portes.forEach((p) => {
111
- const di = service.execute(ctx, p.donnee_entree);
112
- expect(di.uporte).toBeCloseTo(p.donnee_intermediaire.uporte, 2);
113
- expect(di.b).toBeCloseTo(p.donnee_intermediaire.b, 2);
114
- });
115
- });
116
- });
117
- });
@@ -1,508 +0,0 @@
1
- import { TvStore } from '../../../../dpe/infrastructure/tv.store.js';
2
- import { DeperditionVentilationService } from './deperdition-ventilation.service.js';
3
- import { beforeEach, describe, expect, test, vi } from 'vitest';
4
- import { TypeHabitation } from '../../../../dpe/domain/models/type-habitation.model.js';
5
- import corpus from '../../../../../../test/corpus-sano.json';
6
- import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
7
- import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js';
8
- import { ContexteBuilder } from '../../contexte.builder.js';
9
- import { DeperditionEnveloppeService } from '../deperdition-enveloppe.service.js';
10
- import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
11
- import { logger } from '../../../../../core/util/logger/log-service.js';
12
-
13
- /** @type {DeperditionVentilationService} **/
14
- let service;
15
-
16
- /** @type {DpeNormalizerService} **/
17
- let normalizerService;
18
-
19
- /** @type {DeperditionEnveloppeService} **/
20
- let deperditionEnveloppeService;
21
-
22
- /** @type {ContexteBuilder} **/
23
- let contexteBuilder;
24
-
25
- /** @type {TvStore} **/
26
- let tvStore;
27
-
28
- describe('Calcul de déperdition des portes', () => {
29
- beforeEach(() => {
30
- tvStore = new TvStore();
31
- service = new DeperditionVentilationService(tvStore);
32
- normalizerService = new DpeNormalizerService();
33
- contexteBuilder = new ContexteBuilder();
34
- deperditionEnveloppeService = new DeperditionEnveloppeService();
35
- });
36
-
37
- describe('Determination de q4paConv', () => {
38
- /** @type {Contexte} */
39
- let ctx = { typeHabitation: TypeHabitation.MAISON };
40
-
41
- test.each([
42
- {
43
- q4paConvSaisi: undefined,
44
- enumPeriodeConstructionId: '1',
45
- surfaceIsolee: 0,
46
- surfaceNonIsolee: 0,
47
- surfaceMenuiserieAvecJoint: 0,
48
- surfaceMenuiserieSansJoint: 0,
49
- expectedIsolationSurface: '0',
50
- expectedPresenceJointsMenuiserie: undefined
51
- },
52
- {
53
- q4paConvSaisi: undefined,
54
- enumPeriodeConstructionId: '1',
55
- surfaceIsolee: 200,
56
- surfaceNonIsolee: 100,
57
- surfaceMenuiserieAvecJoint: 0,
58
- surfaceMenuiserieSansJoint: 0,
59
- expectedIsolationSurface: '1',
60
- expectedPresenceJointsMenuiserie: undefined
61
- },
62
- {
63
- q4paConvSaisi: undefined,
64
- enumPeriodeConstructionId: '1',
65
- surfaceIsolee: 200,
66
- surfaceNonIsolee: 300,
67
- surfaceMenuiserieAvecJoint: 100,
68
- surfaceMenuiserieSansJoint: 0,
69
- expectedIsolationSurface: '0',
70
- expectedPresenceJointsMenuiserie: '1'
71
- },
72
- {
73
- q4paConvSaisi: undefined,
74
- enumPeriodeConstructionId: '1',
75
- surfaceIsolee: 200,
76
- surfaceNonIsolee: 300,
77
- surfaceMenuiserieAvecJoint: 100,
78
- surfaceMenuiserieSansJoint: 200,
79
- expectedIsolationSurface: '0',
80
- expectedPresenceJointsMenuiserie: undefined
81
- },
82
- {
83
- q4paConvSaisi: undefined,
84
- enumPeriodeConstructionId: '2',
85
- surfaceIsolee: 200,
86
- surfaceNonIsolee: 100,
87
- surfaceMenuiserieAvecJoint: 0,
88
- surfaceMenuiserieSansJoint: 0,
89
- expectedIsolationSurface: '1',
90
- expectedPresenceJointsMenuiserie: undefined
91
- },
92
- {
93
- // 1948-1974 mais moins de 50% de surface isolée => isolationSurface '0'
94
- q4paConvSaisi: undefined,
95
- enumPeriodeConstructionId: '2',
96
- surfaceIsolee: 100,
97
- surfaceNonIsolee: 200,
98
- surfaceMenuiserieAvecJoint: 0,
99
- surfaceMenuiserieSansJoint: 0,
100
- expectedIsolationSurface: '0',
101
- expectedPresenceJointsMenuiserie: undefined
102
- },
103
- {
104
- q4paConvSaisi: undefined,
105
- enumPeriodeConstructionId: '3',
106
- surfaceIsolee: 200,
107
- surfaceNonIsolee: 100,
108
- surfaceMenuiserieAvecJoint: 0,
109
- surfaceMenuiserieSansJoint: 0,
110
- expectedIsolationSurface: undefined,
111
- expectedPresenceJointsMenuiserie: undefined
112
- },
113
- {
114
- q4paConvSaisi: 12.5,
115
- enumPeriodeConstructionId: '1',
116
- surfaceIsolee: 0,
117
- surfaceNonIsolee: 0,
118
- surfaceMenuiserieAvecJoint: 0,
119
- surfaceMenuiserieSansJoint: 0,
120
- expectedIsolationSurface: '0',
121
- expectedPresenceJointsMenuiserie: undefined
122
- }
123
- ])(
124
- '$q4paConvSaisi: q4paConvSaisi, $enumPeriodeConstructionId: enumPeriodeConstructionId, $surfaceIsolee: surfaceIsolee,' +
125
- '$surfaceNonIsolee: surfaceNonIsolee, $surfaceMenuiserieAvecJoint: surfaceMenuiserieAvecJoint, $surfaceMenuiserieSansJoint: surfaceMenuiserieSansJoint,' +
126
- '$expectedIsolationSurface: expectedIsolationSurface, $expectedPresenceJointsMenuiserie: expectedPresenceJointsMenuiserie',
127
- ({
128
- q4paConvSaisi,
129
- enumPeriodeConstructionId,
130
- surfaceIsolee,
131
- surfaceNonIsolee,
132
- surfaceMenuiserieAvecJoint,
133
- surfaceMenuiserieSansJoint,
134
- expectedIsolationSurface,
135
- expectedPresenceJointsMenuiserie
136
- }) => {
137
- vi.spyOn(tvStore, 'getQ4paConv').mockReturnValue({ q4pa_conv: 18.8 });
138
- ctx.enumPeriodeConstructionId = enumPeriodeConstructionId;
139
-
140
- /** @type {VentilationDE} */
141
- const de = {
142
- q4pa_conv_saisi: q4paConvSaisi
143
- };
144
-
145
- const q4paConv = service.q4paConv(
146
- de,
147
- ctx,
148
- surfaceIsolee,
149
- surfaceNonIsolee,
150
- surfaceMenuiserieAvecJoint,
151
- surfaceMenuiserieSansJoint
152
- );
153
-
154
- if (q4paConvSaisi) {
155
- expect(tvStore.getQ4paConv).not.toHaveBeenCalled();
156
- expect(q4paConv).toBe(q4paConvSaisi);
157
- } else {
158
- expect(tvStore.getQ4paConv).toHaveBeenCalledWith(
159
- enumPeriodeConstructionId,
160
- TypeHabitation.MAISON,
161
- expectedIsolationSurface,
162
- expectedPresenceJointsMenuiserie
163
- );
164
- expect(q4paConv).toBe(18.8);
165
- }
166
- }
167
- );
168
-
169
- test('calcul de hvent', () => {
170
- expect(service.hvent(108, { qvarep_conv: 10 })).toBeCloseTo(367.2, 2);
171
- });
172
- });
173
-
174
- describe('Determination de hperm', () => {
175
- /** @type {Contexte} */
176
- let ctx = { typeHabitation: TypeHabitation.MAISON, surfaceHabitable: 100 };
177
-
178
- test.each([
179
- { plusieursFacadeExposee: false, expectedHperm: 15.04 },
180
- { plusieursFacadeExposee: true, expectedHperm: 98.97 }
181
- ])(
182
- '$plusieursFacadeExposee: plusieursFacadeExposee, $expectedHperm: expectedHperm',
183
- ({ plusieursFacadeExposee, expectedHperm }) => {
184
- ctx.hauteurSousPlafond = 10;
185
-
186
- /** @type {VentilationDE} */
187
- const de = {
188
- plusieurs_facade_exposee: plusieursFacadeExposee
189
- };
190
-
191
- const hperm = service.hperm(
192
- de,
193
- { smea_conv: 18, qvasouf_conv: 15.3, qvarep_conv: 13.2 },
194
- ctx,
195
- 10.5,
196
- 19.6
197
- );
198
- expect(hperm).toBeCloseTo(expectedHperm, 2);
199
- }
200
- );
201
- });
202
-
203
- describe('Determination de pventMoy', () => {
204
- test.each([
205
- {
206
- label: 'Ventilation par ouverture des fenêtres',
207
- typeVentilation: '1',
208
- typeHabitation: TypeHabitation.MAISON,
209
- ventilationPost2012: true,
210
- surfaceHabitable: 100,
211
- qvarepConv: 10,
212
- expectedPventMoy: 0
213
- },
214
- {
215
- label: 'Ventilation naturelle par conduit',
216
- typeVentilation: '25',
217
- typeHabitation: TypeHabitation.APPARTEMENT,
218
- ventilationPost2012: false,
219
- surfaceHabitable: 100,
220
- qvarepConv: 10,
221
- expectedPventMoy: 0
222
- },
223
- {
224
- label: 'Ventilation Simple flux auto SF AUTO',
225
- typeVentilation: '4',
226
- typeHabitation: TypeHabitation.MAISON,
227
- ventilationPost2012: true,
228
- surfaceHabitable: 100,
229
- qvarepConv: 10,
230
- expectedPventMoy: 35
231
- },
232
- {
233
- label: 'Ventilation Simple flux auto SF AUTO',
234
- typeVentilation: '4',
235
- typeHabitation: TypeHabitation.MAISON,
236
- ventilationPost2012: false,
237
- surfaceHabitable: 100,
238
- qvarepConv: 10,
239
- expectedPventMoy: 65
240
- },
241
- {
242
- label: 'Ventilation Simple flux auto SF AUTO',
243
- typeVentilation: '4',
244
- typeHabitation: TypeHabitation.APPARTEMENT,
245
- ventilationPost2012: true,
246
- surfaceHabitable: 100,
247
- qvarepConv: 10,
248
- expectedPventMoy: 250
249
- },
250
- {
251
- label: 'Ventilation Simple flux auto SF AUTO',
252
- typeVentilation: '4',
253
- typeHabitation: TypeHabitation.APPARTEMENT,
254
- ventilationPost2012: false,
255
- surfaceHabitable: 100,
256
- qvarepConv: 10,
257
- expectedPventMoy: 460
258
- },
259
- {
260
- label: 'Ventilation Simple flux auto SF GAZ',
261
- typeVentilation: '10',
262
- typeHabitation: TypeHabitation.MAISON,
263
- ventilationPost2012: true,
264
- surfaceHabitable: 100,
265
- qvarepConv: 10,
266
- expectedPventMoy: 35
267
- },
268
- {
269
- label: 'Ventilation Simple flux auto SF GAZ',
270
- typeVentilation: '11',
271
- typeHabitation: TypeHabitation.MAISON,
272
- ventilationPost2012: false,
273
- surfaceHabitable: 100,
274
- qvarepConv: 10,
275
- expectedPventMoy: 65
276
- },
277
- {
278
- label: 'Ventilation Simple flux auto SF GAZ',
279
- typeVentilation: '10',
280
- typeHabitation: TypeHabitation.APPARTEMENT,
281
- ventilationPost2012: true,
282
- surfaceHabitable: 100,
283
- qvarepConv: 10,
284
- expectedPventMoy: 250
285
- },
286
- {
287
- label: 'Ventilation Simple flux auto SF GAZ',
288
- typeVentilation: '12',
289
- typeHabitation: TypeHabitation.APPARTEMENT,
290
- ventilationPost2012: false,
291
- surfaceHabitable: 100,
292
- qvarepConv: 10,
293
- expectedPventMoy: 460
294
- },
295
- {
296
- label: 'Ventilation Simple flux hygro SF HYGRO',
297
- typeVentilation: '7',
298
- typeHabitation: TypeHabitation.MAISON,
299
- ventilationPost2012: true,
300
- surfaceHabitable: 100,
301
- qvarepConv: 10,
302
- expectedPventMoy: 15
303
- },
304
- {
305
- label: 'Ventilation Simple flux hygro SF HYGRO',
306
- typeVentilation: '8',
307
- typeHabitation: TypeHabitation.MAISON,
308
- ventilationPost2012: false,
309
- surfaceHabitable: 100,
310
- qvarepConv: 10,
311
- expectedPventMoy: 50
312
- },
313
- {
314
- label: 'Ventilation Simple flux hygro SF HYGRO',
315
- typeVentilation: '9',
316
- typeHabitation: TypeHabitation.APPARTEMENT,
317
- ventilationPost2012: true,
318
- surfaceHabitable: 100,
319
- qvarepConv: 10,
320
- expectedPventMoy: 250
321
- },
322
- {
323
- label: 'Ventilation Simple flux hygro SF HYGRO',
324
- typeVentilation: '13',
325
- typeHabitation: TypeHabitation.APPARTEMENT,
326
- ventilationPost2012: false,
327
- surfaceHabitable: 100,
328
- qvarepConv: 10,
329
- expectedPventMoy: 460
330
- },
331
- {
332
- label: 'Ventilation double flux hygro DF INDIVIDUELLE',
333
- typeVentilation: '19',
334
- typeHabitation: TypeHabitation.MAISON,
335
- ventilationPost2012: true,
336
- surfaceHabitable: 100,
337
- qvarepConv: 10,
338
- expectedPventMoy: 35
339
- },
340
- {
341
- label: 'Ventilation double flux hygro DF INDIVIDUELLE',
342
- typeVentilation: '19',
343
- typeHabitation: TypeHabitation.MAISON,
344
- ventilationPost2012: false,
345
- surfaceHabitable: 100,
346
- qvarepConv: 10,
347
- expectedPventMoy: 80
348
- },
349
- {
350
- label: 'Ventilation double flux hygro DF INDIVIDUELLE',
351
- typeVentilation: '19',
352
- typeHabitation: TypeHabitation.APPARTEMENT,
353
- ventilationPost2012: true,
354
- surfaceHabitable: 100,
355
- qvarepConv: 10,
356
- expectedPventMoy: 600
357
- },
358
- {
359
- label: 'Ventilation double flux hygro DF INDIVIDUELLE',
360
- typeVentilation: '19',
361
- typeHabitation: TypeHabitation.APPARTEMENT,
362
- ventilationPost2012: false,
363
- surfaceHabitable: 100,
364
- qvarepConv: 10,
365
- expectedPventMoy: 1100
366
- },
367
- {
368
- label: 'Ventilation simple flux auto HYBRIDE',
369
- typeVentilation: '26',
370
- typeHabitation: TypeHabitation.MAISON,
371
- ventilationPost2012: true,
372
- surfaceHabitable: 100,
373
- qvarepConv: 10,
374
- expectedPventMoy: 2.92
375
- },
376
- {
377
- label: 'Ventilation simple flux auto HYBRIDE',
378
- typeVentilation: '27',
379
- typeHabitation: TypeHabitation.MAISON,
380
- ventilationPost2012: false,
381
- surfaceHabitable: 100,
382
- qvarepConv: 10,
383
- expectedPventMoy: 5.42
384
- },
385
- {
386
- label: 'Ventilation simple flux auto HYBRIDE',
387
- typeVentilation: '28',
388
- typeHabitation: TypeHabitation.APPARTEMENT,
389
- ventilationPost2012: true,
390
- surfaceHabitable: 100,
391
- qvarepConv: 10,
392
- expectedPventMoy: 41.67
393
- },
394
- {
395
- label: 'Ventilation simple flux auto HYBRIDE',
396
- typeVentilation: '29',
397
- typeHabitation: TypeHabitation.APPARTEMENT,
398
- ventilationPost2012: false,
399
- surfaceHabitable: 100,
400
- qvarepConv: 10,
401
- expectedPventMoy: 76.67
402
- }
403
- ])(
404
- '$typeVentilation: typeVentilation, $typeHabitation: typeHabitation, $ventilationPost2012: ventilationPost2012, $surfaceHabitable: surfaceHabitable, $qvarepConv: qvarepConv',
405
- ({
406
- typeVentilation,
407
- typeHabitation,
408
- ventilationPost2012,
409
- surfaceHabitable,
410
- qvarepConv,
411
- expectedPventMoy
412
- }) => {
413
- const pventMoy = service.pventMoy(
414
- typeVentilation,
415
- { typeHabitation, surfaceHabitable },
416
- ventilationPost2012,
417
- { qvarep_conv: qvarepConv }
418
- );
419
- expect(pventMoy).toBeCloseTo(expectedPventMoy, 2);
420
- }
421
- );
422
- });
423
-
424
- describe('execute (agrégation des déperditions et consommations de ventilation)', () => {
425
- /** @type {Contexte} */
426
- const ctx = {
427
- surfaceHabitable: 100,
428
- hauteurSousPlafond: 2.5,
429
- typeHabitation: TypeHabitation.MAISON,
430
- enumPeriodeConstructionId: '3'
431
- };
432
-
433
- test('assemble hvent, hperm et la consommation des auxiliaires', () => {
434
- vi.spyOn(tvStore, 'getDebitsVentilation').mockReturnValue({
435
- qvarep_conv: 10,
436
- qvasouf_conv: 5,
437
- smea_conv: 2
438
- });
439
- vi.spyOn(tvStore, 'getQ4paConv').mockReturnValue({ q4pa_conv: 1.7 });
440
-
441
- /** @type {VentilationDE} */
442
- const de = {
443
- enum_type_ventilation_id: '4',
444
- ventilation_post_2012: true,
445
- plusieurs_facade_exposee: false
446
- };
447
-
448
- const di = service.execute(ctx, de, 120, 80, 40, 10, 5);
449
-
450
- expect(tvStore.getDebitsVentilation).toHaveBeenCalledWith('4');
451
- // hvent = 0.34 * qvarep_conv * surfaceHabitable
452
- expect(di.hvent).toBeCloseTo(340, 5);
453
- // pventMoy (SF auto, maison, post 2012) = 35 => conso = 8.76 * 35
454
- expect(di.pvent_moy).toBe(35);
455
- expect(di.conso_auxiliaire_ventilation).toBeCloseTo(306.6, 5);
456
- // hperm : valeur de référence de régression
457
- expect(di.hperm).toBeCloseTo(0.10692928032279153, 9);
458
- });
459
-
460
- test('conso des auxiliaires nulle sans type de ventilation ni indicateur post 2012', () => {
461
- vi.spyOn(tvStore, 'getDebitsVentilation').mockReturnValue({});
462
- vi.spyOn(tvStore, 'getQ4paConv').mockReturnValue({ q4pa_conv: 1.7 });
463
- const errorSpy = vi.spyOn(logger, 'error').mockImplementation(() => {});
464
-
465
- /** @type {VentilationDE} */
466
- const de = { plusieurs_facade_exposee: false };
467
-
468
- const di = service.execute(ctx, de, 0, 0, 0, 0, 0);
469
-
470
- expect(errorSpy).toHaveBeenCalledOnce();
471
- // La consommation retournée vaut 0 (nombre), les clés conso ne sont donc pas ajoutées
472
- expect(di.conso_auxiliaire_ventilation).toBeUndefined();
473
- expect(di.pvent_moy).toBeUndefined();
474
- });
475
- });
476
-
477
- describeIntegration("Test d'intégration des ventilations", () => {
478
- test.each(corpus)('vérification des DI de la ventilation pour dpe %s', (ademeId) => {
479
- let dpeRequest = getAdemeFileJson(ademeId);
480
- dpeRequest = normalizerService.normalize(dpeRequest);
481
-
482
- const initialVentilations = [
483
- ...(dpeRequest.logement.ventilation_collection?.ventilation || [])
484
- ];
485
-
486
- /** @type {Contexte} */
487
- const ctx = contexteBuilder.fromDpe(dpeRequest);
488
-
489
- deperditionEnveloppeService.deperditions(ctx, dpeRequest.logement);
490
-
491
- const ventilations = dpeRequest.logement.ventilation_collection?.ventilation || [];
492
-
493
- ventilations.forEach((ventilation, index) => {
494
- expect(initialVentilations[index].donnee_intermediaire.hvent).toBeCloseTo(
495
- ventilation.donnee_intermediaire.hvent,
496
- 2
497
- );
498
- expect(initialVentilations[index].donnee_intermediaire.hperm).toBeCloseTo(
499
- ventilation.donnee_intermediaire.hperm,
500
- 2
501
- );
502
- expect(
503
- initialVentilations[index].donnee_intermediaire.conso_auxiliaire_ventilation
504
- ).toBeCloseTo(ventilation.donnee_intermediaire.conso_auxiliaire_ventilation, 2);
505
- });
506
- });
507
- });
508
- });