@open3cl/engine 1.6.1 → 1.7.0
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/10_besoin_fr.spec.js +122 -0
- package/10_clim.spec.js +116 -0
- package/11_besoin_ecs.spec.js +69 -0
- package/11_ecs.spec.js +282 -0
- package/11_nadeq.spec.js +37 -0
- package/12.4_pac.spec.js +131 -0
- package/13.2_generateur_combustion.js +2 -0
- package/13.2_generateur_combustion.spec.js +537 -0
- package/13.2_generateur_combustion_bouilleur.js +4 -1
- package/13.2_generateur_combustion_bouilleur.spec.js +74 -0
- package/13.2_generateur_combustion_ch.spec.js +323 -0
- package/13.2_generateur_combustion_chaudiere.spec.js +85 -0
- package/13.2_generateur_pac.spec.js +64 -0
- package/13_rendement_distribution_ecs.spec.js +38 -0
- package/14_generateur_ecs.js +4 -4
- package/14_generateur_ecs.spec.js +745 -0
- package/15_conso_aux.js +121 -1
- package/15_conso_aux.spec.js +550 -0
- package/16.2_production_enr.spec.js +188 -0
- package/16_conso_eclairage.spec.js +62 -0
- package/2021_04_13_confort_ete.spec.js +159 -0
- package/2021_04_13_qualite_isolation.js +1 -1
- package/2021_04_13_qualite_isolation.spec.js +286 -0
- package/3.1_b.js +1 -1
- package/3.1_b.spec.js +367 -0
- package/3.2.1_mur.spec.js +812 -39
- package/3.2.2_plancher_bas.spec.js +643 -78
- package/3.2.3_plancher_haut.spec.js +452 -0
- package/3.3.1.4_porte.spec.js +114 -0
- package/3.3_baie_vitree.spec.js +449 -295
- package/3.4_pont_thermique.spec.js +890 -0
- package/3_deperdition.spec.js +397 -0
- package/4_ventilation.js +1 -1
- package/4_ventilation.spec.js +406 -0
- package/5_conso_ventilation.spec.js +186 -0
- package/6.2_surface_sud_equivalente.js +2 -1
- package/6.2_surface_sud_equivalente.spec.js +138 -0
- package/8_intermittence.spec.js +33 -0
- package/9_besoin_ch.js +2 -2
- package/9_besoin_ch.spec.js +381 -0
- package/9_chauffage.js +4 -0
- package/9_chauffage.spec.js +478 -92
- package/9_conso_ch.spec.js +502 -248
- package/9_emetteur_ch.spec.js +339 -0
- package/9_generateur_ch.spec.js +467 -81
- package/apport_et_besoin.spec.js +126 -0
- package/conso.js +21 -7
- package/conso.spec.js +491 -82
- package/core/assets/domain/add-additionnal-ue-values-tables.spec.js +53 -0
- package/core/assets/domain/synchronize-solicitations-tables.spec.js +25 -0
- package/core/assets/domain/synchronize-valeur-tables.spec.js +48 -0
- package/core/conf/infrastructure/application.config.spec.js +35 -0
- package/core/file/infrastructure/adapter/csv-parser.store.spec.js +31 -13
- package/core/file/infrastructure/adapter/file.store.spec.js +148 -12
- package/core/tv/infrastructure/assets/additional-ue-values.spec.js +36 -0
- package/core/util/infrastructure/object-util.spec.js +20 -0
- package/core/util/logger/log-service.js +16 -7
- package/core/util/logger/log-service.spec.js +101 -0
- package/dpe-sanitizer.service.spec.js +138 -0
- package/engine.js +20 -1
- package/engine.spec.js +949 -0
- package/enums.spec.js +46 -0
- package/features/dpe/domain/models/type-generateur.model.js +1 -2
- package/features/dpe/domain/models/type-generateur.model.spec.js +25 -0
- package/features/dpe/domain/models/type-habitation.model.spec.js +41 -0
- package/features/dpe/domain/models/type-stockage.model.spec.js +18 -0
- package/features/dpe/domain/models/type-ventilation.model.spec.js +19 -0
- package/features/dpe/infrastructure/ch/chTv.store.spec.js +4 -4
- package/features/dpe/infrastructure/enveloppe/baieVitreeTv.store.js +14 -2
- package/features/dpe/infrastructure/enveloppe/baieVitreeTv.store.spec.js +16 -0
- package/features/dpe/infrastructure/tv.store.js +28 -9
- package/features/dpe/infrastructure/tv.store.spec.js +44 -0
- package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +2 -1
- package/features/engine/domain/apport_et_besoin/ch/besoin-ch.service.spec.js +18 -0
- package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +33 -1
- package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +21 -1
- package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +41 -1
- package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +44 -1
- package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +2 -1
- package/features/engine/domain/ch/generateur-ch.service.js +2 -0
- package/features/engine/domain/ch/generateur-ch.service.spec.js +117 -2
- package/features/engine/domain/ch/installation-ch.service.spec.js +14 -0
- package/features/engine/domain/conso/froid/conso-froid.service.spec.js +82 -1
- package/features/engine/domain/constants.spec.js +14 -0
- package/features/engine/domain/contexte.builder.spec.js +21 -0
- package/features/engine/domain/ecs/generateur-ecs.service.spec.js +11 -0
- package/features/engine/domain/ecs/installation-ecs.service.spec.js +55 -2
- package/features/engine/domain/engine.service.spec.js +227 -4
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +124 -1
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +270 -2
- package/features/engine/domain/enveloppe/deperdition.service.spec.js +141 -0
- package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +2 -1
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +117 -1
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +134 -1
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +126 -1
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +18 -1
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +2 -1
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +67 -1
- package/features/normalizer/domain/dpe-normalizer.service.js +1 -1
- package/features/normalizer/domain/dpe-normalizer.service.spec.js +53 -2
- package/ficheTechnique.spec.js +26 -0
- package/index.spec.js +54 -0
- package/package.json +5 -2
- package/preprocessor/index.js +20 -0
- package/preprocessor/index.spec.js +15 -0
- package/tv.spec.js +38 -0
- package/utils.js +43 -1
- package/utils.spec.js +518 -2
- package/output.js +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dépendances mockées pour isoler `DpeSanitizerService` :
|
|
5
|
+
* - `lodash-es` : `has`/`set` contrôlés pour observer la création des collections
|
|
6
|
+
* manquantes ;
|
|
7
|
+
* - `ObjectUtil.deepObjectTransform` : mocké pour capturer la fonction de
|
|
8
|
+
* transformation des valeurs et la tester unitairement, sans parcourir un vrai DPE.
|
|
9
|
+
*/
|
|
10
|
+
vi.mock('lodash-es', () => ({
|
|
11
|
+
has: vi.fn(),
|
|
12
|
+
set: vi.fn()
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
vi.mock('./core/util/infrastructure/object-util.js', () => ({
|
|
16
|
+
ObjectUtil: {
|
|
17
|
+
deepObjectTransform: vi.fn()
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
const { default: DpeSanitizerService } = await import('./dpe-sanitizer.service.js');
|
|
22
|
+
const { has, set } = await import('lodash-es');
|
|
23
|
+
const { ObjectUtil } = await import('./core/util/infrastructure/object-util.js');
|
|
24
|
+
|
|
25
|
+
/** Liste des collections dont l'absence doit être compensée par un tableau vide. */
|
|
26
|
+
const COLLECTIONS = [
|
|
27
|
+
'logement.enveloppe.mur_collection.mur',
|
|
28
|
+
'logement.enveloppe.plancher_bas_collection.plancher_bas',
|
|
29
|
+
'logement.enveloppe.plancher_haut_collection.plancher_haut',
|
|
30
|
+
'logement.ventilation_collection.ventilation',
|
|
31
|
+
'logement.climatisation_collection.climatisation',
|
|
32
|
+
'logement.enveloppe.baie_vitree_collection.baie_vitree',
|
|
33
|
+
'logement.enveloppe.porte_collection.porte',
|
|
34
|
+
'logement.enveloppe.pont_thermique_collection.pont_thermique'
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
let service;
|
|
38
|
+
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
vi.mocked(has).mockReset();
|
|
41
|
+
vi.mocked(set).mockReset();
|
|
42
|
+
vi.mocked(ObjectUtil.deepObjectTransform).mockReset();
|
|
43
|
+
vi.mocked(ObjectUtil.deepObjectTransform).mockImplementation((dpe) => dpe);
|
|
44
|
+
service = new DpeSanitizerService();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('DpeSanitizerService.execute - collections manquantes', () => {
|
|
48
|
+
test('crée un tableau vide pour chaque collection absente', () => {
|
|
49
|
+
vi.mocked(has).mockReturnValue(false);
|
|
50
|
+
const dpe = {};
|
|
51
|
+
|
|
52
|
+
service.execute(dpe);
|
|
53
|
+
|
|
54
|
+
expect(set).toHaveBeenCalledTimes(COLLECTIONS.length);
|
|
55
|
+
for (const path of COLLECTIONS) {
|
|
56
|
+
expect(set).toHaveBeenCalledWith(dpe, path, []);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('ne recrée pas les collections déjà présentes', () => {
|
|
61
|
+
vi.mocked(has).mockReturnValue(true);
|
|
62
|
+
|
|
63
|
+
service.execute({});
|
|
64
|
+
|
|
65
|
+
expect(set).not.toHaveBeenCalled();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('délègue la transformation profonde et retourne son résultat', () => {
|
|
69
|
+
vi.mocked(has).mockReturnValue(true);
|
|
70
|
+
const transforme = { transforme: true };
|
|
71
|
+
vi.mocked(ObjectUtil.deepObjectTransform).mockReturnValue(transforme);
|
|
72
|
+
|
|
73
|
+
const resultat = service.execute({ brut: true });
|
|
74
|
+
|
|
75
|
+
expect(ObjectUtil.deepObjectTransform).toHaveBeenCalledOnce();
|
|
76
|
+
expect(resultat).toBe(transforme);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Récupère la fonction de transformation des valeurs passée en 3e argument de
|
|
82
|
+
* `deepObjectTransform` après un appel à `execute`.
|
|
83
|
+
*/
|
|
84
|
+
function getValueTransform() {
|
|
85
|
+
vi.mocked(has).mockReturnValue(true);
|
|
86
|
+
service.execute({});
|
|
87
|
+
return vi.mocked(ObjectUtil.deepObjectTransform).mock.calls[0][2];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
describe('DpeSanitizerService - transformation des valeurs', () => {
|
|
91
|
+
test('encapsule dans un tableau les nœuds simples à cardinalité multiple', () => {
|
|
92
|
+
const valueTransform = getValueTransform();
|
|
93
|
+
const generateur = { id: 1 };
|
|
94
|
+
// `generateur_ecs` fait partie des nœuds à transformer en tableau
|
|
95
|
+
expect(valueTransform(generateur, 'generateur_ecs')).toEqual([generateur]);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('ne ré-encapsule pas un nœud déjà sous forme de tableau', () => {
|
|
99
|
+
const valueTransform = getValueTransform();
|
|
100
|
+
const deja = [{ id: 1 }];
|
|
101
|
+
// déjà un tableau => traité comme une valeur non numérique et renvoyé tel quel
|
|
102
|
+
expect(valueTransform(deja, 'generateur_ecs')).toBe(deja);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("convertit les valeurs d'énumération en chaîne de caractères", () => {
|
|
106
|
+
const valueTransform = getValueTransform();
|
|
107
|
+
expect(valueTransform(12, 'enum_type_generateur_ch_id')).toBe('12');
|
|
108
|
+
expect(valueTransform(5, 'original_enum_type_generateur_ch_id')).toBe('5');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('une énumération nulle donne une valeur indéfinie (optional chaining)', () => {
|
|
112
|
+
const valueTransform = getValueTransform();
|
|
113
|
+
expect(valueTransform(null, 'enum_type_generateur_ch_id')).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('remplace les valeurs vides ou nulles par une chaîne vide', () => {
|
|
117
|
+
const valueTransform = getValueTransform();
|
|
118
|
+
expect(valueTransform('', 'surface_paroi_opaque')).toBe('');
|
|
119
|
+
expect(valueTransform(null, 'surface_paroi_opaque')).toBe('');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('conserve les tableaux vides tels quels', () => {
|
|
123
|
+
const valueTransform = getValueTransform();
|
|
124
|
+
const vide = [];
|
|
125
|
+
expect(valueTransform(vide, 'mur')).toBe(vide);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('conserve les chaînes non numériques telles quelles', () => {
|
|
129
|
+
const valueTransform = getValueTransform();
|
|
130
|
+
expect(valueTransform('maison', 'description')).toBe('maison');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('convertit les chaînes numériques en nombres', () => {
|
|
134
|
+
const valueTransform = getValueTransform();
|
|
135
|
+
expect(valueTransform('40.94', 'surface_paroi_opaque')).toBe(40.94);
|
|
136
|
+
expect(valueTransform('12', 'quantite')).toBe(12);
|
|
137
|
+
});
|
|
138
|
+
});
|
package/engine.js
CHANGED
|
@@ -3,6 +3,7 @@ import calc_deperdition from './3_deperdition.js';
|
|
|
3
3
|
import calc_apport_et_besoin from './apport_et_besoin.js';
|
|
4
4
|
import calc_clim from './10_clim.js';
|
|
5
5
|
import calc_ecs from './11_ecs.js';
|
|
6
|
+
import { conso_aux_distribution_ecs } from './15_conso_aux.js';
|
|
6
7
|
import calc_besoin_ch from './9_besoin_ch.js';
|
|
7
8
|
import calc_chauffage, { tauxChargeForGenerator } from './9_chauffage.js';
|
|
8
9
|
import calc_confort_ete from './2021_04_13_confort_ete.js';
|
|
@@ -31,7 +32,7 @@ import getFicheTechnique from './ficheTechnique.js';
|
|
|
31
32
|
import { ProductionENR } from './16.2_production_enr.js';
|
|
32
33
|
import DpeSanitizerService from './dpe-sanitizer.service.js';
|
|
33
34
|
|
|
34
|
-
const LIB_VERSION = '1.
|
|
35
|
+
const LIB_VERSION = '1.7.0';
|
|
35
36
|
|
|
36
37
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
37
38
|
|
|
@@ -90,6 +91,7 @@ export function calcul_3cl(inputDpe, options) {
|
|
|
90
91
|
|
|
91
92
|
const cg = logement.caracteristique_generale;
|
|
92
93
|
const map_id = cg.enum_methode_application_dpe_log_id;
|
|
94
|
+
const dpeGenereImmeuble = ['10', '11', '12', '13', '33', '34', '38', '39', '40'].includes(map_id);
|
|
93
95
|
const th = calc_th(map_id);
|
|
94
96
|
|
|
95
97
|
if (logement.enveloppe === undefined) {
|
|
@@ -435,6 +437,20 @@ export function calcul_3cl(inputDpe, options) {
|
|
|
435
437
|
dpe.logement.caracteristique_generale.nombre_appartement,
|
|
436
438
|
isImmeubleSystemEcsIndividuels
|
|
437
439
|
);
|
|
440
|
+
|
|
441
|
+
if (!dpeGenereImmeuble) {
|
|
442
|
+
conso_aux_distribution_ecs(
|
|
443
|
+
ecs,
|
|
444
|
+
ecs.donnee_entree,
|
|
445
|
+
ecs.donnee_intermediaire,
|
|
446
|
+
Sh,
|
|
447
|
+
cg.surface_habitable_immeuble,
|
|
448
|
+
ca_id,
|
|
449
|
+
zc_id,
|
|
450
|
+
apport_et_besoin.nadeq,
|
|
451
|
+
dpe.logement.caracteristique_generale.nombre_niveau_immeuble
|
|
452
|
+
);
|
|
453
|
+
}
|
|
438
454
|
});
|
|
439
455
|
|
|
440
456
|
/**
|
|
@@ -612,6 +628,9 @@ export function calcul_3cl(inputDpe, options) {
|
|
|
612
628
|
);
|
|
613
629
|
|
|
614
630
|
// get all baie_vitree orientations
|
|
631
|
+
// repli défensif inatteignable : la garde en amont réinitialise plancher_haut_collection
|
|
632
|
+
// à { plancher_haut: [] } (tableau vide truthy), donc plancher_haut est toujours défini
|
|
633
|
+
/* c8 ignore next */
|
|
615
634
|
const ph_list = env.plancher_haut_collection.plancher_haut || [];
|
|
616
635
|
logement.sortie = {
|
|
617
636
|
deperdition,
|