@open3cl/engine 1.0.8 → 1.0.9

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.
@@ -4,8 +4,7 @@ import { Ets } from './ets.model';
4
4
  import { InstallationChauffage } from './installation-chauffage.model';
5
5
  import { InstallationEcs } from './installation-ecs.model';
6
6
  import { Mur } from './mur.model';
7
- import { PlancherBas } from './plancher-bas.model';
8
- import { PlancherHaut } from './plancher-haut.model';
7
+ import { PlancherBas, PlancherHaut } from './plancher.model';
9
8
  import { PontThermique } from './pont-thermique.model';
10
9
  import { Porte } from './porte.model';
11
10
  import { ProductionElecEnr } from './production-elec-enr.model';
@@ -187,7 +186,12 @@ export interface DE {
187
186
  reference?: string;
188
187
  }
189
188
 
190
- enum TypeHabitation {
189
+ export enum TypeHabitation {
190
+ MAISON = 'MAISON',
191
+ APPARTEMENT = 'APPARTEMENT',
192
+ IMMEUBLE = 'IMMEUBLE'
193
+ }
194
+ export enum TypeDpe {
191
195
  MAISON = 'MAISON',
192
196
  APPARTEMENT = 'APPARTEMENT',
193
197
  IMMEUBLE = 'IMMEUBLE'
@@ -5,7 +5,12 @@ export interface PlancherBas {
5
5
  donnee_intermediaire?: PlancherBasDI;
6
6
  }
7
7
 
8
- export interface PlancherBasDE extends DE {
8
+ export interface PlancherHaut {
9
+ donnee_entree?: PlancherHautDE;
10
+ donnee_intermediaire?: PlancherHautDI;
11
+ }
12
+
13
+ export interface PlancherDE extends DE {
9
14
  reference_lnc?: string;
10
15
  tv_coef_reduction_deperdition_id?: string; // TV
11
16
  surface_aiu?: number;
@@ -13,26 +18,45 @@ export interface PlancherBasDE extends DE {
13
18
  enum_cfg_isolation_lnc_id?: string; // ENUM cfg_isolation_lnc
14
19
  enum_type_adjacence_id?: string; // ENUM type_adjacence
15
20
  surface_paroi_opaque?: number;
16
- upb0_saisi?: number;
17
- tv_upb0_id?: string; // TV
18
- enum_type_plancher_bas_id?: string; // ENUM type_plancher_bas
19
21
  enum_methode_saisie_u0_id?: string; // ENUM methode_saisie_u0
20
- upb_saisi?: number;
22
+
21
23
  enum_type_isolation_id?: string; // ENUM type_isolation
22
24
  enum_periode_isolation_id?: string; // ENUM periode_isolation
23
25
  resistance_isolation?: number;
24
26
  epaisseur_isolation?: number;
25
- tv_upb_id?: string; // TV
26
27
  enum_methode_saisie_u_id?: string; // ENUM methode_saisie_u
28
+ }
29
+
30
+ export interface PlancherDI {
31
+ b: number;
32
+ }
33
+
34
+ export interface PlancherBasDE extends PlancherDE {
35
+ upb0_saisi?: number;
36
+ tv_upb0_id?: string; // TV
37
+ enum_type_plancher_bas_id?: string; // ENUM type_plancher_bas
38
+ upb_saisi?: number;
39
+ tv_upb_id?: string; // TV
27
40
  calcul_ue: number;
28
41
  perimetre_ue?: number;
29
42
  surface_ue?: number;
30
43
  ue?: number;
31
44
  }
32
45
 
33
- export interface PlancherBasDI {
46
+ export interface PlancherBasDI extends PlancherDI {
34
47
  upb: number;
35
48
  upb0: number;
36
49
  upb_final: number;
50
+ }
51
+
52
+ export interface PlancherHautDE extends PlancherDE {
53
+ uph0_saisi?: number;
54
+ tv_uph0_id?: string; // TV
55
+ enum_type_plancher_haut_id?: string; // ENUM type_plancher_bas
56
+ uph_saisi?: number;
57
+ tv_uph_id?: string; // TV
58
+ }
59
+
60
+ export interface PlancherHautDI extends PlancherDI {
37
61
  b: number;
38
62
  }
@@ -0,0 +1,112 @@
1
+ import { tvs as tv } from '../../../tv-v2.js';
2
+ import { logger } from '../../../core/util/logger/log-service.js';
3
+ import { TvStore } from './tv.store.js';
4
+
5
+ /**
6
+ * Accès aux données des tables de valeurs pour les baies vitrées
7
+ */
8
+ export class PontThermiqueTvStore extends TvStore {
9
+ /**
10
+ * Valeur du pont thermique (W/(m.K)) via tv_pont_thermique_id
11
+ *
12
+ * @param tvPontThermiqueId {number}
13
+ * @return {number|undefined}
14
+ */
15
+ getKForMurById(tvPontThermiqueId) {
16
+ const k = tv['pont_thermique'].find(
17
+ (v) => parseInt(v.tv_pont_thermique_id) === tvPontThermiqueId
18
+ )?.k;
19
+
20
+ if (!k) {
21
+ logger.error(`Pas de valeur forfaitaire k pour tvPontThermiqueId:${tvPontThermiqueId}`);
22
+ return 0;
23
+ }
24
+
25
+ return parseFloat(k);
26
+ }
27
+
28
+ /**
29
+ * Valeur du pont thermique (W/(m.K))
30
+ *
31
+ * @param enumTypeLiaisonId {number}
32
+ * @param isolationMur {string}
33
+ * @return {number|undefined}
34
+ */
35
+ getKForMur(enumTypeLiaisonId, isolationMur) {
36
+ const k = tv['pont_thermique'].find(
37
+ (v) =>
38
+ parseInt(v.enum_type_liaison_id) === enumTypeLiaisonId &&
39
+ v.isolation_mur.toLowerCase() === isolationMur.toLowerCase()
40
+ )?.k;
41
+
42
+ if (!k) {
43
+ logger.error(`Pas de valeur forfaitaire k pour isolationMur:${isolationMur}`);
44
+ return;
45
+ }
46
+
47
+ return parseFloat(k);
48
+ }
49
+
50
+ /**
51
+ * Valeur du pont thermique (W/(m.K))
52
+ *
53
+ * @param enumTypeLiaisonId {number}
54
+ * @param isolationMur {string}
55
+ * @param isolationPlancher {string}
56
+ * @return {number|undefined}
57
+ */
58
+ getKForPlancher(enumTypeLiaisonId, isolationMur, isolationPlancher) {
59
+ const k = tv['pont_thermique'].find(
60
+ (v) =>
61
+ parseInt(v.enum_type_liaison_id) === enumTypeLiaisonId &&
62
+ v.isolation_mur.toLowerCase() === isolationMur.toLowerCase() &&
63
+ v.isolation_plancher.toLowerCase() === isolationPlancher.toLowerCase()
64
+ )?.k;
65
+
66
+ if (!k) {
67
+ logger.error(
68
+ `Pas de valeur forfaitaire k pour isolationMur:${isolationMur}, isolationPlancher:${isolationPlancher}`
69
+ );
70
+ return;
71
+ }
72
+
73
+ return parseFloat(k);
74
+ }
75
+
76
+ /**
77
+ * Valeur du pont thermique (W/(m.K))
78
+ *
79
+ * @param enumTypeLiaisonId {number}
80
+ * @param isolationMur {string}
81
+ * @param typePose {number}
82
+ * @param presenceRetourIsolation {number}
83
+ * @param largeurDormant {number}
84
+ * @return {number|undefined}
85
+ */
86
+ getKForMenuiserie(
87
+ enumTypeLiaisonId,
88
+ isolationMur,
89
+ typePose,
90
+ presenceRetourIsolation,
91
+ largeurDormant
92
+ ) {
93
+ const k = tv['pont_thermique'].find(
94
+ (v) =>
95
+ parseInt(v.enum_type_liaison_id) === enumTypeLiaisonId &&
96
+ v.isolation_mur.toLowerCase() === isolationMur.toLowerCase() &&
97
+ (!v.enum_type_pose_id || parseInt(v.enum_type_pose_id) === typePose) &&
98
+ (!v.presence_retour_isolation ||
99
+ parseInt(v.presence_retour_isolation) === presenceRetourIsolation) &&
100
+ (!v.largeur_dormant || !largeurDormant || parseInt(v.largeur_dormant) === largeurDormant)
101
+ )?.k;
102
+
103
+ if (!k) {
104
+ logger.error(
105
+ `Pas de valeur forfaitaire k pour isolationMur:${isolationMur}, typePose:${typePose}, presenceRetourIsolation:${presenceRetourIsolation}, largeurDormant:${largeurDormant}`
106
+ );
107
+ return;
108
+ }
109
+
110
+ return parseFloat(k);
111
+ }
112
+ }
@@ -0,0 +1,134 @@
1
+ import { beforeEach, describe, expect, test } from 'vitest';
2
+ import { PontThermiqueTvStore } from './pontThermiqueTv.store.js';
3
+
4
+ /** @type {PontThermiqueTvStore} **/
5
+ let tvStore;
6
+
7
+ describe('Lecture des tables de valeurs', () => {
8
+ beforeEach(() => {
9
+ tvStore = new PontThermiqueTvStore();
10
+ });
11
+
12
+ describe('lecture des valeurs de k', () => {
13
+ test.each([
14
+ {
15
+ label: 'tv_pont_thermique_id existant',
16
+ tvPontThermiqueId: 1,
17
+ expected: 0.39
18
+ },
19
+ {
20
+ label: 'tv_pont_thermique_id inexistant',
21
+ tvPontThermiqueId: 0,
22
+ expected: 0
23
+ }
24
+ ])(
25
+ `k via tv_pont_thermique_id pour un pont thermique avec $label`,
26
+ ({ tvPontThermiqueId, expected }) => {
27
+ expect(tvStore.getKForMurById(tvPontThermiqueId)).toBe(expected);
28
+ }
29
+ );
30
+
31
+ test.each([
32
+ {
33
+ label: 'enum_type_liaison_id et isolation_mur qui correspondent',
34
+ enumTypeLiaisonId: 1,
35
+ isolationMur: 'Non isolé',
36
+ expected: 0.39
37
+ },
38
+ {
39
+ label: 'enum_type_liaison_id et isolation_mur qui ne correspondent à aucune entrée',
40
+ enumTypeLiaisonId: 0,
41
+ isolationMur: '',
42
+ expected: undefined
43
+ }
44
+ ])(`k pour un pont thermique via $label`, ({ enumTypeLiaisonId, isolationMur, expected }) => {
45
+ expect(tvStore.getKForMur(enumTypeLiaisonId, isolationMur)).toBe(expected);
46
+ });
47
+
48
+ test.each([
49
+ {
50
+ label: 'enum_type_liaison_id, isolation_mur et isolationPlancher qui correspondent',
51
+ enumTypeLiaisonId: 1,
52
+ isolationMur: 'Non isolé',
53
+ isolationPlancher: 'iti',
54
+ expected: 0.47
55
+ },
56
+ {
57
+ label: 'enum_type_liaison_id et isolation_mur qui ne correspondent à aucune entrée',
58
+ enumTypeLiaisonId: 0,
59
+ isolationMur: 'Non isolé',
60
+ isolationPlancher: 'iti',
61
+ expected: undefined
62
+ }
63
+ ])(
64
+ `k pour un pont thermique via $label`,
65
+ ({ enumTypeLiaisonId, isolationMur, isolationPlancher, expected }) => {
66
+ expect(tvStore.getKForPlancher(enumTypeLiaisonId, isolationMur, isolationPlancher)).toBe(
67
+ expected
68
+ );
69
+ }
70
+ );
71
+ });
72
+
73
+ test.each([
74
+ {
75
+ label:
76
+ 'enum_type_liaison_id, isolation_mur, typePose, largeurDormant, sans largeurDormant et presenceRetourIsolation qui correspondent',
77
+ enumTypeLiaisonId: 5,
78
+ isolationMur: 'Non isolé',
79
+ typePose: 1,
80
+ presenceRetourIsolation: undefined,
81
+ largeurDormant: undefined,
82
+ expected: 0.43
83
+ },
84
+ {
85
+ label:
86
+ 'enum_type_liaison_id, isolation_mur, typePose, largeurDormant, sans presenceRetourIsolation qui correspondent',
87
+ enumTypeLiaisonId: 5,
88
+ isolationMur: 'Non isolé',
89
+ typePose: 1,
90
+ presenceRetourIsolation: undefined,
91
+ largeurDormant: 5,
92
+ expected: 0.43
93
+ },
94
+ {
95
+ label:
96
+ 'enum_type_liaison_id, isolation_mur, typePose, largeurDormant, presenceRetourIsolation qui correspondent',
97
+ enumTypeLiaisonId: 5,
98
+ isolationMur: 'iti',
99
+ typePose: 3,
100
+ presenceRetourIsolation: 1,
101
+ largeurDormant: 10,
102
+ expected: 0.13
103
+ },
104
+ {
105
+ label: 'enum_type_liaison_id et isolation_mur qui ne correspondent à aucune entrée',
106
+ enumTypeLiaisonId: 5,
107
+ isolationMur: 'undefined',
108
+ typePose: 1,
109
+ presenceRetourIsolation: '1',
110
+ largeurDormant: 5,
111
+ expected: undefined
112
+ }
113
+ ])(
114
+ `k pour un pont thermique via $label`,
115
+ ({
116
+ enumTypeLiaisonId,
117
+ isolationMur,
118
+ typePose,
119
+ presenceRetourIsolation,
120
+ largeurDormant,
121
+ expected
122
+ }) => {
123
+ expect(
124
+ tvStore.getKForMenuiserie(
125
+ enumTypeLiaisonId,
126
+ isolationMur,
127
+ typePose,
128
+ presenceRetourIsolation,
129
+ largeurDormant
130
+ )
131
+ ).toBe(expected);
132
+ }
133
+ );
134
+ });
@@ -1,6 +1,7 @@
1
1
  import { inject } from 'dioma';
2
2
  import { ContexteBuilder } from './contexte.builder.js';
3
3
  import { DeperditionEnveloppeService } from './enveloppe/deperdition-enveloppe.service.js';
4
+ import { logger } from '../../../core/util/logger/log-service.js';
4
5
 
5
6
  export class EngineService {
6
7
  /**
@@ -33,7 +34,7 @@ export class EngineService {
33
34
  /** @type {Dpe} */
34
35
  const proceededDpe = this.#removeComputedData(JSON.parse(JSON.stringify(dpe)));
35
36
 
36
- console.error(`Process DPE ${proceededDpe.numero_dpe}`);
37
+ logger.info(`Process DPE ${proceededDpe.numero_dpe}`);
37
38
 
38
39
  proceededDpe.logement.sortie = {
39
40
  deperdition: undefined,
@@ -5,6 +5,7 @@ import { DeperditionPlancherBasService } from './plancher_bas/deperdition-planch
5
5
  import { DeperditionPlancherHautService } from './plancher_haut/deperdition-plancher-haut.service.js';
6
6
  import { DeperditionVentilationService } from './ventilation/deperdition-ventilation.service.js';
7
7
  import { DeperditionBaieVitreeService } from './baie_vitree/deperdition-baie-vitree.service.js';
8
+ import { DeperditionPontThermiqueService } from './pont_thermique/deperdition-pont-thermique.service.js';
8
9
 
9
10
  /**
10
11
  * Calcul des déperditions de l’enveloppe
@@ -36,6 +37,11 @@ export class DeperditionEnveloppeService {
36
37
  */
37
38
  #deperditionBaieVitreeService;
38
39
 
40
+ /**
41
+ * @type {DeperditionPontThermiqueService}
42
+ */
43
+ #deperditionPontThermiqueService;
44
+
39
45
  /**
40
46
  * @type {DeperditionVentilationService}
41
47
  */
@@ -73,6 +79,7 @@ export class DeperditionEnveloppeService {
73
79
  * @param deperditionPlancherBasService {DeperditionPlancherBasService}
74
80
  * @param deperditionPlancherHautService {DeperditionPlancherHautService}
75
81
  * @param deperditionBaieVitreeService {DeperditionBaieVitreeService}
82
+ * @param deperditionPontThermiqueService {DeperditionPontThermiqueService}
76
83
  * @param deperditionVentilationService {DeperditionVentilationService}
77
84
  */
78
85
  constructor(
@@ -81,6 +88,7 @@ export class DeperditionEnveloppeService {
81
88
  deperditionPlancherBasService = inject(DeperditionPlancherBasService),
82
89
  deperditionPlancherHautService = inject(DeperditionPlancherHautService),
83
90
  deperditionBaieVitreeService = inject(DeperditionBaieVitreeService),
91
+ deperditionPontThermiqueService = inject(DeperditionPontThermiqueService),
84
92
  deperditionVentilationService = inject(DeperditionVentilationService)
85
93
  ) {
86
94
  this.#deperditionMurService = deperditionMurService;
@@ -88,6 +96,7 @@ export class DeperditionEnveloppeService {
88
96
  this.#deperditionPlancherBasService = deperditionPlancherBasService;
89
97
  this.#deperditionPlancherHautService = deperditionPlancherHautService;
90
98
  this.#deperditionBaieVitreeService = deperditionBaieVitreeService;
99
+ this.#deperditionPontThermiqueService = deperditionPontThermiqueService;
91
100
  this.#deperditionVentilationService = deperditionVentilationService;
92
101
  this.#surfaceDeperditive = 0;
93
102
  this.#surfaceIsolee = 0;
@@ -145,6 +154,7 @@ export class DeperditionEnveloppeService {
145
154
  deperdition_plancher_bas: 0,
146
155
  deperdition_plancher_haut: 0,
147
156
  deperdition_baie_vitree: 0,
157
+ deperdition_pont_thermique: 0,
148
158
  deperdition_porte: 0
149
159
  };
150
160
 
@@ -239,6 +249,18 @@ export class DeperditionEnveloppeService {
239
249
  }
240
250
  });
241
251
 
252
+ enveloppe.pont_thermique_collection.pont_thermique?.forEach((pt) => {
253
+ pt.donnee_intermediaire = this.#deperditionPontThermiqueService.execute(
254
+ ctx,
255
+ enveloppe,
256
+ pt.donnee_entree
257
+ );
258
+ deperditions.deperdition_pont_thermique +=
259
+ pt.donnee_entree.l *
260
+ pt.donnee_intermediaire.k *
261
+ (pt.donnee_entree.pourcentage_valeur_pont_thermique || 1);
262
+ });
263
+
242
264
  return deperditions;
243
265
  }
244
266
 
@@ -165,4 +165,32 @@ export class DeperditionMurService extends DeperditionService {
165
165
  */
166
166
  return Math.min(2.5, Math.round(parseFloat(umur0) * PRECISION) / PRECISION);
167
167
  }
168
+
169
+ /**
170
+ * Retourner le type d'isolation du mur
171
+ * Si isolation inconnue, on considère isolation iti si la période d'isolation (à défaut année de construction) est > 1975
172
+ *
173
+ * @param ctx {Contexte}
174
+ * @param murDE {MurDE}
175
+ * @return {number}
176
+ */
177
+ typeIsolation(ctx, murDE) {
178
+ const typeIsolation = parseInt(murDE.enum_type_isolation_id);
179
+
180
+ // Type d'isolation inconnu
181
+ if (typeIsolation === 1) {
182
+ const periodeIsolation = murDE.enum_periode_isolation_id || ctx.enumPeriodeConstructionId;
183
+
184
+ // Année isolation / construction > 1974
185
+ if (parseInt(periodeIsolation) >= 3) {
186
+ // Isolation ITI
187
+ return 3;
188
+ } else {
189
+ // Non isolé
190
+ return 2;
191
+ }
192
+ }
193
+
194
+ return typeIsolation;
195
+ }
168
196
  }
@@ -315,6 +315,67 @@ describe('Calcul de déperdition des murs', () => {
315
315
  });
316
316
  });
317
317
 
318
+ test.each([
319
+ {
320
+ label: 'mur avec isolation inconnue et période isolation 1975',
321
+ enumTypeIsolationId: 1,
322
+ enumPeriodIsolationId: 3,
323
+ enumPeriodeConstructionId: undefined,
324
+ typeIsolationExpected: 3
325
+ },
326
+ {
327
+ label: 'mur avec isolation inconnue et période construction 1975',
328
+ enumTypeIsolationId: 1,
329
+ enumPeriodIsolationId: undefined,
330
+ enumPeriodeConstructionId: 6,
331
+ typeIsolationExpected: 3
332
+ },
333
+ {
334
+ label: 'mur avec isolation inconnue et période isolation 1974',
335
+ enumTypeIsolationId: 1,
336
+ enumPeriodIsolationId: 2,
337
+ enumPeriodeConstructionId: undefined,
338
+ typeIsolationExpected: 2
339
+ },
340
+ {
341
+ label: 'mur avec isolation inconnue et période construction 1974',
342
+ enumTypeIsolationId: 1,
343
+ enumPeriodIsolationId: undefined,
344
+ enumPeriodeConstructionId: 1,
345
+ typeIsolationExpected: 2
346
+ },
347
+ {
348
+ label: 'mur avec isolation iti+ite',
349
+ enumTypeIsolationId: 6,
350
+ enumPeriodIsolationId: 1,
351
+ enumPeriodeConstructionId: undefined,
352
+ typeIsolationExpected: 6
353
+ }
354
+ ])(
355
+ "Récupération du type d'isolation pour $label",
356
+ ({
357
+ enumTypeIsolationId,
358
+ enumPeriodIsolationId = undefined,
359
+ enumPeriodeConstructionId = undefined,
360
+ typeIsolationExpected
361
+ }) => {
362
+ /**
363
+ * @type {MurDE}
364
+ */
365
+ let murDE = {
366
+ enum_type_isolation_id: enumTypeIsolationId,
367
+ enum_periode_isolation_id: enumPeriodIsolationId
368
+ };
369
+
370
+ /**
371
+ * @type {Contexte}
372
+ */
373
+ const ctx = { enumPeriodeConstructionId };
374
+
375
+ expect(service.typeIsolation(ctx, murDE)).toBe(typeIsolationExpected);
376
+ }
377
+ );
378
+
318
379
  describe("Test d'intégration de mur", () => {
319
380
  test.each(corpus)('vérification des DI des murs pour dpe %s', (ademeId) => {
320
381
  let dpeRequest = getAdemeFileJson(ademeId);
@@ -166,4 +166,50 @@ export class DeperditionPlancherBasService extends DeperditionService {
166
166
 
167
167
  return Math.round(parseFloat(upbFinal) * PRECISION) / PRECISION;
168
168
  }
169
+
170
+ /**
171
+ * Retourner le type d'isolation du plancher
172
+ * Si isolation inconnue :
173
+ * - Les planchers sur terre-plein sont considérés non isolés avant 2001 et isolés par l’extérieur (en sous-face) à partir de 2001
174
+ * - Les autres planchers sont considérés isolés par l’extérieur
175
+ *
176
+ * @param ctx {Contexte}
177
+ * @param plancherBasDE {PlancherBasDE}
178
+ * @return {number}
179
+ */
180
+ typeIsolation(ctx, plancherBasDE) {
181
+ const typeIsolation = parseInt(plancherBasDE.enum_type_isolation_id);
182
+
183
+ // Type d'isolation inconnu
184
+ if (typeIsolation === 1) {
185
+ const typeAdjacence = parseInt(plancherBasDE.enum_type_adjacence_id);
186
+ const periodeIsolation =
187
+ parseInt(plancherBasDE.enum_periode_isolation_id) ||
188
+ parseInt(ctx.enumPeriodeConstructionId);
189
+
190
+ // Plancher sur terre-plein
191
+ if (typeAdjacence === 5) {
192
+ // Année isolation / construction < 2001
193
+ if (periodeIsolation < 7) {
194
+ // Non isolé
195
+ return 2;
196
+ } else {
197
+ // Isolation ITE
198
+ return 4;
199
+ }
200
+ } else {
201
+ // Année isolation / construction < 1975
202
+ if (periodeIsolation < 3) {
203
+ // Non isolé
204
+ return 2;
205
+ } else {
206
+ // Isolation ITE
207
+ return 4;
208
+ }
209
+ }
210
+ }
211
+
212
+ // Isolation ITE si "isolé mais type d'isolation inconnu"
213
+ return typeIsolation === 9 ? 4 : typeIsolation;
214
+ }
169
215
  }
@@ -170,6 +170,91 @@ describe('Calcul de déperdition des planchers bas', () => {
170
170
  });
171
171
  });
172
172
 
173
+ test.each([
174
+ {
175
+ label:
176
+ 'plancher bas avec isolation inconnue, adjacence terre-plein et période isolation 1974',
177
+ enumTypeIsolationId: 1,
178
+ enumTypeAdjacenceId: 5,
179
+ enumPeriodIsolationId: 1,
180
+ enumPeriodeConstructionId: undefined,
181
+ typeIsolationExpected: 2
182
+ },
183
+ {
184
+ label:
185
+ 'plancher bas avec isolation inconnue, adjacence terre-plein et période construction 2000',
186
+ enumTypeIsolationId: 1,
187
+ enumTypeAdjacenceId: 5,
188
+ enumPeriodIsolationId: undefined,
189
+ enumPeriodeConstructionId: 6,
190
+ typeIsolationExpected: 2
191
+ },
192
+ {
193
+ label:
194
+ 'plancher bas avec isolation inconnue, adjacence terre-plein et période isolation 2001',
195
+ enumTypeIsolationId: 1,
196
+ enumPeriodIsolationId: 7,
197
+ enumTypeAdjacenceId: 5,
198
+ enumPeriodeConstructionId: undefined,
199
+ typeIsolationExpected: 4
200
+ },
201
+ {
202
+ label: 'plancher bas avec isolation inconnue, adjacence garage et période isolation 1974',
203
+ enumTypeIsolationId: 1,
204
+ enumPeriodIsolationId: 2,
205
+ enumTypeAdjacenceId: 8,
206
+ enumPeriodeConstructionId: undefined,
207
+ typeIsolationExpected: 2
208
+ },
209
+ {
210
+ label: 'plancher bas avec isolation inconnue, adjacence garage et période isolation 1975',
211
+ enumTypeIsolationId: 1,
212
+ enumPeriodIsolationId: 3,
213
+ enumTypeAdjacenceId: 8,
214
+ enumPeriodeConstructionId: undefined,
215
+ typeIsolationExpected: 4
216
+ },
217
+ {
218
+ label: 'plancher bas avec isolation de type "isolé mais type d\'isolation inconnu"',
219
+ enumTypeIsolationId: 9,
220
+ enumPeriodIsolationId: 1,
221
+ enumPeriodeConstructionId: undefined,
222
+ typeIsolationExpected: 4
223
+ },
224
+ {
225
+ label: 'plancher bas avec isolation iti+ite',
226
+ enumTypeIsolationId: 6,
227
+ enumPeriodIsolationId: 1,
228
+ enumPeriodeConstructionId: undefined,
229
+ typeIsolationExpected: 6
230
+ }
231
+ ])(
232
+ "Récupération du type d'isolation pour $label",
233
+ ({
234
+ enumTypeIsolationId,
235
+ enumPeriodIsolationId = undefined,
236
+ enumTypeAdjacenceId = undefined,
237
+ enumPeriodeConstructionId = undefined,
238
+ typeIsolationExpected
239
+ }) => {
240
+ /**
241
+ * @type {PlancherBasDE}
242
+ */
243
+ let plancherBasDE = {
244
+ enum_type_isolation_id: enumTypeIsolationId,
245
+ enum_type_adjacence_id: enumTypeAdjacenceId,
246
+ enum_periode_isolation_id: enumPeriodIsolationId
247
+ };
248
+
249
+ /**
250
+ * @type {Contexte}
251
+ */
252
+ const ctx = { enumPeriodeConstructionId };
253
+
254
+ expect(service.typeIsolation(ctx, plancherBasDE)).toBe(typeIsolationExpected);
255
+ }
256
+ );
257
+
173
258
  describe("Test d'intégration de plancher bas", () => {
174
259
  test.each(corpus)('vérification des DI des pb pour dpe %s', (ademeId) => {
175
260
  /**