@open3cl/engine 1.0.13 → 1.0.14

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.
@@ -0,0 +1,734 @@
1
+ import { beforeEach, describe, expect, test, vi } from 'vitest';
2
+ import { GenerateurChService } from './generateur-ch.service.js';
3
+
4
+ import { DpeNormalizerService } from '../../../normalizer/domain/dpe-normalizer.service.js';
5
+ import corpus from '../../../../../test/corpus-sano.json';
6
+ import { getAdemeFileJson } from '../../../../../test/test-helpers.js';
7
+ import { TypeGenerateur } from '../../../dpe/domain/models/installation-chauffage.model.js';
8
+ import { ChTvStore } from '../../../dpe/infrastructure/ch/chTv.store.js';
9
+ import { ContexteBuilder } from '../contexte.builder.js';
10
+ import { TvStore } from '../../../dpe/infrastructure/tv.store.js';
11
+ import { EmetteurChService } from './emetteur-ch.service.js';
12
+
13
+ /** @type {GenerateurChService} **/
14
+ let service;
15
+
16
+ /** @type {EmetteurChService} **/
17
+ let emetteurChService;
18
+
19
+ /** @type {ChTvStore} **/
20
+ let chTvStore;
21
+
22
+ /** @type {TvStore} **/
23
+ let tvStore;
24
+
25
+ /** @type {DpeNormalizerService} **/
26
+ let normalizerService;
27
+
28
+ /** @type {ContexteBuilder} **/
29
+ let contexteBuilder;
30
+
31
+ describe('Calcul des caractéristiques des générateurs de chauffage', () => {
32
+ beforeEach(() => {
33
+ chTvStore = new ChTvStore();
34
+ tvStore = new TvStore();
35
+ emetteurChService = new EmetteurChService(chTvStore);
36
+ service = new GenerateurChService(chTvStore, tvStore, emetteurChService);
37
+ normalizerService = new DpeNormalizerService();
38
+ contexteBuilder = new ContexteBuilder();
39
+ });
40
+
41
+ test.each([
42
+ {
43
+ label: 'Générateur chauffage avec méthode de saisie 4',
44
+ enumMethodeSaisieCaracSysId: 4,
45
+ ratioVirtualisation: 1,
46
+ pn: 25000,
47
+ qp0Perc: '0.05%',
48
+ qp0Initial: 125,
49
+ expected: 125
50
+ },
51
+ {
52
+ label: 'Générateur chauffage avec méthode de saisie 5',
53
+ enumMethodeSaisieCaracSysId: 5,
54
+ ratioVirtualisation: 1,
55
+ pn: 25000,
56
+ qp0Perc: '0.05%',
57
+ qp0Initial: 125,
58
+ expected: 125
59
+ },
60
+ {
61
+ label: 'Générateur chauffage avec méthode de saisie 3 et aucun qp0Perc',
62
+ enumMethodeSaisieCaracSysId: 3,
63
+ ratioVirtualisation: 1,
64
+ pn: 25000,
65
+ qp0Perc: undefined,
66
+ qp0Initial: 125,
67
+ expected: 0
68
+ },
69
+ {
70
+ label:
71
+ 'Générateur chauffage avec méthode de saisie 3 et qp0Perc contenant Pn, ratio de virtualisation 1',
72
+ enumMethodeSaisieCaracSysId: 3,
73
+ ratioVirtualisation: 1,
74
+ pn: 25000,
75
+ qp0Perc: '0,085*Pn*(Pn)^-0,4',
76
+ qp0Initial: 125,
77
+ expected: 586.39
78
+ },
79
+ {
80
+ label:
81
+ 'Générateur chauffage avec méthode de saisie 3 et qp0Perc contenant Pn, ratio de virtualisation 0.5',
82
+ enumMethodeSaisieCaracSysId: 3,
83
+ ratioVirtualisation: 0.5,
84
+ pn: 25000,
85
+ qp0Perc: '0,085*Pn*(Pn)^-0,4',
86
+ qp0Initial: 125,
87
+ expected: 444.4
88
+ },
89
+ {
90
+ label:
91
+ 'Générateur chauffage avec méthode de saisie 3 et qp0Perc en %, ratio de virtualisation 1',
92
+ enumMethodeSaisieCaracSysId: 3,
93
+ ratioVirtualisation: 1,
94
+ pn: 25000,
95
+ qp0Perc: '0.6%',
96
+ qp0Initial: 125,
97
+ expected: 150
98
+ },
99
+ {
100
+ label:
101
+ 'Générateur chauffage avec méthode de saisie 3 et qp0Perc constante, ratio de virtualisation 1',
102
+ enumMethodeSaisieCaracSysId: 3,
103
+ ratioVirtualisation: 1,
104
+ pn: 25000,
105
+ qp0Perc: '12',
106
+ qp0Initial: 125,
107
+ expected: 12000
108
+ },
109
+ {
110
+ label:
111
+ 'Générateur chauffage avec méthode de saisie 3 et qp0Perc contenant Pn, E et F, ratio de virtualisation 0.5, sans ventouse',
112
+ enumMethodeSaisieCaracSysId: 3,
113
+ presenceVentouse: 0,
114
+ ratioVirtualisation: 0.5,
115
+ pn: 25000,
116
+ qp0Perc: 'Pn * (E + F * logPn) / 100',
117
+ qp0Initial: 125,
118
+ expected: 285.21
119
+ },
120
+ {
121
+ label:
122
+ 'Générateur chauffage avec méthode de saisie 3 et qp0Perc contenant Pn, E et F, ratio de virtualisation 0.5, avec ventouse',
123
+ enumMethodeSaisieCaracSysId: 3,
124
+ presenceVentouse: 1,
125
+ ratioVirtualisation: 0.5,
126
+ pn: 25000,
127
+ qp0Perc: 'Pn * (E + F * logPn) / 100',
128
+ qp0Initial: 125,
129
+ expected: 203.89
130
+ }
131
+ ])(
132
+ "Détermination des pertes à l'arrêt qp0 pour $label",
133
+ ({
134
+ enumMethodeSaisieCaracSysId,
135
+ ratioVirtualisation,
136
+ pn,
137
+ qp0Perc,
138
+ qp0Initial,
139
+ presenceVentouse = undefined,
140
+ expected
141
+ }) => {
142
+ /** @type {GenerateurChauffage} */
143
+ const generateurChauffage = {
144
+ donnee_entree: {
145
+ enum_methode_saisie_carac_sys_id: enumMethodeSaisieCaracSysId,
146
+ presence_ventouse: presenceVentouse
147
+ },
148
+ donnee_utilisateur: {
149
+ ratio_virtualisation: ratioVirtualisation,
150
+ generateur: { qp0_perc: qp0Perc }
151
+ },
152
+ donnee_intermediaire: { qp0: qp0Initial, pn }
153
+ };
154
+
155
+ expect(service.qp0(generateurChauffage)).toBeCloseTo(expected, 2);
156
+ }
157
+ );
158
+
159
+ test.each([
160
+ {
161
+ label: 'Générateur chauffage avec méthode de saisie 3',
162
+ enumMethodeSaisieCaracSysId: 3,
163
+ ratioVirtualisation: 1,
164
+ pn: 25000,
165
+ rpn: '84 + 2 logPn',
166
+ rpint: '80 + 3 logPn',
167
+ rpnInitial: 0.95,
168
+ rpintInitial: 0.69,
169
+ expected: { rpn: 0.95, rpint: 0.69 }
170
+ },
171
+ {
172
+ label: 'Générateur chauffage avec méthode de saisie 4',
173
+ enumMethodeSaisieCaracSysId: 4,
174
+ ratioVirtualisation: 1,
175
+ pn: 25000,
176
+ rpn: '84 + 2 logPn',
177
+ rpint: '80 + 3 logPn',
178
+ rpnInitial: 0.95,
179
+ rpintInitial: 0.69,
180
+ expected: { rpn: 0.95, rpint: 0.69 }
181
+ },
182
+ {
183
+ label: 'Générateur chauffage avec méthode de saisie 5',
184
+ enumMethodeSaisieCaracSysId: 5,
185
+ ratioVirtualisation: 1,
186
+ pn: 25000,
187
+ rpn: '84 + 2 logPn',
188
+ rpint: '80 + 3 logPn',
189
+ rpnInitial: 0.95,
190
+ rpintInitial: 0.69,
191
+ expected: { rpn: 0.95, rpint: 0.69 }
192
+ },
193
+ {
194
+ label: 'Générateur chauffage avec méthodes de saisie 2 et aucun rpn ni rpint',
195
+ enumMethodeSaisieCaracSysId: 2,
196
+ ratioVirtualisation: 1,
197
+ pn: 25000,
198
+ rpn: undefined,
199
+ rpint: undefined,
200
+ rpnInitial: 0.95,
201
+ rpintInitial: 0.69,
202
+ expected: { rpn: 0, rpint: 0 }
203
+ },
204
+ {
205
+ label: 'Générateur chauffage avec méthodes de saisie 2 et ratio de virtualisation 1',
206
+ enumMethodeSaisieCaracSysId: 2,
207
+ ratioVirtualisation: 1,
208
+ pn: 25000,
209
+ rpn: '84 + 2 logPn',
210
+ rpint: '80 + 3 logPn',
211
+ rpnInitial: 0.95,
212
+ rpintInitial: 0.69,
213
+ expected: { rpn: 0.8679588001734407, rpint: 0.8419382002601611 }
214
+ },
215
+ {
216
+ label: 'Générateur chauffage avec méthodes de saisie 2 et ratio de virtualisation 0.5',
217
+ enumMethodeSaisieCaracSysId: 2,
218
+ ratioVirtualisation: 0.5,
219
+ pn: 25000,
220
+ rpn: '84 + 2 logPn',
221
+ rpint: '80 + 3 logPn',
222
+ rpnInitial: 0.95,
223
+ rpintInitial: 0.69,
224
+ expected: { rpn: 0.8739794000867204, rpint: 0.8509691001300805 }
225
+ }
226
+ ])(
227
+ 'Détermination des rendements rpn et rpint pour $label',
228
+ ({
229
+ enumMethodeSaisieCaracSysId,
230
+ ratioVirtualisation,
231
+ pn,
232
+ rpn,
233
+ rpint,
234
+ rpnInitial,
235
+ rpintInitial,
236
+ expected
237
+ }) => {
238
+ /** @type {GenerateurChauffage} */
239
+ const generateurChauffage = {
240
+ donnee_entree: { enum_methode_saisie_carac_sys_id: enumMethodeSaisieCaracSysId },
241
+ donnee_utilisateur: {
242
+ ratio_virtualisation: ratioVirtualisation,
243
+ generateur: { rpn, rpint }
244
+ },
245
+ donnee_intermediaire: { rpn: rpnInitial, rpint: rpintInitial, pn }
246
+ };
247
+
248
+ expect(service.rpnrpint(generateurChauffage)).toStrictEqual(expected);
249
+ }
250
+ );
251
+
252
+ test.each([
253
+ {
254
+ label: 'Générateur chauffage avec méthode de saisie 2 et pveilleuse',
255
+ enumMethodeSaisieCaracSysId: 2,
256
+ pveilleuseInitial: 150,
257
+ pveil: 250,
258
+ expected: 150
259
+ },
260
+ {
261
+ label: 'Générateur chauffage avec méthode de saisie 2 et !pveilleuse',
262
+ enumMethodeSaisieCaracSysId: 2,
263
+ pveil: 250,
264
+ expected: 250
265
+ },
266
+ {
267
+ label: 'Générateur chauffage avec méthode de saisie 1 et pveilleuse',
268
+ enumMethodeSaisieCaracSysId: 1,
269
+ pveilleuseInitial: 150,
270
+ pveil: 250,
271
+ expected: 250
272
+ }
273
+ ])(
274
+ 'Détermination de la puissance de la veilleuse pour $label',
275
+ ({ enumMethodeSaisieCaracSysId, pveilleuseInitial, pveil, expected }) => {
276
+ /** @type {GenerateurChauffage} */
277
+ const generateurChauffage = {
278
+ donnee_entree: { enum_methode_saisie_carac_sys_id: enumMethodeSaisieCaracSysId },
279
+ donnee_utilisateur: { generateur: { pveil } },
280
+ donnee_intermediaire: { pveilleuse: pveilleuseInitial }
281
+ };
282
+
283
+ expect(service.pveil(generateurChauffage)).toStrictEqual(expected);
284
+ }
285
+ );
286
+
287
+ test.each([
288
+ {
289
+ label:
290
+ 'Générateur chauffage avec méthode de saisie 5 mais pas de temp_fonc_30 ni temp_fonc_100',
291
+ enumMethodeSaisieCaracSysId: 5,
292
+ emetteurServiceCalled: true,
293
+ expected: { temp_fonc_30: 18, temp_fonc_100: 25 }
294
+ },
295
+ {
296
+ label: 'Générateur chauffage avec méthode de saisie 5 mais pas de temp_fonc_30',
297
+ enumMethodeSaisieCaracSysId: 5,
298
+ tempFonc100Initial: 38,
299
+ emetteurServiceCalled: true,
300
+ expected: { temp_fonc_30: 18, temp_fonc_100: 25 }
301
+ },
302
+ {
303
+ label: 'Générateur chauffage avec méthode de saisie 5 mais pas de temp_fonc_100',
304
+ enumMethodeSaisieCaracSysId: 5,
305
+ tempFonc30Initial: 25,
306
+ emetteurServiceCalled: true,
307
+ expected: { temp_fonc_30: 18, temp_fonc_100: 25 }
308
+ },
309
+ {
310
+ label: 'Générateur chauffage avec méthode de saisie 4 avec temp_fonc_30 et temp_fonc_100',
311
+ enumMethodeSaisieCaracSysId: 4,
312
+ tempFonc30Initial: 25,
313
+ tempFonc100Initial: 38,
314
+ emetteurServiceCalled: true,
315
+ expected: { temp_fonc_30: 18, temp_fonc_100: 25 }
316
+ },
317
+ {
318
+ label: 'Générateur chauffage avec méthode de saisie 5 avec temp_fonc_30 et temp_fonc_100',
319
+ enumMethodeSaisieCaracSysId: 5,
320
+ tempFonc30Initial: 25,
321
+ tempFonc100Initial: 38,
322
+ emetteurServiceCalled: false,
323
+ expected: { temp_fonc_30: 25, temp_fonc_100: 38 }
324
+ }
325
+ ])(
326
+ 'Détermination des températures de fonctionnement à 30% et 100% de charge pour $label',
327
+ ({
328
+ enumMethodeSaisieCaracSysId,
329
+ tempFonc30Initial = undefined,
330
+ tempFonc100Initial = undefined,
331
+ emetteurServiceCalled,
332
+ expected
333
+ }) => {
334
+ vi.spyOn(emetteurChService, 'temperatureFonctionnement').mockReturnValue({
335
+ temp_fonc_30: 18,
336
+ temp_fonc_100: 25
337
+ });
338
+
339
+ /** @type {GenerateurChauffage} */
340
+ const generateurChauffage = {
341
+ donnee_entree: { enum_methode_saisie_carac_sys_id: enumMethodeSaisieCaracSysId },
342
+ donnee_intermediaire: { temp_fonc_100: tempFonc100Initial, temp_fonc_30: tempFonc30Initial }
343
+ };
344
+
345
+ /** @type {EmetteurChauffage[]} */
346
+ const emetteursChauffage = [
347
+ {
348
+ donnee_entree: { surface_chauffee: 80 },
349
+ donnee_intermediaire: { rendement_emission: 0.86 }
350
+ }
351
+ ];
352
+
353
+ /** @type {Contexte} */
354
+ const contexte = { altitude: { id: 1 }, zoneClimatique: { id: 1 } };
355
+
356
+ expect(
357
+ service.temperatureFonctionnement(contexte, generateurChauffage, emetteursChauffage)
358
+ ).toStrictEqual(expected);
359
+
360
+ if (emetteurServiceCalled) {
361
+ expect(emetteurChService.temperatureFonctionnement).toHaveBeenCalledWith(
362
+ contexte,
363
+ generateurChauffage.donnee_entree,
364
+ emetteursChauffage
365
+ );
366
+ } else {
367
+ expect(emetteurChService.temperatureFonctionnement).not.toHaveBeenCalled();
368
+ }
369
+ }
370
+ );
371
+
372
+ test('Détermination de la puissance nominale pour un générateur de chauffage', () => {
373
+ vi.spyOn(tvStore, 'getTempBase').mockReturnValue(-9.5);
374
+
375
+ /** @type {Contexte} */
376
+ const contexte = { altitude: { id: 1 }, zoneClimatique: { id: 1 } };
377
+
378
+ /** @type {Logement} **/
379
+ const logement = { sortie: { deperdition: { deperdition_enveloppe: 1134 } } };
380
+
381
+ expect(service.pn(contexte, logement)).toBeCloseTo(45234.35, 2);
382
+ expect(tvStore.getTempBase).toHaveBeenCalledWith(1, 1);
383
+ });
384
+
385
+ test('Détermination du type de générateur de chauffage', () => {
386
+ expect(service.typeGenerateur({ enum_type_generateur_ch_id: 1 })).toBe(TypeGenerateur.OTHER);
387
+ [
388
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
389
+ 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 148, 149, 150, 151, 160, 161
390
+ ].forEach((value) =>
391
+ expect(service.typeGenerateur({ enum_type_generateur_ch_id: value })).toBe(
392
+ TypeGenerateur.CHAUDIERE
393
+ )
394
+ );
395
+ });
396
+
397
+ test('Détermination des caractéristiques pour le générateur de chauffage', () => {
398
+ vi.spyOn(emetteurChService, 'temperatureFonctionnement').mockReturnValue({
399
+ temp_fonc_30: 18,
400
+ temp_fonc_100: 25
401
+ });
402
+
403
+ /** @type {GenerateurChauffage} */
404
+ const generateurChauffage = {
405
+ donnee_entree: { enum_methode_saisie_carac_sys_id: 5, presence_ventouse: 1 },
406
+ donnee_utilisateur: {
407
+ ratio_virtualisation: 1,
408
+ typeGenerateur: TypeGenerateur.CHAUDIERE,
409
+ generateur: {
410
+ qp0_perc: 'Pn * (E + F * logPn) / 100',
411
+ rpn: '84 + 2 logPn',
412
+ rpint: '80 + 3 logPn',
413
+ pveil: 250
414
+ }
415
+ },
416
+ donnee_intermediaire: {
417
+ rpn: 0.95,
418
+ rpint: 0.68,
419
+ qp0: 125,
420
+ pn: 15000,
421
+ temp_fonc_30: 18,
422
+ temp_fonc_100: 25
423
+ }
424
+ };
425
+
426
+ /** @type {EmetteurChauffage[]} */
427
+ const emetteursChauffage = [
428
+ {
429
+ donnee_entree: { surface_chauffee: 80 },
430
+ donnee_intermediaire: { rendement_emission: 0.86 }
431
+ }
432
+ ];
433
+
434
+ /** @type {Contexte} */
435
+ const contexte = { altitude: { id: 1 }, zoneClimatique: { id: 1 } };
436
+
437
+ expect(
438
+ service.caracteristiques(contexte, generateurChauffage, emetteursChauffage)
439
+ ).toStrictEqual({
440
+ pveil: 250,
441
+ qp0: 125,
442
+ rpint: 0.68,
443
+ rpn: 0.95,
444
+ temp_fonc_100: 25,
445
+ temp_fonc_30: 18
446
+ });
447
+ });
448
+
449
+ describe('Détermination des caractéristiques du générateur', () => {
450
+ let generateurChauffage;
451
+ let installationChauffage;
452
+ let logement;
453
+ let ctx;
454
+
455
+ beforeEach(() => {
456
+ vi.spyOn(chTvStore, 'getCombustionGenerateurs').mockReturnValue([1, 76]);
457
+ vi.spyOn(chTvStore, 'getPacGenerateurs').mockReturnValue([2]);
458
+ vi.spyOn(chTvStore, 'getGenerateurCombustion').mockReturnValue({});
459
+
460
+ /** @type {GenerateurChauffage} */
461
+ generateurChauffage = {
462
+ donnee_entree: {
463
+ enum_methode_saisie_carac_sys_id: 4,
464
+ enum_type_generateur_ch_id: 3,
465
+ presence_ventouse: 1
466
+ },
467
+ donnee_intermediaire: {
468
+ rpn: 0.95,
469
+ rpint: 0.68,
470
+ qp0: 125,
471
+ pn: 15000,
472
+ temp_fonc_30: 25,
473
+ temp_fonc_100: 36
474
+ }
475
+ };
476
+
477
+ installationChauffage = {
478
+ donnee_entree: { ratio_virtualisation: 0.8 },
479
+ generateur_chauffage_collection: {
480
+ generateur_chauffage: [generateurChauffage]
481
+ }
482
+ };
483
+
484
+ /** @type {Logement} */
485
+ logement = {
486
+ installation_chauffage_collection: { installation_chauffage: [installationChauffage] }
487
+ };
488
+
489
+ /** @type {Contexte} */
490
+ ctx = {
491
+ zoneClimatique: { id: 1 }
492
+ };
493
+ });
494
+
495
+ test('Générateur autre que combustion ou chaudière', () => {
496
+ service.execute(ctx, logement, installationChauffage);
497
+ expect(chTvStore.getGenerateurCombustion).not.toHaveBeenCalled();
498
+ expect(
499
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0]
500
+ .donnee_utilisateur
501
+ ).toStrictEqual({
502
+ combustion: false,
503
+ pac: false,
504
+ ratio_virtualisation: 0.8,
505
+ typeGenerateur: TypeGenerateur.OTHER
506
+ });
507
+ });
508
+
509
+ test('Détermination des caractéristiques du générateur à combustion', () => {
510
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0].donnee_entree.enum_type_generateur_ch_id = 1;
511
+ service.execute(ctx, logement, installationChauffage);
512
+ expect(chTvStore.getGenerateurCombustion).toHaveBeenCalledWith(1, 18.75);
513
+ expect(
514
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0]
515
+ .donnee_utilisateur
516
+ ).toStrictEqual({
517
+ combustion: true,
518
+ pac: false,
519
+ generateur: {},
520
+ ratio_virtualisation: 0.8,
521
+ typeGenerateur: TypeGenerateur.OTHER
522
+ });
523
+ expect(
524
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0]
525
+ .donnee_intermediaire
526
+ ).toStrictEqual({
527
+ pn: 15000,
528
+ pveil: 0,
529
+ qp0: 125,
530
+ rpint: 0.68,
531
+ rpn: 0.95,
532
+ temp_fonc_100: 36,
533
+ temp_fonc_30: 25
534
+ });
535
+ });
536
+
537
+ test('Détermination des caractéristiques du générateur à combustion de type chaudière', () => {
538
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0].donnee_entree.enum_type_generateur_ch_id = 76;
539
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0].donnee_entree.enum_methode_saisie_carac_sys_id = 5;
540
+ service.execute(ctx, logement, installationChauffage);
541
+ expect(
542
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0]
543
+ .donnee_utilisateur
544
+ ).toStrictEqual({
545
+ combustion: true,
546
+ pac: false,
547
+ generateur: {},
548
+ ratio_virtualisation: 0.8,
549
+ typeGenerateur: TypeGenerateur.CHAUDIERE
550
+ });
551
+ expect(
552
+ installationChauffage.generateur_chauffage_collection.generateur_chauffage[0]
553
+ .donnee_intermediaire
554
+ ).toStrictEqual({
555
+ pn: 15000,
556
+ pveil: 0,
557
+ qp0: 125,
558
+ rpint: 0.68,
559
+ rpn: 0.95,
560
+ temp_fonc_100: 36,
561
+ temp_fonc_30: 25
562
+ });
563
+ });
564
+ });
565
+
566
+ describe("Test d'intégration des installations de chauffage", () => {
567
+ test.each(corpus)('vérification des DI qp0 des installations CH pour dpe %s', (ademeId) => {
568
+ let dpeRequest = getAdemeFileJson(ademeId);
569
+ dpeRequest = normalizerService.normalize(dpeRequest);
570
+
571
+ const installationsCh = structuredClone(
572
+ dpeRequest.logement.installation_chauffage_collection?.installation_chauffage || []
573
+ );
574
+
575
+ /** @type {Contexte} */
576
+ const ctx = contexteBuilder.fromDpe(dpeRequest);
577
+
578
+ installationsCh.forEach((installationCh, i) => {
579
+ service.execute(ctx, dpeRequest.logement, installationCh);
580
+
581
+ installationCh.generateur_chauffage_collection?.generateur_chauffage.forEach(
582
+ (generateurChauffage, j) => {
583
+ const expectedQp0 =
584
+ dpeRequest.logement.installation_chauffage_collection.installation_chauffage[i]
585
+ .generateur_chauffage_collection.generateur_chauffage[j].donnee_intermediaire.qp0;
586
+
587
+ if (expectedQp0) {
588
+ expect(generateurChauffage.donnee_intermediaire.qp0).toBeCloseTo(expectedQp0, 2);
589
+ } else {
590
+ expect(generateurChauffage.donnee_intermediaire.qp0).toBeUndefined();
591
+ }
592
+ }
593
+ );
594
+ });
595
+ });
596
+
597
+ test.each(corpus)('vérification des DI rpn des installations CH pour dpe %s', (ademeId) => {
598
+ let dpeRequest = getAdemeFileJson(ademeId);
599
+ dpeRequest = normalizerService.normalize(dpeRequest);
600
+
601
+ const installationsCh = structuredClone(
602
+ dpeRequest.logement.installation_chauffage_collection?.installation_chauffage || []
603
+ );
604
+
605
+ /** @type {Contexte} */
606
+ const ctx = contexteBuilder.fromDpe(dpeRequest);
607
+
608
+ installationsCh.forEach((installationCh, i) => {
609
+ service.execute(ctx, dpeRequest.logement, installationCh);
610
+
611
+ installationCh.generateur_chauffage_collection?.generateur_chauffage.forEach(
612
+ (generateurChauffage, j) => {
613
+ const expectedRpn =
614
+ dpeRequest.logement.installation_chauffage_collection.installation_chauffage[i]
615
+ .generateur_chauffage_collection.generateur_chauffage[j].donnee_intermediaire.rpn;
616
+
617
+ if (expectedRpn) {
618
+ expect(generateurChauffage.donnee_intermediaire.rpn).toBeCloseTo(expectedRpn, 2);
619
+ } else {
620
+ expect(generateurChauffage.donnee_intermediaire.rpn).toBeUndefined();
621
+ }
622
+ }
623
+ );
624
+ });
625
+ });
626
+
627
+ test.each(corpus)('vérification des DI rpint des installations CH pour dpe %s', (ademeId) => {
628
+ let dpeRequest = getAdemeFileJson(ademeId);
629
+ dpeRequest = normalizerService.normalize(dpeRequest);
630
+
631
+ const installationsCh = structuredClone(
632
+ dpeRequest.logement.installation_chauffage_collection?.installation_chauffage || []
633
+ );
634
+
635
+ /** @type {Contexte} */
636
+ const ctx = contexteBuilder.fromDpe(dpeRequest);
637
+
638
+ installationsCh.forEach((installationCh, i) => {
639
+ service.execute(ctx, dpeRequest.logement, installationCh);
640
+
641
+ installationCh.generateur_chauffage_collection?.generateur_chauffage.forEach(
642
+ (generateurChauffage, j) => {
643
+ const expectedRpint =
644
+ dpeRequest.logement.installation_chauffage_collection.installation_chauffage[i]
645
+ .generateur_chauffage_collection.generateur_chauffage[j].donnee_intermediaire.rpint;
646
+
647
+ if (expectedRpint) {
648
+ expect(generateurChauffage.donnee_intermediaire.rpint).toBeCloseTo(expectedRpint, 2);
649
+ } else {
650
+ expect(generateurChauffage.donnee_intermediaire.rpint).toBeUndefined();
651
+ }
652
+ }
653
+ );
654
+ });
655
+ });
656
+
657
+ test.each(corpus)(
658
+ 'vérification des DI temp_fonc_30 des installations CH pour dpe %s',
659
+ (ademeId) => {
660
+ let dpeRequest = getAdemeFileJson(ademeId);
661
+ dpeRequest = normalizerService.normalize(dpeRequest);
662
+ console.log(ademeId);
663
+ const installationsCh = structuredClone(
664
+ dpeRequest.logement.installation_chauffage_collection?.installation_chauffage || []
665
+ );
666
+
667
+ /** @type {Contexte} */
668
+ const ctx = contexteBuilder.fromDpe(dpeRequest);
669
+
670
+ installationsCh.forEach((installationCh, i) => {
671
+ service.execute(ctx, dpeRequest.logement, installationCh);
672
+
673
+ installationCh.generateur_chauffage_collection?.generateur_chauffage.forEach(
674
+ (generateurChauffage, j) => {
675
+ const expectedTempFonct30 =
676
+ dpeRequest.logement.installation_chauffage_collection.installation_chauffage[i]
677
+ .generateur_chauffage_collection.generateur_chauffage[j].donnee_intermediaire
678
+ .temp_fonc_30;
679
+
680
+ console.log(expectedTempFonct30);
681
+ console.log(generateurChauffage.donnee_intermediaire.temp_fonc_30);
682
+
683
+ if (expectedTempFonct30) {
684
+ expect(generateurChauffage.donnee_intermediaire.temp_fonc_30).toBeCloseTo(
685
+ expectedTempFonct30,
686
+ 2
687
+ );
688
+ } else {
689
+ expect(generateurChauffage.donnee_intermediaire.temp_fonc_30).toBeUndefined();
690
+ }
691
+ }
692
+ );
693
+ });
694
+ }
695
+ );
696
+
697
+ test.each(corpus)(
698
+ 'vérification des DI temp_fonc_100 des installations CH pour dpe %s',
699
+ (ademeId) => {
700
+ let dpeRequest = getAdemeFileJson(ademeId);
701
+ dpeRequest = normalizerService.normalize(dpeRequest);
702
+
703
+ const installationsCh = structuredClone(
704
+ dpeRequest.logement.installation_chauffage_collection?.installation_chauffage || []
705
+ );
706
+
707
+ /** @type {Contexte} */
708
+ const ctx = contexteBuilder.fromDpe(dpeRequest);
709
+
710
+ installationsCh.forEach((installationCh, i) => {
711
+ service.execute(ctx, dpeRequest.logement, installationCh);
712
+
713
+ installationCh.generateur_chauffage_collection?.generateur_chauffage.forEach(
714
+ (generateurChauffage, j) => {
715
+ const expectedTempFonct100 =
716
+ dpeRequest.logement.installation_chauffage_collection.installation_chauffage[i]
717
+ .generateur_chauffage_collection.generateur_chauffage[j].donnee_intermediaire
718
+ .temp_fonc_100;
719
+
720
+ if (expectedTempFonct100) {
721
+ expect(generateurChauffage.donnee_intermediaire.temp_fonc_100).toBeCloseTo(
722
+ expectedTempFonct100,
723
+ 2
724
+ );
725
+ } else {
726
+ expect(generateurChauffage.donnee_intermediaire.temp_fonc_100).toBeUndefined();
727
+ }
728
+ }
729
+ );
730
+ });
731
+ }
732
+ );
733
+ });
734
+ });