@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
@@ -9,7 +9,7 @@ const { updateGenerateurPacs } = await import('./13.2_generateur_pac.js');
9
9
  /**
10
10
  * 13.2 - Substitution des générateurs "autre système thermodynamique" par un CET
11
11
  * sur air ambiant équivalent selon la période d'installation.
12
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2
12
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2
13
13
  */
14
14
  describe('updateGenerateurPacs - substitution des générateurs thermodynamiques', () => {
15
15
  test("aucune période d'installation renseignée : aucune modification", () => {
@@ -16,7 +16,7 @@ const { default: rendement_distribution_ecs } = await import('./13_rendement_dis
16
16
 
17
17
  /**
18
18
  * 13. Rendement de distribution de l'ECS
19
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13
19
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13
20
20
  */
21
21
  describe('rendement_distribution_ecs', () => {
22
22
  test('ne retourne aucune valeur (fonction sans effet de sortie)', () => {
@@ -1,3 +1,4 @@
1
+ /** @import { GenerateurEcsDI } from './features/dpe/domain/models/installation-ecs.model.js' */
1
2
  import enums from './enums.js';
2
3
  import {
3
4
  bug_for_bug_compat,
@@ -200,7 +201,7 @@ const PVEILLEUSES_EXPORTEES_TRIBU = [10, 0.01];
200
201
  * chauffe-eau gaz / GPL instantané 2001-2015, veilleuse de la méthode (100 W) retenue, et
201
202
  * pveilleuse exportée par le DPE égale à 10 W ou 0,01 kW.
202
203
  * @param typeGenerateurId {string|number} enum_type_generateur_ecs_id
203
- * @param di {Donnee_intermediaire}
204
+ * @param di {GenerateurEcsDI}
204
205
  * @returns {boolean}
205
206
  */
206
207
  export function isPveilChauffeEauGazInstantaneTribu(typeGenerateurId, di) {
@@ -90,7 +90,7 @@ const { getChaudiereFioulDefautId } = await import('./13.2_generateur_combustion
90
90
 
91
91
  /**
92
92
  * 14. Générateur d'ECS : rendements et consommations
93
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §14
93
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14
94
94
  */
95
95
  describe('rendements de génération (fonctions pures)', () => {
96
96
  const di = { rpn: 0.9, qp0: 0.1, pveil: 0.02, Qgw: 1000 };
@@ -415,7 +415,7 @@ describe('calc_gen_ecs - consommation par générateur', () => {
415
415
 
416
416
  /**
417
417
  * 14.1 - Pertes de stockage forfaitaires (générateur électrique à accumulation).
418
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1
418
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1
419
419
  */
420
420
  test('électrique avec stockage : pertes de stockage forfaitaires et matcher de volume', () => {
421
421
  vi.mocked(tvColumnIDs).mockImplementation((table) =>
@@ -690,7 +690,7 @@ describe('calc_gen_ecs - consommation par générateur', () => {
690
690
 
691
691
  /**
692
692
  * Issue #39 : présence de veilleuse lue dans la fiche technique (de.presence_veilleuse).
693
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1
693
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1
694
694
  */
695
695
  test.each([
696
696
  [1, undefined, 0.02],
@@ -943,7 +943,7 @@ describe('calc_gen_ecs - consommation par générateur', () => {
943
943
 
944
944
  /**
945
945
  * Type 84 : chaudière fioul standard datant de la construction du bâtiment.
946
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.2.1.1
946
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.2.1.1
947
947
  */
948
948
  test('type 84 combustion compatible 84 : chaudière de la période de construction retenue', () => {
949
949
  vi.mocked(getChaudiereFioulDefautId).mockReturnValue('39');
package/15_conso_aux.js CHANGED
@@ -1,3 +1,5 @@
1
+ /** @import { EmetteurChauffage, EmetteurChauffageDI, GenerateurChauffageDE, GenerateurChauffageDI } from './features/dpe/domain/models/installation-chauffage.model.js' */
2
+ /** @import { GenerateurEcsDE, GenerateurEcsDI, InstallationEcsDE, InstallationEcsDI } 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 { mois_liste, Njj, Tbase } from './utils.js';
@@ -11,8 +13,8 @@ const H_CHAUDIERE_BOIS = 10.5;
11
13
 
12
14
  /**
13
15
  * 15.1 Consommation des auxiliaires de génération
14
- * @param di {Donnee_intermediaire}
15
- * @param de {Donnee_entree}
16
+ * @param di {GenerateurChauffageDI|GenerateurEcsDI}
17
+ * @param de {GenerateurChauffageDE|GenerateurEcsDE}
16
18
  * @param type {'ecs'|'ch'}
17
19
  * @param besoin {number} Besoin en chauffage ou ecs pour ce générateur
18
20
  * @param besoin_dep {number} Besoin en chauffage ou ecs pour ce générateur (mode dépensier)
@@ -31,7 +33,7 @@ export function conso_aux_gen(di, de, type, besoin, besoin_dep) {
31
33
  * nominale réelle du générateur, comme le moteur de référence CSTB (Tribu) et comme le calcul
32
34
  * dépensier. Autotests CSTB APP3-0-3 (chaudière bois collective 150 kW, Tribu Qaux_ch =
33
35
  * 13,27 kWh) et IC4-0-1 (chaudière bois 300 kW, Tribu Qaux_ch = 864,60 kWh).
34
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
36
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
35
37
  */
36
38
  const pnReel = di.pn / (de.ratio_virtualisation || 1);
37
39
  let pe = pnReel;
@@ -53,7 +55,7 @@ export function conso_aux_gen(di, de, type, besoin, besoin_dep) {
53
55
  * Installation collective virtualisée : Paux_g (W) est celle du générateur de l'immeuble
54
56
  * (Pn = pe, puissance immeuble) et Caux_g = Paux_g × Bch_logement / Pn. Le terme G ne doit pas
55
57
  * être proratisé par ratio_virtualisation (sinon G × ratio), comme le moteur CSTB (Tribu).
56
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
58
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
57
59
  */
58
60
  const Paux_g_ch = g + h * (pe / 1000);
59
61
 
@@ -65,7 +67,7 @@ export function conso_aux_gen(di, de, type, besoin, besoin_dep) {
65
67
  * le moteur de référence CSTB (Tribu) n'utilise aucune clé de répartition pour ces
66
68
  * installations (DPE.Core : Calcul_installation.cs l.79-80, Calcul_generateur.cs l.1497,
67
69
  * Calcul_batiment.cs l.652). La clé reste appliquée au collectif et à l'ECS.
68
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
70
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
69
71
  */
70
72
  const ignoreCle = type === 'ch' && String(de.enum_type_installation_id) === '1';
71
73
  const cle = ignoreCle ? 1 : de[`cle_repartition_${type}`] || 1;
@@ -78,7 +80,7 @@ export function conso_aux_gen(di, de, type, besoin, besoin_dep) {
78
80
  * seconde fois (sinon Bch × (Sc / Sh)²), comme le moteur de référence CSTB (Tribu).
79
81
  * Autotest CSTB MI5-0-8 : radiateur gaz, Sc = 96 m², Sh = 136 m², Tribu Qaux_ch = 84,69 kWh
80
82
  * (59,78 kWh avec le double prorata, −29 %).
81
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
83
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
82
84
  */
83
85
  di[`conso_auxiliaire_generation_${type}`] = (Paux_g_ch * besoinAppart) / pnReel || 0;
84
86
  di[`conso_auxiliaire_generation_${type}_depensier`] = (Paux_g_ch * besoinAppartDep) / pnReel || 0;
@@ -167,9 +169,9 @@ function getFacteur(values, type, id, presenceVentilateur) {
167
169
 
168
170
  /**
169
171
  * Calcul de la consommation des auxiliaires de distribution de chauffage
170
- * @param em_ch { EmetteurChauffageItem[]}
171
- * @param de {Donnee_entree} donnée du générateur de chauffage
172
- * @param di {Donnee_intermediaire} donnée intermédiaire du générateur de chauffage
172
+ * @param em_ch { EmetteurChauffage[]}
173
+ * @param de {GenerateurChauffageDE} donnée du générateur de chauffage
174
+ * @param di {GenerateurChauffageDI} donnée intermédiaire du générateur de chauffage
173
175
  * @param du {object} donnée utilisateur du générateur de chauffage
174
176
  * @param surfaceHabitable {number}
175
177
  * @param zcId {number} id de la zone climatique du bien
@@ -214,9 +216,9 @@ export function conso_aux_distribution_ch(
214
216
 
215
217
  /**
216
218
  * 15.2.1 Puissance des circulateurs de chauffage
217
- * @param em_ch { EmetteurChauffageItem[]}
218
- * @param de {Donnee_entree} donnée du générateur de chauffage
219
- * @param di {Donnee_intermediaire} donnée intermédiaire du générateur de chauffage
219
+ * @param em_ch { EmetteurChauffage[]}
220
+ * @param de {GenerateurChauffageDE} donnée du générateur de chauffage
221
+ * @param di {GenerateurChauffageDI} donnée intermédiaire du générateur de chauffage
220
222
  * @param du {object} donnée utilisateur du générateur de chauffage
221
223
  * @param surfaceHabitable {number}
222
224
  * @param GV {number} déperdition de l'enveloppe
@@ -285,7 +287,7 @@ function getPuissanceCirculateur(em_ch, de, di, du, surfaceHabitable, GV, Tbase)
285
287
 
286
288
  // Exposition de la longueur du réseau (lb) dans les données intermédiaires des émetteurs desservis
287
289
  em_ch.forEach((em) => {
288
- em.donnee_intermediaire = em.donnee_intermediaire || {};
290
+ em.donnee_intermediaire = /** @type {EmetteurChauffageDI} */ (em.donnee_intermediaire || {});
289
291
  em.donnee_intermediaire.lb = Lem;
290
292
  });
291
293
 
@@ -319,8 +321,8 @@ function getPuissanceCirculateur(em_ch, de, di, du, surfaceHabitable, GV, Tbase)
319
321
  * température impose 15 °C, quel que soit l'ordre de saisie des émetteurs (comme le moteur de
320
322
  * référence CSTB Tribu). Auparavant, seul le premier émetteur était considéré.
321
323
  *
322
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
323
- * @param em_ch {EmetteurChauffageItem[]}
324
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
325
+ * @param em_ch {EmetteurChauffage[]}
324
326
  * @return {number}
325
327
  */
326
328
  export function getDeltaDim(em_ch) {
@@ -343,8 +345,8 @@ export function getDeltaDim(em_ch) {
343
345
  * CAS 3 - enum_bouclage_reseau_ecs_id = 3 (traçage) : conso = 0.14 * BECS_annuel * Sh_install / Sh_logement
344
346
  *
345
347
  * @param ecs {object} installation ECS
346
- * @param de {Donnee_entree} donnée d'entrée de l'installation ECS
347
- * @param di {Donnee_intermediaire} donnée intermédiaire de l'installation ECS
348
+ * @param de {InstallationEcsDE} donnée d'entrée de l'installation ECS
349
+ * @param di {InstallationEcsDI} donnée intermédiaire de l'installation ECS
348
350
  * @param Sh_logement {number} surface habitable du logement
349
351
  * @param Sh_immeuble {number} surface habitable de l'immeuble
350
352
  * @param caId {number} id de la classe d'altitude
@@ -36,7 +36,7 @@ const { conso_aux_gen, conso_aux_distribution_ch, conso_aux_distribution_ecs, ge
36
36
 
37
37
  /**
38
38
  * 15.1 Consommation des auxiliaires de génération
39
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
39
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
40
40
  */
41
41
  describe('conso_aux_gen - auxiliaires de génération', () => {
42
42
  let di;
@@ -94,7 +94,7 @@ describe('conso_aux_gen - auxiliaires de génération', () => {
94
94
  /**
95
95
  * Le besoin transmis par calc_chauffage est déjà proratisé par Sc / Sh : aucun second prorata.
96
96
  * Autotest CSTB MI5-0-8 : radiateur gaz (G = 40, H = 0), Sc = 96 m², Sh = 136 m².
97
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
97
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
98
98
  */
99
99
  test('chauffage : surface chauffée partielle sans second prorata Sc / Sh du besoin', () => {
100
100
  const diPartiel = { pn: 20000 };
@@ -235,7 +235,7 @@ describe('conso_aux_gen - auxiliaires de génération', () => {
235
235
  * installation individuelle (enum_type_installation_id = 1) : ce besoin est déjà proratisé
236
236
  * par Sc / Sh, et le moteur CSTB (Tribu) n'utilise aucune clé pour ces installations.
237
237
  * La clé reste appliquée au collectif et à l'ECS.
238
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
238
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
239
239
  */
240
240
  describe('clé de répartition (issue #252)', () => {
241
241
  test('chauffage, installation individuelle : la clé de répartition est ignorée', () => {
@@ -297,7 +297,7 @@ describe('conso_aux_gen - auxiliaires de génération', () => {
297
297
 
298
298
  /**
299
299
  * 15.2 Consommation des auxiliaires de distribution de chauffage
300
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
300
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
301
301
  */
302
302
  describe('conso_aux_distribution_ch - auxiliaires de distribution', () => {
303
303
  const emCh = [
@@ -379,7 +379,7 @@ describe('conso_aux_distribution_ch - auxiliaires de distribution', () => {
379
379
  * Seuls les émetteurs reliés au générateur (même enum_lien_generateur_emetteur_id) dimensionnent
380
380
  * son circulateur. Autotest CSTB IC5-0-3 : chaudière (lien 1) sur plancher chauffant + convecteurs
381
381
  * électriques d'appoint (lien 2) : Fcot du plancher (0,156), pas le forçage multi-émetteurs.
382
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
382
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
383
383
  */
384
384
  test('émetteurs reliés à un autre générateur : exclus du dimensionnement du circulateur', () => {
385
385
  const plancher = {
@@ -412,7 +412,7 @@ describe('conso_aux_distribution_ch - auxiliaires de distribution', () => {
412
412
  /**
413
413
  * La longueur du réseau le plus défavorisé (Lem) est exposée sous le nom lb dans la donnée
414
414
  * intermédiaire de chaque émetteur desservi par le circulateur.
415
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
415
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
416
416
  */
417
417
  test('longueur du réseau lb exposée dans la donnée intermédiaire des émetteurs', () => {
418
418
  const em = [
@@ -640,7 +640,7 @@ describe('conso_aux_distribution_ch - auxiliaires de distribution', () => {
640
640
 
641
641
  /**
642
642
  * 15.2.1 Chute nominale de température de dimensionnement ΔθDim
643
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
643
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
644
644
  */
645
645
  describe('getDeltaDim - chute nominale de température de dimensionnement', () => {
646
646
  const em = (temp, type = '10') => ({
@@ -674,7 +674,7 @@ describe('getDeltaDim - chute nominale de température de dimensionnement', () =
674
674
 
675
675
  /**
676
676
  * 15.2.3 Consommation des auxiliaires de distribution d'ECS
677
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
677
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
678
678
  *
679
679
  * Les scénarios ci-dessous s'appuient sur l'année réduite à Janvier (31 jours,
680
680
  * tefs = 10 °C) définie par les mocks en tête de fichier :
@@ -1,3 +1,4 @@
1
+ /** @import { EfConso, EpConso, SortieParEnergie } from './features/dpe/domain/models/sortie.model.js' */
1
2
  import enums from './enums.js';
2
3
  import { mois_liste, tv } from './utils.js';
3
4
  import tvs from './tv.js';
@@ -152,7 +153,7 @@ export class ProductionENR {
152
153
 
153
154
  /**
154
155
  * Récupération des consommations électriques pour ch et ecs
155
- * @type {SortieParEnergieItem}
156
+ * @type {SortieParEnergie}
156
157
  */
157
158
  let consoElec = conso.sortie_par_energie_collection.sortie_par_energie.find(
158
159
  (sortie) => sortie.enum_type_energie_id === '1'
@@ -302,7 +303,7 @@ export class ProductionENR {
302
303
  /**
303
304
  * Mise à jour des consommations ef en minorant l'énergie primaire consommée par l'énergie autoconsommée par chaque enveloppe
304
305
  * @param productionElectricite
305
- * @param conso {{ep_conso: Ep_conso}}
306
+ * @param conso {{ep_conso: EpConso}}
306
307
  * @param Sh {number}
307
308
  * @param coeff_ep_override {number?} coeff ep à surcharger si définit
308
309
  */
@@ -350,7 +351,7 @@ export class ProductionENR {
350
351
 
351
352
  /**
352
353
  * Calcul des taux d'autoproduction consommés pour chaque enveloppe
353
- * @param efConso {Ef_conso}
354
+ * @param efConso {EfConso}
354
355
  * @param consoElec
355
356
  * @param ccom {number}
356
357
  * @param consoElecTotale {number}
@@ -3,7 +3,7 @@ import { describe, expect, test, it } from 'vitest';
3
3
 
4
4
  describe('production ENR unit tests', () => {
5
5
  /**
6
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf Page 103
6
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf Page 103
7
7
  */
8
8
  const productionENR = new ProductionENR();
9
9
 
@@ -23,7 +23,7 @@ const { default: calc_conso_eclairage } = await import('./16_conso_eclairage.js'
23
23
 
24
24
  /**
25
25
  * 16.1 Consommation d'éclairage (Cecl)
26
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §16.1
26
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §16.1
27
27
  *
28
28
  * Cecl = (C * Pecl * Nh) / 1000 avec C = 0.9 (interrupteur) et Pecl = 1.4 W/m²
29
29
  * Nh = nombre d'heures de fonctionnement de l'éclairage, fonction de la zone climatique.
@@ -45,7 +45,7 @@ function plancherHaut({ typeAdjacence = 'extérieur', typeIsolation = 'isolé' }
45
45
 
46
46
  /**
47
47
  * Indicateur de confort d'été
48
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe confort d'été
48
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe confort d'été
49
49
  */
50
50
  describe("calc_confort_ete - indicateur de confort d'été", () => {
51
51
  test('inertie lourde + aspect traversant : niveau « bon »', () => {
@@ -120,7 +120,7 @@ export default function calc_qualite_isolation(enveloppe, dp) {
120
120
  * Il ne prend en compte QUE les déperditions par les parois et les ponts thermiques :
121
121
  * les déperditions par renouvellement d'air (DR) sont volontairement exclues
122
122
  * (cf. issue #45).
123
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe 8 (indicateurs de qualité d'isolation)
123
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe 8 (indicateurs de qualité d'isolation)
124
124
  */
125
125
  const deperdition =
126
126
  dp.deperdition_mur +
@@ -9,7 +9,7 @@ const { default: calc_qualite_isolation, qualite_isol } =
9
9
 
10
10
  /**
11
11
  * Qualité de l'isolation
12
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe qualité d'isolation
12
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe qualité d'isolation
13
13
  */
14
14
  describe('qualite_isol - classement selon les seuils U', () => {
15
15
  const seuils = [0.3, 0.45, 0.65];
@@ -123,7 +123,7 @@ describe('calc_qualite_isolation - agrégation et classement', () => {
123
123
  /**
124
124
  * Ubat est un coefficient de transmission surfacique moyen : il exclut les
125
125
  * déperditions par renouvellement d'air (DR).
126
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe 8 / issue #45
126
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - annexe 8 / issue #45
127
127
  */
128
128
  test("les déperditions par renouvellement d'air (DR) ne sont pas prises en compte dans ubat", () => {
129
129
  const env = enveloppe({
package/3.1_b.spec.js CHANGED
@@ -54,7 +54,7 @@ afterEach(() => {
54
54
 
55
55
  /**
56
56
  * 3.1 Coefficient de réduction des déperditions (b)
57
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.1
57
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.1
58
58
  */
59
59
  describe('findRanges - encadrement du rapport surface_aiu / surface_aue', () => {
60
60
  const ranges = [0.25, 0.5, 0.75, 1, 1.25, 2, 2.5, 3, 3.5, 4, 6, 8, 10, 25, 50];
package/3.2.1_mur.js CHANGED
@@ -1,3 +1,4 @@
1
+ /** @import { MurDE, MurDI } from './features/dpe/domain/models/mur.model.js' */
1
2
  import enums from './enums.js';
2
3
  import {
3
4
  tv,
@@ -24,7 +25,7 @@ const scriptName = new URL(import.meta.url).pathname.split('/').pop();
24
25
  * logiciels) : colonne la plus proche, et en cas d'égalité la colonne inférieure (la plus
25
26
  * défavorable thermiquement). Les bornes ouvertes « ≤ x » / « ≥ x » sont ramenées à x.
26
27
  *
27
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
28
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
28
29
  *
29
30
  * @param enumMateriauxStructureMurId {string|number}
30
31
  * @param epaisseur {number|string}
@@ -87,7 +88,7 @@ function matcherEpaisseurTable(matcher) {
87
88
  * 2, 3 - pierre de taille et moellons ; 4 - pisé / béton de terre ; 5, 6 - pan de bois (colombage) ;
88
89
  * 7 - bois (rondin) ; 8, 9 - briques pleines ; 21 - autre matériau traditionnel ancien.
89
90
  *
90
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
91
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
91
92
  * @see https://github.com/Open3CL/engine/issues/295
92
93
  */
93
94
  export const MATERIAUX_PAROI_ANCIENNE = [2, 3, 4, 5, 6, 7, 8, 9, 21];
@@ -99,7 +100,7 @@ export const MATERIAUX_PAROI_ANCIENNE = [2, 3, 4, 5, 6, 7, 8, 9, 21];
99
100
  * La méthode ne précise pas de règle d'interpolation pour Umur0 : cette valeur n'est utilisée qu'en
100
101
  * compatibilité (bug_for_bug), lorsque le DPE d'origine l'a manifestement appliquée.
101
102
  *
102
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
103
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
103
104
  * @see https://github.com/Open3CL/engine/issues/295
104
105
  *
105
106
  * @param enumMateriauxStructureMurId {string|number}
@@ -204,7 +205,7 @@ function tv_umur0(di, de, du) {
204
205
  * Certains logiciels interpolent Umur0 entre les deux colonnes d'épaisseur qui encadrent
205
206
  * l'épaisseur saisie (ex : 2,28 pour un béton banché de 32 cm, entre 30 et 35 cm).
206
207
  * Si l'Umur0 du DPE correspond à cette interpolation (tolérance empirique de 0,006), on la reprend.
207
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
208
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
208
209
  * @see https://github.com/Open3CL/engine/issues/295
209
210
  */
210
211
  if (bug_for_bug_compat && du.umur0_avant !== undefined) {
@@ -260,7 +261,7 @@ function tv_umur(di, de, du, pc_id, zc, effetJoule) {
260
261
  enum_zone_climatique_id: zc,
261
262
  effet_joule: effetJoule
262
263
  };
263
- const row = tv('umur', matcher, de);
264
+ const row = tv('umur', matcher);
264
265
  if (row) {
265
266
  di.umur = Number(row.umur);
266
267
  de.tv_umur_id = Number(row.tv_umur_id);
@@ -330,7 +331,7 @@ function calc_umur0(di, de, du, versionDpe) {
330
331
  * DPE antérieurs à la version 2.4 : certains logiciels n'y cumulent déjà pas le doublage avec une
331
332
  * isolation ITE/ITI. Si l'Umur0 du DPE vaut min(2,5 ; Umur0 de la paroi nue), le doublage n'a pas
332
333
  * été appliqué : on ne l'applique pas non plus.
333
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
334
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
334
335
  * @see https://github.com/Open3CL/engine/issues/295
335
336
  */
336
337
  if (
@@ -376,7 +377,7 @@ function calc_umur0(di, de, du, versionDpe) {
376
377
  * intègre l'enduit. Si l'Umur du DPE vaut min(2,5 ; Umur0 avec enduit), le DPE a bien appliqué
377
378
  * l'enduit : l'Umur0 d'origine ne doit pas être conservé.
378
379
  * Garde : l'enduit isolant ne vaut que pour les parois anciennes (MATERIAUX_PAROI_ANCIENNE).
379
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
380
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
380
381
  * @see https://github.com/Open3CL/engine/issues/295
381
382
  */
382
383
  const enduitAppliqueDansDpe =
@@ -510,8 +511,8 @@ export default function calc_mur(mur, zc, pc_id, effetJoule, versionDpe) {
510
511
  * Vérification si le calcul des déperditions des murs utilisent, dans le DPE d'origine, une minoration à 2.5 de Umur0
511
512
  * pour l'application du doublage
512
513
  * @param type_doublage {number}
513
- * @param di {Donnee_intermediaire}
514
- * @param de {Donnee_entree}
514
+ * @param di {MurDI}
515
+ * @param de {MurDE}
515
516
  * @param umur0_avant {number}
516
517
  * @param umur_avant {number}
517
518
  */
package/3.2.1_mur.spec.js CHANGED
@@ -106,7 +106,7 @@ beforeEach(() => {
106
106
 
107
107
  /**
108
108
  * 3.2.1 Coefficient de transmission des murs (Umur)
109
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
109
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
110
110
  */
111
111
  describe('calc_mur - mur non isolé', () => {
112
112
  test('type de paroi inconnu : Umur0 = 2,5 et Umur = min(Umur0 ; 2,5)', () => {
@@ -710,8 +710,7 @@ describe('calc_mur - table forfaitaire (Umur)', () => {
710
710
  enum_periode_construction_id: '1',
711
711
  enum_zone_climatique_id: 'h1a',
712
712
  effet_joule: '0'
713
- }),
714
- mur.donnee_entree
713
+ })
715
714
  );
716
715
  // min(0,5 ; 2,5) = 0,5
717
716
  expect(mur.donnee_intermediaire.umur).toBe(0.5);
@@ -732,8 +731,7 @@ describe('calc_mur - table forfaitaire (Umur)', () => {
732
731
 
733
732
  expect(tv).toHaveBeenCalledWith(
734
733
  'umur',
735
- expect.objectContaining({ enum_periode_construction_id: '6' }),
736
- mur.donnee_entree
734
+ expect.objectContaining({ enum_periode_construction_id: '6' })
737
735
  );
738
736
  });
739
737
 
@@ -751,8 +749,7 @@ describe('calc_mur - table forfaitaire (Umur)', () => {
751
749
 
752
750
  expect(tv).toHaveBeenCalledWith(
753
751
  'umur',
754
- expect.objectContaining({ enum_periode_construction_id: '5' }),
755
- mur.donnee_entree
752
+ expect.objectContaining({ enum_periode_construction_id: '5' })
756
753
  );
757
754
  });
758
755
 
@@ -790,8 +787,7 @@ describe('calc_mur - année de construction saisie (table forfaitaire)', () => {
790
787
 
791
788
  expect(tv).toHaveBeenCalledWith(
792
789
  'umur',
793
- expect.objectContaining({ enum_periode_construction_id: '6' }),
794
- mur.donnee_entree
790
+ expect.objectContaining({ enum_periode_construction_id: '6' })
795
791
  );
796
792
  warn.mockRestore();
797
793
  });
@@ -827,8 +823,7 @@ describe('calc_mur - année de construction saisie (table forfaitaire)', () => {
827
823
  // parseInt(getKeyByValue(periode_isolation, '1975-1977'), 10) = 2 (nombre)
828
824
  expect(tv).toHaveBeenCalledWith(
829
825
  'umur',
830
- expect.objectContaining({ enum_periode_construction_id: 2 }),
831
- mur.donnee_entree
826
+ expect.objectContaining({ enum_periode_construction_id: 2 })
832
827
  );
833
828
  expect(warn).toHaveBeenCalled();
834
829
  warn.mockRestore();
@@ -867,8 +862,7 @@ describe('calc_mur - année de construction saisie (table forfaitaire)', () => {
867
862
  // Le dernier appel forfaitaire réutilise la période de construction d'origine ('1')
868
863
  expect(tv).toHaveBeenLastCalledWith(
869
864
  'umur',
870
- expect.objectContaining({ enum_periode_construction_id: '1' }),
871
- mur.donnee_entree
865
+ expect.objectContaining({ enum_periode_construction_id: '1' })
872
866
  );
873
867
  warn.mockRestore();
874
868
  });
@@ -887,8 +881,7 @@ describe('calc_mur - année de construction saisie (table forfaitaire)', () => {
887
881
 
888
882
  expect(tv).toHaveBeenCalledWith(
889
883
  'umur',
890
- expect.objectContaining({ enum_periode_construction_id: '5' }),
891
- mur.donnee_entree
884
+ expect.objectContaining({ enum_periode_construction_id: '5' })
892
885
  );
893
886
  expect(warn).not.toHaveBeenCalled();
894
887
  warn.mockRestore();
@@ -930,8 +923,7 @@ describe('calc_mur - bug_for_bug sur tv_umur (récupération depuis tv_umur_id)'
930
923
  // Le matcher final utilise l'effet Joule ('1') et la période ('5') issus du DPE
931
924
  expect(tv).toHaveBeenLastCalledWith(
932
925
  'umur',
933
- expect.objectContaining({ effet_joule: '1', enum_periode_construction_id: '5' }),
934
- mur.donnee_entree
926
+ expect.objectContaining({ effet_joule: '1', enum_periode_construction_id: '5' })
935
927
  );
936
928
  error.mockRestore();
937
929
  });
@@ -1077,7 +1069,7 @@ describe('calc_mur - doublage et isolation ITE/ITI (#146)', () => {
1077
1069
  * 3.2.1.2 Calcul des Umur0 : l'épaisseur saisie est ramenée sur une colonne de la table du
1078
1070
  * matériau déclaré, sans jamais basculer vers un autre matériau (issue #138).
1079
1071
  * Convention (la méthode ne précise pas l'arrondi) : colonne la plus proche, égalité => inférieure.
1080
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
1072
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1.2
1081
1073
  */
1082
1074
  describe('epaisseurStructureTable - épaisseur hors table (issue #138)', () => {
1083
1075
  test.each([
@@ -1138,7 +1130,7 @@ describe('epaisseurStructureTable - épaisseur hors table (issue #138)', () => {
1138
1130
 
1139
1131
  /**
1140
1132
  * Correctifs de compatibilité (bug_for_bug) sur les murs.
1141
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
1133
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.1
1142
1134
  * @see https://github.com/Open3CL/engine/issues/295
1143
1135
  */
1144
1136
  describe('issue #295 - enduit isolant sur paroi ancienne (MUR1)', () => {
@@ -9,7 +9,7 @@ function tv_upb0(di, de, du) {
9
9
  const matcher = {
10
10
  enum_type_plancher_bas_id: de.enum_type_plancher_bas_id
11
11
  };
12
- const row = tv('upb0', matcher, de);
12
+ const row = tv('upb0', matcher);
13
13
  if (row) {
14
14
  di.upb0 = Number(row.upb0);
15
15
  de.tv_upb0_id = Number(row.tv_upb0_id);
@@ -44,7 +44,7 @@ function tv_upb(di, de, du, pc_id, zc, effetJoule) {
44
44
  enum_zone_climatique_id: zc,
45
45
  effet_joule: effetJoule
46
46
  };
47
- const row = tv('upb', matcher, de);
47
+ const row = tv('upb', matcher);
48
48
  if (row) {
49
49
  di.upb = Number(row.upb);
50
50
  de.tv_upb_id = Number(row.tv_upb_id);
@@ -61,7 +61,7 @@ const values_2s_p = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20];
61
61
  * (perimetre_ue) du seul plancher courant, sans sommer les autres planchers de même adjacence.
62
62
  * Les valeurs absentes du tableau sont obtenues par interpolation linéaire sur upb.
63
63
  *
64
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2 (tableau ue)
64
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.2.2 (tableau ue)
65
65
  */
66
66
  function tv_ue(di, de, du, pc_id) {
67
67
  const type_adjacence = enums.type_adjacence[de.enum_type_adjacence_id];
@@ -84,6 +84,7 @@ function tv_ue(di, de, du, pc_id) {
84
84
  const surfaceUe = de.surface_ue || de.surface_paroi_opaque;
85
85
  const perimetreUe = de.perimetre_ue || 0;
86
86
 
87
+ /** @type {Record<string, any>} `2s_p` est d'abord numérique puis devient une regex (chaîne) */
87
88
  const matcher = {
88
89
  type_adjacence_plancher,
89
90
  '2s_p': Math.round((2 * surfaceUe) / perimetreUe)