@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,430 +0,0 @@
1
- import corpus from '../../../../../../test/corpus-sano.json';
2
- import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
3
- import { ContexteBuilder } from '../../contexte.builder.js';
4
- import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js';
5
- import { DeperditionPlancherBasService } from './deperdition-plancher-bas.service.js';
6
- import { TvStore } from '../../../../dpe/infrastructure/tv.store.js';
7
- import { beforeEach, describe, expect, test } from 'vitest';
8
- import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
9
-
10
- /** @type {DeperditionPlancherBasService} **/
11
- let service;
12
-
13
- /** @type {DpeNormalizerService} **/
14
- let normalizerService;
15
-
16
- /** @type {ContexteBuilder} **/
17
- let contexteBuilder;
18
-
19
- describe('Calcul de déperdition des planchers bas', () => {
20
- beforeEach(() => {
21
- service = new DeperditionPlancherBasService(new TvStore());
22
- normalizerService = new DpeNormalizerService();
23
- contexteBuilder = new ContexteBuilder();
24
- });
25
-
26
- describe('Determination de upb, upb0 et upb_final', () => {
27
- test('Plancher 1 - Dalle béton non isolée donnant sur un terre-plein', () => {
28
- /** @type {Contexte} */
29
- const ctx = {
30
- effetJoule: false,
31
- enumPeriodeConstructionId: '6',
32
- zoneClimatique: {
33
- id: '3'
34
- }
35
- };
36
- /** @type {PlancherBasDE} */
37
- const de = {
38
- enum_type_adjacence_id: '5',
39
- enum_type_plancher_bas_id: '9',
40
- enum_methode_saisie_u0_id: '2',
41
- enum_type_isolation_id: '2',
42
- enum_methode_saisie_u_id: '1',
43
- calcul_ue: 1,
44
- perimetre_ue: 19.2,
45
- ue: 0.49684211
46
- };
47
-
48
- const di = service.execute(ctx, de, []);
49
- expect(di.upb).toBeCloseTo(2);
50
- expect(di.upb0).toBeCloseTo(2);
51
- expect(di.upb_final).toBeCloseTo(0.49684211);
52
- });
53
-
54
- test('Plancher 1 - Plancher lourd type entrevous terre-cuite, poutrelles béton donnant sur un sous-sol non chauffé avec isolation intrinsèque ou en sous-face (5 cm)', () => {
55
- /** @type {Contexte} */
56
- const ctx = {
57
- effetJoule: false,
58
- enumPeriodeConstructionId: '6',
59
- zoneClimatique: {
60
- id: '3'
61
- }
62
- };
63
- /** @type {PlancherBasDE} */
64
- const de = {
65
- enum_type_adjacence_id: '6',
66
- enum_type_plancher_bas_id: '11',
67
- enum_methode_saisie_u0_id: '2',
68
- enum_type_isolation_id: '4',
69
- epaisseur_isolation: 5,
70
- enum_methode_saisie_u_id: '3',
71
- calcul_ue: 0,
72
- perimetre_ue: 27,
73
- surface_ue: 42.08,
74
- ue: 0.37117494
75
- };
76
-
77
- const di = service.execute(ctx, de, [{ donnee_entree: de }]);
78
- expect(di.upb).toBeCloseTo(0.59154929577464788);
79
- expect(di.upb0).toBeCloseTo(2);
80
- expect(di.upb_final).toBeCloseTo(0.37117494);
81
- });
82
-
83
- test('Plancher 2 - Plancher avec ou sans remplissage non isolé donnant sur un garage', () => {
84
- /** @type {Contexte} */
85
- const ctx = {
86
- effetJoule: false,
87
- enumPeriodeConstructionId: '6',
88
- zoneClimatique: {
89
- id: '3'
90
- }
91
- };
92
- /** @type {PlancherBasDE} */
93
- const de = {
94
- enum_type_adjacence_id: '21',
95
- enum_type_plancher_bas_id: '2',
96
- enum_methode_saisie_u0_id: '2',
97
- enum_type_isolation_id: '2',
98
- enum_methode_saisie_u_id: '1',
99
- calcul_ue: 0
100
- };
101
-
102
- const di = service.execute(ctx, de, []);
103
- expect(di.upb).toBeCloseTo(1.45);
104
- expect(di.upb0).toBeCloseTo(1.45);
105
- expect(di.upb_final).toBeCloseTo(1.45);
106
- });
107
-
108
- test('Test de plancher avec upb0 saisie', () => {
109
- /** @type {Contexte} */
110
- const ctx = {
111
- effetJoule: false,
112
- enumPeriodeConstructionId: '6',
113
- zoneClimatique: {
114
- id: '3'
115
- }
116
- };
117
- /** @type {PlancherBasDE} */
118
- const de = {
119
- enum_type_adjacence_id: '21',
120
- enum_type_plancher_bas_id: '2',
121
- enum_methode_saisie_u0_id: '9',
122
- enum_type_isolation_id: '2',
123
- enum_methode_saisie_u_id: '1',
124
- calcul_ue: 0,
125
- upb0_saisi: 3.2
126
- };
127
-
128
- const di = service.execute(ctx, de, []);
129
- expect(di.upb).toBeCloseTo(2);
130
- expect(di.upb0).toBeCloseTo(3.2);
131
- expect(di.upb_final).toBeCloseTo(2);
132
- });
133
-
134
- test('Test de plancher avec type de paroi inconnue', () => {
135
- /** @type {Contexte} */
136
- const ctx = {
137
- effetJoule: false,
138
- enumPeriodeConstructionId: '6',
139
- zoneClimatique: {
140
- id: '3'
141
- }
142
- };
143
- /** @type {PlancherBasDE} */
144
- const de = {
145
- enum_type_adjacence_id: '21',
146
- enum_type_plancher_bas_id: '1',
147
- enum_methode_saisie_u0_id: '1',
148
- enum_type_isolation_id: '2',
149
- enum_methode_saisie_u_id: '1',
150
- calcul_ue: 0
151
- };
152
-
153
- const di = service.execute(ctx, de, []);
154
- expect(di.upb).toBeCloseTo(2);
155
- expect(di.upb0).toBeCloseTo(2);
156
- expect(di.upb_final).toBeCloseTo(2);
157
- });
158
-
159
- test('Test de plancher avec upb directement saisie', () => {
160
- /** @type {Contexte} */
161
- const ctx = {
162
- effetJoule: false,
163
- enumPeriodeConstructionId: '6',
164
- zoneClimatique: {
165
- id: '3'
166
- }
167
- };
168
- /** @type {PlancherBasDE} */
169
- const de = {
170
- enum_type_adjacence_id: '21',
171
- enum_type_plancher_bas_id: '1',
172
- enum_methode_saisie_u0_id: '5',
173
- enum_type_isolation_id: '2',
174
- enum_methode_saisie_u_id: '9',
175
- calcul_ue: 0,
176
- upb_saisi: 1.25
177
- };
178
-
179
- const di = service.execute(ctx, de, []);
180
- expect(di.upb).toBeCloseTo(1.25);
181
- expect(di.upb0).toBeUndefined();
182
- expect(di.upb_final).toBeCloseTo(1.25);
183
- });
184
-
185
- test('Isolation inconnue (méthode 2) : upb plafonné par la valeur forfaitaire de la table', () => {
186
- /** @type {Contexte} */
187
- const ctx = {
188
- effetJoule: false,
189
- enumPeriodeConstructionId: '6',
190
- zoneClimatique: { id: '3' }
191
- };
192
- /** @type {PlancherBasDE} */
193
- const de = {
194
- enum_type_adjacence_id: '21',
195
- enum_type_plancher_bas_id: '2',
196
- enum_methode_saisie_u0_id: '2',
197
- enum_type_isolation_id: '3',
198
- enum_methode_saisie_u_id: '2',
199
- enum_periode_isolation_id: '6',
200
- calcul_ue: 0
201
- };
202
-
203
- const di = service.execute(ctx, de, []);
204
- expect(di.upb0).toBeCloseTo(1.45);
205
- // Valeur de référence de régression
206
- expect(di.upb).toBeCloseTo(0.5);
207
- expect(di.upb_final).toBeCloseTo(0.5);
208
- });
209
-
210
- test.each([
211
- // Méthodes 7 (année d'isolation) et 8 (année de construction) : même table forfaitaire.
212
- { enumMethodeSaisieUId: '7' },
213
- { enumMethodeSaisieUId: '8' }
214
- ])(
215
- 'upb via table forfaitaire pour la méthode de saisie $enumMethodeSaisieUId',
216
- ({ enumMethodeSaisieUId }) => {
217
- /** @type {Contexte} */
218
- const ctx = {
219
- effetJoule: false,
220
- enumPeriodeConstructionId: '6',
221
- zoneClimatique: { id: '3' }
222
- };
223
- /** @type {PlancherBasDE} */
224
- const de = {
225
- enum_type_adjacence_id: '21',
226
- enum_type_plancher_bas_id: '2',
227
- enum_methode_saisie_u0_id: '2',
228
- enum_type_isolation_id: '3',
229
- enum_methode_saisie_u_id: enumMethodeSaisieUId,
230
- enum_periode_isolation_id: '6',
231
- calcul_ue: 0
232
- };
233
-
234
- const di = service.execute(ctx, de, []);
235
- expect(di.upb0).toBeCloseTo(1.45);
236
- // Valeur de référence de régression
237
- expect(di.upb).toBeCloseTo(0.5);
238
- }
239
- );
240
-
241
- test("Résistance d'isolation saisie (méthode 6) : upb calculé à partir de la résistance", () => {
242
- /** @type {Contexte} */
243
- const ctx = {
244
- effetJoule: false,
245
- enumPeriodeConstructionId: '6',
246
- zoneClimatique: { id: '3' }
247
- };
248
- /** @type {PlancherBasDE} */
249
- const de = {
250
- enum_type_adjacence_id: '21',
251
- enum_type_plancher_bas_id: '2',
252
- enum_methode_saisie_u0_id: '2',
253
- enum_type_isolation_id: '3',
254
- enum_methode_saisie_u_id: '6',
255
- resistance_isolation: 2.5,
256
- calcul_ue: 0
257
- };
258
-
259
- const di = service.execute(ctx, de, []);
260
- expect(di.upb0).toBeCloseTo(1.45);
261
- // 1 / (1 / 1.45 + 2.5) => valeur de référence de régression
262
- expect(di.upb).toBeCloseTo(0.31351);
263
- });
264
-
265
- test("Résistance d'isolation saisie (méthode 5) : upb calculé à partir de la résistance", () => {
266
- /** @type {Contexte} */
267
- const ctx = {
268
- effetJoule: false,
269
- enumPeriodeConstructionId: '6',
270
- zoneClimatique: { id: '3' }
271
- };
272
- /** @type {PlancherBasDE} */
273
- const de = {
274
- enum_type_adjacence_id: '21',
275
- enum_type_plancher_bas_id: '2',
276
- enum_methode_saisie_u0_id: '2',
277
- enum_type_isolation_id: '3',
278
- enum_methode_saisie_u_id: '5',
279
- resistance_isolation: 2.5,
280
- calcul_ue: 0
281
- };
282
-
283
- const di = service.execute(ctx, de, []);
284
- expect(di.upb0).toBeCloseTo(1.45);
285
- // 1 / (1 / 1.45 + 2.5) => valeur de référence de régression
286
- expect(di.upb).toBeCloseTo(0.31351);
287
- });
288
-
289
- test('Calcul Ue avec repli sur surface de paroi et périmètre nul (dsp par défaut = 1)', () => {
290
- // Adjacence terre-plein, calcul_ue = 0 : le upb_final passe par la table Ue.
291
- // Le plancher n'a ni surface_ue ni perimetre_ue => on retombe sur surface_paroi_opaque
292
- // et un dsp forfaitaire de 1.
293
- /** @type {Contexte} */
294
- const ctx = {
295
- effetJoule: false,
296
- enumPeriodeConstructionId: '6',
297
- zoneClimatique: { id: '3' }
298
- };
299
- /** @type {PlancherBasDE} */
300
- const de = {
301
- enum_type_adjacence_id: '5',
302
- enum_type_plancher_bas_id: '9',
303
- enum_methode_saisie_u0_id: '2',
304
- enum_type_isolation_id: '2',
305
- enum_methode_saisie_u_id: '1',
306
- calcul_ue: 0,
307
- surface_paroi_opaque: 40
308
- };
309
-
310
- const di = service.execute(ctx, de, [{ donnee_entree: de }]);
311
- expect(di.upb0).toBeCloseTo(2);
312
- expect(di.upb).toBeCloseTo(2);
313
- // Valeur de référence de régression (Ue table, dsp = 1)
314
- expect(di.upb_final).toBeCloseTo(0.74421);
315
- });
316
- });
317
-
318
- test.each([
319
- {
320
- label:
321
- 'plancher bas avec isolation inconnue, adjacence terre-plein et période isolation 1974',
322
- enumTypeIsolationId: 1,
323
- enumTypeAdjacenceId: 5,
324
- enumPeriodIsolationId: 1,
325
- enumPeriodeConstructionId: undefined,
326
- typeIsolationExpected: 2
327
- },
328
- {
329
- label:
330
- 'plancher bas avec isolation inconnue, adjacence terre-plein et période construction 2000',
331
- enumTypeIsolationId: 1,
332
- enumTypeAdjacenceId: 5,
333
- enumPeriodIsolationId: undefined,
334
- enumPeriodeConstructionId: 6,
335
- typeIsolationExpected: 2
336
- },
337
- {
338
- label:
339
- 'plancher bas avec isolation inconnue, adjacence terre-plein et période isolation 2001',
340
- enumTypeIsolationId: 1,
341
- enumPeriodIsolationId: 7,
342
- enumTypeAdjacenceId: 5,
343
- enumPeriodeConstructionId: undefined,
344
- typeIsolationExpected: 4
345
- },
346
- {
347
- label: 'plancher bas avec isolation inconnue, adjacence garage et période isolation 1974',
348
- enumTypeIsolationId: 1,
349
- enumPeriodIsolationId: 2,
350
- enumTypeAdjacenceId: 8,
351
- enumPeriodeConstructionId: undefined,
352
- typeIsolationExpected: 2
353
- },
354
- {
355
- label: 'plancher bas avec isolation inconnue, adjacence garage et période isolation 1975',
356
- enumTypeIsolationId: 1,
357
- enumPeriodIsolationId: 3,
358
- enumTypeAdjacenceId: 8,
359
- enumPeriodeConstructionId: undefined,
360
- typeIsolationExpected: 4
361
- },
362
- {
363
- label: 'plancher bas avec isolation de type "isolé mais type d\'isolation inconnu"',
364
- enumTypeIsolationId: 9,
365
- enumPeriodIsolationId: 1,
366
- enumPeriodeConstructionId: undefined,
367
- typeIsolationExpected: 4
368
- },
369
- {
370
- label: 'plancher bas avec isolation iti+ite',
371
- enumTypeIsolationId: 6,
372
- enumPeriodIsolationId: 1,
373
- enumPeriodeConstructionId: undefined,
374
- typeIsolationExpected: 6
375
- }
376
- ])(
377
- "Récupération du type d'isolation pour $label",
378
- ({
379
- enumTypeIsolationId,
380
- enumPeriodIsolationId = undefined,
381
- enumTypeAdjacenceId = undefined,
382
- enumPeriodeConstructionId = undefined,
383
- typeIsolationExpected
384
- }) => {
385
- /**
386
- * @type {PlancherBasDE}
387
- */
388
- let plancherBasDE = {
389
- enum_type_isolation_id: enumTypeIsolationId,
390
- enum_type_adjacence_id: enumTypeAdjacenceId,
391
- enum_periode_isolation_id: enumPeriodIsolationId
392
- };
393
-
394
- /**
395
- * @type {Contexte}
396
- */
397
- const ctx = { enumPeriodeConstructionId };
398
-
399
- expect(service.typeIsolation(ctx, plancherBasDE)).toBe(typeIsolationExpected);
400
- }
401
- );
402
-
403
- describeIntegration("Test d'intégration de plancher bas", () => {
404
- test.each(corpus)('vérification des DI des pb pour dpe %s', (ademeId) => {
405
- /**
406
- * @type {Dpe}
407
- */
408
- let dpeRequest = getAdemeFileJson(ademeId);
409
- dpeRequest = normalizerService.normalize(dpeRequest);
410
-
411
- /** @type {Contexte} */
412
- const ctx = contexteBuilder.fromDpe(dpeRequest);
413
-
414
- /** @type {PlancherBas[]} */
415
- const pbs = dpeRequest.logement.enveloppe.plancher_bas_collection?.plancher_bas || [];
416
-
417
- pbs.forEach((pb) => {
418
- const di = service.execute(ctx, pb.donnee_entree, pbs);
419
-
420
- if (pb.donnee_intermediaire) {
421
- expect(di.upb0).toBeCloseTo(pb.donnee_intermediaire.upb0, 2);
422
- } else {
423
- expect(di.upb0).toBeUndefined();
424
- }
425
- expect(di.upb_final).toBeCloseTo(pb.donnee_intermediaire.upb_final, 2);
426
- expect(di.b).toBeCloseTo(pb.donnee_intermediaire.b, 2);
427
- });
428
- });
429
- });
430
- });