@open3cl/engine 1.0.13 → 1.0.15
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/13.2_generateur_combustion_ch.js +1 -1
- package/features/dpe/domain/models/climatisation.model.ts +1 -0
- package/features/dpe/domain/models/installation-chauffage.model.ts +24 -0
- package/features/dpe/domain/models/type-generateur.model.js +8 -0
- package/features/dpe/infrastructure/ch/chTv.store.js +94 -0
- package/features/dpe/infrastructure/ch/chTv.store.spec.js +99 -0
- package/features/dpe/infrastructure/ecs/ecsTv.store.js +5 -3
- package/features/dpe/infrastructure/ecs/ecsTv.store.spec.js +4 -0
- package/features/dpe/infrastructure/froid/frTv.store.js +27 -0
- package/features/dpe/infrastructure/froid/frTv.store.spec.js +22 -0
- package/features/dpe/infrastructure/tv.store.js +28 -0
- package/features/dpe/infrastructure/tv.store.spec.js +12 -0
- package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.js +14 -0
- package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +14 -0
- package/features/engine/domain/ch/emetteur-ch.service.js +100 -0
- package/features/engine/domain/ch/emetteur-ch.service.spec.js +78 -0
- package/features/engine/domain/ch/generateur-ch.service.js +365 -0
- package/features/engine/domain/ch/generateur-ch.service.spec.js +734 -0
- package/features/engine/domain/ch/installation-ch.service.js +39 -0
- package/features/engine/domain/ch/installation-ch.service.spec.js +41 -0
- package/features/engine/domain/conso/conso.service.js +26 -0
- package/features/engine/domain/conso/conso.service.spec.js +29 -0
- package/features/engine/domain/conso/froid/conso-froid.service.js +94 -0
- package/features/engine/domain/conso/froid/conso-froid.service.spec.js +152 -0
- package/features/engine/domain/contexte.builder.js +1 -0
- package/features/engine/domain/contexte.builder.spec.js +2 -0
- package/features/engine/domain/ecs/generateur-ecs.service.js +2 -2
- package/features/engine/domain/engine.service.js +10 -0
- package/features/engine/domain/models/contexte.model.ts +1 -0
- package/package.json +1 -1
|
@@ -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
|
+
});
|