@open3cl/engine 1.0.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.js +76 -0
- package/10_clim.js +45 -0
- package/11_besoin_ecs.js +25 -0
- package/11_ecs.js +95 -0
- package/11_nadeq.js +87 -0
- package/11_nadeq.spec.js +55 -0
- package/12.4_pac.js +54 -0
- package/13.2_generateur_combustion.js +295 -0
- package/13.2_generateur_combustion_bouilleur.js +173 -0
- package/13.2_generateur_combustion_ch.js +195 -0
- package/13.2_generateur_combustion_chaudiere.js +151 -0
- package/13.2_generateur_pac.js +36 -0
- package/13_rendement_distribution_ecs.js +12 -0
- package/14_generateur_ecs.js +388 -0
- package/15_conso_aux.js +257 -0
- package/16.2_production_enr.js +328 -0
- package/16.2_production_enr.spec.js +251 -0
- package/16_conso_eclairage.js +37 -0
- package/2021_04_13_confort_ete.js +61 -0
- package/2021_04_13_qualite_isolation.js +174 -0
- package/3.1_b.js +141 -0
- package/3.2.1_mur.js +331 -0
- package/3.2.1_mur.spec.js +46 -0
- package/3.2.2_plancher_bas.js +259 -0
- package/3.2.2_plancher_bas.spec.js +88 -0
- package/3.2.3_plancher_haut.js +158 -0
- package/3.3.1.4_porte.js +32 -0
- package/3.3_baie_vitree.js +308 -0
- package/3.3_baie_vitree.spec.js +333 -0
- package/3.4_pont_thermique.js +463 -0
- package/3_deperdition.js +258 -0
- package/4_ventilation.js +197 -0
- package/5_conso_ventilation.js +127 -0
- package/6.1_apport_gratuit.js +61 -0
- package/6.1_apport_gratuit.spec.js +181 -0
- package/6.2_surface_sud_equivalente.js +109 -0
- package/7_inertie.js +178 -0
- package/7_inertie.spec.js +263 -0
- package/8_intermittence.js +5 -0
- package/9_besoin_ch.js +198 -0
- package/9_chauffage.js +291 -0
- package/9_chauffage.spec.js +101 -0
- package/9_conso_ch.js +95 -0
- package/9_conso_ch.spec.js +255 -0
- package/9_emetteur_ch.js +122 -0
- package/9_generateur_ch.js +230 -0
- package/9_generateur_ch.spec.js +87 -0
- package/README.md +43 -0
- package/apport_et_besoin.js +55 -0
- package/conso.js +529 -0
- package/conso.spec.js +90 -0
- package/core/assets/domain/add-additionnal-ue-values-tables.js +57 -0
- package/core/assets/domain/synchronize-assets.js +29 -0
- package/core/assets/domain/synchronize-assets.spec.js +37 -0
- package/core/assets/domain/synchronize-c1-tables.js +61 -0
- package/core/assets/domain/synchronize-c1-tables.spec.js +35 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +73 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +72 -0
- package/core/assets/domain/synchronize-enum-tables.js +77 -0
- package/core/assets/domain/synchronize-enum-tables.spec.js +31 -0
- package/core/assets/domain/synchronize-solicitations-tables.js +72 -0
- package/core/assets/domain/synchronize-solicitations-tables.spec.js +47 -0
- package/core/assets/domain/synchronize-valeur-tables.js +146 -0
- package/core/assets/domain/synchronize-valeur-tables.spec.js +54 -0
- package/core/conf/infrastructure/application.config.js +33 -0
- package/core/file/infrastructure/adapter/file.store.js +75 -0
- package/core/file/infrastructure/adapter/file.store.spec.js +30 -0
- package/core/tv/infrastructure/assets/additional-ue-values.js +69 -0
- package/core/tv/infrastructure/tvs.store.js +40 -0
- package/core/tv/infrastructure/tvs.store.spec.js +34 -0
- package/core/util/infrastructure/object-util.js +23 -0
- package/core/util/infrastructure/object-util.spec.js +25 -0
- package/engine.js +503 -0
- package/enums.js +1155 -0
- package/ficheTechnique.js +86 -0
- package/ficheTechnique.spec.js +181 -0
- package/index.js +4 -0
- package/package.json +87 -0
- package/tv/18.2_sollicitations_ext.ods +0 -0
- package/tv/18.5_c1.ods +0 -0
- package/tv/dpe_ges_limit_values.ods +0 -0
- package/tv.js +80811 -0
- package/tvs.d.ts +7 -0
- package/utils.js +500 -0
- package/utils.spec.js +36 -0
package/10_besoin_fr.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { tvs } from './tv.js';
|
|
2
|
+
import { mois_liste } from './utils.js';
|
|
3
|
+
import { calc_ai_j, calc_as_j } from './6.1_apport_gratuit.js';
|
|
4
|
+
import { calc_sse_j } from './6.2_surface_sud_equivalente.js';
|
|
5
|
+
|
|
6
|
+
const Cin = {
|
|
7
|
+
'très lourde': 260000,
|
|
8
|
+
lourde: 260000,
|
|
9
|
+
moyenne: 165000,
|
|
10
|
+
légère: 110000
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function calc_besoin_fr_j(Sh, GV, inertie, aij_fr, asj_fr, nrefj, textmoy_clim_j, Tint) {
|
|
14
|
+
if (nrefj == 0) return 0;
|
|
15
|
+
const Rbth = (aij_fr + asj_fr) / (GV * (textmoy_clim_j - Tint) * nrefj);
|
|
16
|
+
|
|
17
|
+
if (Rbth < 1 / 2) return 0;
|
|
18
|
+
|
|
19
|
+
const t = (Cin[inertie] * Sh) / (3600 * GV);
|
|
20
|
+
const a = 1 + t / 15;
|
|
21
|
+
let futj;
|
|
22
|
+
if (Rbth === 1) futj = a / (a + 1);
|
|
23
|
+
else futj = (1 - Rbth ** -a) / (1 - Rbth ** (-a - 1));
|
|
24
|
+
const bfr = (aij_fr + asj_fr) / 1000 - ((futj * GV) / 1000) * (Tint - textmoy_clim_j) * nrefj;
|
|
25
|
+
return bfr;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default function calc_besoin_fr(ca, zc, Sh, nadeq, GV, inertie, bv, ets) {
|
|
29
|
+
const Nref26 = tvs.nref26;
|
|
30
|
+
const Nref28 = tvs.nref28;
|
|
31
|
+
const e_fr_26 = tvs.e_fr_26;
|
|
32
|
+
const e_fr_28 = tvs.e_fr_28;
|
|
33
|
+
const textmoy_clim_26 = tvs.textmoy_clim_26;
|
|
34
|
+
const textmoy_clim_28 = tvs.textmoy_clim_28;
|
|
35
|
+
|
|
36
|
+
const ret = {
|
|
37
|
+
besoin_fr: 0,
|
|
38
|
+
besoin_fr_depensier: 0
|
|
39
|
+
};
|
|
40
|
+
for (const mois of mois_liste) {
|
|
41
|
+
const nref26 = Nref26[ca][mois][zc];
|
|
42
|
+
const nref28 = Nref28[ca][mois][zc];
|
|
43
|
+
const ej_fr_26 = e_fr_26[ca][mois][zc];
|
|
44
|
+
const ej_fr_28 = e_fr_28[ca][mois][zc];
|
|
45
|
+
const textmoy_clim_j_26 = textmoy_clim_26[ca][mois][zc];
|
|
46
|
+
const textmoy_clim_j_28 = textmoy_clim_28[ca][mois][zc];
|
|
47
|
+
|
|
48
|
+
const aij_fr = calc_ai_j(Sh, nadeq, nref28);
|
|
49
|
+
const aij_fr_dep = calc_ai_j(Sh, nadeq, nref26);
|
|
50
|
+
const ssej = calc_sse_j(bv, ets, ca, zc, mois);
|
|
51
|
+
const asj_fr = calc_as_j(ssej, ej_fr_28);
|
|
52
|
+
const asj_fr_dep = calc_as_j(ssej, ej_fr_26);
|
|
53
|
+
|
|
54
|
+
ret.besoin_fr += calc_besoin_fr_j(
|
|
55
|
+
Sh,
|
|
56
|
+
GV,
|
|
57
|
+
inertie,
|
|
58
|
+
aij_fr,
|
|
59
|
+
asj_fr,
|
|
60
|
+
nref28,
|
|
61
|
+
textmoy_clim_j_28,
|
|
62
|
+
28
|
|
63
|
+
);
|
|
64
|
+
ret.besoin_fr_depensier += calc_besoin_fr_j(
|
|
65
|
+
Sh,
|
|
66
|
+
GV,
|
|
67
|
+
inertie,
|
|
68
|
+
aij_fr_dep,
|
|
69
|
+
asj_fr_dep,
|
|
70
|
+
nref26,
|
|
71
|
+
textmoy_clim_j_26,
|
|
72
|
+
26
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return ret;
|
|
76
|
+
}
|
package/10_clim.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { requestInputID, tv } from './utils.js';
|
|
2
|
+
|
|
3
|
+
function tv_seer(di, de, du, zc_id) {
|
|
4
|
+
const matcher = {
|
|
5
|
+
enum_zone_climatique_id: zc_id,
|
|
6
|
+
enum_periode_installation_fr_id: requestInputID(de, du, 'periode_installation_fr')
|
|
7
|
+
};
|
|
8
|
+
const row = tv('seer', matcher, de);
|
|
9
|
+
if (row) {
|
|
10
|
+
de.tv_seer_id = Number(row.tv_seer_id);
|
|
11
|
+
di.eer = row.eer;
|
|
12
|
+
} else {
|
|
13
|
+
console.error('!! pas de valeur forfaitaire trouvée pour seer !!');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function calc_clim(clim, bfr, bfr_dep, zc_id, Sh) {
|
|
18
|
+
const de = clim.donnee_entree;
|
|
19
|
+
const di = clim.donnee_intermediaire || {};
|
|
20
|
+
const du = {};
|
|
21
|
+
|
|
22
|
+
const rs = de.surface_clim / Sh;
|
|
23
|
+
di.besoin_fr = bfr * rs;
|
|
24
|
+
di.besoin_fr_depensier = bfr_dep * rs;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Si la méthode de saisie n'est pas "Valeur forfaitaire" mais "caractéristiques saisies"
|
|
28
|
+
* Documentation 3CL : "Pour les installations récentes ou recommandées, les caractéristiques réelles des chaudières présentées sur les bases
|
|
29
|
+
* de données professionnelles peuvent être utilisées."
|
|
30
|
+
*
|
|
31
|
+
* 6 - caractéristiques saisies à partir de la plaque signalétique ou d'une documentation technique du système thermodynamique : scop/cop/eer
|
|
32
|
+
* 7 - déterminé à partir du rset/rsee( etude rt2012/re2020)
|
|
33
|
+
* 8 - seer saisi pour permettre la saisie de réseau de froid ou de système de climatisations qui ne sont pas éléctriques
|
|
34
|
+
*/
|
|
35
|
+
const methodeSaisie = parseInt(de.enum_methode_saisie_carac_sys_id);
|
|
36
|
+
if (![6, 7, 8].includes(methodeSaisie) || !di.eer) {
|
|
37
|
+
tv_seer(di, de, du, zc_id);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
di.conso_fr = (0.9 * di.besoin_fr) / di.eer;
|
|
41
|
+
di.conso_fr_depensier = (0.9 * di.besoin_fr_depensier) / di.eer;
|
|
42
|
+
|
|
43
|
+
clim.donnee_intermediaire = di;
|
|
44
|
+
clim.donnee_utilisateur = du;
|
|
45
|
+
}
|
package/11_besoin_ecs.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { tvs } from './tv.js';
|
|
2
|
+
import { mois_liste, Njj } from './utils.js';
|
|
3
|
+
|
|
4
|
+
export function calc_besoin_ecs_j(ca, mois, zc, nadeq, depensier) {
|
|
5
|
+
const tefsj = tvs.tefs[ca][mois][zc];
|
|
6
|
+
const njj = Njj[mois];
|
|
7
|
+
|
|
8
|
+
if (depensier) {
|
|
9
|
+
return (1.163 * nadeq * 79 * (40 - tefsj) * njj) / 1000;
|
|
10
|
+
} else {
|
|
11
|
+
return (1.163 * nadeq * 56 * (40 - tefsj) * njj) / 1000;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default function calc_besoin_ecs(ca, zc, nadeq) {
|
|
16
|
+
const ret = {
|
|
17
|
+
besoin_ecs: 0,
|
|
18
|
+
besoin_ecs_depensier: 0
|
|
19
|
+
};
|
|
20
|
+
for (const mois of mois_liste) {
|
|
21
|
+
ret.besoin_ecs += calc_besoin_ecs_j(ca, mois, zc, nadeq, false);
|
|
22
|
+
ret.besoin_ecs_depensier += calc_besoin_ecs_j(ca, mois, zc, nadeq, true);
|
|
23
|
+
}
|
|
24
|
+
return ret;
|
|
25
|
+
}
|
package/11_ecs.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import enums from './enums.js';
|
|
2
|
+
import calc_gen_ecs from './14_generateur_ecs.js';
|
|
3
|
+
import { tv, requestInput } from './utils.js';
|
|
4
|
+
|
|
5
|
+
function tv_rendement_distribution_ecs(di, de, du, pvc) {
|
|
6
|
+
let matcher = {};
|
|
7
|
+
|
|
8
|
+
if (de.tv_rendement_distribution_ecs_id) {
|
|
9
|
+
matcher['tv_rendement_distribution_ecs_id'] = de.tv_rendement_distribution_ecs_id;
|
|
10
|
+
} else {
|
|
11
|
+
const type_installation = enums.type_installation[de.enum_type_installation_id];
|
|
12
|
+
|
|
13
|
+
let configuration_logement;
|
|
14
|
+
if (type_installation.includes('individuelle')) {
|
|
15
|
+
if (pvc === 1) {
|
|
16
|
+
configuration_logement = 'production volume habitable [+] pièces alimentées contiguës';
|
|
17
|
+
} else configuration_logement = 'production hors volume habitable';
|
|
18
|
+
} else if (type_installation.includes('collective')) {
|
|
19
|
+
let type_reseau_collectif;
|
|
20
|
+
if (type_installation.includes('multi-bâtiment')) {
|
|
21
|
+
configuration_logement = 'majorité des logements avec pièces alimentées non contiguës';
|
|
22
|
+
} else {
|
|
23
|
+
configuration_logement = 'majorité des logements avec pièces alimentées contiguës';
|
|
24
|
+
}
|
|
25
|
+
const isole = requestInput(de, du, 'reseau_distribution_isole', 'bool');
|
|
26
|
+
if (isole === 0) {
|
|
27
|
+
type_reseau_collectif = 'Réseau collectif non isolé';
|
|
28
|
+
} else {
|
|
29
|
+
const type_bouclage = requestInput(de, du, 'bouclage_reseau_ecs');
|
|
30
|
+
if (type_bouclage === "réseau d'ecs bouclé") {
|
|
31
|
+
type_reseau_collectif = 'Réseau collectif isolé bouclé';
|
|
32
|
+
} else {
|
|
33
|
+
configuration_logement = null;
|
|
34
|
+
type_reseau_collectif =
|
|
35
|
+
'Réseau collectif isolé avec traçage ou Réseau collectif isolé sans traçage ni bouclage';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
matcher.type_reseau_collectif = type_reseau_collectif;
|
|
39
|
+
}
|
|
40
|
+
if (configuration_logement) matcher.configuration_logement = configuration_logement;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const row = tv('rendement_distribution_ecs', matcher);
|
|
44
|
+
if (row) {
|
|
45
|
+
di.rendement_distribution = Number(row.rd);
|
|
46
|
+
de.tv_rendement_distribution_ecs_id = Number(row.tv_rendement_distribution_ecs_id);
|
|
47
|
+
} else {
|
|
48
|
+
console.error('!! pas de valeur forfaitaire trouvée pour rd !!');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default function calc_ecs(
|
|
53
|
+
dpe,
|
|
54
|
+
ecs,
|
|
55
|
+
becs,
|
|
56
|
+
becs_dep,
|
|
57
|
+
GV,
|
|
58
|
+
ca_id,
|
|
59
|
+
zc_id,
|
|
60
|
+
th,
|
|
61
|
+
virtualisationECS
|
|
62
|
+
) {
|
|
63
|
+
const de = ecs.donnee_entree;
|
|
64
|
+
const di = {};
|
|
65
|
+
const du = {};
|
|
66
|
+
|
|
67
|
+
// La conso de chaque générateur ECS doit être ramenée au prorata de la surface du logement
|
|
68
|
+
di.ratio_besoin_ecs = 1;
|
|
69
|
+
if (virtualisationECS) {
|
|
70
|
+
di.ratio_besoin_ecs = de.cle_repartition_ecs || 1;
|
|
71
|
+
} else if (de.rdim) {
|
|
72
|
+
di.ratio_besoin_ecs = 1 / de.rdim || 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
di.besoin_ecs = becs * di.ratio_besoin_ecs;
|
|
76
|
+
di.besoin_ecs_depensier = becs_dep * di.ratio_besoin_ecs;
|
|
77
|
+
|
|
78
|
+
const pvc = ecs.generateur_ecs_collection.generateur_ecs[0].donnee_entree.position_volume_chauffe;
|
|
79
|
+
tv_rendement_distribution_ecs(di, de, du, pvc);
|
|
80
|
+
|
|
81
|
+
const gen_ecs_list = ecs.generateur_ecs_collection.generateur_ecs;
|
|
82
|
+
gen_ecs_list.forEach((gen_ecs) => calc_gen_ecs(dpe, gen_ecs, di, de, GV, ca_id, zc_id, th));
|
|
83
|
+
|
|
84
|
+
di.conso_ecs = gen_ecs_list.reduce(
|
|
85
|
+
(acc, gen_ecs) => acc + gen_ecs.donnee_intermediaire.conso_ecs,
|
|
86
|
+
0
|
|
87
|
+
);
|
|
88
|
+
di.conso_ecs_depensier = gen_ecs_list.reduce(
|
|
89
|
+
(acc, gen_ecs) => acc + gen_ecs.donnee_intermediaire.conso_ecs_depensier,
|
|
90
|
+
0
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
ecs.donnee_intermediaire = di;
|
|
94
|
+
ecs.donnee_utilisateur = du;
|
|
95
|
+
}
|
package/11_nadeq.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export class Nadeq {
|
|
2
|
+
/**
|
|
3
|
+
* Return nadeq for maison or individual logement
|
|
4
|
+
* @param surfaceHabitableLogement {number}
|
|
5
|
+
* @returns {number}
|
|
6
|
+
*/
|
|
7
|
+
calculateIndividualNadeq(surfaceHabitableLogement) {
|
|
8
|
+
let Nmax;
|
|
9
|
+
|
|
10
|
+
if (surfaceHabitableLogement < 30) Nmax = 1;
|
|
11
|
+
else if (surfaceHabitableLogement < 70) Nmax = 1.75 - 0.01875 * (70 - surfaceHabitableLogement);
|
|
12
|
+
else Nmax = 0.025 * surfaceHabitableLogement;
|
|
13
|
+
|
|
14
|
+
if (Nmax < 1.75) return Nmax;
|
|
15
|
+
else return 1.75 + 0.3 * (Nmax - 1.75);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Return nadeq for immeuble or collective logement
|
|
20
|
+
* @param surfaceHabitableImmeuble {number}
|
|
21
|
+
* @param nombreAppartement {number}
|
|
22
|
+
* @returns {number}
|
|
23
|
+
*/
|
|
24
|
+
calculateCollectiveNadeq(surfaceHabitableImmeuble, nombreAppartement) {
|
|
25
|
+
const Shmoy = surfaceHabitableImmeuble / nombreAppartement;
|
|
26
|
+
|
|
27
|
+
let Nmax;
|
|
28
|
+
if (Shmoy < 10) Nmax = 1;
|
|
29
|
+
else if (Shmoy < 50) Nmax = 1.75 - 0.01875 * (50 - Shmoy);
|
|
30
|
+
else Nmax = 0.035 * Shmoy;
|
|
31
|
+
|
|
32
|
+
if (Nmax < 1.75) return nombreAppartement * Nmax;
|
|
33
|
+
else return nombreAppartement * (1.75 + 0.3 * (Nmax - 1.75));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Get nadeq for a DPE
|
|
38
|
+
* @param logement {Logement}
|
|
39
|
+
* @returns {number}
|
|
40
|
+
*/
|
|
41
|
+
calculateNadeq(logement) {
|
|
42
|
+
/**
|
|
43
|
+
* enum_methode_application_dpe_log_id pour maison individuelle
|
|
44
|
+
* 1 - dpe maison individuelle
|
|
45
|
+
* 14 - dpe issu d'une étude thermique réglementaire RT2012 bâtiment : maison individuelle
|
|
46
|
+
* 18 - dpe issu d'une étude energie environement réglementaire RE2020 bâtiment : maison individuelle
|
|
47
|
+
*/
|
|
48
|
+
if (
|
|
49
|
+
[1, 14, 18].includes(
|
|
50
|
+
Number(logement.caracteristique_generale.enum_methode_application_dpe_log_id)
|
|
51
|
+
)
|
|
52
|
+
) {
|
|
53
|
+
return this.calculateIndividualNadeq(
|
|
54
|
+
logement.caracteristique_generale.surface_habitable_logement
|
|
55
|
+
);
|
|
56
|
+
} else if (
|
|
57
|
+
[2, 3, 4, 5, 31, 32, 35, 36, 37].includes(
|
|
58
|
+
Number(logement.caracteristique_generale.enum_methode_application_dpe_log_id)
|
|
59
|
+
)
|
|
60
|
+
) {
|
|
61
|
+
/**
|
|
62
|
+
* enum_methode_application_dpe_log_id - pour appartements
|
|
63
|
+
* 2 - dpe appartement individuel chauffage individuel ecs individuel
|
|
64
|
+
* 3 - dpe appartement individuel chauffage collectif ecs individuel
|
|
65
|
+
* 4 - dpe appartement individuel chauffage individuel ecs collectif
|
|
66
|
+
* 5 - dpe appartement individuel chauffage collectif ecs collectif
|
|
67
|
+
* 31 - dpe appartement individuel chauffage mixte (collectif-individuel) ecs individuel
|
|
68
|
+
* 32 - dpe appartement individuel chauffage mixte (collectif-individuel) ecs collectif
|
|
69
|
+
* 35 - dpe appartement individuel chauffage mixte (collectif-individuel) ecs mixte (collectif-individuel)
|
|
70
|
+
* 36 - dpe appartement individuel chauffage individuel ecs mixte (collectif-individuel)
|
|
71
|
+
* 37 - dpe appartement individuel chauffage collectif ecs mixte (collectif-individuel)
|
|
72
|
+
*/
|
|
73
|
+
return this.calculateCollectiveNadeq(
|
|
74
|
+
logement.caracteristique_generale.surface_habitable_logement,
|
|
75
|
+
1
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* enum_methode_application_dpe_log_id - pour immeuble ou DPE appartement généré à partir du DPE immeuble
|
|
81
|
+
*/
|
|
82
|
+
return this.calculateCollectiveNadeq(
|
|
83
|
+
logement.caracteristique_generale.surface_habitable_immeuble,
|
|
84
|
+
logement.caracteristique_generale.nombre_appartement
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
package/11_nadeq.spec.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Nadeq } from './11_nadeq.js';
|
|
2
|
+
|
|
3
|
+
describe('Nadeq unit tests', () => {
|
|
4
|
+
/**
|
|
5
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf Page 70
|
|
6
|
+
*/
|
|
7
|
+
const nadeq = new Nadeq();
|
|
8
|
+
|
|
9
|
+
it.each([
|
|
10
|
+
[1, 8],
|
|
11
|
+
[1, 28],
|
|
12
|
+
[1.28125, 45],
|
|
13
|
+
[1.39375, 51],
|
|
14
|
+
[1.75, 70],
|
|
15
|
+
[1.7875, 75]
|
|
16
|
+
])(
|
|
17
|
+
'should get individual nadeq %s for surface_habitable_logement %s',
|
|
18
|
+
(expectedNadeq, surface_habitable_logement) => {
|
|
19
|
+
const logement = {
|
|
20
|
+
caracteristique_generale: {
|
|
21
|
+
enum_methode_application_dpe_log_id: 1,
|
|
22
|
+
surface_habitable_logement
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
expect(nadeq.calculateNadeq(logement)).toBe(expectedNadeq);
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
it.each([
|
|
30
|
+
[1, 8, 1],
|
|
31
|
+
[2, 8, 2],
|
|
32
|
+
[1.3375, 28, 1],
|
|
33
|
+
[2.15, 28, 2],
|
|
34
|
+
[1.65625, 45, 1],
|
|
35
|
+
[2.46875, 45, 2],
|
|
36
|
+
[1.7605, 51, 1],
|
|
37
|
+
[2.58125, 51, 2],
|
|
38
|
+
[1.96, 70, 1],
|
|
39
|
+
[2.9375, 70, 2],
|
|
40
|
+
[2.0125, 75, 1],
|
|
41
|
+
[3.03125, 75, 2]
|
|
42
|
+
])(
|
|
43
|
+
'should get collective nadeq %s for surface_habitable_immeuble %s, nombre_appartement %s',
|
|
44
|
+
(expectedNadeq, surface_habitable_immeuble, nombre_appartement) => {
|
|
45
|
+
const logement = {
|
|
46
|
+
caracteristique_generale: {
|
|
47
|
+
enum_methode_application_dpe_log_id: 6,
|
|
48
|
+
surface_habitable_immeuble,
|
|
49
|
+
nombre_appartement
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
expect(nadeq.calculateNadeq(logement)).toBeCloseTo(expectedNadeq, 2);
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
});
|
package/12.4_pac.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { requestInputID, tv } from './utils.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Calcul ou récupération des paramètres scop ou cop
|
|
5
|
+
* @param di {Donnee_intermediaire}
|
|
6
|
+
* @param de {Donnee_entree}
|
|
7
|
+
* @param du {Object}
|
|
8
|
+
* @param zc_id {string}
|
|
9
|
+
* @param ed_id {string|null}
|
|
10
|
+
* @param type {'ecs'|'ch'}
|
|
11
|
+
*/
|
|
12
|
+
export function scopOrCop(di, de, du, zc_id, ed_id, type) {
|
|
13
|
+
/**
|
|
14
|
+
* Si la méthode de saisie n'est pas "Valeur forfaitaire" mais "caractéristiques saisies"
|
|
15
|
+
* Documentation 3CL : "Pour les installations récentes ou recommandées, les caractéristiques réelles présentées sur les bases
|
|
16
|
+
* de données professionnelles peuvent être utilisées."
|
|
17
|
+
*
|
|
18
|
+
* 6 - caractéristiques saisies à partir de la plaque signalétique ou d'une documentation technique du système thermodynamique : scop/cop/eer
|
|
19
|
+
*/
|
|
20
|
+
if (de.enum_methode_saisie_carac_sys_id === '6') {
|
|
21
|
+
di.rg = di.scop || di.cop;
|
|
22
|
+
di.rg_dep = di.scop || di.cop;
|
|
23
|
+
} else {
|
|
24
|
+
tv_scop(di, de, du, zc_id, ed_id, type);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function tv_scop(di, de, du, zc_id, ed_id, type) {
|
|
29
|
+
const matcher = {
|
|
30
|
+
enum_zone_climatique_id: zc_id
|
|
31
|
+
};
|
|
32
|
+
matcher[`enum_type_generateur_${type}_id`] = requestInputID(de, du, `type_generateur_${type}`);
|
|
33
|
+
if (ed_id) matcher.enum_type_emission_distribution_id = ed_id;
|
|
34
|
+
const row = tv('scop', matcher, de);
|
|
35
|
+
if (row) {
|
|
36
|
+
const scop = row.scop_ou_cop;
|
|
37
|
+
di[scop] = Number(row.scop);
|
|
38
|
+
|
|
39
|
+
if (de.tv_scop_id && de.tv_scop_id !== Number(row.tv_scop_id)) {
|
|
40
|
+
console.error(`
|
|
41
|
+
Le paramètre ${scop} utilisé par le DPE est erroné.
|
|
42
|
+
Utilisation de tv_scop_id = ${de.tv_scop_id} alors que devrait être utilisé tv_scop_id = ${row.tv_scop_id} (utilisé dans la suite du calcul)
|
|
43
|
+
`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
de.tv_scop_id = Number(row.tv_scop_id);
|
|
47
|
+
|
|
48
|
+
// for Ich
|
|
49
|
+
di.rg = di[scop];
|
|
50
|
+
di.rg_dep = di[scop];
|
|
51
|
+
} else {
|
|
52
|
+
console.error('!! pas de valeur forfaitaire trouvée pour scop !!');
|
|
53
|
+
}
|
|
54
|
+
}
|