@open3cl/engine 1.8.12 → 1.8.13
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.
- package/3.4_pont_thermique.js +22 -0
- package/3.4_pont_thermique.spec.js +128 -0
- package/README.md +18 -18
- package/engine.js +1 -1
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +28 -2
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +125 -0
- package/package.json +3 -2
package/3.4_pont_thermique.js
CHANGED
|
@@ -213,6 +213,28 @@ function tv_k(pt_di, di, de, du, pc_id, logement) {
|
|
|
213
213
|
return;
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
+
/**
|
|
217
|
+
* 3.4 Calcul des déperditions par les ponts thermiques (issue #212)
|
|
218
|
+
* « Les ponts thermiques des parois au niveau des circulations communes ne sont pas pris en compte. »
|
|
219
|
+
* La règle porte sur les parois : elle s'applique au plancher de la liaison comme au mur.
|
|
220
|
+
* 14 à 18 - Circulations communes / halls d'entrée
|
|
221
|
+
* 22 - Local non déperditif (local à usage d'habitation chauffé)
|
|
222
|
+
*
|
|
223
|
+
* Ambiguïté : la méthode ne tranche pas explicitement le cas du plancher en adjacence 22 et les moteurs
|
|
224
|
+
* certifiés divergent (3cl-2024.6.1.0 exporte k = 0, Tribu 1.4.25.1 et BBS 2024.6.1.0 conservent la
|
|
225
|
+
* valeur forfaitaire sur les « planchers mitoyens »). Comme pour le mur ci-dessus, on s'appuie sur la
|
|
226
|
+
* valeur du DPE : k = 0 si le DPE a retenu k = 0, sinon la valeur forfaitaire est recalculée.
|
|
227
|
+
*/
|
|
228
|
+
if (
|
|
229
|
+
['14', '15', '16', '17', '18', '22'].includes(
|
|
230
|
+
String(plancher.donnee_entree.enum_type_adjacence_id)
|
|
231
|
+
) &&
|
|
232
|
+
pt_di.k === 0
|
|
233
|
+
) {
|
|
234
|
+
di.k = 0;
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
216
238
|
/**
|
|
217
239
|
* 3.4.3 Plancher haut / mur
|
|
218
240
|
* Les ponts thermiques des planchers haut en structure légère sont négligés.
|
|
@@ -889,3 +889,131 @@ describe('calc_pont_thermique - cas limites', () => {
|
|
|
889
889
|
expect(pt.donnee_intermediaire.k).toBeUndefined();
|
|
890
890
|
});
|
|
891
891
|
});
|
|
892
|
+
|
|
893
|
+
/**
|
|
894
|
+
* Issue #212 : l'exclusion des parois non déperditives s'applique aussi au plancher des liaisons
|
|
895
|
+
* plancher bas / mur et plancher haut lourd / mur, pas seulement au mur.
|
|
896
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
|
|
897
|
+
*/
|
|
898
|
+
describe('calc_pont_thermique - plancher sur paroi non déperditive (issue #212)', () => {
|
|
899
|
+
/** Mur extérieur lourd isolé ITI + plancher lourd isolé ITE avec l'adjacence donnée. */
|
|
900
|
+
function liaison(type_liaison, adjacencePlancher, k = 0.9) {
|
|
901
|
+
const mur = [
|
|
902
|
+
{
|
|
903
|
+
donnee_entree: { reference: 'M1', enum_type_adjacence_id: '1', type_isolation: 'iti' },
|
|
904
|
+
donnee_utilisateur: {}
|
|
905
|
+
}
|
|
906
|
+
];
|
|
907
|
+
const plancher = {
|
|
908
|
+
donnee_entree: {
|
|
909
|
+
reference: 'P1',
|
|
910
|
+
enum_type_adjacence_id: adjacencePlancher,
|
|
911
|
+
enum_type_plancher_bas_id: '1',
|
|
912
|
+
enum_type_plancher_haut_id: '1',
|
|
913
|
+
type_isolation: 'ite'
|
|
914
|
+
},
|
|
915
|
+
donnee_utilisateur: {}
|
|
916
|
+
};
|
|
917
|
+
const pt = pontThermique(
|
|
918
|
+
{
|
|
919
|
+
type_liaison,
|
|
920
|
+
enum_type_liaison_id: type_liaison === 'plancher bas / mur' ? '1' : '3',
|
|
921
|
+
reference_1: 'P1',
|
|
922
|
+
reference_2: 'M1',
|
|
923
|
+
description: 'plancher / mur'
|
|
924
|
+
},
|
|
925
|
+
k
|
|
926
|
+
);
|
|
927
|
+
return { mur, plancher, pt };
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
test('cas 2557E3382433Y : plancher bas sur local habitation chauffé (22), mur extérieur, k DPE nul : k = 0', () => {
|
|
931
|
+
const { mur, plancher, pt } = liaison('plancher bas / mur', '22', 0);
|
|
932
|
+
|
|
933
|
+
calc_pont_thermique(pt, '1', logement({ mur, pb: [plancher] }));
|
|
934
|
+
|
|
935
|
+
expect(pt.donnee_intermediaire.k).toBe(0);
|
|
936
|
+
expect(tv).not.toHaveBeenCalled();
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
test('plancher mitoyen (22) avec k DPE non nul (Tribu / BBS) : valeur forfaitaire recalculée', () => {
|
|
940
|
+
tv.mockReturnValue({ k: '0.71', tv_pont_thermique_id: '12' });
|
|
941
|
+
const { mur, plancher, pt } = liaison('plancher bas / mur', '22', 0.71);
|
|
942
|
+
|
|
943
|
+
calc_pont_thermique(pt, '1', logement({ mur, pb: [plancher] }));
|
|
944
|
+
|
|
945
|
+
expect(tv).toHaveBeenCalledWith('pont_thermique', {
|
|
946
|
+
enum_type_liaison_id: '1',
|
|
947
|
+
isolation_mur: '^iti$',
|
|
948
|
+
isolation_plancher: '^ite$'
|
|
949
|
+
});
|
|
950
|
+
expect(pt.donnee_intermediaire.k).toBe(0.71);
|
|
951
|
+
});
|
|
952
|
+
|
|
953
|
+
test('cas 2534E3387900I : plancher haut lourd sous local habitation chauffé (22), mur extérieur : k = 0', () => {
|
|
954
|
+
const { mur, plancher, pt } = liaison('plancher haut lourd / mur', '22', 0);
|
|
955
|
+
|
|
956
|
+
calc_pont_thermique(pt, '1', logement({ mur, ph: [plancher] }));
|
|
957
|
+
|
|
958
|
+
expect(pt.donnee_intermediaire.k).toBe(0);
|
|
959
|
+
expect(tv).not.toHaveBeenCalled();
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
test.each(['14', '15', '16', '17', '18'])(
|
|
963
|
+
'plancher bas sur circulation commune / hall (%s) avec k DPE nul : k = 0 sans accès table',
|
|
964
|
+
(adjacence) => {
|
|
965
|
+
const { mur, plancher, pt } = liaison('plancher bas / mur', adjacence, 0);
|
|
966
|
+
|
|
967
|
+
calc_pont_thermique(pt, '1', logement({ mur, pb: [plancher] }));
|
|
968
|
+
|
|
969
|
+
expect(pt.donnee_intermediaire.k).toBe(0);
|
|
970
|
+
expect(tv).not.toHaveBeenCalled();
|
|
971
|
+
}
|
|
972
|
+
);
|
|
973
|
+
|
|
974
|
+
test('plancher haut lourd sous circulation (14) avec k DPE nul : k = 0', () => {
|
|
975
|
+
const { mur, plancher, pt } = liaison('plancher haut lourd / mur', '14', 0);
|
|
976
|
+
|
|
977
|
+
calc_pont_thermique(pt, '1', logement({ mur, ph: [plancher] }));
|
|
978
|
+
|
|
979
|
+
expect(pt.donnee_intermediaire.k).toBe(0);
|
|
980
|
+
expect(tv).not.toHaveBeenCalled();
|
|
981
|
+
});
|
|
982
|
+
|
|
983
|
+
test('plancher bas sur hall (17) avec k DPE non nul : valeur forfaitaire conservée (même règle que pour le mur)', () => {
|
|
984
|
+
tv.mockReturnValue({ k: '0.71', tv_pont_thermique_id: '12' });
|
|
985
|
+
const { mur, plancher, pt } = liaison('plancher bas / mur', '17', 0.71);
|
|
986
|
+
|
|
987
|
+
calc_pont_thermique(pt, '1', logement({ mur, pb: [plancher] }));
|
|
988
|
+
|
|
989
|
+
expect(tv).toHaveBeenCalledWith('pont_thermique', {
|
|
990
|
+
enum_type_liaison_id: '1',
|
|
991
|
+
isolation_mur: '^iti$',
|
|
992
|
+
isolation_plancher: '^ite$'
|
|
993
|
+
});
|
|
994
|
+
expect(pt.donnee_intermediaire.k).toBe(0.71);
|
|
995
|
+
});
|
|
996
|
+
|
|
997
|
+
test('contre-test : plancher bas sur sous-sol non chauffé (6) : pont thermique compté (pas de b sur les PT)', () => {
|
|
998
|
+
tv.mockReturnValue({ k: '0.71', tv_pont_thermique_id: '12' });
|
|
999
|
+
const { mur, plancher, pt } = liaison('plancher bas / mur', '6', 0);
|
|
1000
|
+
|
|
1001
|
+
calc_pont_thermique(pt, '1', logement({ mur, pb: [plancher] }));
|
|
1002
|
+
|
|
1003
|
+
expect(tv).toHaveBeenCalledWith('pont_thermique', {
|
|
1004
|
+
enum_type_liaison_id: '1',
|
|
1005
|
+
isolation_mur: '^iti$',
|
|
1006
|
+
isolation_plancher: '^ite$'
|
|
1007
|
+
});
|
|
1008
|
+
expect(pt.donnee_intermediaire.k).toBe(0.71);
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
test('contre-test : plancher bas sur local tertiaire (20) : pont thermique compté', () => {
|
|
1012
|
+
tv.mockReturnValue({ k: '0.71', tv_pont_thermique_id: '12' });
|
|
1013
|
+
const { mur, plancher, pt } = liaison('plancher bas / mur', '20', 0.71);
|
|
1014
|
+
|
|
1015
|
+
calc_pont_thermique(pt, '1', logement({ mur, pb: [plancher] }));
|
|
1016
|
+
|
|
1017
|
+
expect(pt.donnee_intermediaire.k).toBe(0.71);
|
|
1018
|
+
});
|
|
1019
|
+
});
|
package/README.md
CHANGED
|
@@ -370,26 +370,26 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
370
370
|
|
|
371
371
|
<!-- CORPUS:START -->
|
|
372
372
|
|
|
373
|
-
> **Version `1.8.
|
|
373
|
+
> **Version `1.8.12`** · à publier · branche `main` · généré le 2026-10-02
|
|
374
374
|
> Seuil de tolérance **5%**
|
|
375
375
|
|
|
376
376
|
<table>
|
|
377
377
|
<tr>
|
|
378
378
|
<td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
|
|
379
379
|
<td align="center"><strong>89 990</strong><br/><sub>DPE analysés</sub></td>
|
|
380
|
-
<td align="center"><strong>59
|
|
381
|
-
<td align="center"><strong>66,
|
|
380
|
+
<td align="center"><strong>59 886</strong><br/><sub>DPE conformes</sub></td>
|
|
381
|
+
<td align="center"><strong>66,55 %</strong><br/><sub>réussite globale</sub></td>
|
|
382
382
|
</tr>
|
|
383
383
|
</table>
|
|
384
384
|
|
|
385
385
|
| | Corpus | Réussite | | DPE conformes |
|
|
386
386
|
| :-: | :---------------------------------------------------------------------------------------------------------------------- | ----------: | :--------------------- | -------------: |
|
|
387
|
-
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **46,
|
|
387
|
+
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **46,31 %** | `█████████░░░░░░░░░░░` | 4 631 / 10 000 |
|
|
388
388
|
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **91,80 %** | `██████████████████░░` | 9 180 / 10 000 |
|
|
389
389
|
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **88,70 %** | `██████████████████░░` | 8 863 / 9 992 |
|
|
390
390
|
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,40 %** | `██████████████████░░` | 8 840 / 10 000 |
|
|
391
391
|
| 🟡 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **74,14 %** | `███████████████░░░░░` | 7 413 / 9 999 |
|
|
392
|
-
| 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **70,
|
|
392
|
+
| 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **70,63 %** | `██████████████░░░░░░` | 7 063 / 10 000 |
|
|
393
393
|
| 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **62,52 %** | `█████████████░░░░░░░` | 6 251 / 9 999 |
|
|
394
394
|
| 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **49,06 %** | `██████████░░░░░░░░░░` | 4 906 / 10 000 |
|
|
395
395
|
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **27,39 %** | `█████░░░░░░░░░░░░░░░` | 2 739 / 10 000 |
|
|
@@ -403,24 +403,24 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
403
403
|
|
|
404
404
|
<table>
|
|
405
405
|
<tr>
|
|
406
|
-
<td align="center"><strong>5,
|
|
407
|
-
<td align="center"><strong>4,
|
|
408
|
-
<td align="center"><strong>0,
|
|
409
|
-
<td align="center"><strong>
|
|
406
|
+
<td align="center"><strong>5,49 ms</strong><br/><sub>moyenne</sub></td>
|
|
407
|
+
<td align="center"><strong>4,81 ms</strong><br/><sub>médiane</sub></td>
|
|
408
|
+
<td align="center"><strong>0,11 ms</strong><br/><sub>min</sub></td>
|
|
409
|
+
<td align="center"><strong>842,5 ms</strong><br/><sub>max</sub></td>
|
|
410
410
|
</tr>
|
|
411
411
|
</table>
|
|
412
412
|
|
|
413
413
|
| Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
|
|
414
414
|
| :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
|
|
415
|
-
| **Généraliste** | 4,
|
|
416
|
-
| **Appartement · chauffage individuel (2025)** | 3,
|
|
417
|
-
| **Logement individuel (2025)** | 5,
|
|
418
|
-
| **Maison individuelle (2025)** |
|
|
419
|
-
| **Immeuble · chauffage individuel** |
|
|
420
|
-
| **Appartement · chauffage collectif (2025)** | 4,
|
|
421
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
422
|
-
| **Immeuble · chauffage mixte** | 5,
|
|
423
|
-
| **Individuel généré depuis l'immeuble (2026)** |
|
|
415
|
+
| **Généraliste** | 4,60 ms | 4,18 ms | 0,22 ms | 34,3 ms | 8,29 ms | 11,3 ms |
|
|
416
|
+
| **Appartement · chauffage individuel (2025)** | 3,94 ms | 3,52 ms | 1,41 ms | 29,4 ms | 6,94 ms | 10,8 ms |
|
|
417
|
+
| **Logement individuel (2025)** | 5,12 ms | 4,56 ms | 1,59 ms | 38,6 ms | 9,60 ms | 13,1 ms |
|
|
418
|
+
| **Maison individuelle (2025)** | 6,45 ms | 5,83 ms | 1,90 ms | 41,6 ms | 11,7 ms | 15,6 ms |
|
|
419
|
+
| **Immeuble · chauffage individuel** | 6,64 ms | 5,67 ms | 0,11 ms | 74,6 ms | 13,5 ms | 21,9 ms |
|
|
420
|
+
| **Appartement · chauffage collectif (2025)** | 4,74 ms | 4,39 ms | 1,57 ms | 34,6 ms | 7,84 ms | 11,9 ms |
|
|
421
|
+
| **Immeuble · chauffage collectif** | 5,91 ms | 5,13 ms | 0,14 ms | 145,5 ms | 11,0 ms | 19,2 ms |
|
|
422
|
+
| **Immeuble · chauffage mixte** | 5,97 ms | 4,83 ms | 0,21 ms | 842,5 ms | 12,5 ms | 21,1 ms |
|
|
423
|
+
| **Individuel généré depuis l'immeuble (2026)** | 6,01 ms | 5,13 ms | 1,68 ms | 57,9 ms | 11,4 ms | 17,9 ms |
|
|
424
424
|
|
|
425
425
|
<sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
|
|
426
426
|
dizaines de fois la médiane : c’est la médiane qui décrit le cas courant, et p95/p99 le cas
|
package/engine.js
CHANGED
|
@@ -33,7 +33,7 @@ import getFicheTechnique from './ficheTechnique.js';
|
|
|
33
33
|
import { ProductionENR } from './16.2_production_enr.js';
|
|
34
34
|
import DpeSanitizerService from './dpe-sanitizer.service.js';
|
|
35
35
|
|
|
36
|
-
const LIB_VERSION = '1.8.
|
|
36
|
+
const LIB_VERSION = '1.8.13';
|
|
37
37
|
|
|
38
38
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
39
39
|
|
package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js
CHANGED
|
@@ -175,7 +175,10 @@ export class DeperditionPontThermiqueService extends DeperditionService {
|
|
|
175
175
|
return this.defaultValue(pontThermiqueDE);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
if (
|
|
178
|
+
if (
|
|
179
|
+
!this.plancherHasPontThermiqueAdjacence(plancherBasDE) ||
|
|
180
|
+
!this.plancherBasHasPontThermique(plancherBasDE)
|
|
181
|
+
) {
|
|
179
182
|
return 0;
|
|
180
183
|
}
|
|
181
184
|
|
|
@@ -206,7 +209,10 @@ export class DeperditionPontThermiqueService extends DeperditionService {
|
|
|
206
209
|
return this.defaultValue(pontThermiqueDE);
|
|
207
210
|
}
|
|
208
211
|
|
|
209
|
-
if (
|
|
212
|
+
if (
|
|
213
|
+
!this.plancherHasPontThermiqueAdjacence(plancherHautDE) ||
|
|
214
|
+
!this.plancherHautHasPontThermique(plancherHautDE)
|
|
215
|
+
) {
|
|
210
216
|
return 0;
|
|
211
217
|
}
|
|
212
218
|
|
|
@@ -391,6 +397,26 @@ export class DeperditionPontThermiqueService extends DeperditionService {
|
|
|
391
397
|
return true;
|
|
392
398
|
}
|
|
393
399
|
|
|
400
|
+
/**
|
|
401
|
+
* Retourne true si l'adjacence du plancher (bas ou haut) permet un pont thermique avec le mur (issue #212)
|
|
402
|
+
*
|
|
403
|
+
* 3.4 Calcul des déperditions par les ponts thermiques
|
|
404
|
+
* Les ponts thermiques des parois au niveau des circulations communes ne sont pas pris en compte.
|
|
405
|
+
* La règle porte sur les parois en général : elle s'applique au plancher de la liaison comme au mur.
|
|
406
|
+
* 14 - Circulation sans ouverture directe sur l'extérieur
|
|
407
|
+
* 15 - Circulation avec ouverture directe sur l'extérieur
|
|
408
|
+
* 16 - Circulation avec bouche ou gaine de désenfumage ouverte en permanence
|
|
409
|
+
* 17 - Hall d'entrée avec dispositif de fermeture automatique
|
|
410
|
+
* 18 - Hall d'entrée sans dispositif de fermeture automatique
|
|
411
|
+
* 22 - Local non déperditif (local à usage d'habitation chauffé) : le plancher n'est pas déperditif
|
|
412
|
+
*
|
|
413
|
+
* @param plancherDE {PlancherBasDE|PlancherHautDE}
|
|
414
|
+
* @return {boolean}
|
|
415
|
+
*/
|
|
416
|
+
plancherHasPontThermiqueAdjacence(plancherDE) {
|
|
417
|
+
return ![14, 15, 16, 17, 18, 22].includes(parseInt(plancherDE.enum_type_adjacence_id));
|
|
418
|
+
}
|
|
419
|
+
|
|
394
420
|
/**
|
|
395
421
|
* Retourne true si le plancher haut est concerné par un pont thermique
|
|
396
422
|
* @param plancherHautDE {PlancherHautDE}
|
package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
2
|
+
import { DeperditionPontThermiqueService } from './deperdition-pont-thermique.service.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Tests unitaires isolés de `DeperditionPontThermiqueService` (nouvelle architecture).
|
|
6
|
+
*
|
|
7
|
+
* Le store des tables de valeurs et les services de déperdition des parois sont remplacés par des
|
|
8
|
+
* doubles de test : seule la logique propre au service (exclusions de ponts thermiques) est vérifiée.
|
|
9
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §3.4
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
let tvStore;
|
|
13
|
+
let murService;
|
|
14
|
+
let plancherHautService;
|
|
15
|
+
let plancherBasService;
|
|
16
|
+
|
|
17
|
+
/** @type {DeperditionPontThermiqueService} */
|
|
18
|
+
let service;
|
|
19
|
+
|
|
20
|
+
const ctx = {};
|
|
21
|
+
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
tvStore = {
|
|
24
|
+
getKForPlancher: vi.fn(() => 0.71),
|
|
25
|
+
getKForMur: vi.fn(() => 0.82),
|
|
26
|
+
getKForMenuiserie: vi.fn(() => 0.3),
|
|
27
|
+
getKForMurById: vi.fn(() => 0.5)
|
|
28
|
+
};
|
|
29
|
+
murService = { typeIsolation: vi.fn(() => 3) };
|
|
30
|
+
plancherHautService = { typeIsolation: vi.fn(() => 4) };
|
|
31
|
+
plancherBasService = { typeIsolation: vi.fn(() => 4) };
|
|
32
|
+
service = new DeperditionPontThermiqueService(
|
|
33
|
+
tvStore,
|
|
34
|
+
murService,
|
|
35
|
+
plancherHautService,
|
|
36
|
+
plancherBasService
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
/** Enveloppe : mur extérieur lourd + plancher (bas ou haut) lourd avec l'adjacence donnée. */
|
|
41
|
+
function enveloppe(adjacencePlancher, adjacenceMur = '1') {
|
|
42
|
+
const plancher = {
|
|
43
|
+
donnee_entree: {
|
|
44
|
+
reference: 'P1',
|
|
45
|
+
enum_type_adjacence_id: adjacencePlancher,
|
|
46
|
+
enum_type_plancher_bas_id: '1',
|
|
47
|
+
enum_type_plancher_haut_id: '1'
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
mur_collection: {
|
|
52
|
+
mur: [
|
|
53
|
+
{
|
|
54
|
+
donnee_entree: {
|
|
55
|
+
reference: 'M1',
|
|
56
|
+
enum_type_adjacence_id: adjacenceMur,
|
|
57
|
+
enum_materiaux_structure_mur_id: '1'
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
plancher_bas_collection: { plancher_bas: [plancher] },
|
|
63
|
+
plancher_haut_collection: { plancher_haut: [plancher] }
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function pontThermique(enumTypeLiaisonId) {
|
|
68
|
+
return {
|
|
69
|
+
enum_methode_saisie_pont_thermique_id: '1',
|
|
70
|
+
enum_type_liaison_id: enumTypeLiaisonId,
|
|
71
|
+
reference_1: 'P1',
|
|
72
|
+
reference_2: 'M1',
|
|
73
|
+
description: 'plancher / mur'
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
describe('DeperditionPontThermiqueService - adjacence du plancher (issue #212)', () => {
|
|
78
|
+
test.each(['14', '15', '16', '17', '18', '22'])(
|
|
79
|
+
'adjacence %s : plancher sans pont thermique',
|
|
80
|
+
(adjacence) => {
|
|
81
|
+
expect(service.plancherHasPontThermiqueAdjacence({ enum_type_adjacence_id: adjacence })).toBe(
|
|
82
|
+
false
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
test.each(['1', '3', '5', '6', '7', '20'])(
|
|
88
|
+
'adjacence %s : plancher avec pont thermique',
|
|
89
|
+
(adj) => {
|
|
90
|
+
expect(service.plancherHasPontThermiqueAdjacence({ enum_type_adjacence_id: adj })).toBe(true);
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
test('cas 2557E3382433Y : plancher bas / mur, plancher sur local habitation chauffé (22) : k = 0', () => {
|
|
95
|
+
const di = service.execute(ctx, enveloppe('22'), pontThermique('1'));
|
|
96
|
+
expect(di.k).toBe(0);
|
|
97
|
+
expect(tvStore.getKForPlancher).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('cas 2534E3387900I : plancher haut lourd / mur, plafond sous local habitation chauffé (22) : k = 0', () => {
|
|
101
|
+
const di = service.execute(ctx, enveloppe('22'), pontThermique('3'));
|
|
102
|
+
expect(di.k).toBe(0);
|
|
103
|
+
expect(tvStore.getKForPlancher).not.toHaveBeenCalled();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('plancher bas sur hall d’entrée (17) : k = 0', () => {
|
|
107
|
+
expect(service.execute(ctx, enveloppe('17'), pontThermique('1')).k).toBe(0);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('contre-test : plancher bas sur sous-sol non chauffé (6) : valeur tabulée (pas de b sur les PT)', () => {
|
|
111
|
+
const di = service.execute(ctx, enveloppe('6'), pontThermique('1'));
|
|
112
|
+
expect(tvStore.getKForPlancher).toHaveBeenCalledWith(1, expect.anything(), expect.anything());
|
|
113
|
+
expect(di.k).toBe(0.71);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('contre-test : plancher haut lourd sur extérieur : valeur tabulée', () => {
|
|
117
|
+
const di = service.execute(ctx, enveloppe('1'), pontThermique('3'));
|
|
118
|
+
expect(tvStore.getKForPlancher).toHaveBeenCalledWith(3, expect.anything(), expect.anything());
|
|
119
|
+
expect(di.k).toBe(0.71);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('mur sur circulation (14) : k = 0 quelle que soit l’adjacence du plancher', () => {
|
|
123
|
+
expect(service.execute(ctx, enveloppe('1', '14'), pontThermique('1')).k).toBe(0);
|
|
124
|
+
});
|
|
125
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open3cl/engine",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.13",
|
|
4
4
|
"description": "Open Source 3CL-DPE engine",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"directories": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"test:unit": "vitest run src",
|
|
18
18
|
"test:unit:ci": "vitest run src --coverage",
|
|
19
19
|
"test:corpus": "node test/corpus/run_all_corpus_checks.js",
|
|
20
|
-
"test:corpus:all": "node test/corpus/run_all_corpus_checks.js && npm run reports:readme",
|
|
20
|
+
"test:corpus:all": "npm run reports:clean && node test/corpus/run_all_corpus_checks.js && npm run reports:readme",
|
|
21
21
|
"test:corpus:all+database": "npm run test:corpus:all && node test/corpus/corpus_database.js",
|
|
22
22
|
"qa:lint": "eslint .",
|
|
23
23
|
"qa:lint:fix": "npm run qa:lint -- --fix",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"assets:sync": "node scripts/synchronize_assets.js",
|
|
30
30
|
"version:update": "node scripts/update_version.js",
|
|
31
31
|
"reports:preview": "npm run http-server dist/reports/corpus -o",
|
|
32
|
+
"reports:clean": "node scripts/clean_corpus_reports.js",
|
|
32
33
|
"reports:readme": "node scripts/generate_corpus_readme.js",
|
|
33
34
|
"reports:stamp": "node scripts/stamp_corpus_release.js",
|
|
34
35
|
"reports:version": "node scripts/corpus_version.js"
|