@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.
Files changed (58) 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.js +2 -10
  7. package/13.2_generateur_combustion.spec.js +3 -3
  8. package/13.2_generateur_combustion_ch.spec.js +3 -3
  9. package/14_generateur_ecs.spec.js +1 -0
  10. package/15_conso_aux.spec.js +3 -3
  11. package/2021_04_13_confort_ete.spec.js +1 -0
  12. package/3.1_b.js +45 -33
  13. package/3.1_b.spec.js +1 -0
  14. package/3.2.1_mur.spec.js +1 -0
  15. package/3.2.2_plancher_bas.spec.js +1 -0
  16. package/3.2.3_plancher_haut.spec.js +1 -0
  17. package/3.3.1.4_porte.spec.js +1 -0
  18. package/3.3_baie_vitree.js +32 -10
  19. package/3.3_baie_vitree.spec.js +1 -0
  20. package/3.4_pont_thermique.js +21 -13
  21. package/3.4_pont_thermique.spec.js +2 -1
  22. package/4_ventilation.spec.js +1 -0
  23. package/5_conso_ventilation.spec.js +1 -0
  24. package/6.2_surface_sud_equivalente.spec.js +1 -0
  25. package/9_besoin_ch.spec.js +1 -0
  26. package/9_chauffage.spec.js +3 -3
  27. package/9_conso_ch.spec.js +1 -0
  28. package/9_emetteur_ch.spec.js +1 -0
  29. package/9_generateur_ch.spec.js +1 -0
  30. package/README.md +442 -291
  31. package/conso.spec.js +1 -0
  32. package/engine.js +3 -1
  33. package/engine.spec.js +1 -0
  34. package/ficheTechnique.js +133 -53
  35. package/ficheTechnique.spec.js +46 -14
  36. package/formula.js +251 -0
  37. package/formula.spec.js +99 -0
  38. package/package.json +15 -15
  39. package/utils.js +195 -44
  40. package/utils.spec.js +69 -0
  41. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
  42. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
  43. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
  44. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
  45. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
  46. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
  47. package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
  48. package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
  49. package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
  50. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
  51. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
  52. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
  53. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
  54. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
  55. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
  56. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
  57. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
  58. 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
- });