@open3cl/engine 1.6.1 → 1.6.2
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.spec.js +225 -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.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 +1 -1
- package/conso.spec.js +471 -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 +4 -1
- package/engine.spec.js +854 -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,745 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dépendances mockées pour isoler `calc_gen_ecs` et ses fonctions de rendement :
|
|
5
|
+
* - `enums` : libellés des types de générateur / installation / zone ;
|
|
6
|
+
* - `utils` : `tv`, `tvColumnIDs`, `requestInput(ID)`, `Tbase` contrôlés, `bug_for_bug_compat` désactivé ;
|
|
7
|
+
* - `tv_generateur_combustion` : injecte les caractéristiques (rpn, qp0, pveil) du générateur ;
|
|
8
|
+
* - `scopOrCop` : injecte le SCOP pour les pompes à chaleur ;
|
|
9
|
+
* - `conso_aux_gen`, `updateGenerateurCombustion`, `getFicheTechnique` : neutralisés.
|
|
10
|
+
* Aucune vraie table de valeurs n'est utilisée : les tests restent stables si les données changent.
|
|
11
|
+
*/
|
|
12
|
+
const state = vi.hoisted(() => ({ bug: false }));
|
|
13
|
+
|
|
14
|
+
vi.mock('./enums.js', () => ({
|
|
15
|
+
default: {
|
|
16
|
+
type_generateur_ecs: {
|
|
17
|
+
60: 'ballon électrique à accumulation vertical',
|
|
18
|
+
61: 'ballon électrique à accumulation vertical catégorie c ou 3 étoiles',
|
|
19
|
+
gaz: 'chauffe-eau gaz',
|
|
20
|
+
chaud: 'chaudière gaz condensation',
|
|
21
|
+
accu: 'accumulateur gaz',
|
|
22
|
+
pac: 'pac double service',
|
|
23
|
+
autre: 'générateur non implémenté',
|
|
24
|
+
combautre: 'foyer fermé bois à combustion',
|
|
25
|
+
84: 'chaudière fioul (système collectif par défaut)'
|
|
26
|
+
},
|
|
27
|
+
type_generateur_ch: { chaud_ch: 'chaudière gaz condensation' },
|
|
28
|
+
classe_altitude: { 1: 'ca1' },
|
|
29
|
+
zone_climatique: { 1: 'h1a' },
|
|
30
|
+
type_installation_solaire: { 1: 'installation solaire' }
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
vi.mock('./utils.js', () => ({
|
|
35
|
+
get bug_for_bug_compat() {
|
|
36
|
+
return state.bug;
|
|
37
|
+
},
|
|
38
|
+
getVolumeStockageFromDescription: vi.fn(),
|
|
39
|
+
requestInput: vi.fn((de, du, field) => de[field]),
|
|
40
|
+
requestInputID: vi.fn((de, du, field) => de[`enum_${field}_id`]),
|
|
41
|
+
Tbase: { ca1: { h1: -5 } },
|
|
42
|
+
tv: vi.fn(),
|
|
43
|
+
tvColumnIDs: vi.fn(() => [])
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
vi.mock('./13.2_generateur_combustion.js', () => ({
|
|
47
|
+
tv_generateur_combustion: vi.fn(),
|
|
48
|
+
updateGenerateurCombustion: vi.fn()
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
vi.mock('./15_conso_aux.js', () => ({
|
|
52
|
+
conso_aux_gen: vi.fn()
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
vi.mock('./12.4_pac.js', () => ({
|
|
56
|
+
scopOrCop: vi.fn()
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
vi.mock('./ficheTechnique.js', () => ({
|
|
60
|
+
default: vi.fn()
|
|
61
|
+
}));
|
|
62
|
+
|
|
63
|
+
const {
|
|
64
|
+
default: calc_gen_ecs,
|
|
65
|
+
rg_chauffe_eau_gaz,
|
|
66
|
+
rgrs_chaudiere,
|
|
67
|
+
rg_accumulateur_gaz,
|
|
68
|
+
rgrsReseauUrbain
|
|
69
|
+
} = await import('./14_generateur_ecs.js');
|
|
70
|
+
const { tvColumnIDs, requestInput, requestInputID, tv, getVolumeStockageFromDescription } =
|
|
71
|
+
await import('./utils.js');
|
|
72
|
+
const { tv_generateur_combustion } = await import('./13.2_generateur_combustion.js');
|
|
73
|
+
const { scopOrCop } = await import('./12.4_pac.js');
|
|
74
|
+
const { default: getFicheTechnique } = await import('./ficheTechnique.js');
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 14. Générateur d'ECS : rendements et consommations
|
|
78
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §14
|
|
79
|
+
*/
|
|
80
|
+
describe('rendements de génération (fonctions pures)', () => {
|
|
81
|
+
const di = { rpn: 0.9, qp0: 0.1, pveil: 0.02, Qgw: 1000 };
|
|
82
|
+
|
|
83
|
+
test('rg_chauffe_eau_gaz : valeur de référence', () => {
|
|
84
|
+
// valeur de référence de régression
|
|
85
|
+
expect(rg_chauffe_eau_gaz(di, 100)).toBeCloseTo(0.8974283293793307, 9);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('rgrs_chaudiere : valeur de référence (prend en compte Qgw et 0.5·pveil)', () => {
|
|
89
|
+
// valeur de référence de régression
|
|
90
|
+
expect(rgrs_chaudiere(di, 100)).toBeCloseTo(0.8899979361936746, 9);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('rg_accumulateur_gaz : valeur de référence', () => {
|
|
94
|
+
// valeur de référence de régression
|
|
95
|
+
expect(rg_accumulateur_gaz(di, 100)).toBeCloseTo(0.8840973866670649, 9);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('un besoin ECS plus grand rapproche le rendement du rendement à pleine charge', () => {
|
|
99
|
+
expect(rg_chauffe_eau_gaz(di, 100000)).toBeGreaterThan(rg_chauffe_eau_gaz(di, 100));
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Réseau de chaleur : rendement forfaitaire selon le caractère isolé.
|
|
105
|
+
*/
|
|
106
|
+
describe('rgrsReseauUrbain - rendement d’un réseau de chaleur', () => {
|
|
107
|
+
test('type 73 (réseau isolé) : 0.9', () => {
|
|
108
|
+
expect(rgrsReseauUrbain({ enum_type_generateur_ecs_id: '73' }, {})).toBe(0.9);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('réseau marqué isolé au niveau de l’installation : 0.9', () => {
|
|
112
|
+
expect(
|
|
113
|
+
rgrsReseauUrbain({ enum_type_generateur_ecs_id: '72' }, { reseau_distribution_isole: 1 })
|
|
114
|
+
).toBe(0.9);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('réseau non isolé par défaut : 0.75', () => {
|
|
118
|
+
expect(
|
|
119
|
+
rgrsReseauUrbain({ enum_type_generateur_ecs_id: '72' }, { reseau_distribution_isole: 0 })
|
|
120
|
+
).toBe(0.75);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* calc_gen_ecs : sélection de la branche de rendement selon le type d'énergie / générateur.
|
|
126
|
+
*/
|
|
127
|
+
describe('calc_gen_ecs - consommation par générateur', () => {
|
|
128
|
+
let ecs_di;
|
|
129
|
+
let ecs_de;
|
|
130
|
+
|
|
131
|
+
beforeEach(() => {
|
|
132
|
+
vi.mocked(tvColumnIDs).mockReset().mockReturnValue([]);
|
|
133
|
+
vi.mocked(requestInput)
|
|
134
|
+
.mockReset()
|
|
135
|
+
.mockImplementation((de, du, field) => de[field]);
|
|
136
|
+
vi.mocked(requestInputID)
|
|
137
|
+
.mockReset()
|
|
138
|
+
.mockImplementation((de, du, field) => de[`enum_${field}_id`]);
|
|
139
|
+
vi.mocked(tv_generateur_combustion).mockReset();
|
|
140
|
+
vi.mocked(scopOrCop).mockReset();
|
|
141
|
+
vi.mocked(tv).mockReset();
|
|
142
|
+
vi.mocked(getVolumeStockageFromDescription).mockReset();
|
|
143
|
+
vi.mocked(getFicheTechnique).mockReset();
|
|
144
|
+
state.bug = false;
|
|
145
|
+
|
|
146
|
+
ecs_di = { besoin_ecs: 100, besoin_ecs_depensier: 150, rendement_distribution: 0.9 };
|
|
147
|
+
ecs_de = { enum_type_installation_id: '1' };
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
/** Données d'entrée d'un générateur, avec absence de stockage par défaut (Qgw = 0). */
|
|
151
|
+
function gen(deExtra) {
|
|
152
|
+
return {
|
|
153
|
+
donnee_entree: {
|
|
154
|
+
usage_generateur: 'ecs',
|
|
155
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
156
|
+
volume_stockage: 0,
|
|
157
|
+
...deExtra
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
test('générateur électrique sans stockage (Qgw = 0) : conso = besoin / rd', () => {
|
|
163
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: '60' });
|
|
164
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
165
|
+
|
|
166
|
+
expect(g.donnee_intermediaire.rendement_stockage).toBeCloseTo(1, 9);
|
|
167
|
+
// valeur de référence de régression : 100 / 0.9
|
|
168
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(111.11111111111111, 9);
|
|
169
|
+
expect(g.donnee_intermediaire.conso_ecs_depensier).toBeCloseTo(166.66666666666666, 9);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('ballon électrique 3 étoiles : bonus de 8 % sur le rendement de stockage', () => {
|
|
173
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: '61' });
|
|
174
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
175
|
+
|
|
176
|
+
expect(g.donnee_intermediaire.rendement_stockage).toBeCloseTo(1.08, 9);
|
|
177
|
+
// valeur de référence de régression : 100 / (1.08 * 0.9)
|
|
178
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(102.88065843621398, 9);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('réseau de chaleur isolé (type 73) : rendement 0.9', () => {
|
|
182
|
+
const g = gen({
|
|
183
|
+
type_energie: 'réseau de chauffage urbain',
|
|
184
|
+
enum_type_generateur_ecs_id: '73'
|
|
185
|
+
});
|
|
186
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
187
|
+
|
|
188
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.9);
|
|
189
|
+
// valeur de référence de régression : 100 / (0.9 * 0.9)
|
|
190
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(123.45679012345678, 9);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test('pompe à chaleur : consommation pilotée par le SCOP', () => {
|
|
194
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) => (table === 'scop' ? ['pac'] : []));
|
|
195
|
+
vi.mocked(scopOrCop).mockImplementation((di) => {
|
|
196
|
+
di.scop = 3;
|
|
197
|
+
});
|
|
198
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: 'pac' });
|
|
199
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
200
|
+
|
|
201
|
+
expect(scopOrCop).toHaveBeenCalled();
|
|
202
|
+
// valeur de référence de régression : 100 / 3 / 0.9
|
|
203
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(37.03703703703703, 9);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test('chauffe-eau gaz (combustion) : rendement calculé par rg_chauffe_eau_gaz', () => {
|
|
207
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
208
|
+
table === 'generateur_combustion' ? ['gaz'] : []
|
|
209
|
+
);
|
|
210
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
211
|
+
di.rpn = 0.9;
|
|
212
|
+
di.qp0 = 0.1;
|
|
213
|
+
di.pveil = 0.02;
|
|
214
|
+
di.pveilleuse = 1;
|
|
215
|
+
di.pn = 5000;
|
|
216
|
+
});
|
|
217
|
+
const g = gen({
|
|
218
|
+
type_energie: 'gaz',
|
|
219
|
+
enum_type_generateur_ecs_id: 'gaz',
|
|
220
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
221
|
+
});
|
|
222
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
223
|
+
|
|
224
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.8974283293793307, 9);
|
|
225
|
+
// valeur de référence de régression : 100 / (0.8974283293793307 * 0.9)
|
|
226
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(123.81056790123455, 9);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test('installation solaire : la couverture solaire réduit la consommation', () => {
|
|
230
|
+
ecs_de.enum_type_installation_solaire_id = '1';
|
|
231
|
+
ecs_de.fecs_saisi = 0.5;
|
|
232
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: '60' });
|
|
233
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
234
|
+
|
|
235
|
+
expect(ecs_di.fecs).toBe(0.5);
|
|
236
|
+
// valeur de référence de régression : 100 * (1 - 0.5) / 0.9
|
|
237
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(55.55555555555556, 9);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test('type d’énergie non pris en charge : rendement neutre (Iecs = 1)', () => {
|
|
241
|
+
const g = gen({ type_energie: 'bois', enum_type_generateur_ecs_id: 'autre' });
|
|
242
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
243
|
+
|
|
244
|
+
// aucune branche spécifique : conso = besoin / rd
|
|
245
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(111.11111111111111, 9);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* 14.1 - Pertes de stockage forfaitaires (générateur électrique à accumulation).
|
|
250
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1
|
|
251
|
+
*/
|
|
252
|
+
test('électrique avec stockage : pertes de stockage forfaitaires et matcher de volume', () => {
|
|
253
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
254
|
+
table === 'pertes_stockage' ? ['60'] : []
|
|
255
|
+
);
|
|
256
|
+
vi.mocked(tv).mockReturnValue({ cr: '0.5', tv_pertes_stockage_id: '7' });
|
|
257
|
+
const g = gen({
|
|
258
|
+
type_energie: 'électricité',
|
|
259
|
+
enum_type_generateur_ecs_id: '60',
|
|
260
|
+
type_stockage_ecs: 'ballon vertical',
|
|
261
|
+
volume_stockage: 150
|
|
262
|
+
});
|
|
263
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
264
|
+
|
|
265
|
+
// Volume 150 -> plage '100 < ≤ 200'
|
|
266
|
+
expect(tv).toHaveBeenCalledWith('pertes_stockage', {
|
|
267
|
+
enum_type_generateur_ecs_id: '60',
|
|
268
|
+
volume_ballon: '100 < ≤ 200'
|
|
269
|
+
});
|
|
270
|
+
// Qgw = (8592 * 45 / 24) * Vs * cr * ratio -- valeur de référence de régression
|
|
271
|
+
expect(g.donnee_intermediaire.Qgw).toBe(1208250);
|
|
272
|
+
expect(g.donnee_entree.tv_pertes_stockage_id).toBe(7);
|
|
273
|
+
// cr est supprimé après usage
|
|
274
|
+
expect(g.donnee_intermediaire.cr).toBeUndefined();
|
|
275
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(1319.361111111111, 9);
|
|
276
|
+
expect(g.donnee_intermediaire.conso_ecs_depensier).toBeCloseTo(1374.9166666666667, 9);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test.each([
|
|
280
|
+
[50, '≤ 100'],
|
|
281
|
+
[150, '100 < ≤ 200'],
|
|
282
|
+
[250, '200 < ≤ 300'],
|
|
283
|
+
[400, '> 300']
|
|
284
|
+
])('plage de volume de ballon : %s L -> %s', (volume, plageAttendue) => {
|
|
285
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
286
|
+
table === 'pertes_stockage' ? ['60'] : []
|
|
287
|
+
);
|
|
288
|
+
vi.mocked(tv).mockReturnValue({ cr: '0.4', tv_pertes_stockage_id: '7' });
|
|
289
|
+
const g = gen({
|
|
290
|
+
type_energie: 'électricité',
|
|
291
|
+
enum_type_generateur_ecs_id: '60',
|
|
292
|
+
type_stockage_ecs: 'ballon',
|
|
293
|
+
volume_stockage: volume
|
|
294
|
+
});
|
|
295
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
296
|
+
|
|
297
|
+
expect(tv).toHaveBeenCalledWith('pertes_stockage', {
|
|
298
|
+
enum_type_generateur_ecs_id: '60',
|
|
299
|
+
volume_ballon: plageAttendue
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
test('pertes de stockage introuvables : erreur signalée, cr non renseigné', () => {
|
|
304
|
+
const errSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
305
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
306
|
+
table === 'pertes_stockage' ? ['60'] : []
|
|
307
|
+
);
|
|
308
|
+
vi.mocked(tv).mockReturnValue(undefined);
|
|
309
|
+
const g = gen({
|
|
310
|
+
type_energie: 'électricité',
|
|
311
|
+
enum_type_generateur_ecs_id: '60',
|
|
312
|
+
type_stockage_ecs: 'ballon',
|
|
313
|
+
volume_stockage: 150
|
|
314
|
+
});
|
|
315
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
316
|
+
|
|
317
|
+
expect(errSpy).toHaveBeenCalledWith('!! pas de valeur forfaitaire trouvée pour cr !!');
|
|
318
|
+
errSpy.mockRestore();
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* 17.2.1 - Traitement des usages collectifs (ratio de virtualisation, volume issu de la fiche).
|
|
323
|
+
*/
|
|
324
|
+
test('installation collective : volume de stockage lu dans la fiche technique', () => {
|
|
325
|
+
vi.mocked(getFicheTechnique).mockReturnValue({ valeur: '150 L' });
|
|
326
|
+
ecs_de.enum_type_installation_id = '2';
|
|
327
|
+
ecs_de.ratio_virtualisation = 1;
|
|
328
|
+
const g = gen({
|
|
329
|
+
type_energie: 'gaz',
|
|
330
|
+
enum_type_generateur_ecs_id: 'autre',
|
|
331
|
+
type_stockage_ecs: 'ballon',
|
|
332
|
+
volume_stockage: 999
|
|
333
|
+
});
|
|
334
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
335
|
+
|
|
336
|
+
// Vs issu de la fiche (150) -> Qgw = 67662 * 150^0.55 (générateur non électrique)
|
|
337
|
+
expect(g.donnee_intermediaire.Qgw).toBeCloseTo(1064620.987190969, 9);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
test('installation collective sans volume : repli sur parseFloat(Vs) / ratio', () => {
|
|
341
|
+
// Fiche dont la valeur ne contient pas de volume exploitable -> VsFiche = 0
|
|
342
|
+
vi.mocked(getFicheTechnique).mockReturnValue({ valeur: 'inconnu' });
|
|
343
|
+
ecs_de.enum_type_installation_id = '2';
|
|
344
|
+
ecs_de.ratio_virtualisation = 2;
|
|
345
|
+
const g = gen({
|
|
346
|
+
type_energie: 'gaz',
|
|
347
|
+
enum_type_generateur_ecs_id: 'autre',
|
|
348
|
+
type_stockage_ecs: 'ballon',
|
|
349
|
+
volume_stockage: 0
|
|
350
|
+
});
|
|
351
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
352
|
+
|
|
353
|
+
// Vs = 0 -> Qgw = 67662 * 0^0.55 = 0
|
|
354
|
+
expect(g.donnee_intermediaire.Qgw).toBe(0);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test('bug_for_bug_compat : volume proratisé recalé sur la description', () => {
|
|
358
|
+
state.bug = true;
|
|
359
|
+
vi.mocked(getVolumeStockageFromDescription).mockReturnValue(100);
|
|
360
|
+
const g = gen({
|
|
361
|
+
type_energie: 'gaz',
|
|
362
|
+
enum_type_generateur_ecs_id: 'autre',
|
|
363
|
+
type_stockage_ecs: 'ballon',
|
|
364
|
+
volume_stockage: 100
|
|
365
|
+
});
|
|
366
|
+
// ratio = 1 (non collectif) -> round(100 / 1) = 100 == description -> Vs = 100
|
|
367
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
368
|
+
|
|
369
|
+
// Générateur non électrique -> Qgw = 67662 * 100^0.55
|
|
370
|
+
expect(g.donnee_intermediaire.Qgw).toBeCloseTo(67662 * 100 ** 0.55, 9);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
test('bug_for_bug_compat : type 84 électrique déduit de l’énergie, pertes via tv_pertes_stockage_id', () => {
|
|
374
|
+
state.bug = true;
|
|
375
|
+
const errSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
376
|
+
vi.mocked(tv).mockReturnValue({ cr: '0.5', tv_pertes_stockage_id: '9' });
|
|
377
|
+
const g = gen({
|
|
378
|
+
type_energie: 'électricité',
|
|
379
|
+
enum_type_generateur_ecs_id: '84',
|
|
380
|
+
enum_type_energie_id: '1',
|
|
381
|
+
type_stockage_ecs: 'ballon',
|
|
382
|
+
volume_stockage: 150,
|
|
383
|
+
tv_pertes_stockage_id: '9'
|
|
384
|
+
});
|
|
385
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
386
|
+
|
|
387
|
+
// Type 84 : le matcher des pertes se fonde sur tv_pertes_stockage_id
|
|
388
|
+
expect(tv).toHaveBeenCalledWith('pertes_stockage', { tv_pertes_stockage_id: '9' });
|
|
389
|
+
expect(errSpy).toHaveBeenCalled();
|
|
390
|
+
errSpy.mockRestore();
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* 18.4 - Facteur de couverture solaire forfaitaire.
|
|
395
|
+
*/
|
|
396
|
+
test('couverture solaire forfaitaire (maison) : facteur issu de la table', () => {
|
|
397
|
+
vi.mocked(tv).mockReturnValue({
|
|
398
|
+
facteur_couverture_solaire: '0.4',
|
|
399
|
+
tv_facteur_couverture_solaire_id: '3'
|
|
400
|
+
});
|
|
401
|
+
ecs_de.enum_type_installation_solaire_id = '1';
|
|
402
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: '60' });
|
|
403
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
404
|
+
|
|
405
|
+
expect(tv).toHaveBeenCalledWith('facteur_couverture_solaire', {
|
|
406
|
+
enum_zone_climatique_id: '1',
|
|
407
|
+
type_installation_solaire: 'installation solaire',
|
|
408
|
+
type_batiment: 'maison'
|
|
409
|
+
});
|
|
410
|
+
expect(ecs_di.fecs).toBe(0.4);
|
|
411
|
+
expect(ecs_de.tv_facteur_couverture_solaire_id).toBe(3);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
test('couverture solaire forfaitaire (immeuble) : type de bâtiment immeuble', () => {
|
|
415
|
+
vi.mocked(tv).mockReturnValue({
|
|
416
|
+
facteur_couverture_solaire: '0.3',
|
|
417
|
+
tv_facteur_couverture_solaire_id: '4'
|
|
418
|
+
});
|
|
419
|
+
ecs_de.enum_type_installation_solaire_id = '1';
|
|
420
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: '60' });
|
|
421
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
422
|
+
|
|
423
|
+
expect(tv).toHaveBeenCalledWith(
|
|
424
|
+
'facteur_couverture_solaire',
|
|
425
|
+
expect.objectContaining({ type_batiment: 'immeuble' })
|
|
426
|
+
);
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
test('couverture solaire introuvable : erreur signalée', () => {
|
|
430
|
+
const errSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
431
|
+
vi.mocked(tv).mockReturnValue(undefined);
|
|
432
|
+
ecs_de.enum_type_installation_solaire_id = '1';
|
|
433
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: '60' });
|
|
434
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
435
|
+
|
|
436
|
+
expect(errSpy).toHaveBeenCalledWith(
|
|
437
|
+
'!! pas de valeur forfaitaire trouvée pour facteur_couverture_solaire !!'
|
|
438
|
+
);
|
|
439
|
+
errSpy.mockRestore();
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* 14.1.2 / 14.1.3 - Générateurs à combustion (chaudière, accumulateur).
|
|
444
|
+
*/
|
|
445
|
+
test('chaudière combustion sans stockage (Qgw = 0) : rendement de génération direct', () => {
|
|
446
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
447
|
+
table === 'generateur_combustion' ? ['chaud'] : []
|
|
448
|
+
);
|
|
449
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
450
|
+
di.rpn = 0.9;
|
|
451
|
+
di.qp0 = 100;
|
|
452
|
+
di.pn = 20000;
|
|
453
|
+
di.pveilleuse = 0; // absence de veilleuse -> pveil forcé à 0
|
|
454
|
+
});
|
|
455
|
+
const g = gen({
|
|
456
|
+
type_energie: 'gaz',
|
|
457
|
+
enum_type_generateur_ecs_id: 'chaud',
|
|
458
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
459
|
+
});
|
|
460
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
461
|
+
|
|
462
|
+
// pveil ramené à 0 en l'absence de veilleuse
|
|
463
|
+
expect(g.donnee_intermediaire.pveil).toBe(0);
|
|
464
|
+
// valeurs de référence de régression
|
|
465
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.3446955189582535, 9);
|
|
466
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(322.3456790123457, 9);
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
test('chaudière combustion avec stockage (Qgw > 0) : rendement génération + stockage', () => {
|
|
470
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
471
|
+
table === 'generateur_combustion' ? ['chaud'] : []
|
|
472
|
+
);
|
|
473
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
474
|
+
di.rpn = 0.9;
|
|
475
|
+
di.qp0 = 100;
|
|
476
|
+
di.pn = 20000;
|
|
477
|
+
di.pveilleuse = 1;
|
|
478
|
+
di.pveil = 0;
|
|
479
|
+
});
|
|
480
|
+
const g = gen({
|
|
481
|
+
type_energie: 'gaz',
|
|
482
|
+
enum_type_generateur_ecs_id: 'chaud',
|
|
483
|
+
enum_methode_saisie_carac_sys_id: '1',
|
|
484
|
+
type_stockage_ecs: 'ballon',
|
|
485
|
+
volume_stockage: 200
|
|
486
|
+
});
|
|
487
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
488
|
+
|
|
489
|
+
expect(g.donnee_intermediaire.Qgw).toBeCloseTo(1247128.8571714761, 9);
|
|
490
|
+
// valeur de référence de régression
|
|
491
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBeCloseTo(
|
|
492
|
+
0.06505165235309393,
|
|
493
|
+
9
|
|
494
|
+
);
|
|
495
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(1708.0444092028745, 9);
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
test('accumulateur gaz : qp0 recalculé (1.5 % de Pn) et rendement dédié', () => {
|
|
499
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
500
|
+
table === 'generateur_combustion' ? ['accu'] : []
|
|
501
|
+
);
|
|
502
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
503
|
+
di.rpn = 0.9;
|
|
504
|
+
di.qp0 = 999; // sera écrasé par 1.5 * pn / 100
|
|
505
|
+
di.pn = 20000;
|
|
506
|
+
di.pveilleuse = 1;
|
|
507
|
+
di.pveil = 0;
|
|
508
|
+
});
|
|
509
|
+
const g = gen({
|
|
510
|
+
type_energie: 'gaz',
|
|
511
|
+
enum_type_generateur_ecs_id: 'accu',
|
|
512
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
513
|
+
});
|
|
514
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
515
|
+
|
|
516
|
+
// qp0 = 1.5 * 20000 / 100 = 300
|
|
517
|
+
expect(g.donnee_intermediaire.qp0).toBe(300);
|
|
518
|
+
// valeur de référence de régression
|
|
519
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.03719254165564666, 9);
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
test('générateur à combustion non implémenté : avertissement, aucun rendement', () => {
|
|
523
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
524
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
525
|
+
table === 'generateur_combustion' ? ['combautre'] : []
|
|
526
|
+
);
|
|
527
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
528
|
+
di.rpn = 0.9;
|
|
529
|
+
di.qp0 = 100;
|
|
530
|
+
di.pn = 20000;
|
|
531
|
+
di.pveilleuse = 1;
|
|
532
|
+
di.pveil = 0;
|
|
533
|
+
});
|
|
534
|
+
const g = gen({
|
|
535
|
+
type_energie: 'gaz',
|
|
536
|
+
enum_type_generateur_ecs_id: 'combautre',
|
|
537
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
538
|
+
});
|
|
539
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
540
|
+
|
|
541
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
542
|
+
warnSpy.mockRestore();
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
test('bug_for_bug_compat : correction de qp0 (< 1) pour un générateur à combustion', () => {
|
|
546
|
+
state.bug = true;
|
|
547
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
548
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
549
|
+
table === 'generateur_combustion' ? ['chaud'] : []
|
|
550
|
+
);
|
|
551
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
552
|
+
di.rpn = 0.9;
|
|
553
|
+
di.qp0 = 0.1; // < 1 -> corrigé à 100
|
|
554
|
+
di.pn = 20000;
|
|
555
|
+
di.pveilleuse = 1;
|
|
556
|
+
di.pveil = 0;
|
|
557
|
+
});
|
|
558
|
+
const g = gen({
|
|
559
|
+
type_energie: 'gaz',
|
|
560
|
+
enum_type_generateur_ecs_id: 'chaud',
|
|
561
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
562
|
+
});
|
|
563
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
564
|
+
|
|
565
|
+
expect(g.donnee_intermediaire.qp0).toBe(100);
|
|
566
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.3446955189582535, 9);
|
|
567
|
+
warnSpy.mockRestore();
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Type 84 (système collectif par défaut) : détection combustion / PAC selon les données présentes.
|
|
572
|
+
*/
|
|
573
|
+
test('type 84 combustion : le type de générateur ECS est déduit de la ligne combustion', () => {
|
|
574
|
+
vi.mocked(tv).mockReturnValue({ enum_type_generateur_ecs_id: 'chaud|autre' });
|
|
575
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
576
|
+
di.rpn = 0.9;
|
|
577
|
+
di.qp0 = 100;
|
|
578
|
+
di.pn = 20000;
|
|
579
|
+
di.pveilleuse = 1;
|
|
580
|
+
di.pveil = 0;
|
|
581
|
+
});
|
|
582
|
+
const g = gen({
|
|
583
|
+
type_energie: 'gaz',
|
|
584
|
+
enum_type_generateur_ecs_id: '84',
|
|
585
|
+
tv_generateur_combustion_id: '42',
|
|
586
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
587
|
+
});
|
|
588
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
589
|
+
|
|
590
|
+
// Premier type de la liste retenu pour le calcul du rendement
|
|
591
|
+
expect(g.donnee_entree.enum_type_generateur_ecs_id).toBe('chaud');
|
|
592
|
+
// La chaudière est bien calculée
|
|
593
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.3446955189582535, 9);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
test('type 84 combustion : ligne combustion absente, aucun redressement du type', () => {
|
|
597
|
+
vi.mocked(tv).mockReturnValue(undefined);
|
|
598
|
+
const g = gen({
|
|
599
|
+
type_energie: 'gaz',
|
|
600
|
+
enum_type_generateur_ecs_id: '84',
|
|
601
|
+
tv_generateur_combustion_id: '42',
|
|
602
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
603
|
+
});
|
|
604
|
+
// Générateur '84' n'est pas dans les combustion_ids : bascule sur la branche neutre (Iecs = 1)
|
|
605
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
606
|
+
di.rpn = 0.9;
|
|
607
|
+
di.qp0 = 100;
|
|
608
|
+
di.pn = 20000;
|
|
609
|
+
di.pveilleuse = 1;
|
|
610
|
+
});
|
|
611
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
612
|
+
|
|
613
|
+
// Type inchangé (pas de enum_type_generateur_ecs_id dans la ligne)
|
|
614
|
+
expect(g.donnee_entree.enum_type_generateur_ecs_id).toBe('84');
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
test('type 84 pompe à chaleur : déduit via tv_scop_id', () => {
|
|
618
|
+
vi.mocked(scopOrCop).mockImplementation((di) => {
|
|
619
|
+
di.scop = 3;
|
|
620
|
+
});
|
|
621
|
+
const g = gen({
|
|
622
|
+
type_energie: 'gaz',
|
|
623
|
+
enum_type_generateur_ecs_id: '84',
|
|
624
|
+
tv_scop_id: '5',
|
|
625
|
+
enum_methode_saisie_carac_sys_id: '1'
|
|
626
|
+
});
|
|
627
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
628
|
+
|
|
629
|
+
// Reconnu comme PAC -> consommation pilotée par le SCOP
|
|
630
|
+
expect(scopOrCop).toHaveBeenCalled();
|
|
631
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(37.03703703703703, 9);
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Réseau de chaleur : redressement de reseau_distribution_isole (bug_for_bug_compat).
|
|
636
|
+
*/
|
|
637
|
+
test('bug_for_bug_compat : rendement 0.9 saisi force reseau_distribution_isole à 1', () => {
|
|
638
|
+
state.bug = true;
|
|
639
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
640
|
+
ecs_de.enum_type_installation_id = '3';
|
|
641
|
+
ecs_de.reseau_distribution_isole = 0;
|
|
642
|
+
const g = {
|
|
643
|
+
donnee_entree: {
|
|
644
|
+
usage_generateur: 'ecs',
|
|
645
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
646
|
+
volume_stockage: 0,
|
|
647
|
+
type_energie: 'réseau de chauffage urbain',
|
|
648
|
+
enum_type_generateur_ecs_id: '72'
|
|
649
|
+
},
|
|
650
|
+
donnee_intermediaire: { rendement_generation_stockage: 0.9 }
|
|
651
|
+
};
|
|
652
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
653
|
+
|
|
654
|
+
expect(ecs_de.reseau_distribution_isole).toBe(1);
|
|
655
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
656
|
+
warnSpy.mockRestore();
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
test('usage chauffage + ecs : type de générateur limité aux générateurs mixtes', () => {
|
|
660
|
+
const g = gen({
|
|
661
|
+
type_energie: 'électricité',
|
|
662
|
+
enum_type_generateur_ecs_id: '60',
|
|
663
|
+
usage_generateur: 'chauffage + ecs'
|
|
664
|
+
});
|
|
665
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
666
|
+
|
|
667
|
+
// Le générateur électrique conserve son calcul de rendement de stockage
|
|
668
|
+
expect(g.donnee_intermediaire.rendement_stockage).toBeCloseTo(1, 9);
|
|
669
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(111.11111111111111, 9);
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
test('usage de générateur inconnu : avertissement, type de générateur non défini', () => {
|
|
673
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
674
|
+
const g = gen({
|
|
675
|
+
type_energie: 'électricité',
|
|
676
|
+
enum_type_generateur_ecs_id: '60',
|
|
677
|
+
usage_generateur: 'refroidissement'
|
|
678
|
+
});
|
|
679
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
680
|
+
|
|
681
|
+
expect(warnSpy).toHaveBeenCalledWith(
|
|
682
|
+
"!! usage_generateur n'est pas 'ecs' ou 'chauffage + ecs' !!"
|
|
683
|
+
);
|
|
684
|
+
warnSpy.mockRestore();
|
|
685
|
+
});
|
|
686
|
+
|
|
687
|
+
test('collectif électrique : pertes de stockage calculées avec le volume collectif', () => {
|
|
688
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
689
|
+
table === 'pertes_stockage' ? ['60'] : []
|
|
690
|
+
);
|
|
691
|
+
vi.mocked(tv).mockReturnValue({ cr: '0.5', tv_pertes_stockage_id: '7' });
|
|
692
|
+
ecs_de.enum_type_installation_id = '2';
|
|
693
|
+
ecs_de.ratio_virtualisation = 1;
|
|
694
|
+
const g = gen({
|
|
695
|
+
type_energie: 'électricité',
|
|
696
|
+
enum_type_generateur_ecs_id: '60',
|
|
697
|
+
type_stockage_ecs: 'ballon',
|
|
698
|
+
volume_stockage: 150
|
|
699
|
+
});
|
|
700
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
701
|
+
|
|
702
|
+
// Volume collectif (150) transmis à tv_pertes_stockage
|
|
703
|
+
expect(tv).toHaveBeenCalledWith('pertes_stockage', {
|
|
704
|
+
enum_type_generateur_ecs_id: '60',
|
|
705
|
+
volume_ballon: '100 < ≤ 200'
|
|
706
|
+
});
|
|
707
|
+
expect(g.donnee_intermediaire.Qgw).toBe(1208250);
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
test('pompe à chaleur sans SCOP : la consommation est pilotée par le COP', () => {
|
|
711
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) => (table === 'scop' ? ['pac'] : []));
|
|
712
|
+
vi.mocked(scopOrCop).mockImplementation((di) => {
|
|
713
|
+
di.cop = 2.5;
|
|
714
|
+
});
|
|
715
|
+
const g = gen({ type_energie: 'électricité', enum_type_generateur_ecs_id: 'pac' });
|
|
716
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
717
|
+
|
|
718
|
+
// valeur de référence de régression : 100 / 2.5 / 0.9
|
|
719
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(44.44444444444444, 9);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
test('bug_for_bug_compat : rendement 0.75 saisi avec réseau marqué isolé -> avertissement', () => {
|
|
723
|
+
state.bug = true;
|
|
724
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
725
|
+
ecs_de.enum_type_installation_id = '3';
|
|
726
|
+
ecs_de.reseau_distribution_isole = 1;
|
|
727
|
+
const g = {
|
|
728
|
+
donnee_entree: {
|
|
729
|
+
usage_generateur: 'ecs',
|
|
730
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
731
|
+
volume_stockage: 0,
|
|
732
|
+
type_energie: 'réseau de chauffage urbain',
|
|
733
|
+
enum_type_generateur_ecs_id: '72',
|
|
734
|
+
description: 'RCU'
|
|
735
|
+
},
|
|
736
|
+
donnee_intermediaire: { rendement_generation_stockage: 0.75 }
|
|
737
|
+
};
|
|
738
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
739
|
+
|
|
740
|
+
// Le réseau reste isolé (0.9) car reseau_distribution_isole = 1
|
|
741
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.9);
|
|
742
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
743
|
+
warnSpy.mockRestore();
|
|
744
|
+
});
|
|
745
|
+
});
|