@open3cl/engine 1.7.0 → 1.7.1
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 +1 -0
- package/10_clim.spec.js +1 -0
- package/11_besoin_ecs.spec.js +1 -0
- package/11_ecs.spec.js +1 -0
- package/12.4_pac.spec.js +1 -0
- package/13.2_generateur_combustion.spec.js +3 -3
- package/13.2_generateur_combustion_ch.spec.js +3 -3
- package/14_generateur_ecs.spec.js +1 -0
- package/15_conso_aux.spec.js +3 -3
- package/2021_04_13_confort_ete.spec.js +1 -0
- package/3.1_b.spec.js +1 -0
- package/3.2.1_mur.spec.js +1 -0
- package/3.2.2_plancher_bas.spec.js +1 -0
- package/3.2.3_plancher_haut.spec.js +1 -0
- package/3.3.1.4_porte.spec.js +1 -0
- package/3.3_baie_vitree.spec.js +1 -0
- package/3.4_pont_thermique.spec.js +1 -0
- package/4_ventilation.spec.js +1 -0
- package/5_conso_ventilation.spec.js +1 -0
- package/6.2_surface_sud_equivalente.spec.js +1 -0
- package/9_besoin_ch.spec.js +1 -0
- package/9_chauffage.spec.js +3 -3
- package/9_conso_ch.spec.js +1 -0
- package/9_emetteur_ch.spec.js +1 -0
- package/9_generateur_ch.spec.js +1 -0
- package/README.md +412 -291
- package/conso.spec.js +1 -0
- package/engine.js +3 -1
- package/engine.spec.js +1 -0
- package/package.json +15 -14
- package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
- package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
- package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
- package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
- package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
- package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
- package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
- package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
- package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
- package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +0 -508
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { DeperditionPorteService } from './deperdition-porte.service.js';
|
|
2
|
-
import corpus from '../../../../../../test/corpus-sano.json';
|
|
3
|
-
import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
|
|
4
|
-
import { beforeEach, describe, expect, test } from 'vitest';
|
|
5
|
-
import { TvStore } from '../../../../dpe/infrastructure/tv.store.js';
|
|
6
|
-
import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
|
|
7
|
-
|
|
8
|
-
/** @type {DeperditionPorteService} **/
|
|
9
|
-
let service;
|
|
10
|
-
|
|
11
|
-
describe('Calcul de déperdition des portes', () => {
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
service = new DeperditionPorteService(new TvStore());
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
describe('Determination de uPorte', () => {
|
|
17
|
-
/** @type {Contexte} */
|
|
18
|
-
const ctx = { zoneClimatique: { id: 1 } };
|
|
19
|
-
|
|
20
|
-
test.each([
|
|
21
|
-
{ type: '1', label: 'porte simple en bois porte opaque pleine', uPorteExpected: 3.5 },
|
|
22
|
-
{
|
|
23
|
-
type: '2',
|
|
24
|
-
label: 'porte simple en bois porte avec moins de 30% de vitrage simple',
|
|
25
|
-
uPorteExpected: 4
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
type: '3',
|
|
29
|
-
label: 'porte simple en bois porte avec 30-60% de vitrage simple',
|
|
30
|
-
uPorteExpected: 4.5
|
|
31
|
-
},
|
|
32
|
-
{ type: '4', label: 'porte simple en bois porte avec double vitrage', uPorteExpected: 3.3 },
|
|
33
|
-
{ type: '5', label: 'porte simple en pvc porte opaque pleine', uPorteExpected: 3.5 },
|
|
34
|
-
{
|
|
35
|
-
type: '6',
|
|
36
|
-
label: 'porte simple en pvc porte avec moins de 30% de vitrage simple',
|
|
37
|
-
uPorteExpected: 4
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
type: '7',
|
|
41
|
-
label: 'porte simple en pvc porte avec 30-60% de vitrage simple',
|
|
42
|
-
uPorteExpected: 4.5
|
|
43
|
-
},
|
|
44
|
-
{ type: '8', label: 'porte simple en pvc porte avec double vitrage', uPorteExpected: 3.3 },
|
|
45
|
-
|
|
46
|
-
{ type: '9', label: 'porte simple en métal porte opaque pleine', uPorteExpected: 5.8 },
|
|
47
|
-
{ type: '10', label: 'porte simple en métal porte avec vitrage simple', uPorteExpected: 5.8 },
|
|
48
|
-
{
|
|
49
|
-
type: '11',
|
|
50
|
-
label: 'porte simple en métal porte avec moins de 30% de double vitrage',
|
|
51
|
-
uPorteExpected: 5.5
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
type: '12',
|
|
55
|
-
label: 'porte simple en métal porte avec 30-60% de double vitrage',
|
|
56
|
-
uPorteExpected: 4.8
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
{ type: '13', label: 'toute menuiserie porte opaque pleine isolée', uPorteExpected: 1.5 },
|
|
60
|
-
{ type: '14', label: 'toute menuiserie porte précédée d’un sas', uPorteExpected: 1.5 },
|
|
61
|
-
{
|
|
62
|
-
type: '15',
|
|
63
|
-
label: 'toute menuiserie porte isolée avec double vitrage',
|
|
64
|
-
uPorteExpected: 1.5
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
{ type: '16', label: 'autre type de porte', uPorteExpected: undefined }
|
|
68
|
-
])('$label (id:$type)', ({ type, uPorteExpected }) => {
|
|
69
|
-
/** @type {PorteDE} */
|
|
70
|
-
const de = {
|
|
71
|
-
enum_type_porte_id: type
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const di = service.execute(ctx, de);
|
|
75
|
-
expect(di.uporte).toBe(uPorteExpected);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test('autre porte Uporte saisie manuellement ', () => {
|
|
79
|
-
/** @type {PorteDE} */
|
|
80
|
-
const de = {
|
|
81
|
-
enum_type_porte_id: '16',
|
|
82
|
-
enum_methode_saisie_uporte_id: '2',
|
|
83
|
-
uporte_saisi: 1.6
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const di = service.execute(ctx, de);
|
|
87
|
-
expect(di.uporte).toBe(de.uporte_saisi);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test('autre porte Uporte saisie manuellement et justifié', () => {
|
|
91
|
-
/** @type {PorteDE} */
|
|
92
|
-
const de = {
|
|
93
|
-
enum_type_porte_id: '16',
|
|
94
|
-
enum_methode_saisie_uporte_id: '3',
|
|
95
|
-
uporte_saisi: 1.88
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const di = service.execute(ctx, de);
|
|
99
|
-
expect(di.uporte).toBe(de.uporte_saisi);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
describeIntegration("Test d'intégration de porte", () => {
|
|
104
|
-
test.each(corpus)('vérification des DI des portes pour dpe %s', (ademeId) => {
|
|
105
|
-
const dpeRequest = getAdemeFileJson(ademeId);
|
|
106
|
-
/** @type {Contexte} */
|
|
107
|
-
const ctx = { zoneClimatique: { id: dpeRequest.logement.meteo.enum_zone_climatique_id } };
|
|
108
|
-
const portes = dpeRequest.logement.enveloppe.porte_collection?.porte || [];
|
|
109
|
-
|
|
110
|
-
portes.forEach((p) => {
|
|
111
|
-
const di = service.execute(ctx, p.donnee_entree);
|
|
112
|
-
expect(di.uporte).toBeCloseTo(p.donnee_intermediaire.uporte, 2);
|
|
113
|
-
expect(di.b).toBeCloseTo(p.donnee_intermediaire.b, 2);
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
});
|
package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js
DELETED
|
@@ -1,508 +0,0 @@
|
|
|
1
|
-
import { TvStore } from '../../../../dpe/infrastructure/tv.store.js';
|
|
2
|
-
import { DeperditionVentilationService } from './deperdition-ventilation.service.js';
|
|
3
|
-
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
4
|
-
import { TypeHabitation } from '../../../../dpe/domain/models/type-habitation.model.js';
|
|
5
|
-
import corpus from '../../../../../../test/corpus-sano.json';
|
|
6
|
-
import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
|
|
7
|
-
import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js';
|
|
8
|
-
import { ContexteBuilder } from '../../contexte.builder.js';
|
|
9
|
-
import { DeperditionEnveloppeService } from '../deperdition-enveloppe.service.js';
|
|
10
|
-
import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
|
|
11
|
-
import { logger } from '../../../../../core/util/logger/log-service.js';
|
|
12
|
-
|
|
13
|
-
/** @type {DeperditionVentilationService} **/
|
|
14
|
-
let service;
|
|
15
|
-
|
|
16
|
-
/** @type {DpeNormalizerService} **/
|
|
17
|
-
let normalizerService;
|
|
18
|
-
|
|
19
|
-
/** @type {DeperditionEnveloppeService} **/
|
|
20
|
-
let deperditionEnveloppeService;
|
|
21
|
-
|
|
22
|
-
/** @type {ContexteBuilder} **/
|
|
23
|
-
let contexteBuilder;
|
|
24
|
-
|
|
25
|
-
/** @type {TvStore} **/
|
|
26
|
-
let tvStore;
|
|
27
|
-
|
|
28
|
-
describe('Calcul de déperdition des portes', () => {
|
|
29
|
-
beforeEach(() => {
|
|
30
|
-
tvStore = new TvStore();
|
|
31
|
-
service = new DeperditionVentilationService(tvStore);
|
|
32
|
-
normalizerService = new DpeNormalizerService();
|
|
33
|
-
contexteBuilder = new ContexteBuilder();
|
|
34
|
-
deperditionEnveloppeService = new DeperditionEnveloppeService();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe('Determination de q4paConv', () => {
|
|
38
|
-
/** @type {Contexte} */
|
|
39
|
-
let ctx = { typeHabitation: TypeHabitation.MAISON };
|
|
40
|
-
|
|
41
|
-
test.each([
|
|
42
|
-
{
|
|
43
|
-
q4paConvSaisi: undefined,
|
|
44
|
-
enumPeriodeConstructionId: '1',
|
|
45
|
-
surfaceIsolee: 0,
|
|
46
|
-
surfaceNonIsolee: 0,
|
|
47
|
-
surfaceMenuiserieAvecJoint: 0,
|
|
48
|
-
surfaceMenuiserieSansJoint: 0,
|
|
49
|
-
expectedIsolationSurface: '0',
|
|
50
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
q4paConvSaisi: undefined,
|
|
54
|
-
enumPeriodeConstructionId: '1',
|
|
55
|
-
surfaceIsolee: 200,
|
|
56
|
-
surfaceNonIsolee: 100,
|
|
57
|
-
surfaceMenuiserieAvecJoint: 0,
|
|
58
|
-
surfaceMenuiserieSansJoint: 0,
|
|
59
|
-
expectedIsolationSurface: '1',
|
|
60
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
q4paConvSaisi: undefined,
|
|
64
|
-
enumPeriodeConstructionId: '1',
|
|
65
|
-
surfaceIsolee: 200,
|
|
66
|
-
surfaceNonIsolee: 300,
|
|
67
|
-
surfaceMenuiserieAvecJoint: 100,
|
|
68
|
-
surfaceMenuiserieSansJoint: 0,
|
|
69
|
-
expectedIsolationSurface: '0',
|
|
70
|
-
expectedPresenceJointsMenuiserie: '1'
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
q4paConvSaisi: undefined,
|
|
74
|
-
enumPeriodeConstructionId: '1',
|
|
75
|
-
surfaceIsolee: 200,
|
|
76
|
-
surfaceNonIsolee: 300,
|
|
77
|
-
surfaceMenuiserieAvecJoint: 100,
|
|
78
|
-
surfaceMenuiserieSansJoint: 200,
|
|
79
|
-
expectedIsolationSurface: '0',
|
|
80
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
q4paConvSaisi: undefined,
|
|
84
|
-
enumPeriodeConstructionId: '2',
|
|
85
|
-
surfaceIsolee: 200,
|
|
86
|
-
surfaceNonIsolee: 100,
|
|
87
|
-
surfaceMenuiserieAvecJoint: 0,
|
|
88
|
-
surfaceMenuiserieSansJoint: 0,
|
|
89
|
-
expectedIsolationSurface: '1',
|
|
90
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
// 1948-1974 mais moins de 50% de surface isolée => isolationSurface '0'
|
|
94
|
-
q4paConvSaisi: undefined,
|
|
95
|
-
enumPeriodeConstructionId: '2',
|
|
96
|
-
surfaceIsolee: 100,
|
|
97
|
-
surfaceNonIsolee: 200,
|
|
98
|
-
surfaceMenuiserieAvecJoint: 0,
|
|
99
|
-
surfaceMenuiserieSansJoint: 0,
|
|
100
|
-
expectedIsolationSurface: '0',
|
|
101
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
q4paConvSaisi: undefined,
|
|
105
|
-
enumPeriodeConstructionId: '3',
|
|
106
|
-
surfaceIsolee: 200,
|
|
107
|
-
surfaceNonIsolee: 100,
|
|
108
|
-
surfaceMenuiserieAvecJoint: 0,
|
|
109
|
-
surfaceMenuiserieSansJoint: 0,
|
|
110
|
-
expectedIsolationSurface: undefined,
|
|
111
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
q4paConvSaisi: 12.5,
|
|
115
|
-
enumPeriodeConstructionId: '1',
|
|
116
|
-
surfaceIsolee: 0,
|
|
117
|
-
surfaceNonIsolee: 0,
|
|
118
|
-
surfaceMenuiserieAvecJoint: 0,
|
|
119
|
-
surfaceMenuiserieSansJoint: 0,
|
|
120
|
-
expectedIsolationSurface: '0',
|
|
121
|
-
expectedPresenceJointsMenuiserie: undefined
|
|
122
|
-
}
|
|
123
|
-
])(
|
|
124
|
-
'$q4paConvSaisi: q4paConvSaisi, $enumPeriodeConstructionId: enumPeriodeConstructionId, $surfaceIsolee: surfaceIsolee,' +
|
|
125
|
-
'$surfaceNonIsolee: surfaceNonIsolee, $surfaceMenuiserieAvecJoint: surfaceMenuiserieAvecJoint, $surfaceMenuiserieSansJoint: surfaceMenuiserieSansJoint,' +
|
|
126
|
-
'$expectedIsolationSurface: expectedIsolationSurface, $expectedPresenceJointsMenuiserie: expectedPresenceJointsMenuiserie',
|
|
127
|
-
({
|
|
128
|
-
q4paConvSaisi,
|
|
129
|
-
enumPeriodeConstructionId,
|
|
130
|
-
surfaceIsolee,
|
|
131
|
-
surfaceNonIsolee,
|
|
132
|
-
surfaceMenuiserieAvecJoint,
|
|
133
|
-
surfaceMenuiserieSansJoint,
|
|
134
|
-
expectedIsolationSurface,
|
|
135
|
-
expectedPresenceJointsMenuiserie
|
|
136
|
-
}) => {
|
|
137
|
-
vi.spyOn(tvStore, 'getQ4paConv').mockReturnValue({ q4pa_conv: 18.8 });
|
|
138
|
-
ctx.enumPeriodeConstructionId = enumPeriodeConstructionId;
|
|
139
|
-
|
|
140
|
-
/** @type {VentilationDE} */
|
|
141
|
-
const de = {
|
|
142
|
-
q4pa_conv_saisi: q4paConvSaisi
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
const q4paConv = service.q4paConv(
|
|
146
|
-
de,
|
|
147
|
-
ctx,
|
|
148
|
-
surfaceIsolee,
|
|
149
|
-
surfaceNonIsolee,
|
|
150
|
-
surfaceMenuiserieAvecJoint,
|
|
151
|
-
surfaceMenuiserieSansJoint
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
if (q4paConvSaisi) {
|
|
155
|
-
expect(tvStore.getQ4paConv).not.toHaveBeenCalled();
|
|
156
|
-
expect(q4paConv).toBe(q4paConvSaisi);
|
|
157
|
-
} else {
|
|
158
|
-
expect(tvStore.getQ4paConv).toHaveBeenCalledWith(
|
|
159
|
-
enumPeriodeConstructionId,
|
|
160
|
-
TypeHabitation.MAISON,
|
|
161
|
-
expectedIsolationSurface,
|
|
162
|
-
expectedPresenceJointsMenuiserie
|
|
163
|
-
);
|
|
164
|
-
expect(q4paConv).toBe(18.8);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
test('calcul de hvent', () => {
|
|
170
|
-
expect(service.hvent(108, { qvarep_conv: 10 })).toBeCloseTo(367.2, 2);
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
describe('Determination de hperm', () => {
|
|
175
|
-
/** @type {Contexte} */
|
|
176
|
-
let ctx = { typeHabitation: TypeHabitation.MAISON, surfaceHabitable: 100 };
|
|
177
|
-
|
|
178
|
-
test.each([
|
|
179
|
-
{ plusieursFacadeExposee: false, expectedHperm: 15.04 },
|
|
180
|
-
{ plusieursFacadeExposee: true, expectedHperm: 98.97 }
|
|
181
|
-
])(
|
|
182
|
-
'$plusieursFacadeExposee: plusieursFacadeExposee, $expectedHperm: expectedHperm',
|
|
183
|
-
({ plusieursFacadeExposee, expectedHperm }) => {
|
|
184
|
-
ctx.hauteurSousPlafond = 10;
|
|
185
|
-
|
|
186
|
-
/** @type {VentilationDE} */
|
|
187
|
-
const de = {
|
|
188
|
-
plusieurs_facade_exposee: plusieursFacadeExposee
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
const hperm = service.hperm(
|
|
192
|
-
de,
|
|
193
|
-
{ smea_conv: 18, qvasouf_conv: 15.3, qvarep_conv: 13.2 },
|
|
194
|
-
ctx,
|
|
195
|
-
10.5,
|
|
196
|
-
19.6
|
|
197
|
-
);
|
|
198
|
-
expect(hperm).toBeCloseTo(expectedHperm, 2);
|
|
199
|
-
}
|
|
200
|
-
);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
describe('Determination de pventMoy', () => {
|
|
204
|
-
test.each([
|
|
205
|
-
{
|
|
206
|
-
label: 'Ventilation par ouverture des fenêtres',
|
|
207
|
-
typeVentilation: '1',
|
|
208
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
209
|
-
ventilationPost2012: true,
|
|
210
|
-
surfaceHabitable: 100,
|
|
211
|
-
qvarepConv: 10,
|
|
212
|
-
expectedPventMoy: 0
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
label: 'Ventilation naturelle par conduit',
|
|
216
|
-
typeVentilation: '25',
|
|
217
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
218
|
-
ventilationPost2012: false,
|
|
219
|
-
surfaceHabitable: 100,
|
|
220
|
-
qvarepConv: 10,
|
|
221
|
-
expectedPventMoy: 0
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
label: 'Ventilation Simple flux auto SF AUTO',
|
|
225
|
-
typeVentilation: '4',
|
|
226
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
227
|
-
ventilationPost2012: true,
|
|
228
|
-
surfaceHabitable: 100,
|
|
229
|
-
qvarepConv: 10,
|
|
230
|
-
expectedPventMoy: 35
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
label: 'Ventilation Simple flux auto SF AUTO',
|
|
234
|
-
typeVentilation: '4',
|
|
235
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
236
|
-
ventilationPost2012: false,
|
|
237
|
-
surfaceHabitable: 100,
|
|
238
|
-
qvarepConv: 10,
|
|
239
|
-
expectedPventMoy: 65
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
label: 'Ventilation Simple flux auto SF AUTO',
|
|
243
|
-
typeVentilation: '4',
|
|
244
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
245
|
-
ventilationPost2012: true,
|
|
246
|
-
surfaceHabitable: 100,
|
|
247
|
-
qvarepConv: 10,
|
|
248
|
-
expectedPventMoy: 250
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
label: 'Ventilation Simple flux auto SF AUTO',
|
|
252
|
-
typeVentilation: '4',
|
|
253
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
254
|
-
ventilationPost2012: false,
|
|
255
|
-
surfaceHabitable: 100,
|
|
256
|
-
qvarepConv: 10,
|
|
257
|
-
expectedPventMoy: 460
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
label: 'Ventilation Simple flux auto SF GAZ',
|
|
261
|
-
typeVentilation: '10',
|
|
262
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
263
|
-
ventilationPost2012: true,
|
|
264
|
-
surfaceHabitable: 100,
|
|
265
|
-
qvarepConv: 10,
|
|
266
|
-
expectedPventMoy: 35
|
|
267
|
-
},
|
|
268
|
-
{
|
|
269
|
-
label: 'Ventilation Simple flux auto SF GAZ',
|
|
270
|
-
typeVentilation: '11',
|
|
271
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
272
|
-
ventilationPost2012: false,
|
|
273
|
-
surfaceHabitable: 100,
|
|
274
|
-
qvarepConv: 10,
|
|
275
|
-
expectedPventMoy: 65
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
label: 'Ventilation Simple flux auto SF GAZ',
|
|
279
|
-
typeVentilation: '10',
|
|
280
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
281
|
-
ventilationPost2012: true,
|
|
282
|
-
surfaceHabitable: 100,
|
|
283
|
-
qvarepConv: 10,
|
|
284
|
-
expectedPventMoy: 250
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
label: 'Ventilation Simple flux auto SF GAZ',
|
|
288
|
-
typeVentilation: '12',
|
|
289
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
290
|
-
ventilationPost2012: false,
|
|
291
|
-
surfaceHabitable: 100,
|
|
292
|
-
qvarepConv: 10,
|
|
293
|
-
expectedPventMoy: 460
|
|
294
|
-
},
|
|
295
|
-
{
|
|
296
|
-
label: 'Ventilation Simple flux hygro SF HYGRO',
|
|
297
|
-
typeVentilation: '7',
|
|
298
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
299
|
-
ventilationPost2012: true,
|
|
300
|
-
surfaceHabitable: 100,
|
|
301
|
-
qvarepConv: 10,
|
|
302
|
-
expectedPventMoy: 15
|
|
303
|
-
},
|
|
304
|
-
{
|
|
305
|
-
label: 'Ventilation Simple flux hygro SF HYGRO',
|
|
306
|
-
typeVentilation: '8',
|
|
307
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
308
|
-
ventilationPost2012: false,
|
|
309
|
-
surfaceHabitable: 100,
|
|
310
|
-
qvarepConv: 10,
|
|
311
|
-
expectedPventMoy: 50
|
|
312
|
-
},
|
|
313
|
-
{
|
|
314
|
-
label: 'Ventilation Simple flux hygro SF HYGRO',
|
|
315
|
-
typeVentilation: '9',
|
|
316
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
317
|
-
ventilationPost2012: true,
|
|
318
|
-
surfaceHabitable: 100,
|
|
319
|
-
qvarepConv: 10,
|
|
320
|
-
expectedPventMoy: 250
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
label: 'Ventilation Simple flux hygro SF HYGRO',
|
|
324
|
-
typeVentilation: '13',
|
|
325
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
326
|
-
ventilationPost2012: false,
|
|
327
|
-
surfaceHabitable: 100,
|
|
328
|
-
qvarepConv: 10,
|
|
329
|
-
expectedPventMoy: 460
|
|
330
|
-
},
|
|
331
|
-
{
|
|
332
|
-
label: 'Ventilation double flux hygro DF INDIVIDUELLE',
|
|
333
|
-
typeVentilation: '19',
|
|
334
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
335
|
-
ventilationPost2012: true,
|
|
336
|
-
surfaceHabitable: 100,
|
|
337
|
-
qvarepConv: 10,
|
|
338
|
-
expectedPventMoy: 35
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
label: 'Ventilation double flux hygro DF INDIVIDUELLE',
|
|
342
|
-
typeVentilation: '19',
|
|
343
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
344
|
-
ventilationPost2012: false,
|
|
345
|
-
surfaceHabitable: 100,
|
|
346
|
-
qvarepConv: 10,
|
|
347
|
-
expectedPventMoy: 80
|
|
348
|
-
},
|
|
349
|
-
{
|
|
350
|
-
label: 'Ventilation double flux hygro DF INDIVIDUELLE',
|
|
351
|
-
typeVentilation: '19',
|
|
352
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
353
|
-
ventilationPost2012: true,
|
|
354
|
-
surfaceHabitable: 100,
|
|
355
|
-
qvarepConv: 10,
|
|
356
|
-
expectedPventMoy: 600
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
label: 'Ventilation double flux hygro DF INDIVIDUELLE',
|
|
360
|
-
typeVentilation: '19',
|
|
361
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
362
|
-
ventilationPost2012: false,
|
|
363
|
-
surfaceHabitable: 100,
|
|
364
|
-
qvarepConv: 10,
|
|
365
|
-
expectedPventMoy: 1100
|
|
366
|
-
},
|
|
367
|
-
{
|
|
368
|
-
label: 'Ventilation simple flux auto HYBRIDE',
|
|
369
|
-
typeVentilation: '26',
|
|
370
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
371
|
-
ventilationPost2012: true,
|
|
372
|
-
surfaceHabitable: 100,
|
|
373
|
-
qvarepConv: 10,
|
|
374
|
-
expectedPventMoy: 2.92
|
|
375
|
-
},
|
|
376
|
-
{
|
|
377
|
-
label: 'Ventilation simple flux auto HYBRIDE',
|
|
378
|
-
typeVentilation: '27',
|
|
379
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
380
|
-
ventilationPost2012: false,
|
|
381
|
-
surfaceHabitable: 100,
|
|
382
|
-
qvarepConv: 10,
|
|
383
|
-
expectedPventMoy: 5.42
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
label: 'Ventilation simple flux auto HYBRIDE',
|
|
387
|
-
typeVentilation: '28',
|
|
388
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
389
|
-
ventilationPost2012: true,
|
|
390
|
-
surfaceHabitable: 100,
|
|
391
|
-
qvarepConv: 10,
|
|
392
|
-
expectedPventMoy: 41.67
|
|
393
|
-
},
|
|
394
|
-
{
|
|
395
|
-
label: 'Ventilation simple flux auto HYBRIDE',
|
|
396
|
-
typeVentilation: '29',
|
|
397
|
-
typeHabitation: TypeHabitation.APPARTEMENT,
|
|
398
|
-
ventilationPost2012: false,
|
|
399
|
-
surfaceHabitable: 100,
|
|
400
|
-
qvarepConv: 10,
|
|
401
|
-
expectedPventMoy: 76.67
|
|
402
|
-
}
|
|
403
|
-
])(
|
|
404
|
-
'$typeVentilation: typeVentilation, $typeHabitation: typeHabitation, $ventilationPost2012: ventilationPost2012, $surfaceHabitable: surfaceHabitable, $qvarepConv: qvarepConv',
|
|
405
|
-
({
|
|
406
|
-
typeVentilation,
|
|
407
|
-
typeHabitation,
|
|
408
|
-
ventilationPost2012,
|
|
409
|
-
surfaceHabitable,
|
|
410
|
-
qvarepConv,
|
|
411
|
-
expectedPventMoy
|
|
412
|
-
}) => {
|
|
413
|
-
const pventMoy = service.pventMoy(
|
|
414
|
-
typeVentilation,
|
|
415
|
-
{ typeHabitation, surfaceHabitable },
|
|
416
|
-
ventilationPost2012,
|
|
417
|
-
{ qvarep_conv: qvarepConv }
|
|
418
|
-
);
|
|
419
|
-
expect(pventMoy).toBeCloseTo(expectedPventMoy, 2);
|
|
420
|
-
}
|
|
421
|
-
);
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
describe('execute (agrégation des déperditions et consommations de ventilation)', () => {
|
|
425
|
-
/** @type {Contexte} */
|
|
426
|
-
const ctx = {
|
|
427
|
-
surfaceHabitable: 100,
|
|
428
|
-
hauteurSousPlafond: 2.5,
|
|
429
|
-
typeHabitation: TypeHabitation.MAISON,
|
|
430
|
-
enumPeriodeConstructionId: '3'
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
test('assemble hvent, hperm et la consommation des auxiliaires', () => {
|
|
434
|
-
vi.spyOn(tvStore, 'getDebitsVentilation').mockReturnValue({
|
|
435
|
-
qvarep_conv: 10,
|
|
436
|
-
qvasouf_conv: 5,
|
|
437
|
-
smea_conv: 2
|
|
438
|
-
});
|
|
439
|
-
vi.spyOn(tvStore, 'getQ4paConv').mockReturnValue({ q4pa_conv: 1.7 });
|
|
440
|
-
|
|
441
|
-
/** @type {VentilationDE} */
|
|
442
|
-
const de = {
|
|
443
|
-
enum_type_ventilation_id: '4',
|
|
444
|
-
ventilation_post_2012: true,
|
|
445
|
-
plusieurs_facade_exposee: false
|
|
446
|
-
};
|
|
447
|
-
|
|
448
|
-
const di = service.execute(ctx, de, 120, 80, 40, 10, 5);
|
|
449
|
-
|
|
450
|
-
expect(tvStore.getDebitsVentilation).toHaveBeenCalledWith('4');
|
|
451
|
-
// hvent = 0.34 * qvarep_conv * surfaceHabitable
|
|
452
|
-
expect(di.hvent).toBeCloseTo(340, 5);
|
|
453
|
-
// pventMoy (SF auto, maison, post 2012) = 35 => conso = 8.76 * 35
|
|
454
|
-
expect(di.pvent_moy).toBe(35);
|
|
455
|
-
expect(di.conso_auxiliaire_ventilation).toBeCloseTo(306.6, 5);
|
|
456
|
-
// hperm : valeur de référence de régression
|
|
457
|
-
expect(di.hperm).toBeCloseTo(0.10692928032279153, 9);
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
test('conso des auxiliaires nulle sans type de ventilation ni indicateur post 2012', () => {
|
|
461
|
-
vi.spyOn(tvStore, 'getDebitsVentilation').mockReturnValue({});
|
|
462
|
-
vi.spyOn(tvStore, 'getQ4paConv').mockReturnValue({ q4pa_conv: 1.7 });
|
|
463
|
-
const errorSpy = vi.spyOn(logger, 'error').mockImplementation(() => {});
|
|
464
|
-
|
|
465
|
-
/** @type {VentilationDE} */
|
|
466
|
-
const de = { plusieurs_facade_exposee: false };
|
|
467
|
-
|
|
468
|
-
const di = service.execute(ctx, de, 0, 0, 0, 0, 0);
|
|
469
|
-
|
|
470
|
-
expect(errorSpy).toHaveBeenCalledOnce();
|
|
471
|
-
// La consommation retournée vaut 0 (nombre), les clés conso ne sont donc pas ajoutées
|
|
472
|
-
expect(di.conso_auxiliaire_ventilation).toBeUndefined();
|
|
473
|
-
expect(di.pvent_moy).toBeUndefined();
|
|
474
|
-
});
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
describeIntegration("Test d'intégration des ventilations", () => {
|
|
478
|
-
test.each(corpus)('vérification des DI de la ventilation pour dpe %s', (ademeId) => {
|
|
479
|
-
let dpeRequest = getAdemeFileJson(ademeId);
|
|
480
|
-
dpeRequest = normalizerService.normalize(dpeRequest);
|
|
481
|
-
|
|
482
|
-
const initialVentilations = [
|
|
483
|
-
...(dpeRequest.logement.ventilation_collection?.ventilation || [])
|
|
484
|
-
];
|
|
485
|
-
|
|
486
|
-
/** @type {Contexte} */
|
|
487
|
-
const ctx = contexteBuilder.fromDpe(dpeRequest);
|
|
488
|
-
|
|
489
|
-
deperditionEnveloppeService.deperditions(ctx, dpeRequest.logement);
|
|
490
|
-
|
|
491
|
-
const ventilations = dpeRequest.logement.ventilation_collection?.ventilation || [];
|
|
492
|
-
|
|
493
|
-
ventilations.forEach((ventilation, index) => {
|
|
494
|
-
expect(initialVentilations[index].donnee_intermediaire.hvent).toBeCloseTo(
|
|
495
|
-
ventilation.donnee_intermediaire.hvent,
|
|
496
|
-
2
|
|
497
|
-
);
|
|
498
|
-
expect(initialVentilations[index].donnee_intermediaire.hperm).toBeCloseTo(
|
|
499
|
-
ventilation.donnee_intermediaire.hperm,
|
|
500
|
-
2
|
|
501
|
-
);
|
|
502
|
-
expect(
|
|
503
|
-
initialVentilations[index].donnee_intermediaire.conso_auxiliaire_ventilation
|
|
504
|
-
).toBeCloseTo(ventilation.donnee_intermediaire.conso_auxiliaire_ventilation, 2);
|
|
505
|
-
});
|
|
506
|
-
});
|
|
507
|
-
});
|
|
508
|
-
});
|