@open3cl/engine 1.11.2 → 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 (154) 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/11_rdim_ecs_individuelle_unique.js +78 -0
  10. package/11_rdim_ecs_individuelle_unique.spec.js +136 -0
  11. package/12.4_pac.js +5 -3
  12. package/12.4_pac.spec.js +10 -18
  13. package/13.2_generateur_combustion.js +19 -16
  14. package/13.2_generateur_combustion.spec.js +10 -10
  15. package/13.2_generateur_combustion_bouilleur.js +5 -2
  16. package/13.2_generateur_combustion_bouilleur.spec.js +1 -1
  17. package/13.2_generateur_combustion_ch.js +8 -7
  18. package/13.2_generateur_combustion_ch.spec.js +7 -7
  19. package/13.2_generateur_combustion_chaudiere.js +5 -2
  20. package/13.2_generateur_combustion_chaudiere.spec.js +2 -2
  21. package/13.2_generateur_combustion_pdim.js +6 -6
  22. package/13.2_generateur_combustion_pdim.spec.js +1 -1
  23. package/13.2_generateur_combustion_pn.spec.js +1 -1
  24. package/13.2_generateur_pac.js +4 -1
  25. package/13.2_generateur_pac.spec.js +1 -1
  26. package/13_rendement_distribution_ecs.spec.js +1 -1
  27. package/14_generateur_ecs.js +2 -1
  28. package/14_generateur_ecs.spec.js +4 -4
  29. package/15_conso_aux.js +19 -17
  30. package/15_conso_aux.spec.js +8 -8
  31. package/16.2_production_enr.js +4 -3
  32. package/16.2_production_enr.spec.js +1 -1
  33. package/16_conso_eclairage.spec.js +1 -1
  34. package/2021_04_13_confort_ete.spec.js +1 -1
  35. package/2021_04_13_qualite_isolation.js +1 -1
  36. package/2021_04_13_qualite_isolation.spec.js +2 -2
  37. package/3.1_b.spec.js +1 -1
  38. package/3.2.1_mur.js +10 -9
  39. package/3.2.1_mur.spec.js +11 -19
  40. package/3.2.2_plancher_bas.js +4 -3
  41. package/3.2.2_plancher_bas.spec.js +10 -20
  42. package/3.2.3_plancher_haut.js +1 -1
  43. package/3.2.3_plancher_haut.spec.js +2 -2
  44. package/3.3.1.4_porte.js +1 -1
  45. package/3.3.1.4_porte.spec.js +2 -2
  46. package/3.3_baie_vitree.js +2 -2
  47. package/3.3_baie_vitree.spec.js +3 -3
  48. package/3.4_pont_thermique.js +6 -4
  49. package/3.4_pont_thermique.spec.js +7 -7
  50. package/3_deperdition.js +1 -0
  51. package/3_deperdition.spec.js +3 -3
  52. package/4_ventilation.js +2 -2
  53. package/4_ventilation.spec.js +1 -1
  54. package/5_conso_ventilation.spec.js +1 -1
  55. package/6.1_apport_gratuit.spec.js +2 -2
  56. package/6.2_surface_sud_equivalente.js +12 -9
  57. package/6.2_surface_sud_equivalente.spec.js +3 -3
  58. package/7_inertie.js +7 -4
  59. package/7_inertie.spec.js +1 -1
  60. package/8_intermittence.spec.js +1 -1
  61. package/9_besoin_ch.js +5 -3
  62. package/9_besoin_ch.spec.js +3 -3
  63. package/9_chauffage.js +12 -11
  64. package/9_chauffage.spec.js +7 -7
  65. package/9_conso_ch.spec.js +3 -3
  66. package/9_emetteur_ch.js +5 -5
  67. package/9_emetteur_ch.spec.js +1 -1
  68. package/9_generateur_ch.js +16 -13
  69. package/9_generateur_ch.spec.js +6 -6
  70. package/README.md +19 -19
  71. package/apport_et_besoin.spec.js +1 -1
  72. package/conso.js +18 -14
  73. package/conso.spec.js +3 -3
  74. package/core/assets/domain/synchronize-assets.js +2 -0
  75. package/core/assets/domain/synchronize-c1-tables.js +2 -0
  76. package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +2 -0
  77. package/core/assets/domain/synchronize-enum-tables.js +2 -0
  78. package/core/assets/domain/synchronize-solicitations-tables.js +2 -0
  79. package/core/assets/domain/synchronize-valeur-tables.js +6 -0
  80. package/core/file/infrastructure/adapter/csv-parser.store.js +2 -1
  81. package/dpe-sanitizer.service.js +1 -0
  82. package/engine.js +11 -2
  83. package/engine.spec.js +23 -2
  84. package/enums.d.ts +1257 -0
  85. package/features/dpe/domain/models/baie-ets.model.ts +8 -11
  86. package/features/dpe/domain/models/baie-vitree.model.ts +28 -96
  87. package/features/dpe/domain/models/climatisation.model.ts +13 -23
  88. package/features/dpe/domain/models/dpe-xsd.generated.ts +2797 -0
  89. package/features/dpe/domain/models/dpe.model.ts +105 -181
  90. package/features/dpe/domain/models/ets.model.ts +10 -18
  91. package/features/dpe/domain/models/installation-chauffage.model.ts +92 -99
  92. package/features/dpe/domain/models/installation-ecs.model.ts +45 -77
  93. package/features/dpe/domain/models/mur.model.ts +10 -38
  94. package/features/dpe/domain/models/plancher.model.ts +22 -63
  95. package/features/dpe/domain/models/pont-thermique.model.ts +10 -20
  96. package/features/dpe/domain/models/porte.model.ts +10 -30
  97. package/features/dpe/domain/models/production-elec-enr.model.ts +13 -27
  98. package/features/dpe/domain/models/sortie.model.ts +32 -176
  99. package/features/dpe/domain/models/type-generateur.model.js +4 -3
  100. package/features/dpe/domain/models/type-habitation.model.js +8 -6
  101. package/features/dpe/domain/models/type-stockage.model.js +4 -3
  102. package/features/dpe/domain/models/type-ventilation.model.js +4 -3
  103. package/features/dpe/domain/models/ventilation.model.ts +15 -25
  104. package/features/dpe/infrastructure/ch/chTv.store.js +2 -2
  105. package/features/dpe/infrastructure/ecs/ecsTv.store.js +3 -3
  106. package/features/dpe/infrastructure/enveloppe/baieVitreeTv.store.js +1 -1
  107. package/features/dpe/infrastructure/froid/frTv.store.js +3 -3
  108. package/features/dpe/infrastructure/froid/frTv.store.spec.js +1 -1
  109. package/features/dpe/infrastructure/tv.store.js +1 -1
  110. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.js +3 -0
  111. package/features/engine/domain/apport_et_besoin/apport_gratuit/apport-gratuit.service.js +3 -1
  112. package/features/engine/domain/apport_et_besoin/ch/besoin-ch.service.js +3 -1
  113. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.js +9 -3
  114. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +1 -1
  115. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.js +2 -1
  116. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.js +4 -1
  117. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.js +3 -1
  118. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.js +7 -2
  119. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +1 -1
  120. package/features/engine/domain/ch/emetteur-ch.service.js +3 -1
  121. package/features/engine/domain/ch/emetteur-ch.service.spec.js +1 -1
  122. package/features/engine/domain/ch/generateur-ch.service.js +4 -1
  123. package/features/engine/domain/ch/generateur-ch.service.spec.js +3 -3
  124. package/features/engine/domain/ch/installation-ch.service.js +2 -0
  125. package/features/engine/domain/conso/conso.service.js +2 -0
  126. package/features/engine/domain/conso/froid/conso-froid.service.js +5 -1
  127. package/features/engine/domain/contexte.builder.js +2 -0
  128. package/features/engine/domain/ecs/generateur-ecs.service.js +1 -0
  129. package/features/engine/domain/ecs/installation-ecs.service.js +3 -0
  130. package/features/engine/domain/engine.service.js +1 -0
  131. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +4 -1
  132. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +3 -0
  133. package/features/engine/domain/enveloppe/deperdition.service.js +8 -4
  134. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.js +4 -1
  135. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +3 -1
  136. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +3 -1
  137. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +2 -2
  138. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +4 -2
  139. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +9 -1
  140. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +1 -1
  141. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +3 -1
  142. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +3 -1
  143. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +1 -1
  144. package/features/engine/domain/logement/nadeq.service.js +1 -1
  145. package/features/engine/domain/logement/nadeq.service.spec.js +1 -1
  146. package/features/engine/domain/models/contexte.model.ts +2 -2
  147. package/features/normalizer/domain/dpe-normalizer.service.js +1 -0
  148. package/ficheTechnique.js +4 -2
  149. package/globals.d.ts +14 -0
  150. package/package.json +3 -2
  151. package/preprocessor/index.js +1 -0
  152. package/tv.d.ts +759 -0
  153. package/tvs.d.ts +2 -7
  154. package/utils.js +8 -6
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) => ({
package/9_chauffage.js CHANGED
@@ -1,3 +1,5 @@
1
+ /** @import { FullDpe } from './features/dpe/domain/models/dpe.model.js' */
2
+ /** @import { GenerateurChauffage, GenerateurChauffageDU, InstallationChauffage, InstallationChauffageDE } from './features/dpe/domain/models/installation-chauffage.model.js' */
1
3
  import { requestInput, Tbase, tv, tvColumnIDs } from './utils.js';
2
4
  import { calc_emetteur_ch } from './9_emetteur_ch.js';
3
5
  import {
@@ -195,9 +197,8 @@ export default function calc_chauffage(
195
197
  zc,
196
198
  principaux.includes(gen)
197
199
  );
198
- /* c8 ignore next 2 -- repli défensif inatteignable : donnee_utilisateur est toujours renseignée
199
- par la première boucle sur gen_ch ci-dessus */
200
- (gen.donnee_utilisateur = gen.donnee_utilisateur || {}).nbGenerateurCascade =
200
+ // donnee_utilisateur est toujours renseignée par la première boucle sur gen_ch ci-dessus
201
+ /** @type {GenerateurChauffageDU} */ (gen.donnee_utilisateur).nbGenerateurCascade =
201
202
  reseauCirculateurUnique(de.enum_cfg_installation_ch_id) ? 1 : gen_ch.length;
202
203
 
203
204
  calc_generateur_ch(
@@ -251,9 +252,9 @@ export default function calc_chauffage(
251
252
  * Comme le moteur de référence CSTB (Tribu, autotests État APP5-0-4/41/43), le générateur
252
253
  * prioritaire assure la totalité du besoin et son taux de charge est calculé avec sa seule Pn.
253
254
  *
254
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.3
255
- * @param gen_ch {GenerateurChauffageItem[]}
256
- * @return {GenerateurChauffageItem[]} générateurs principaux
255
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.3
256
+ * @param gen_ch {GenerateurChauffage[]}
257
+ * @return {GenerateurChauffage[]} générateurs principaux
257
258
  */
258
259
  export function generateursPrincipauxCascade(gen_ch) {
259
260
  const priorites = gen_ch.map((gen) => Number(gen.donnee_entree.priorite_generateur_cascade));
@@ -278,7 +279,7 @@ export function generateursPrincipauxCascade(gen_ch) {
278
279
  * collectif (cfg 10). Le circulateur unique n'est pas divisé par le nombre de générateurs.
279
280
  * Autotests CSTB IC4-0-1 (cfg 6, Tribu Caux_dist_ch = 8908,24 kWh), IC5-0-1 (cfg 8, 1777,76 kWh),
280
281
  * IC5-0-3 (cfg 10, 1951,90 kWh).
281
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
282
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
282
283
  * @param cfgInstallationId {string|number} enum_cfg_installation_ch_id
283
284
  * @return {boolean}
284
285
  */
@@ -332,8 +333,8 @@ function getProrataGenerateur(
332
333
 
333
334
  /**
334
335
  * Retourne le facteur de couverture solaire pour les maisons avec chauffage solaire
335
- * @param de {Donnee_entree}
336
- * @param zc_id {int}
336
+ * @param de {InstallationChauffageDE}
337
+ * @param zc_id {number}
337
338
  * @returns {number|*|null}
338
339
  */
339
340
  function tv_ch_facteur_couverture_solaire(de, zc_id) {
@@ -362,7 +363,7 @@ function tv_ch_facteur_couverture_solaire(de, zc_id) {
362
363
  * 13.2.1.2 Présence d’un ou plusieurs générateurs à combustion indépendants
363
364
  * Calcul du taux de charge cdimref et cdimrefDep pour chacun des générateurs
364
365
  *
365
- * @param installationChauffage {InstallationChauffageItem[]}
366
+ * @param installationChauffage {InstallationChauffage[]}
366
367
  * @param GV {number} déperdition de l'enveloppe
367
368
  * @param zcId {string} id de la zone climatique du bien
368
369
  * @param caId {string} id de la classe d'altitude du bien
@@ -421,7 +422,7 @@ export function tauxChargeForGenerator(installationChauffage, GV, caId, zcId, th
421
422
  * En immeuble, chaque installation est ramenée à l'échelle de l'immeuble par son rdim (y compris les
422
423
  * installations collectives : rdim est renseigné par le logiciel et déjà appliqué au GV avant correctif).
423
424
  *
424
- * @param installCh {InstallationChauffageItem}
425
+ * @param installCh {InstallationChauffage}
425
426
  * @param th {string} type d'habitation
426
427
  * @return {number}
427
428
  */
@@ -176,7 +176,7 @@ beforeEach(() => {
176
176
 
177
177
  /**
178
178
  * 9. Consommation de chauffage — orchestration
179
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
179
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
180
180
  */
181
181
  describe('calc_chauffage - cas nominal (1 générateur, 1 émetteur)', () => {
182
182
  test('agrège les consommations et renseigne les données intermédiaires', () => {
@@ -243,7 +243,7 @@ describe('calc_chauffage - cas nominal (1 générateur, 1 émetteur)', () => {
243
243
  /**
244
244
  * Longueur du réseau de l'installation de chauffage, même formule que la longueur de
245
245
  * bouclage ECS : Lb = 4 × (Sh / Niv)^0,5 + 6 × (Niv − 0,5)
246
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
246
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
247
247
  */
248
248
  describe('calc_lb_installation_ch - longueur du réseau de chauffage', () => {
249
249
  test.each([
@@ -442,7 +442,7 @@ describe('calc_chauffage - générateurs à combustion', () => {
442
442
  });
443
443
 
444
444
  /**
445
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.2.4 (prorata de Pch à la surface desservie)
445
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.2.4 (prorata de Pch à la surface desservie)
446
446
  */
447
447
  test('ratio surface chauffée de l’installation / Sh transmis pour la Pn estimée (issue #264)', () => {
448
448
  const ch = installation(
@@ -550,7 +550,7 @@ describe('calc_chauffage - générateurs à combustion', () => {
550
550
  * dimensionné pour tout le besoin (pas de division par le nombre de générateurs). La consommation
551
551
  * est ensuite répartie entre générateurs (division par nbGenWithAuxConsoDistribution).
552
552
  * Autotests CSTB IC4-0-2 / IC4-0-21 (cascade de 2 chaudières gaz, Tribu Pcirc = 1321,76 W).
553
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
553
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
554
554
  */
555
555
  describe('calc_chauffage - nombre de générateurs pris en compte pour le circulateur', () => {
556
556
  test('installation simple (cfg 1) avec 2 générateurs en cascade : circulateur unique', () => {
@@ -577,7 +577,7 @@ describe('calc_chauffage - nombre de générateurs pris en compte pour le circul
577
577
  * PAC (cfg 8) et base + appoint collectif (cfg 10) partagent le réseau ; le circulateur est
578
578
  * dimensionné pour tout le besoin, comme en installation simple (cfg 1).
579
579
  * Autotests CSTB IC4-0-1 (cfg 6), IC5-0-1 (cfg 8), IC5-0-3 (cfg 10).
580
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
580
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
581
581
  */
582
582
  describe('reseauCirculateurUnique', () => {
583
583
  test.each(['1', '6', '8', '10', 6, 8])('configuration %s : circulateur unique', (cfg) => {
@@ -641,7 +641,7 @@ describe('calc_chauffage - prorata entre générateurs', () => {
641
641
 
642
642
  /**
643
643
  * 13.2.1.3 Cascade de deux générateurs à combustion avec priorité
644
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.3
644
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.3
645
645
  */
646
646
  describe('calc_chauffage - cascade de générateurs à combustion avec priorité', () => {
647
647
  /** Deux chaudières (combustion) en cascade sur un seul émetteur. */
@@ -779,7 +779,7 @@ describe('calc_chauffage - initialisation défensive des données du générateu
779
779
 
780
780
  /**
781
781
  * 13.2.1.2 Taux de charge des générateurs à combustion (cdimref)
782
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.2
782
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.2
783
783
  */
784
784
  describe('tauxChargeForGenerator - taux de charge des générateurs à combustion', () => {
785
785
  /** Installation avec un générateur à combustion. */
@@ -66,7 +66,7 @@ function emetteur(i0, surface = 100, lien = '1') {
66
66
 
67
67
  /**
68
68
  * 9. Consommations de chauffage (Cch)
69
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
69
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
70
70
  */
71
71
  describe('conso_ch - configuration par défaut (installation simple)', () => {
72
72
  beforeEach(() => {
@@ -467,7 +467,7 @@ describe('conso_ch - installation collective base + appoint', () => {
467
467
  * bâtiment) est proratisé à la surface chauffée par l'installation, comme `bch`.
468
468
  * Tribu Calcul_installation.cs l.79-86 : bch = Bch1 × S_ratio / Rdim et
469
469
  * Bch1_mensuel × S_ratio / Rdim, avec S_ratio = Sh_chauffée × Rdim / Stotal.
470
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.8
470
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.8
471
471
  */
472
472
  describe('installation desservant une partie de l’immeuble (Sh_installation < Sh)', () => {
473
473
  function appelPartiel(pos, { pn = 0, Sh = 200, sInst = 100, bch = 25, rdim = 1 } = {}) {
@@ -645,7 +645,7 @@ describe('conso_ch - installation collective base + appoint', () => {
645
645
  * génération (§15.1 : Caux_g = Paux_g × Bch_générateur / Pn).
646
646
  * Autotests CSTB APP5-0-5 (relève de PAC, 0,8 / 0,2) et IC4-0-1 (relève d'une chaudière bois,
647
647
  * 0,75 / 0,25).
648
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9 et §15.1
648
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9 et §15.1
649
649
  */
650
650
  describe('conso_ch - besoin couvert par le générateur', () => {
651
651
  beforeEach(() => {
package/9_emetteur_ch.js CHANGED
@@ -43,7 +43,7 @@ function tv_rendement_emission(di, de) {
43
43
  const matcher = {
44
44
  enum_type_emission_distribution_id: de.enum_type_emission_distribution_id
45
45
  };
46
- const row = tv('rendement_emission', matcher, de);
46
+ const row = tv('rendement_emission', matcher);
47
47
  if (row) {
48
48
  di.rendement_emission = Number(row.re);
49
49
  de.tv_rendement_emission_id = Number(row.tv_rendement_emission_id);
@@ -56,7 +56,7 @@ function tv_rendement_regulation(di, de) {
56
56
  const matcher = {
57
57
  enum_type_emission_distribution_id: de.enum_type_emission_distribution_id
58
58
  };
59
- const row = tv('rendement_regulation', matcher, de);
59
+ const row = tv('rendement_regulation', matcher);
60
60
  if (row) {
61
61
  di.rendement_regulation = Number(row.rr);
62
62
  de.tv_rendement_regulation_id = Number(row.tv_rendement_regulation_id);
@@ -73,7 +73,7 @@ function tv_rendement_regulation(di, de) {
73
73
  */
74
74
  export function isIntermittenceCollectiveSaisie(de) {
75
75
  if (!bug_for_bug_compat || !de.tv_intermittence_id) return false;
76
- const row = tv('intermittence', { tv_intermittence_id: de.tv_intermittence_id }, de);
76
+ const row = tv('intermittence', { tv_intermittence_id: de.tv_intermittence_id });
77
77
  if (!row || !row.enum_type_installation_id) return false;
78
78
  return !row.enum_type_installation_id.split('|').includes('1');
79
79
  }
@@ -94,7 +94,7 @@ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id, isAppointIndiv
94
94
  const inertie = {
95
95
  tv_intermittence_id: de.tv_intermittence_id
96
96
  };
97
- row = tv('intermittence', inertie, de);
97
+ row = tv('intermittence', inertie);
98
98
 
99
99
  if (row && row.comptage_individuel) {
100
100
  hasComptage = row.comptage_individuel.includes('Présence');
@@ -128,7 +128,7 @@ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id, isAppointIndiv
128
128
  delete matcher.comptage_individuel;
129
129
  }
130
130
 
131
- row = tv('intermittence', matcher, de);
131
+ row = tv('intermittence', matcher);
132
132
  if (row) {
133
133
  di.i0 = Number(row.i0);
134
134
  de.tv_intermittence_id = Number(row.tv_intermittence_id);
@@ -81,7 +81,7 @@ function emetteur({
81
81
  * Tests pour le calcul du rendement de distribution pour chauffage (9_emetteur_ch.js)
82
82
  * Focus sur la correction du bug #170 : conservation du tv_rendement_distribution_ch_id
83
83
  * pour type_emission_distribution=41 ('Autres équipements').
84
- * @see : https://github.com/Open3CL/engine/issues/170
84
+ * @see https://github.com/Open3CL/engine/issues/170
85
85
  */
86
86
  describe('tv_rendement_distribution_ch - rendement de distribution CH', () => {
87
87
  test("type_emission=41 AVEC tv_rendement_distribution_ch_id=6 : conserve l'ID original", () => {
@@ -1,3 +1,6 @@
1
+ /** @import { FullDpe } from './features/dpe/domain/models/dpe.model.js' */
2
+ /** @import { EmetteurChauffage, GenerateurChauffageDE, GenerateurChauffageDI } from './features/dpe/domain/models/installation-chauffage.model.js' */
3
+ /** @import { GenerateurEcs, GenerateurEcsDE, GenerateurEcsDI } from './features/dpe/domain/models/installation-ecs.model.js' */
1
4
  import enums from './enums.js';
2
5
  import { requestInput, requestInputID, tv, tvColumnIDs } from './utils.js';
3
6
  import { conso_aux_distribution_ch, conso_aux_gen } from './15_conso_aux.js';
@@ -57,15 +60,15 @@ export function calc_Qrec_gen_j(gen_ch, nrefj, Bch_hp_j) {
57
60
  * l'usage est 'ecs' sont concernés. Les générateurs 'chauffage + ecs' sont déjà pris en compte via
58
61
  * la collection des générateurs de chauffage (cf. issue #153).
59
62
  *
60
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
63
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
61
64
  *
62
- * @param gen_ecs {GenerateurEcsItem}
65
+ * @param gen_ecs {GenerateurEcs}
63
66
  * @param nrefj {number}
64
67
  * @returns {number}
65
68
  */
66
69
  export function calc_Qrec_gen_ecs_j(gen_ecs, nrefj) {
67
70
  const de = gen_ecs.donnee_entree;
68
- const di = gen_ecs.donnee_intermediaire || {};
71
+ const di = /** @type {GenerateurEcsDI} */ (gen_ecs.donnee_intermediaire || {});
69
72
 
70
73
  if (!isGenerateurEcsSeulRecuperable(gen_ecs)) return 0;
71
74
 
@@ -78,12 +81,12 @@ export function calc_Qrec_gen_ecs_j(gen_ecs, nrefj) {
78
81
  * s'il a des pertes à l'arrêt (Qp0 > 0), s'il est en volume chauffé et si son usage est 'ecs' seul
79
82
  * (enum_usage_generateur_id = 2).
80
83
  *
81
- * @param gen_ecs {GenerateurEcsItem}
84
+ * @param gen_ecs {GenerateurEcs}
82
85
  * @returns {boolean}
83
86
  */
84
87
  export function isGenerateurEcsSeulRecuperable(gen_ecs) {
85
- const de = gen_ecs.donnee_entree || {};
86
- const di = gen_ecs.donnee_intermediaire || {};
88
+ const de = /** @type {GenerateurEcsDE} */ (gen_ecs.donnee_entree || {});
89
+ const di = /** @type {GenerateurEcsDI} */ (gen_ecs.donnee_intermediaire || {});
87
90
  return (
88
91
  Number(di.qp0 || 0) > 0 &&
89
92
  Number(de.position_volume_chauffe ?? 0) === 1 &&
@@ -95,7 +98,7 @@ function tv_rendement_generation(di, de, du) {
95
98
  const matcher = {
96
99
  enum_type_generateur_ch_id: requestInputID(de, du, 'type_generateur_ch')
97
100
  };
98
- const row = tv('rendement_generation', matcher, de);
101
+ const row = tv('rendement_generation', matcher);
99
102
  if (row) {
100
103
  di.rendement_generation = Number(row.rg);
101
104
  di.rg = di.rendement_generation;
@@ -128,8 +131,8 @@ export function type_generateur_ch(di, de, du, usage_generateur) {
128
131
  /**
129
132
  * Récupération du type de générateur
130
133
  * @param dpe {FullDpe}
131
- * @param de {Donnee_entree}
132
- * @param di {Donnee_intermediaire}
134
+ * @param de {GenerateurChauffageDE}
135
+ * @param di {GenerateurChauffageDI}
133
136
  * @param du {Object}
134
137
  */
135
138
  export function checkForGeneratorType(dpe, de, di, du) {
@@ -285,7 +288,7 @@ export function calc_generateur_ch(
285
288
  * ce générateur (part de base / d'appoint, relève), et non le besoin de toute l'installation.
286
289
  * Autotests CSTB APP5-0-5 (chaudière fioul en relève de PAC, Tribu Qaux_ch = 2,13 kWh) et
287
290
  * IC4-0-1 (chaudière en relève d'une chaudière bois).
288
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
291
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
289
292
  */
290
293
  const besoinGenerateur = besoinCouvert ?? bch;
291
294
  const besoinGenerateurDep = bch > 0 ? (bch_dep * besoinGenerateur) / bch : 0;
@@ -330,11 +333,11 @@ const TYPE_EMISSION_DISTRIBUTION_AERAULIQUE = 5;
330
333
  * aéraulique a donc des auxiliaires de distribution, bien que hasConsoForAuxDistribution l'exclue.
331
334
  * L'émetteur est rattaché au générateur s'il est seul, ou par enum_lien_generateur_emetteur_id.
332
335
  *
333
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
336
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
334
337
  * @see Tribu Calcul_installation.cs (calcul_Cauxiliaires), Calcul_batiment.cs (Calcul_Cauxiliaires)
335
338
  * @see https://github.com/Open3CL/engine/issues/291
336
- * @param em_ch {EmetteurChauffageItem[]}
337
- * @param de {Donnee_entree} donnée d'entrée du générateur de chauffage
339
+ * @param em_ch {EmetteurChauffage[]}
340
+ * @param de {GenerateurChauffageDE} donnée d'entrée du générateur de chauffage
338
341
  * @returns {boolean}
339
342
  */
340
343
  export function hasEmetteurAerauliqueLie(em_ch, de) {
@@ -94,7 +94,7 @@ beforeEach(() => {
94
94
 
95
95
  /**
96
96
  * 9.1.1 Pertes récupérées de génération pour le chauffage (Qrec_gen)
97
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
97
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
98
98
  */
99
99
  describe('calc_Qrec_gen_j - pertes de génération récupérées', () => {
100
100
  /** Générateur minimal en volume chauffé, non "air chaud". */
@@ -159,7 +159,7 @@ describe('calc_Qrec_gen_j - pertes de génération récupérées', () => {
159
159
  * 9.1.1 Pertes récupérées de génération pour le chauffage : générateur de la collection ECS
160
160
  * assurant l'ECS uniquement (issue #153).
161
161
  * Dperj = Nrefj * 1790 / 8760 ; Qgen_rec_j = 0,48 * Cper * Qp0 * Dperj
162
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
162
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
163
163
  */
164
164
  describe('calc_Qrec_gen_ecs_j / isGenerateurEcsSeulRecuperable - générateur ECS seul', () => {
165
165
  /** Générateur ECS seul (usage 2), en volume chauffé, avec Qp0 = 100 W. */
@@ -355,7 +355,7 @@ describe('checkForGeneratorType - classification du générateur', () => {
355
355
 
356
356
  /**
357
357
  * Chaudière fioul par défaut : chaudière standard datant de la construction du bâtiment.
358
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.2.1.1
358
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.2.1.1
359
359
  */
360
360
  describe('cas 119 : chaudière fioul par défaut selon l’année de construction', () => {
361
361
  beforeEach(() => {
@@ -397,7 +397,7 @@ describe('checkForGeneratorType - classification du générateur', () => {
397
397
 
398
398
  /**
399
399
  * 15 Consommations d'auxiliaires de distribution : générateurs concernés.
400
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15
400
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15
401
401
  */
402
402
  describe('hasConsoForAuxDistribution - éligibilité aux auxiliaires de distribution', () => {
403
403
  test('générateurs éligibles (chacune des plages)', () => {
@@ -428,7 +428,7 @@ describe('hasConsoForAuxDistribution - éligibilité aux auxiliaires de distribu
428
428
  /**
429
429
  * 15.2 Réseau aéraulique (émetteur 5) rattaché au générateur : auxiliaires de distribution calculés
430
430
  * quel que soit le générateur, comme le moteur de référence (#291).
431
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
431
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
432
432
  */
433
433
  describe('hasEmetteurAerauliqueLie - réseau aéraulique rattaché au générateur', () => {
434
434
  const em = (ed, lien) => ({
@@ -688,7 +688,7 @@ describe('calc_generateur_ch - orchestration du calcul générateur', () => {
688
688
  * effectivement couvert par le générateur (retourné par conso_ch : part de relève, de base ou
689
689
  * d'appoint) et non le besoin de toute l'installation.
690
690
  * Autotest CSTB APP5-0-5 : chaudière fioul en relève de PAC (part 0,2), Tribu Qaux_ch = 2,13 kWh.
691
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
691
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
692
692
  */
693
693
  describe('calc_generateur_ch - besoin couvert transmis aux auxiliaires de génération', () => {
694
694
  const dpe = {
package/README.md CHANGED
@@ -383,15 +383,15 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
383
383
 
384
384
  <!-- CORPUS:START -->
385
385
 
386
- > **Version `1.10.0`** · branche `main` · généré le 2026-10-29
386
+ > **Version `1.11.3`** · branche `main` · généré le 2026-11-07
387
387
  > Seuil de tolérance **5%**
388
388
 
389
389
  <table>
390
390
  <tr>
391
391
  <td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
392
392
  <td align="center"><strong>88 475</strong><br/><sub>DPE analysés</sub></td>
393
- <td align="center"><strong>75 700</strong><br/><sub>DPE conformes</sub></td>
394
- <td align="center"><strong>85,56 %</strong><br/><sub>réussite globale</sub></td>
393
+ <td align="center"><strong>75 961</strong><br/><sub>DPE conformes</sub></td>
394
+ <td align="center"><strong>85,86 %</strong><br/><sub>réussite globale</sub></td>
395
395
  </tr>
396
396
  </table>
397
397
 
@@ -402,9 +402,9 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
402
402
  | 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **93,36 %** | `███████████████████░` | 9 180 / 9 833 |
403
403
  | 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **92,14 %** | `██████████████████░░` | 9 003 / 9 771 |
404
404
  | 🟢 | **Maison individuelle (2026)**<br/><sub>`dpe_maison_individuelle_2026.csv`</sub> | **90,46 %** | `██████████████████░░` | 9 046 / 10 000 |
405
- | 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **89,13 %** | `██████████████████░░` | 8 680 / 9 739 |
406
- | 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **86,04 %** | `█████████████████░░░` | 8 539 / 9 924 |
407
- | 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **70,50 %** | `██████████████░░░░░░` | 6 748 / 9 571 |
405
+ | 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **89,23 %** | `██████████████████░░` | 8 690 / 9 739 |
406
+ | 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **86,17 %** | `█████████████████░░░` | 8 552 / 9 924 |
407
+ | 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **72,99 %** | `███████████████░░░░░` | 6 986 / 9 571 |
408
408
  | 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **57,83 %** | `████████████░░░░░░░░` | 5 678 / 9 818 |
409
409
 
410
410
  <sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
@@ -416,24 +416,24 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
416
416
 
417
417
  <table>
418
418
  <tr>
419
- <td align="center"><strong>5,64 ms</strong><br/><sub>moyenne</sub></td>
420
- <td align="center"><strong>4,87 ms</strong><br/><sub>médiane</sub></td>
421
- <td align="center"><strong>0,11 ms</strong><br/><sub>min</sub></td>
422
- <td align="center"><strong>957,0 ms</strong><br/><sub>max</sub></td>
419
+ <td align="center"><strong>5,25 ms</strong><br/><sub>moyenne</sub></td>
420
+ <td align="center"><strong>4,54 ms</strong><br/><sub>médiane</sub></td>
421
+ <td align="center"><strong>0,12 ms</strong><br/><sub>min</sub></td>
422
+ <td align="center"><strong>527,5 ms</strong><br/><sub>max</sub></td>
423
423
  </tr>
424
424
  </table>
425
425
 
426
426
  | Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
427
427
  | :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
428
- | **Appartement · chauffage individuel (2025)** | 4,00 ms | 3,58 ms | 1,42 ms | 34,6 ms | 6,99 ms | 9,30 ms |
429
- | **Appartement · chauffage collectif (2025)** | 4,46 ms | 4,04 ms | 1,62 ms | 42,4 ms | 7,33 ms | 9,33 ms |
430
- | **Logement individuel (2025)** | 5,20 ms | 4,57 ms | 1,74 ms | 56,0 ms | 9,72 ms | 13,5 ms |
431
- | **Maison individuelle (2025)** | 6,01 ms | 5,41 ms | 2,04 ms | 51,8 ms | 10,7 ms | 14,3 ms |
432
- | **Maison individuelle (2026)** | 6,16 ms | 5,47 ms | 2,09 ms | 46,7 ms | 11,1 ms | 15,1 ms |
433
- | **Immeuble · chauffage collectif** | 5,81 ms | 4,91 ms | 0,14 ms | 126,7 ms | 10,9 ms | 17,7 ms |
434
- | **Immeuble · chauffage individuel** | 7,07 ms | 5,99 ms | 0,11 ms | 123,4 ms | 14,5 ms | 22,6 ms |
435
- | **Immeuble · chauffage mixte** | 5,73 ms | 4,63 ms | 0,20 ms | 957,0 ms | 11,9 ms | 19,7 ms |
436
- | **Individuel généré depuis l'immeuble (2026)** | 6,33 ms | 5,26 ms | 1,79 ms | 79,2 ms | 12,0 ms | 19,1 ms |
428
+ | **Appartement · chauffage individuel (2025)** | 3,67 ms | 3,30 ms | 1,36 ms | 43,8 ms | 6,43 ms | 8,54 ms |
429
+ | **Appartement · chauffage collectif (2025)** | 4,14 ms | 3,70 ms | 1,59 ms | 42,2 ms | 6,90 ms | 8,93 ms |
430
+ | **Logement individuel (2025)** | 5,04 ms | 4,49 ms | 1,81 ms | 55,4 ms | 9,25 ms | 13,0 ms |
431
+ | **Maison individuelle (2025)** | 5,94 ms | 5,28 ms | 2,04 ms | 59,1 ms | 10,7 ms | 14,7 ms |
432
+ | **Maison individuelle (2026)** | 6,03 ms | 5,39 ms | 1,92 ms | 53,8 ms | 10,6 ms | 14,6 ms |
433
+ | **Immeuble · chauffage collectif** | 5,29 ms | 4,48 ms | 0,14 ms | 123,7 ms | 9,60 ms | 16,3 ms |
434
+ | **Immeuble · chauffage individuel** | 6,07 ms | 5,12 ms | 0,12 ms | 111,3 ms | 12,3 ms | 20,4 ms |
435
+ | **Immeuble · chauffage mixte** | 5,17 ms | 4,19 ms | 0,19 ms | 527,5 ms | 11,0 ms | 17,2 ms |
436
+ | **Individuel généré depuis l'immeuble (2026)** | 5,91 ms | 4,90 ms | 1,80 ms | 83,7 ms | 11,1 ms | 18,6 ms |
437
437
 
438
438
  <sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
439
439
  dizaines de fois la médiane : c’est la médiane qui décrit le cas courant, et p95/p99 le cas
@@ -62,7 +62,7 @@ beforeEach(() => {
62
62
 
63
63
  /**
64
64
  * Calcul des apports et besoins (assembleur chauffage / froid / ECS)
65
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf
65
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf
66
66
  */
67
67
  describe('calc_apport_et_besoin', () => {
68
68
  test('agrège les besoins, apports et volumes ECS (climatisation présente)', () => {
package/conso.js CHANGED
@@ -1,3 +1,5 @@
1
+ /** @import { GenerateurChauffage, GenerateurChauffageDE, GenerateurChauffageDU } from './features/dpe/domain/models/installation-chauffage.model.js' */
2
+ /** @import { GenerateurEcs, GenerateurEcsDE, GenerateurEcsDU, InstallationEcs } from './features/dpe/domain/models/installation-ecs.model.js' */
1
3
  import enums from './enums.js';
2
4
  import calc_conso_eclairage from './16_conso_eclairage.js';
3
5
  import tvs from './tv.js';
@@ -219,7 +221,7 @@ export function masqueEnergie(groupe) {
219
221
  * Calcul_batiment.cs l.1318). Vérifié sur 927 / 1000 DPE ADEME appartement gaz collectif 2026.
220
222
  *
221
223
  * @param base {object} barème (prix unitaires et fonctions par tranches)
222
- * @param consoGroupe {function(masque): {total: number, collectif: number}} consommations EF
224
+ * @param consoGroupe {function(object): {total: number, collectif: number}} consommations EF
223
225
  * @param nbLogements {number} nombre de logements (1 hors immeuble)
224
226
  * @param genCollectifs {Set} générateurs de chauffage / ECS d'installations collectives
225
227
  * @param ratioSurfaceCollectif {number} SH_immeuble / SH_logement pour un appartement (1 sinon)
@@ -261,12 +263,12 @@ function coefPourGenerateur(coef, gen) {
261
263
  /**
262
264
  * Part d'appoint individuel (40 % du besoin, §9.1.6) de la consommation d'un convecteur
263
265
  * bi-jonction, mémorisée par conso_ch (9_conso_ch.js) ; 0 pour les autres générateurs.
264
- * @param gen {GenerateurChauffageItem}
266
+ * @param gen {GenerateurChauffage}
265
267
  * @param field {'conso_ch'|'conso_ch_depensier'}
266
268
  * @returns {number}
267
269
  */
268
270
  export function appointBijonction(gen, field) {
269
- const du = gen.donnee_utilisateur || {};
271
+ const du = /** @type {GenerateurChauffageDU} */ (gen.donnee_utilisateur || {});
270
272
  const appoint =
271
273
  field === 'conso_ch_depensier'
272
274
  ? du.conso_ch_appoint_bijonction_depensier
@@ -281,10 +283,10 @@ export function appointBijonction(gen, field) {
281
283
  * Moteur de référence CSTB : DPE.Core Calcul_batiment.cs l.861-872 (base Cch1 → conso_elec_coll_ch
282
284
  * si l'installation n'est pas individuelle) et l.912-915 (Cch_appoint_elec → conso_elec_indiv_ch),
283
285
  * Calcul_cout.cs l.149-172 (tarification séparée collectif / individuel).
284
- * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.6 (convecteurs bi-jonction)
286
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.6 (convecteurs bi-jonction)
285
287
  *
286
288
  * @param coef {object} barème issu de coefCoutProrata
287
- * @param gen {GenerateurChauffageItem}
289
+ * @param gen {GenerateurChauffage}
288
290
  * @param typeEnergie {string}
289
291
  * @param conso {number} consommation du générateur (base + appoint)
290
292
  * @param field {'conso_ch'|'conso_ch_depensier'}
@@ -444,7 +446,7 @@ const ENERGIE_MULTI_BATIMENT = {
444
446
 
445
447
  /**
446
448
  * Récupération du coefficient d'émission GES pour le générateur
447
- * @param gen_ch {GenerateurChauffageItem||GenerateurEcsItem}
449
+ * @param gen_ch {GenerateurChauffage|GenerateurEcs}
448
450
  * @param suffix {'ch'|'ecs'}
449
451
  * @param dateDpe {string} date d'établissement du DPE
450
452
  * @param versionLogiciel {string} version du logiciel de saisie
@@ -508,8 +510,9 @@ export default function calc_conso(
508
510
  value.donnee_entree.enum_methode_calcul_conso_id =
509
511
  ch.donnee_entree.enum_methode_calcul_conso_id;
510
512
  value.donnee_entree.enum_type_installation_id = ch.donnee_entree.enum_type_installation_id;
511
- (value.donnee_utilisateur = value.donnee_utilisateur || {}).coeffEmissionGes =
512
- getGesCoeffForGenerateur(value, 'ch', dateDpe, versionLogiciel);
513
+ /** @type {GenerateurChauffageDU} */ (
514
+ value.donnee_utilisateur = value.donnee_utilisateur || {}
515
+ ).coeffEmissionGes = getGesCoeffForGenerateur(value, 'ch', dateDpe, versionLogiciel);
513
516
  });
514
517
  return acc.concat(generateur_chauffage);
515
518
  }, []);
@@ -523,8 +526,9 @@ export default function calc_conso(
523
526
  generateur_ecs.forEach((value) => {
524
527
  value.donnee_entree.cle_repartition_ecs =
525
528
  (ecs.donnee_entree.cle_repartition_ecs || 1) * getRdimEcs(ecs);
526
- (value.donnee_utilisateur = value.donnee_utilisateur || {}).coeffEmissionGes =
527
- getGesCoeffForGenerateur(value, 'ecs', dateDpe, versionLogiciel);
529
+ /** @type {GenerateurEcsDU} */ (
530
+ value.donnee_utilisateur = value.donnee_utilisateur || {}
531
+ ).coeffEmissionGes = getGesCoeffForGenerateur(value, 'ecs', dateDpe, versionLogiciel);
528
532
  });
529
533
  }
530
534
  return acc.concat(generateur_ecs);
@@ -882,7 +886,7 @@ export function classe_emission_ges(emission_ges_5_usages_m2, zc_id, ca_id, Sh)
882
886
 
883
887
  /**
884
888
  Calcul de la consommation globale d'ECS
885
- * @param gen_ecs {Generateur_ecs_collection}
889
+ * @param gen_ecs {GenerateurEcs[]}
886
890
  * @param field {string}
887
891
  * @param coef {number}
888
892
  * @param prorataECS {number}
@@ -948,8 +952,8 @@ export function getAuxGenerationEcs(ecs, field, coef, prorataECS, facteurAc = 1)
948
952
 
949
953
  /**
950
954
  * Calcul de la consommation globale de chauffage
951
- * @param gen_ch {Generateur_chauffage_collection}
952
- * @param field {string}
955
+ * @param gen_ch {GenerateurChauffage[]}
956
+ * @param field {'conso_ch'|'conso_ch_depensier'}
953
957
  * @param coef {number}
954
958
  * @param prorataChauffage {number}
955
959
  * @param prefix {string}
@@ -1133,7 +1137,7 @@ function calc_conso_pond(
1133
1137
  /**
1134
1138
  * Retourne le type d'énergie utilisé.
1135
1139
  * 1 - Electricité par défaut si la donnée n'est pas définie
1136
- * @param donneeEntree {Donnee_entree}
1140
+ * @param donneeEntree {GenerateurChauffageDE|GenerateurEcsDE}
1137
1141
  * @param suffix {string} Suffix à ajouter au type électricité
1138
1142
  * @return {string}
1139
1143
  */