@open3cl/engine 1.11.3 → 1.11.4

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 (150) hide show
  1. package/10_besoin_fr.spec.js +1 -1
  2. package/10_clim.js +1 -1
  3. package/10_clim.spec.js +5 -9
  4. package/11_besoin_ecs.spec.js +1 -1
  5. package/11_ecs.js +2 -1
  6. package/11_ecs.spec.js +2 -2
  7. package/11_nadeq.js +1 -0
  8. package/11_nadeq.spec.js +1 -1
  9. package/12.4_pac.js +5 -3
  10. package/12.4_pac.spec.js +10 -18
  11. package/13.2_generateur_combustion.js +19 -16
  12. package/13.2_generateur_combustion.spec.js +10 -10
  13. package/13.2_generateur_combustion_bouilleur.js +5 -2
  14. package/13.2_generateur_combustion_bouilleur.spec.js +1 -1
  15. package/13.2_generateur_combustion_ch.js +8 -7
  16. package/13.2_generateur_combustion_ch.spec.js +7 -7
  17. package/13.2_generateur_combustion_chaudiere.js +5 -2
  18. package/13.2_generateur_combustion_chaudiere.spec.js +2 -2
  19. package/13.2_generateur_combustion_pdim.js +6 -6
  20. package/13.2_generateur_combustion_pdim.spec.js +1 -1
  21. package/13.2_generateur_combustion_pn.spec.js +1 -1
  22. package/13.2_generateur_pac.js +4 -1
  23. package/13.2_generateur_pac.spec.js +1 -1
  24. package/13_rendement_distribution_ecs.spec.js +1 -1
  25. package/14_generateur_ecs.js +2 -1
  26. package/14_generateur_ecs.spec.js +4 -4
  27. package/15_conso_aux.js +19 -17
  28. package/15_conso_aux.spec.js +8 -8
  29. package/16.2_production_enr.js +4 -3
  30. package/16.2_production_enr.spec.js +1 -1
  31. package/16_conso_eclairage.spec.js +1 -1
  32. package/2021_04_13_confort_ete.spec.js +1 -1
  33. package/2021_04_13_qualite_isolation.js +1 -1
  34. package/2021_04_13_qualite_isolation.spec.js +2 -2
  35. package/3.1_b.spec.js +1 -1
  36. package/3.2.1_mur.js +10 -9
  37. package/3.2.1_mur.spec.js +11 -19
  38. package/3.2.2_plancher_bas.js +4 -3
  39. package/3.2.2_plancher_bas.spec.js +10 -20
  40. package/3.2.3_plancher_haut.js +1 -1
  41. package/3.2.3_plancher_haut.spec.js +2 -2
  42. package/3.3.1.4_porte.js +1 -1
  43. package/3.3.1.4_porte.spec.js +2 -2
  44. package/3.3_baie_vitree.js +2 -2
  45. package/3.3_baie_vitree.spec.js +3 -3
  46. package/3.4_pont_thermique.js +6 -4
  47. package/3.4_pont_thermique.spec.js +7 -7
  48. package/3_deperdition.js +1 -0
  49. package/3_deperdition.spec.js +3 -3
  50. package/4_ventilation.js +2 -2
  51. package/4_ventilation.spec.js +1 -1
  52. package/5_conso_ventilation.spec.js +1 -1
  53. package/6.1_apport_gratuit.spec.js +2 -2
  54. package/6.2_surface_sud_equivalente.js +12 -9
  55. package/6.2_surface_sud_equivalente.spec.js +3 -3
  56. package/7_inertie.js +7 -4
  57. package/7_inertie.spec.js +1 -1
  58. package/8_intermittence.spec.js +1 -1
  59. package/9_besoin_ch.js +5 -3
  60. package/9_besoin_ch.spec.js +3 -3
  61. package/9_chauffage.js +12 -11
  62. package/9_chauffage.spec.js +7 -7
  63. package/9_conso_ch.spec.js +3 -3
  64. package/9_emetteur_ch.js +5 -5
  65. package/9_emetteur_ch.spec.js +1 -1
  66. package/9_generateur_ch.js +16 -13
  67. package/9_generateur_ch.spec.js +6 -6
  68. package/README.md +19 -19
  69. package/apport_et_besoin.spec.js +1 -1
  70. package/conso.js +18 -14
  71. package/conso.spec.js +3 -3
  72. package/core/assets/domain/synchronize-assets.js +2 -0
  73. package/core/assets/domain/synchronize-c1-tables.js +2 -0
  74. package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +2 -0
  75. package/core/assets/domain/synchronize-enum-tables.js +2 -0
  76. package/core/assets/domain/synchronize-solicitations-tables.js +2 -0
  77. package/core/assets/domain/synchronize-valeur-tables.js +6 -0
  78. package/core/file/infrastructure/adapter/csv-parser.store.js +2 -1
  79. package/dpe-sanitizer.service.js +1 -0
  80. package/engine.js +2 -1
  81. package/enums.d.ts +1257 -0
  82. package/features/dpe/domain/models/baie-ets.model.ts +1 -1
  83. package/features/dpe/domain/models/baie-vitree.model.ts +6 -2
  84. package/features/dpe/domain/models/climatisation.model.ts +1 -1
  85. package/features/dpe/domain/models/dpe.model.ts +16 -23
  86. package/features/dpe/domain/models/ets.model.ts +1 -1
  87. package/features/dpe/domain/models/installation-chauffage.model.ts +54 -8
  88. package/features/dpe/domain/models/installation-ecs.model.ts +24 -6
  89. package/features/dpe/domain/models/mur.model.ts +1 -1
  90. package/features/dpe/domain/models/plancher.model.ts +1 -1
  91. package/features/dpe/domain/models/pont-thermique.model.ts +1 -1
  92. package/features/dpe/domain/models/porte.model.ts +1 -1
  93. package/features/dpe/domain/models/production-elec-enr.model.ts +1 -1
  94. package/features/dpe/domain/models/sortie.model.ts +1 -1
  95. package/features/dpe/domain/models/type-generateur.model.js +4 -3
  96. package/features/dpe/domain/models/type-habitation.model.js +8 -6
  97. package/features/dpe/domain/models/type-stockage.model.js +4 -3
  98. package/features/dpe/domain/models/type-ventilation.model.js +4 -3
  99. package/features/dpe/domain/models/ventilation.model.ts +1 -1
  100. package/features/dpe/infrastructure/ch/chTv.store.js +2 -2
  101. package/features/dpe/infrastructure/ecs/ecsTv.store.js +3 -3
  102. package/features/dpe/infrastructure/enveloppe/baieVitreeTv.store.js +1 -1
  103. package/features/dpe/infrastructure/froid/frTv.store.js +3 -3
  104. package/features/dpe/infrastructure/froid/frTv.store.spec.js +1 -1
  105. package/features/dpe/infrastructure/tv.store.js +1 -1
  106. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.js +3 -0
  107. package/features/engine/domain/apport_et_besoin/apport_gratuit/apport-gratuit.service.js +3 -1
  108. package/features/engine/domain/apport_et_besoin/ch/besoin-ch.service.js +3 -1
  109. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.js +9 -3
  110. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +1 -1
  111. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.js +2 -1
  112. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.js +4 -1
  113. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.js +3 -1
  114. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.js +7 -2
  115. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +1 -1
  116. package/features/engine/domain/ch/emetteur-ch.service.js +3 -1
  117. package/features/engine/domain/ch/emetteur-ch.service.spec.js +1 -1
  118. package/features/engine/domain/ch/generateur-ch.service.js +4 -1
  119. package/features/engine/domain/ch/generateur-ch.service.spec.js +3 -3
  120. package/features/engine/domain/ch/installation-ch.service.js +2 -0
  121. package/features/engine/domain/conso/conso.service.js +2 -0
  122. package/features/engine/domain/conso/froid/conso-froid.service.js +5 -1
  123. package/features/engine/domain/contexte.builder.js +2 -0
  124. package/features/engine/domain/ecs/generateur-ecs.service.js +1 -0
  125. package/features/engine/domain/ecs/installation-ecs.service.js +3 -0
  126. package/features/engine/domain/engine.service.js +1 -0
  127. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +4 -1
  128. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +3 -0
  129. package/features/engine/domain/enveloppe/deperdition.service.js +8 -4
  130. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.js +4 -1
  131. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +3 -1
  132. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +3 -1
  133. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +2 -2
  134. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +4 -2
  135. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +9 -1
  136. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +1 -1
  137. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +3 -1
  138. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +3 -1
  139. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +1 -1
  140. package/features/engine/domain/logement/nadeq.service.js +1 -1
  141. package/features/engine/domain/logement/nadeq.service.spec.js +1 -1
  142. package/features/engine/domain/models/contexte.model.ts +2 -2
  143. package/features/normalizer/domain/dpe-normalizer.service.js +1 -0
  144. package/ficheTechnique.js +4 -2
  145. package/globals.d.ts +14 -0
  146. package/package.json +3 -3
  147. package/preprocessor/index.js +1 -0
  148. package/tv.d.ts +759 -0
  149. package/tvs.d.ts +2 -7
  150. package/utils.js +8 -6
