@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,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
- });