@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,411 +0,0 @@
1
- import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
2
- import { ContexteBuilder } from '../../contexte.builder.js';
3
- import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js';
4
- import { DeperditionPlancherHautService } from './deperdition-plancher-haut.service.js';
5
- import corpus from '../../../../../../test/corpus-sano.json';
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 {DeperditionPlancherHautService} **/
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 haut', () => {
20
- beforeEach(() => {
21
- service = new DeperditionPlancherHautService(new TvStore());
22
- normalizerService = new DpeNormalizerService();
23
- contexteBuilder = new ContexteBuilder();
24
- });
25
-
26
- describe('Determination de uph, uph0 et uph_final', () => {
27
- test('(2187E1039187C) Plafond 2 : plafond bois sous solives bois', () => {
28
- /** @type {Contexte} */
29
- const ctx = {
30
- effetJoule: false,
31
- enumPeriodeConstructionId: '2',
32
- zoneClimatique: {
33
- id: '3'
34
- }
35
- };
36
- /** @type {PlancherHautDE} */
37
- const de = {
38
- enum_type_adjacence_id: '1',
39
- enum_type_plancher_haut_id: '10',
40
- enum_methode_saisie_u0_id: '2',
41
- enum_type_isolation_id: '9',
42
- enum_periode_isolation_id: '3',
43
- enum_methode_saisie_u_id: '8'
44
- };
45
-
46
- const di = service.execute(ctx, de);
47
- expect(di.uph0).toBeCloseTo(2.3);
48
- expect(di.uph).toBeCloseTo(0.75);
49
- });
50
-
51
- test("(2287E0224445X) Plafond 2 - Plafond structure inconnu (sous combles perdus) donnant sur l'extérieur (combles aménagés) avec isolation intérieure (réalisée entre 1989 et 2000)", () => {
52
- /** @type {Contexte} */
53
- const ctx = {
54
- effetJoule: false,
55
- enumPeriodeConstructionId: '1',
56
- zoneClimatique: {
57
- id: '3'
58
- }
59
- };
60
- /** @type {PlancherHautDE} */
61
- const de = {
62
- enum_type_adjacence_id: '1', // extérieur
63
- enum_type_plancher_haut_id: '1', // inconnu
64
- enum_methode_saisie_u0_id: '2', // déterminé selon le matériau et épaisseur à partir de la table de valeur forfaitaire
65
- enum_type_isolation_id: '3', // iti
66
- enum_periode_isolation_id: '6', // 1989-2000
67
- enum_methode_saisie_u_id: '7' // année d'isolation différente de l'année de construction saisie justifiée (table forfaitaire)
68
- };
69
-
70
- const di = service.execute(ctx, de);
71
- expect(di.uph0).toBeCloseTo(2.5);
72
- expect(di.uph).toBeCloseTo(0.4); // Dans le DPE d'origine, uph (0.25) est pris dans la partie "comble" et pas "terrasse" alors que le local donne sur l'extérieur
73
- expect(di.b).toBeCloseTo(1);
74
- });
75
-
76
- test("(2387E0562437Q) Plafond 2 - Plafond structure inconnu (sous combles perdus) donnant sur l'extérieur (combles aménagés) avec isolation intérieure (réalisée entre 1989 et 2000)", () => {
77
- /** @type {Contexte} */
78
- const ctx = {
79
- effetJoule: true,
80
- enumPeriodeConstructionId: '1',
81
- zoneClimatique: {
82
- id: '3'
83
- }
84
- };
85
- /** @type {PlancherHautDE} */
86
- const de = {
87
- enum_type_adjacence_id: '1', // extérieur
88
- enum_type_plancher_haut_id: '1', // inconnu
89
- enum_methode_saisie_u0_id: '2', // déterminé selon le matériau et épaisseur à partir de la table de valeur forfaitaire
90
- enum_type_isolation_id: '3', // iti
91
- enum_periode_isolation_id: '8', // 2006-2012
92
- enum_methode_saisie_u_id: '7' // année d'isolation différente de l'année de construction saisie justifiée (table forfaitaire)
93
- };
94
-
95
- const di = service.execute(ctx, de);
96
- expect(di.uph0).toBeCloseTo(2.5);
97
- expect(di.uph).toBeCloseTo(0.27); // Dans le DPE d'origine, uph (0.2) est pris dans la partie "comble" et pas "terrasse" alors que le local donne sur l'extérieur
98
- expect(di.b).toBeCloseTo(1);
99
- });
100
-
101
- test("(2287E0272588O) Plafond - Combles aménagés sous rampants donnant sur l'extérieur (combles aménagés) avec isolation intérieure (réalisée entre 1975 et 1977)", () => {
102
- /** @type {Contexte} */
103
- const ctx = {
104
- effetJoule: true,
105
- enumPeriodeConstructionId: '1',
106
- zoneClimatique: {
107
- id: '3'
108
- }
109
- };
110
- /** @type {PlancherHautDE} */
111
- const de = {
112
- enum_type_adjacence_id: '1', // extérieur
113
- enum_type_plancher_haut_id: '12', // combles aménagés sous rampant
114
- enum_methode_saisie_u0_id: '2', // déterminé selon le matériau et épaisseur à partir de la table de valeur forfaitaire
115
- enum_type_isolation_id: '3', // iti
116
- enum_periode_isolation_id: '3', // 1975-1977
117
- enum_methode_saisie_u_id: '7' // année d'isolation différente de l'année de construction saisie justifiée (table forfaitaire)
118
- };
119
-
120
- const di = service.execute(ctx, de);
121
- expect(di.uph0).toBeCloseTo(2.5);
122
- expect(di.uph).toBeCloseTo(0.5);
123
- expect(di.b).toBeCloseTo(1);
124
- });
125
-
126
- test('Test de plancher avec uph directement saisie', () => {
127
- /** @type {Contexte} */
128
- const ctx = {
129
- effetJoule: false,
130
- enumPeriodeConstructionId: '6',
131
- zoneClimatique: {
132
- id: '3'
133
- }
134
- };
135
- /** @type {PlancherHautDE} */
136
- const de = {
137
- enum_type_adjacence_id: '21',
138
- enum_type_plancher_haut_id: '1',
139
- enum_methode_saisie_u0_id: '5',
140
- enum_type_isolation_id: '2',
141
- enum_methode_saisie_u_id: '9',
142
- uph_saisi: 1.25
143
- };
144
-
145
- const di = service.execute(ctx, de);
146
- expect(di.uph).toBeCloseTo(1.25);
147
- expect(di.uph0).toBeUndefined();
148
- });
149
-
150
- test('Test de plancher avec uph0 directement saisie', () => {
151
- /** @type {Contexte} */
152
- const ctx = {
153
- effetJoule: false,
154
- enumPeriodeConstructionId: '6',
155
- zoneClimatique: {
156
- id: '3'
157
- }
158
- };
159
- /** @type {PlancherHautDE} */
160
- const de = {
161
- enum_type_adjacence_id: '21',
162
- enum_type_plancher_haut_id: '1',
163
- enum_methode_saisie_u0_id: '3',
164
- enum_type_isolation_id: '2',
165
- enum_periode_isolation_id: '3',
166
- enum_methode_saisie_u_id: '7',
167
- uph0_saisi: 1.25
168
- };
169
-
170
- const di = service.execute(ctx, de);
171
- expect(di.uph0).toBeCloseTo(1.25);
172
- expect(di.uph).toBeCloseTo(0.5);
173
- });
174
-
175
- test('Test de plancher avec uph0 type de paroi inconnu (valeur par défaut)', () => {
176
- /** @type {Contexte} */
177
- const ctx = {
178
- effetJoule: false,
179
- enumPeriodeConstructionId: '6',
180
- zoneClimatique: {
181
- id: '3'
182
- }
183
- };
184
- /** @type {PlancherHautDE} */
185
- const de = {
186
- enum_type_adjacence_id: '1',
187
- enum_type_plancher_haut_id: '1',
188
- enum_methode_saisie_u0_id: '1',
189
- enum_type_isolation_id: '1',
190
- enum_methode_saisie_u_id: '7'
191
- };
192
-
193
- const di = service.execute(ctx, de);
194
- expect(di.uph0).toBeCloseTo(2.5);
195
- expect(di.uph).toBeCloseTo(0.4);
196
- });
197
-
198
- test('Plancher non isolé (méthode 1) : uph vaut uph_nu', () => {
199
- /** @type {Contexte} */
200
- const ctx = {
201
- effetJoule: false,
202
- enumPeriodeConstructionId: '2',
203
- zoneClimatique: { id: '3' }
204
- };
205
- /** @type {PlancherHautDE} */
206
- const de = {
207
- enum_type_adjacence_id: '1',
208
- enum_type_plancher_haut_id: '10',
209
- enum_methode_saisie_u0_id: '2',
210
- enum_type_isolation_id: '2',
211
- enum_methode_saisie_u_id: '1'
212
- };
213
-
214
- const di = service.execute(ctx, de);
215
- expect(di.uph0).toBeCloseTo(2.3);
216
- expect(di.uph).toBeCloseTo(2.3);
217
- });
218
-
219
- test("Épaisseur d'isolation saisie (méthode 4) : uph calculé à partir de l'épaisseur", () => {
220
- /** @type {Contexte} */
221
- const ctx = {
222
- effetJoule: false,
223
- enumPeriodeConstructionId: '2',
224
- zoneClimatique: { id: '3' }
225
- };
226
- /** @type {PlancherHautDE} */
227
- const de = {
228
- enum_type_adjacence_id: '1',
229
- enum_type_plancher_haut_id: '10',
230
- enum_methode_saisie_u0_id: '2',
231
- enum_type_isolation_id: '3',
232
- enum_methode_saisie_u_id: '4',
233
- epaisseur_isolation: 10
234
- };
235
-
236
- const di = service.execute(ctx, de);
237
- expect(di.uph0).toBeCloseTo(2.3);
238
- // 1 / (1 / 2.3 + (10 * 0.01) / 0.04) => valeur de référence de régression
239
- expect(di.uph).toBeCloseTo(0.34074);
240
- });
241
-
242
- test("Résistance d'isolation saisie (méthode 6) : uph calculé à partir de la résistance", () => {
243
- /** @type {Contexte} */
244
- const ctx = {
245
- effetJoule: false,
246
- enumPeriodeConstructionId: '2',
247
- zoneClimatique: { id: '3' }
248
- };
249
- /** @type {PlancherHautDE} */
250
- const de = {
251
- enum_type_adjacence_id: '1',
252
- enum_type_plancher_haut_id: '10',
253
- enum_methode_saisie_u0_id: '2',
254
- enum_type_isolation_id: '3',
255
- enum_methode_saisie_u_id: '6',
256
- resistance_isolation: 2.5
257
- };
258
-
259
- const di = service.execute(ctx, de);
260
- expect(di.uph0).toBeCloseTo(2.3);
261
- // 1 / (1 / 2.3 + 2.5) => valeur de référence de régression
262
- expect(di.uph).toBeCloseTo(0.34074);
263
- });
264
-
265
- test.each([
266
- // Isolation inconnue via table forfaitaire (méthode 2) et variantes épaisseur/résistance.
267
- { enumMethodeSaisieUId: '2', uphExpected: 0.75 },
268
- { enumMethodeSaisieUId: '3', epaisseurIsolation: 10, uphExpected: 0.34074 },
269
- { enumMethodeSaisieUId: '5', resistanceIsolation: 2.5, uphExpected: 0.34074 }
270
- ])(
271
- 'uph pour la méthode de saisie $enumMethodeSaisieUId',
272
- ({ enumMethodeSaisieUId, epaisseurIsolation, resistanceIsolation, uphExpected }) => {
273
- /** @type {Contexte} */
274
- const ctx = {
275
- effetJoule: false,
276
- enumPeriodeConstructionId: '2',
277
- zoneClimatique: { id: '3' }
278
- };
279
- /** @type {PlancherHautDE} */
280
- const de = {
281
- enum_type_adjacence_id: '1',
282
- enum_type_plancher_haut_id: '10',
283
- enum_methode_saisie_u0_id: '2',
284
- enum_type_isolation_id: '3',
285
- enum_periode_isolation_id: '3',
286
- enum_methode_saisie_u_id: enumMethodeSaisieUId,
287
- epaisseur_isolation: epaisseurIsolation,
288
- resistance_isolation: resistanceIsolation
289
- };
290
-
291
- const di = service.execute(ctx, de);
292
- expect(di.uph0).toBeCloseTo(2.3);
293
- // Valeurs de référence de régression
294
- expect(di.uph).toBeCloseTo(uphExpected);
295
- }
296
- );
297
-
298
- test("Adjacence 'locaux non chauffés non accessible' (7) : uph_tab pris en catégorie terrasse", () => {
299
- // @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.3.1
300
- /** @type {Contexte} */
301
- const ctx = {
302
- effetJoule: false,
303
- enumPeriodeConstructionId: '2',
304
- zoneClimatique: { id: '3' }
305
- };
306
- /** @type {PlancherHautDE} */
307
- const de = {
308
- enum_type_adjacence_id: '7',
309
- enum_type_plancher_haut_id: '1',
310
- enum_methode_saisie_u0_id: '2',
311
- enum_type_isolation_id: '3',
312
- enum_periode_isolation_id: '6',
313
- enum_methode_saisie_u_id: '8'
314
- };
315
-
316
- const di = service.execute(ctx, de);
317
- expect(di.uph0).toBeCloseTo(2.5);
318
- // Valeur de référence de régression (catégorie terrasse)
319
- expect(di.uph).toBeCloseTo(0.4);
320
- });
321
- });
322
-
323
- test.each([
324
- {
325
- label: 'plafond avec isolation inconnue et période isolation 1974',
326
- enumTypeIsolationId: 1,
327
- enumPeriodIsolationId: 1,
328
- enumPeriodeConstructionId: undefined,
329
- typeIsolationExpected: 2
330
- },
331
- {
332
- label: 'plafond avec isolation inconnue et période construction 1974',
333
- enumTypeIsolationId: 1,
334
- enumPeriodIsolationId: undefined,
335
- enumPeriodeConstructionId: 1,
336
- typeIsolationExpected: 2
337
- },
338
- {
339
- label: 'plafond avec isolation inconnue et période isolation 1975',
340
- enumTypeIsolationId: 1,
341
- enumPeriodIsolationId: 3,
342
- enumPeriodeConstructionId: undefined,
343
- typeIsolationExpected: 4
344
- },
345
- {
346
- label: 'plafond avec isolation de type "isolé mais type d\'isolation inconnu"',
347
- enumTypeIsolationId: 9,
348
- enumPeriodIsolationId: 1,
349
- enumPeriodeConstructionId: undefined,
350
- typeIsolationExpected: 4
351
- },
352
- {
353
- label: 'plafond avec isolation iti+ite',
354
- enumTypeIsolationId: 6,
355
- enumPeriodIsolationId: 1,
356
- enumPeriodeConstructionId: undefined,
357
- typeIsolationExpected: 6
358
- }
359
- ])(
360
- "Récupération du type d'isolation pour $label",
361
- ({
362
- enumTypeIsolationId,
363
- enumPeriodIsolationId = undefined,
364
- enumPeriodeConstructionId = undefined,
365
- typeIsolationExpected
366
- }) => {
367
- /**
368
- * @type {PlancherHautDE}
369
- */
370
- let plancherHautDE = {
371
- enum_type_isolation_id: enumTypeIsolationId,
372
- enum_periode_isolation_id: enumPeriodIsolationId
373
- };
374
-
375
- /**
376
- * @type {Contexte}
377
- */
378
- const ctx = { enumPeriodeConstructionId };
379
-
380
- expect(service.typeIsolation(ctx, plancherHautDE)).toBe(typeIsolationExpected);
381
- }
382
- );
383
-
384
- describeIntegration("Test d'intégration de plancher haut", () => {
385
- test.each(corpus)('vérification des DI des ph pour dpe %s', (ademeId) => {
386
- /**
387
- * @type {Dpe}
388
- */
389
- let dpeRequest = getAdemeFileJson(ademeId);
390
- dpeRequest = normalizerService.normalize(dpeRequest);
391
-
392
- /** @type {Contexte} */
393
- const ctx = contexteBuilder.fromDpe(dpeRequest);
394
-
395
- /** @type {PlancherHaut[]} */
396
- const phs = dpeRequest.logement.enveloppe.plancher_haut_collection?.plancher_haut || [];
397
-
398
- phs.forEach((ph) => {
399
- const di = service.execute(ctx, ph.donnee_entree);
400
-
401
- if (ph.donnee_intermediaire) {
402
- expect(di.uph0).toBeCloseTo(ph.donnee_intermediaire.uph0, 2);
403
- } else {
404
- expect(di.uph0).toBeUndefined();
405
- }
406
- expect(di.uph).toBeCloseTo(ph.donnee_intermediaire.uph, 2);
407
- expect(di.b).toBeCloseTo(ph.donnee_intermediaire.b, 2);
408
- });
409
- });
410
- });
411
- });