@@ -61,7 +61,7 @@ beforeEach(() => {
61
61
 
62
62
  /**
63
63
  * 3.2.2 Coefficient de transmission des planchers bas (Upb)
64
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2
64
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2
65
65
  */
66
66
  describe('calc_pb - plancher non isolé (methode 1)', () => {
67
67
  test('Upb égal à Upb0 (paroi nue) et adjacence non déperditive => upb_final = upb', () => {
@@ -216,8 +216,7 @@ describe('calc_pb - isolation inconnue / table forfaitaire (methodes 2 et 7)', (
216
216
  // La période d'isolation renseignée est utilisée comme période de la table
217
217
  expect(tv).toHaveBeenCalledWith(
218
218
  'upb',
219
- expect.objectContaining({ enum_periode_construction_id: '6' }),
220
- pb.donnee_entree
219
+ expect.objectContaining({ enum_periode_construction_id: '6' })
221
220
  );
222
221
  // min(0,3 ; 2) = 0,3
223
222
  expect(pb.donnee_intermediaire.upb).toBe(0.3);
@@ -237,8 +236,7 @@ describe('calc_pb - isolation inconnue / table forfaitaire (methodes 2 et 7)', (
237
236
 
238
237
  expect(tv).toHaveBeenCalledWith(
239
238
  'upb',
240
- expect.objectContaining({ enum_periode_construction_id: '5' }),
241
- pb.donnee_entree
239
+ expect.objectContaining({ enum_periode_construction_id: '5' })
242
240
  );
243
241
  });
244
242
 
@@ -278,8 +276,7 @@ describe('calc_pb - année de construction saisie (methode 8)', () => {
278
276
 
279
277
  expect(tv).toHaveBeenCalledWith(
280
278
  'upb',
281
- expect.objectContaining({ enum_periode_construction_id: '6' }),
282
- pb.donnee_entree
279
+ expect.objectContaining({ enum_periode_construction_id: '6' })
283
280
  );
284
281
  warn.mockRestore();
285
282
  });
@@ -305,8 +302,7 @@ describe('calc_pb - année de construction saisie (methode 8)', () => {
305
302
  // getKeyByValue(periode_isolation, '1975-1977') = '2' (différent de pc_id) => avertissement
306
303
  expect(tv).toHaveBeenCalledWith(
307
304
  'upb',
308
- expect.objectContaining({ enum_periode_construction_id: '2' }),
309
- pb.donnee_entree
305
+ expect.objectContaining({ enum_periode_construction_id: '2' })
310
306
  );
311
307
  expect(warn).toHaveBeenCalled();
312
308
  warn.mockRestore();
@@ -346,8 +342,7 @@ describe('calc_pb - année de construction saisie (methode 8)', () => {
346
342
  // Le dernier appel forfaitaire utilise la période de construction d'origine ('1')
347
343
  expect(tv).toHaveBeenLastCalledWith(
348
344
  'upb',
349
- expect.objectContaining({ enum_periode_construction_id: '1' }),
350
- pb.donnee_entree
345
+ expect.objectContaining({ enum_periode_construction_id: '1' })
351
346
  );
352
347
  warn.mockRestore();
353
348
  error.mockRestore();
@@ -368,8 +363,7 @@ describe('calc_pb - année de construction saisie (methode 8)', () => {
368
363
 
369
364
  expect(tv).toHaveBeenCalledWith(
370
365
  'upb',
371
- expect.objectContaining({ enum_periode_construction_id: '5' }),
372
- pb.donnee_entree
366
+ expect.objectContaining({ enum_periode_construction_id: '5' })
373
367
  );
374
368
  expect(warn).not.toHaveBeenCalled();
375
369
  warn.mockRestore();
@@ -498,11 +492,7 @@ describe('calc_pb - compatibilité bug for bug (forçage de la méthode de saisi
498
492
 
499
493
  expect(error).toHaveBeenCalledWith(expect.stringContaining('effet_joule'));
500
494
  // Le matcher forfaitaire final utilise l'effet Joule '1' issu du DPE
501
- expect(tv).toHaveBeenLastCalledWith(
502
- 'upb',
503
- expect.objectContaining({ effet_joule: '1' }),
504
- pb.donnee_entree
505
- );
495
+ expect(tv).toHaveBeenLastCalledWith('upb', expect.objectContaining({ effet_joule: '1' }));
506
496
  error.mockRestore();
507
497
  });
508
498
 
@@ -531,7 +521,7 @@ describe('calc_pb - compatibilité bug for bug (forçage de la méthode de saisi
531
521
 
532
522
  /**
533
523
  * Calcul de la déperdition Ue vers un plancher bas sur terre-plein / vide sanitaire / sous-sol.
534
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2 (Ue)
524
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2 (Ue)
535
525
  */
536
526
  describe('calc_pb - calcul de Ue (tv_ue)', () => {
537
527
  /** Renvoie une ue interpolée selon la valeur de upb du matcher. */
@@ -658,7 +648,7 @@ describe('calc_pb - calcul de Ue (tv_ue)', () => {
658
648
 
659
649
  /**
660
650
  * Issue #46 : ue calculé plancher par plancher, 2S/P issu du seul plancher courant.
661
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2 (tableau ue : « Les données ne figurant
651
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2 (tableau ue : « Les données ne figurant
662
652
  * pas dans le tableau peuvent être obtenues par interpolation et extrapolation »)
663
653
  */
664
654
  describe('calcul plancher par plancher (#46)', () => {
@@ -7,7 +7,7 @@ function tv_uph0(di, de, du) {
7
7
  const matcher = {
8
8
  enum_type_plancher_haut_id: de.enum_type_plancher_haut_id
9
9
  };
10
- const row = tv('uph0', matcher, de);
10
+ const row = tv('uph0', matcher);
11
11
  if (row) {
12
12
  di.uph0 = Number(row.uph0);
13
13
  de.tv_uph0_id = Number(row.tv_uph0_id);
@@ -52,7 +52,7 @@ beforeEach(() => {
52
52
 
53
53
  /**
54
54
  * 3.2.3 Coefficient de transmission des planchers hauts (Uph)
55
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.3
55
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.3
56
56
  */
57
57
  describe('calc_ph - plancher non isolé', () => {
58
58
  test('Uph égal à Uph0 (paroi nue)', () => {
@@ -249,7 +249,7 @@ describe('calc_ph - isolation inconnue (table forfaitaire)', () => {
249
249
 
250
250
  /**
251
251
  * Détermination du type de toiture (matcher de la table `uph`) selon l'adjacence.
252
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - page 21
252
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - page 21
253
253
  */
254
254
  test.each([
255
255
  ['locaux non chauffés non accessible', 'terrasse', 'terrasse'],
package/3.3.1.4_porte.js CHANGED
@@ -6,7 +6,7 @@ function tv_uporte(di, de, du) {
6
6
  const matcher = {
7
7
  enum_type_porte_id: de.enum_type_porte_id
8
8
  };
9
- const row = tv('uporte', matcher, de);
9
+ const row = tv('uporte', matcher);
10
10
  if (row) {
11
11
  di.uporte = Number(row.uporte);
12
12
  de.tv_uporte_id = Number(row.tv_uporte_id);
@@ -27,7 +27,7 @@ beforeEach(() => {
27
27
 
28
28
  /**
29
29
  * 3.3.1.4 Coefficient de transmission surfacique des portes (Uporte)
30
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.3.1.4
30
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.3.1.4
31
31
  */
32
32
  describe('calc_porte - coefficient de transmission des portes', () => {
33
33
  test('valeur forfaitaire : Uporte lu dans la table via le type de porte', () => {
@@ -42,7 +42,7 @@ describe('calc_porte - coefficient de transmission des portes', () => {
42
42
 
43
43
  calc_porte(porte, 1);
44
44
 
45
- expect(tv).toHaveBeenCalledWith('uporte', { enum_type_porte_id: '3' }, porte.donnee_entree);
45
+ expect(tv).toHaveBeenCalledWith('uporte', { enum_type_porte_id: '3' });
46
46
  expect(porte.donnee_intermediaire.uporte).toBe(2.4);
47
47
  expect(porte.donnee_entree.tv_uporte_id).toBe(15);
48
48
  });
@@ -320,8 +320,8 @@ export default function calc_bv(bv, zc) {
320
320
  mlnh.reduce((acc, ml) => acc - calc_omb(ml) / 100, 1)
321
321
  );
322
322
  }
323
- tv_masque_proche(di, de, du);
324
- tv_masque_lointain_homogene(di, de, du);
323
+ tv_masque_proche(di, de);
324
+ tv_masque_lointain_homogene(di, de);
325
325
 
326
326
  delete di.deltar;
327
327
 
@@ -105,7 +105,7 @@ function baseBv(overrides = {}) {
105
105
 
106
106
  /**
107
107
  * 3.3 Coefficients de transmission thermique et facteur solaire des baies vitrées.
108
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.3
108
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.3
109
109
  */
110
110
  describe('calc_bv - parcours nominal (double vitrage avec fermeture)', () => {
111
111
  test('renseigne b, sw, ug, uw, ujn et u_menuiserie', () => {
@@ -301,7 +301,7 @@ describe('calc_bv - traitement de la fermeture', () => {
301
301
 
302
302
  /**
303
303
  * 3.3.2 / 6.2.1 Traitement des doubles fenêtres : sw et uw équivalents.
304
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.3.2
304
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.3.2
305
305
  */
306
306
  describe('calc_bv - double fenêtre', () => {
307
307
  /** Baie secondaire (deuxième fenêtre) mesurable pour sw / uw équivalents. */
@@ -394,7 +394,7 @@ describe('calc_bv - double fenêtre', () => {
394
394
 
395
395
  /**
396
396
  * 6.3 Masques proches et lointains.
397
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.3
397
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.3
398
398
  */
399
399
  describe('calc_bv - masques lointains non homogènes (fe2)', () => {
400
400
  test('collection de masques : fe2 = 1 - somme des occultations', () => {
@@ -1,3 +1,5 @@
1
+ /** @import { BaieVitree } from './features/dpe/domain/models/baie-vitree.model.js' */
2
+ /** @import { PontThermiqueDE, PontThermiqueDI } from './features/dpe/domain/models/pont-thermique.model.js' */
1
3
  import enums from './enums.js';
2
4
  import { isNil } from 'lodash-es';
3
5
  import { tv, requestInput, cleanReference, bug_for_bug_compat } from './utils.js';
@@ -36,7 +38,7 @@ function tv_k(pt_di, di, de, du, pc_id, logement) {
36
38
  const mur_list = enveloppe.mur_collection.mur || [];
37
39
  const pb_list = enveloppe.plancher_bas_collection.plancher_bas || [];
38
40
  const ph_list = enveloppe.plancher_haut_collection.plancher_haut || [];
39
- /** @type {BaieVitreeItem[]} **/
41
+ /** @type {BaieVitree[]} **/
40
42
  const bv_list = enveloppe.baie_vitree_collection.baie_vitree || [];
41
43
  const porte_list = enveloppe.porte_collection.porte || [];
42
44
 
@@ -137,7 +139,7 @@ function tv_k(pt_di, di, de, du, pc_id, logement) {
137
139
  * Si on ne trouve pas de mur associé au pont thermique, on vérifie si on trouve une baie vitrée associée
138
140
  * au pont thermique et si cette dernière à une reference_paroi qui correspond à un mur existant.
139
141
  */
140
- /** @type {BaieVitreeItem} **/
142
+ /** @type {BaieVitree} **/
141
143
  const bvPt = bv_list.find((bv) => bv.donnee_entree.reference === de.reference_1);
142
144
  if (bvPt && Number(bvPt.donnee_entree.reference_paroi) === murIndex) {
143
145
  console.error(
@@ -444,9 +446,9 @@ function tv_k(pt_di, di, de, du, pc_id, logement) {
444
446
  * Si la valeur k calculée est égale au à celle spécifiée, le facteur est déjà pris en compte
445
447
  *
446
448
  * @param type_liaison {string} type de liaison du pont thermique en cours d'étude
447
- * @param de {Donnee_entree} données d'entrée du pont thermique en cours d'étude
449
+ * @param de {PontThermiqueDE} données d'entrée du pont thermique en cours d'étude
448
450
  * @param k {string} valeur calculée pour k
449
- * @param pt_di {Donnee_intermediaire} données intermédiaires du pont thermique en cours d'étude
451
+ * @param pt_di {PontThermiqueDI} données intermédiaires du pont thermique en cours d'étude
450
452
  */
451
453
  function pourcentageValeurPontThermique(type_liaison, de, k, pt_di) {
452
454
  if (
@@ -81,7 +81,7 @@ afterEach(() => {
81
81
 
82
82
  /**
83
83
  * 3.4 Calcul des déperditions par les ponts thermiques
84
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
84
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
85
85
  */
86
86
  describe('calc_pont_thermique - méthode de saisie directe', () => {
87
87
  test('k justifié saisi (méthode 2) : k pris directement', () => {
@@ -132,7 +132,7 @@ describe('calc_pont_thermique - valeur forfaitaire (méthode 1)', () => {
132
132
 
133
133
  /**
134
134
  * Les ponts thermiques des murs de circulation avec k intermédiaire nul restent nuls.
135
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4 (locaux de circulation)
135
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4 (locaux de circulation)
136
136
  */
137
137
  test('mur de circulation (adjacence 22) avec k intermédiaire nul : k = 0 sans accès table', () => {
138
138
  const mur = [
@@ -157,7 +157,7 @@ describe('calc_pont_thermique - valeur forfaitaire (méthode 1)', () => {
157
157
 
158
158
  /**
159
159
  * 3.4.5 Menuiserie / mur : les ponts thermiques avec les parois en structure bois sont négligés.
160
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4.5
160
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4.5
161
161
  */
162
162
  test('liaison menuiserie / mur sur structure bois : k = 0', () => {
163
163
  const mur = [
@@ -248,7 +248,7 @@ describe('defaultValue - valeur de repli sur description non reconnue', () => {
248
248
 
249
249
  /**
250
250
  * 3.4 Reconstruction des références manquantes à partir de la description.
251
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
251
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
252
252
  */
253
253
  describe('calc_pont_thermique - reconstruction des références via la description', () => {
254
254
  test('description "mur / plancher" : la référence du mur est retrouvée (liaison refend, pas de 2e paroi)', () => {
@@ -439,7 +439,7 @@ describe('calc_pont_thermique - mur de circulation avec k non nul', () => {
439
439
 
440
440
  /**
441
441
  * 3.4.1 / 3.4.3 Ponts thermiques plancher bas / mur et plancher haut lourd / mur.
442
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4.1 et §3.4.3
442
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4.1 et §3.4.3
443
443
  */
444
444
  describe('calc_pont_thermique - liaisons plancher / mur', () => {
445
445
  function murPlancher(murOverrides = {}, plancherOverrides = {}) {
@@ -633,7 +633,7 @@ describe('calc_pont_thermique - liaisons plancher / mur', () => {
633
633
 
634
634
  /**
635
635
  * 3.4.5 Menuiserie / mur.
636
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4.5
636
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4.5
637
637
  */
638
638
  describe('calc_pont_thermique - liaison menuiserie / mur', () => {
639
639
  function murMenuiserie(murOverrides = {}, menuiserieOverrides = {}) {
@@ -920,7 +920,7 @@ describe('calc_pont_thermique - cas limites', () => {
920
920
  /**
921
921
  * Issue #212 : l'exclusion des parois non déperditives s'applique aussi au plancher des liaisons
922
922
  * plancher bas / mur et plancher haut lourd / mur, pas seulement au mur.
923
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
923
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
924
924
  */
925
925
  describe('calc_pont_thermique - plancher sur paroi non déperditive (issue #212)', () => {
926
926
  /** Mur extérieur lourd isolé ITI + plancher lourd isolé ITE avec l'adjacence donnée. */
package/3_deperdition.js CHANGED
@@ -1,3 +1,4 @@
1
+ /** @import { FullDpe } from './features/dpe/domain/models/dpe.model.js' */
1
2
  import enums from './enums.js';
2
3
  import calc_mur from './3.2.1_mur.js';
3
4
  import calc_pb from './3.2.2_plancher_bas.js';
@@ -52,7 +52,7 @@ afterEach(() => {
52
52
 
53
53
  /**
54
54
  * 3. Déperditions de l'enveloppe : déperditions surfaciques par paroi.
55
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3
55
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3
56
56
  */
57
57
  describe('déperditions surfaciques par paroi (U * surface * b)', () => {
58
58
  test('Umur = surface_paroi_opaque * umur * b', () => {
@@ -106,7 +106,7 @@ describe('déperditions surfaciques par paroi (U * surface * b)', () => {
106
106
 
107
107
  /**
108
108
  * 3.4 Déperdition d'un pont thermique : Upt = l * k * pourcentage.
109
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
109
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
110
110
  */
111
111
  describe('Upt - déperdition linéique des ponts thermiques', () => {
112
112
  test("Upt = l * k lorsque le pourcentage n'est pas renseigné (défaut 1)", () => {
@@ -361,7 +361,7 @@ describe("calc_deperdition - agrégation des déperditions de l'enveloppe", () =
361
361
 
362
362
  /**
363
363
  * 3.4 Comparaison des déperditions calculées et déclarées.
364
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
364
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
365
365
  */
366
366
  describe('totalDeperditionMurs - arbitrage entre valeur calculée et déclarée', () => {
367
367
  /** Un mur unique : Umur = 10 * 0,5 * 1 = 5. */
package/4_ventilation.js CHANGED
@@ -134,7 +134,7 @@ function tv_q4pa_conv(di, de, cg, mur_list, ph_list, porte_list, bv_list) {
134
134
  * le recalcul les donne non isolées. Dans le sens inverse (ligne « non isolées », recalcul
135
135
  * « isolées »), le DPE a pu être modifié par l'appelant (scénario d'isolation des parois) :
136
136
  * la valeur recalculée est utilisée.
137
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §4
137
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §4
138
138
  */
139
139
  if (rowQ4paConv.isolation_surfaces !== isolation_surfaces) {
140
140
  if (
@@ -160,7 +160,7 @@ function tv_q4pa_conv(di, de, cg, mur_list, ph_list, porte_list, bv_list) {
160
160
  * la ligne q4pa_conv retenue par le logiciel (ex. ligne 12 « avant 1948 avec joints », 2,5) :
161
161
  * on reprend sa valeur `presence_joints_menuiserie` au lieu de considérer les menuiseries
162
162
  * sans joint. Uniquement avec l'option `compat_for_corpus_analysis`.
163
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §4
163
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §4
164
164
  */
165
165
  if (
166
166
  compat_for_corpus_analysis &&
@@ -51,7 +51,7 @@ beforeEach(() => {
51
51
 
52
52
  /**
53
53
  * Déperdition par renouvellement d'air dû aux infiltrations (Hperm)
54
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §4
54
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §4
55
55
  */
56
56
  describe('calc_hperm - déperdition par perméabilité', () => {
57
57
  test('plusieurs façades exposées (pfe=1) : e=0,07 et f=15', () => {
@@ -17,7 +17,7 @@ const {
17
17
 
18
18
  /**
19
19
  * 5. Consommation des auxiliaires de ventilation
20
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §5, pages 41-42
20
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §5, pages 41-42
21
21
  */
22
22
  describe('calc_pvent - consommation des auxiliaires de ventilation', () => {
23
23
  let di;
@@ -3,7 +3,7 @@ import { describe, expect, test } from 'vitest';
3
3
 
4
4
  describe("Recherche de bugs dans le calcul de l'apport gratuit", () => {
5
5
  /**
6
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf Page 43
6
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf Page 43
7
7
  */
8
8
  test('calcul de f apport solaire', () => {
9
9
  const ilpa = '0';
@@ -165,7 +165,7 @@ describe("Recherche de bugs dans le calcul de l'apport gratuit", () => {
165
165
  });
166
166
 
167
167
  /**
168
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf Page 43
168
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf Page 43
169
169
  */
170
170
  test('calcul de f apport interne', () => {
171
171
  const ilpa = '0';
@@ -1,3 +1,6 @@
1
+ /** @import { BaieVitree, BaieVitreeDE, BaieVitreeDI } from './features/dpe/domain/models/baie-vitree.model.js' */
2
+ /** @import { BaieEtsDE } from './features/dpe/domain/models/baie-ets.model.js' */
3
+ /** @import { Ets } from './features/dpe/domain/models/ets.model.js' */
1
4
  import enums from './enums.js';
2
5
  import tvs from './tv.js';
3
6
  import { mois_liste } from './utils.js';
@@ -41,8 +44,8 @@ export function calc_sse_j(bv_list, ets, ca, zc, mois) {
41
44
  * Certaines vérandas sont dupliquées dans les DPE : une même véranda (même référence, ou à défaut
42
45
  * même contenu) ne doit être comptée qu'une seule fois.
43
46
  *
44
- * @param etsList {EtsItem[]}
45
- * @returns {EtsItem[]}
47
+ * @param etsList {Ets[]}
48
+ * @returns {Ets[]}
46
49
  */
47
50
  export function dedoublonnerEts(etsList) {
48
51
  const vues = new Set();
@@ -64,9 +67,9 @@ export function dedoublonnerEts(etsList) {
64
67
  * rattachée à la première véranda : c'est le comportement historique, et le seul possible quand le
65
68
  * DPE ne comporte qu'une véranda. La méthode ne permet pas de faire mieux pour une donnée manquante.
66
69
  *
67
- * @param baiesAdjVeranda {BaieVitreeItem[]}
68
- * @param etsList {EtsItem[]}
69
- * @returns {BaieVitreeItem[][]} baies par véranda, dans l'ordre de etsList
70
+ * @param baiesAdjVeranda {BaieVitree[]}
71
+ * @param etsList {Ets[]}
72
+ * @returns {BaieVitree[][]} baies par véranda, dans l'ordre de etsList
70
73
  */
71
74
  export function rattacherBaiesAuxEts(baiesAdjVeranda, etsList) {
72
75
  const baiesParEts = etsList.map(() => []);
@@ -87,8 +90,8 @@ export function rattacherBaiesAuxEts(baiesAdjVeranda, etsList) {
87
90
  /**
88
91
  * Surface sud équivalente apportée par une véranda sur le mois j (§6.3).
89
92
  *
90
- * @param ets {EtsItem}
91
- * @param baiesAdjVeranda {BaieVitreeItem[]} baies séparant le logement de cette véranda
93
+ * @param ets {Ets}
94
+ * @param baiesAdjVeranda {BaieVitree[]} baies séparant le logement de cette véranda
92
95
  * @param zc {string}
93
96
  * @param mois {string}
94
97
  * @returns {number}
@@ -157,7 +160,7 @@ function calc_sse_veranda_j(ets, baiesAdjVeranda, zc, mois) {
157
160
  /**
158
161
  * Calcul de la surface sur équivalente pour la baie vitrée bv pendant le mois $mois
159
162
  *
160
- * @param bv {BaieVitreeItem}
163
+ * @param bv {{donnee_entree: BaieVitreeDE | BaieEtsDE, donnee_intermediaire?: BaieVitreeDI}} baie vitrée ou baie d'espace tampon solarisé
161
164
  * @param zc {string} zone climatique du logement
162
165
  * @param mois {string} mois au cours duquel calculer la surface sur équivalente de la baie vitrée
163
166
  * @param coeff {number} coefficient à appliquer à cette surface sud
@@ -167,7 +170,7 @@ function getSsd(bv, zc, mois, coeff) {
167
170
  const c1 = tvs.c1;
168
171
 
169
172
  const de = bv.donnee_entree;
170
- const di = bv.donnee_intermediaire || {};
173
+ const di = /** @type {BaieVitreeDI} */ (bv.donnee_intermediaire || {});
171
174
 
172
175
  const orientation = enums.orientation[de.enum_orientation_id];
173
176
  const inclinaison = enums.inclinaison_vitrage[de.enum_inclinaison_vitrage_id ?? 3];
@@ -51,7 +51,7 @@ function baie({ adjacence, surface, orientationId = '1', inclinaisonId = '3', sw
51
51
 
52
52
  /**
53
53
  * 6.2 Calcul de la surface sud équivalente (SSE)
54
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.2 / §6.3
54
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.2 / §6.3
55
55
  */
56
56
  describe('calc_sse_j - surface sud équivalente journalière', () => {
57
57
  test("sans espace tampon : somme sur les baies donnant sur l'extérieur", () => {
@@ -143,7 +143,7 @@ describe('calc_sse_j - surface sud équivalente journalière', () => {
143
143
  * Issue #140 : la surface sud équivalente véranda (Sse_ver = Ssd + Ssind * bver) n'est calculée que
144
144
  * pour les baies vitrées séparant le logement de l'espace tampon solarisé (adjacence 10).
145
145
  * Sans aucune de ces baies, les apports de l'ETS n'entrent pas dans le logement => Sse_ver = 0.
146
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.3
146
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.3
147
147
  */
148
148
  describe('calc_sse_j - espace tampon solarisé sans baie séparant le logement de l’ETS', () => {
149
149
  /** Fabrique un espace tampon solarisé avec une baie donnant sur l'extérieur. */
@@ -225,7 +225,7 @@ describe('calc_sse - surface sud équivalente annuelle', () => {
225
225
  * sur laquelle elle donne (reference_lnc = ets.reference).
226
226
  * Cas de test fournis par Olivier (thermicien), zone h1b mockée avec C1 sud = 1, est = 0,40,
227
227
  * nord = 0,31 ; Fe = 1.
228
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.3
228
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §6.3
229
229
  */
230
230
  describe('calc_sse_j - plusieurs espaces tampons solarisés (issue #101)', () => {
231
231
  const SUD = '1';
package/7_inertie.js CHANGED
@@ -1,3 +1,6 @@
1
+ /** @import { Enveloppe } from './features/dpe/domain/models/dpe.model.js' */
2
+ /** @import { Mur, MurDE } from './features/dpe/domain/models/mur.model.js' */
3
+ /** @import { PlancherBas, PlancherBasDE, PlancherHaut, PlancherHautDE } from './features/dpe/domain/models/plancher.model.js' */
1
4
  import enums from './enums.js';
2
5
  import { getThicknessFromDescription, getKeyByValue } from './utils.js';
3
6
 
@@ -11,7 +14,7 @@ export class Inertie {
11
14
 
12
15
  /**
13
16
  * Return 1 if the plancher_haut has high inertia, 0 otherwise
14
- * @param de {Donnee_entree}
17
+ * @param de {PlancherHautDE}
15
18
  * @returns {number}
16
19
  */
17
20
  calculateInertiePhLourd(de) {
@@ -37,7 +40,7 @@ export class Inertie {
37
40
 
38
41
  /**
39
42
  * Return 1 if the plancher_bas has high inertia, 0 otherwise
40
- * @param de {Donnee_entree}
43
+ * @param de {PlancherBasDE}
41
44
  * @returns {number}
42
45
  */
43
46
  calculateInertiePbLourd(de) {
@@ -68,7 +71,7 @@ export class Inertie {
68
71
 
69
72
  /**
70
73
  * Return 1 if the mur has high inertia, 0 otherwise
71
- * @param de {Donnee_entree}
74
+ * @param de {MurDE}
72
75
  * @returns {number}
73
76
  */
74
77
  calculateInertieMurLourd(de) {
@@ -163,7 +166,7 @@ export class Inertie {
163
166
 
164
167
  /**
165
168
  * Return 1 if the collection has high inertia (majority high inertia surface), 0 otherwise
166
- * @param collection {PlancherBasItem[] || PlancherHautItem[] || MurItem[]}
169
+ * @param collection {PlancherBas[] | PlancherHaut[] | Mur[]}
167
170
  * @param method - method to apply on each item to get inertia type
168
171
  * @returns {number}
169
172
  */
package/7_inertie.spec.js CHANGED
@@ -3,7 +3,7 @@ import { describe, expect, test } from 'vitest';
3
3
 
4
4
  describe('Inertie unit tests', () => {
5
5
  /**
6
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf Page 53
6
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf Page 53
7
7
  */
8
8
  const inertie = new Inertie();
9
9
 
@@ -3,7 +3,7 @@ import { describe, expect, test } from 'vitest';
3
3
 
4
4
  /**
5
5
  * 8. Modélisation de l'intermittence
6
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §8
6
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §8
7
7
  *
8
8
  * i = i0 / (1 + 0.1 * (G - 1)) avec G = GV / (Sh * Hsp)
9
9
  * (fonction pure, aucune dépendance à mocker).
package/9_besoin_ch.js CHANGED
@@ -1,3 +1,5 @@
1
+ /** @import { GenerateurChauffage } from './features/dpe/domain/models/installation-chauffage.model.js' */
2
+ /** @import { GenerateurEcs } from './features/dpe/domain/models/installation-ecs.model.js' */
1
3
  import enums from './enums.js';
2
4
  import tvs from './tv.js';
3
5
  import { calc_besoin_ecs_j } from './11_besoin_ecs.js';
@@ -99,7 +101,7 @@ export default function calc_besoin_ch(
99
101
  * Seules les pertes des générateurs et des ballons de stockage en volume chauffé sont récupérables. Les pertes
100
102
  * récupérées des générateurs d’air chaud sont nulles.
101
103
  *
102
- * @type {GenerateurChauffageItem[]}
104
+ * @type {GenerateurChauffage[]}
103
105
  */
104
106
  const gen_ch_recup = instal_ch.flatMap((inst_ch) =>
105
107
  inst_ch.generateur_chauffage_collection.generateur_chauffage.filter(
@@ -112,9 +114,9 @@ export default function calc_besoin_ch(
112
114
  * 9.1.1 - Générateurs de la collection ECS assurant l'ECS uniquement, avec Qp0 > 0 et situés en
113
115
  * volume chauffé : leurs pertes de génération sont aussi récupérées pour le chauffage.
114
116
  * Les générateurs 'chauffage + ecs' sont exclus car déjà présents dans la collection chauffage.
115
- * @see issue #153
117
+ * @see issue 153
116
118
  *
117
- * @type {GenerateurEcsItem[]}
119
+ * @type {GenerateurEcs[]}
118
120
  */
119
121
  const gen_ecs_recup = instal_ecs.flatMap((inst_ecs) =>
120
122
  (inst_ecs.generateur_ecs_collection?.generateur_ecs || []).filter(
@@ -73,7 +73,7 @@ const { calc_Qrec_gen_j, calc_Qrec_gen_ecs_j, isGenerateurEcsSeulRecuperable } =
73
73
 
74
74
  /**
75
75
  * 9. Besoins de chauffage (Bch)
76
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
76
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
77
77
  */
78
78
  describe('calc_Fj - fraction des besoins de chauffage couverte par les apports', () => {
79
79
  test('retourne 0 lorsque le nombre de degrés-heures est nul', () => {
@@ -419,7 +419,7 @@ describe('calc_besoin_ch - branches complémentaires', () => {
419
419
  /**
420
420
  * 9.1.1 - Pertes récupérées de génération : générateurs de la collection ECS assurant l'ECS
421
421
  * uniquement, avec Qp0 > 0 et en volume chauffé (issue #153).
422
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
422
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
423
423
  */
424
424
  describe('calc_besoin_ch - récupération des pertes des générateurs ECS seuls (#153)', () => {
425
425
  const genEcsSeul = {
@@ -566,7 +566,7 @@ describe('calc_besoin_ch - récupération des pertes des générateurs ECS seuls
566
566
  * Immeuble à plusieurs installations ECS dont une collective (ex. installation mixte
567
567
  * individuelle/collective) : besoin de chaque installation = Becs_immeuble × Sh_ecs / SH, × rdim
568
568
  * pour une installation individuelle (Tribu, Calcul_batiment.Calcul_Cecs et l. 374).
569
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1 et §11.4
569
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1 et §11.4
570
570
  */
571
571
  describe('calc_besoin_ch - immeuble à installations ECS individuelles et collectives', () => {
572
572
  const ecsIndividuelle = (surface_habitable, rdim) => ({