Skip to content

Commit

Permalink
fix(fix-297): Get the 'presence_joint' information from fiche_techniq…
Browse files Browse the repository at this point in the history
…ue if unknown
  • Loading branch information
Jérôme GAVIGNET committed Jan 7, 2025
1 parent 8fee1db commit d911b6e
Show file tree
Hide file tree
Showing 9 changed files with 1,813 additions and 28 deletions.
2 changes: 1 addition & 1 deletion src/13.2_generateur_combustion.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ function addInfosFromFichesTechniques(dpe, de) {
dpe,
'8',
'Présence ventilateur / dispositif circulation air dans circuit combustion',
de.description
[de.description]
)?.valeur;

if (ficheTechnique && ficheTechnique === 'oui') {
Expand Down
2 changes: 1 addition & 1 deletion src/13.2_generateur_combustion_bouilleur.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ function updateGenerateurBouilleur(dpe, ids, de, type) {
const values = ids[generateurId];

// Récupération de l'année d'installation du système ECS ou Chauffage dans les fiches techniques
const ficheTechnique = getFicheTechnique(dpe, '7', 'année', 'bouilleur')?.valeur;
const ficheTechnique = getFicheTechnique(dpe, '7', 'année', ['bouilleur'])?.valeur;

/**
* Par défaut:
Expand Down
7 changes: 2 additions & 5 deletions src/13.2_generateur_combustion_chaudiere.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,9 @@ function updateGenerateurChaudiere(dpe, ids, de, type) {
de[`previous_${enumType}`] = generateurId;

// Récupération de l'année d'installation du système ECS ou Chauffage dans les fiches techniques
const ficheTechnique = getFicheTechnique(
dpe,
type === 'ch' ? '7' : '8',
'année',
const ficheTechnique = getFicheTechnique(dpe, type === 'ch' ? '7' : '8', 'année', [
'Autre système à combustion'
)?.valeur;
])?.valeur;

if (ficheTechnique) {
if (ficheTechnique.toString().toLowerCase() === 'avant 1948') {
Expand Down
8 changes: 4 additions & 4 deletions src/4_ventilation.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,19 @@ function tv_q4pa_conv(di, de, cg, mur_list, ph_list, porte_list, bv_list) {
// presence joints menuiserie
let surface_bv_avec_joint = bv_list.reduce((acc, bv) => {
if (bv.donnee_entree.presence_joint) return acc + bv.donnee_entree.surface_totale_baie;
else return 0;
else return acc;
}, 0);
surface_bv_avec_joint += porte_list.reduce((acc, porte) => {
if (porte.donnee_entree.presence_joint) return acc + porte.donnee_entree.surface_porte;
else return 0;
else return acc;
}, 0);
let surface_bv_sans_joint = bv_list.reduce((acc, bv) => {
if (!bv.donnee_entree.presence_joint) return acc + bv.donnee_entree.surface_totale_baie;
else return 0;
else return acc;
}, 0);
surface_bv_sans_joint += porte_list.reduce((acc, porte) => {
if (!porte.donnee_entree.presence_joint) return acc + porte.donnee_entree.surface_porte;
else return 0;
else return acc;
}, 0);
let pjt =
surface_bv_avec_joint / (surface_bv_avec_joint + surface_bv_sans_joint) > 0.5 ? '1' : '0';
Expand Down
38 changes: 35 additions & 3 deletions src/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,39 @@ export function calcul_3cl(dpe) {
const ca_id = logement.meteo.enum_classe_altitude_id;

const instal_ch = logement.installation_chauffage_collection.installation_chauffage;
const bv_list = env.baie_vitree_collection.baie_vitree;

bv_list.forEach((baieVitree) => {
const donneeEntree = baieVitree.donnee_entree;

// Si pas d'information sur la présence de joint => vérification dans les fiches techniques
if (donneeEntree.presence_joint === undefined) {
const orientation = enums.orientation[donneeEntree.enum_orientation_id];
const typeVitrage = enums.type_vitrage[donneeEntree.enum_type_vitrage_id];
const typeBaie = enums.type_baie[donneeEntree.enum_type_baie_id];
const typeMateriauxMenuiserie =
enums.type_materiaux_menuiserie[donneeEntree.enum_type_materiaux_menuiserie_id];

const ficheTechnique = getFicheTechnique(dpe, '4', 'joint', [
orientation,
typeVitrage,
typeBaie,
typeMateriauxMenuiserie
]);

if (ficheTechnique) {
if (ficheTechnique.valeur.toLowerCase() === 'oui') {
donneeEntree.presence_joint = 1;
} else if (ficheTechnique.valeur.toLowerCase() === 'non') {
donneeEntree.presence_joint = 0;
} else {
console.warn(`
La valeur de la sous-fiche technique pour la présence de joint de la baie vitrée ${baieVitree.donnee_entree.description} est inconnue
`);
}
}
}
});

/**
* 4 - Calcul des déperditions par renouvellement d’air
Expand All @@ -161,7 +194,7 @@ export function calcul_3cl(dpe) {
dpe,
'10',
'après 2012',
null,
[],
'valeur'
);

Expand Down Expand Up @@ -256,7 +289,7 @@ export function calcul_3cl(dpe) {
dpe,
'8',
'hors volume habitable',
generateur.donnee_entree.description
[generateur.donnee_entree.description]
);

if (ficheProductionVolumeHabitable) {
Expand Down Expand Up @@ -358,7 +391,6 @@ export function calcul_3cl(dpe) {
);
});

const bv_list = env.baie_vitree_collection.baie_vitree;
const ets = env.ets_collection.ets;

const besoin_ch = calc_besoin_ch(
Expand Down
30 changes: 17 additions & 13 deletions src/ficheTechnique.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
* @param dpe {FullDpe}
* @param categoryFicheTechiqueId {string}
* @param description {string}
* @param classification {string | null}
* @param classifications {[string]}
* @param field {'description' | 'valeur'}
*/
export default function getFicheTechnique(
dpe,
categoryFicheTechiqueId,
description,
classification = null,
classifications = [],
field = 'description'
) {
/** @type {FicheTechniqueItem[]} */
Expand All @@ -30,7 +30,7 @@ export default function getFicheTechnique(
* Plusieurs collections de fiches techniques peuvent exister pour la même catégorie (pour 2 systèmes ECS par exemple)
* Le champs classification permet de trouver la collection qui convient en filtrant sur une seconde donnée
*/
if (classification) {
if (classifications.length) {
/** @type {SousFicheTechniqueItem[]} */
let sousFichesTechniques =
ficheTechnique.sous_fiche_technique_collection.sous_fiche_technique;
Expand All @@ -39,19 +39,23 @@ export default function getFicheTechnique(
sousFichesTechniques = [sousFichesTechniques];
}

const secondFiche = sousFichesTechniques.filter((ficheTechnique) => {
const valeur = ficheTechnique?.valeur;
const allContained = classifications.every((classification) =>
sousFichesTechniques.some((ficheTechnique) => {
const valeur = ficheTechnique?.valeur;

if (typeof valeur === 'string') {
return (
ficheTechnique.valeur.toLowerCase().indexOf(classification.toLowerCase()) !== -1
);
}
if (typeof valeur === 'string') {
return (
ficheTechnique.valeur
.toLowerCase()
.indexOf(classification.toString().toLowerCase()) !== -1
);
}

return ficheTechnique.valeur === classification;
});
return ficheTechnique.valeur === classification;
})
);

if (!secondFiche.length) {
if (!allContained) {
return acc;
}
}
Expand Down
181 changes: 181 additions & 0 deletions src/ficheTechnique.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
import getFicheTechnique from './ficheTechnique.js';

describe('FicheTechnique service tests', () => {
const dpe = {
fiche_technique_collection: {
fiche_technique: [
{
enum_categorie_fiche_technique_id: '10',
sous_fiche_technique_collection: {
sous_fiche_technique: [
{
description: 'Type de ventilation: VMC SF Auto réglable avant 1982',
valeur: 'VMC SF Auto réglable avant 1982',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Année installation: 1949',
valeur: 1949,
detail_origine_donnee: '',
enum_origine_donnee_id: '1'
},
{
description: 'Energie utilisée: Electrique',
valeur: 'Electrique',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Façades exposées: plusieurs',
valeur: 'plusieurs',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Logement Traversant: oui',
valeur: 'oui',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
}
]
}
},
{
enum_categorie_fiche_technique_id: '10',
sous_fiche_technique_collection: {
sous_fiche_technique: [
{
description: 'Type de ventilation: VMC SF Auto réglable avant 1982',
valeur: 'VMC SF Auto réglable avant 1982',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Année installation: 1950',
valeur: 1950,
detail_origine_donnee: '',
enum_origine_donnee_id: '1'
},
{
description: 'Energie utilisée: Bois',
valeur: 'Bois',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Façades exposées: plusieurs',
valeur: 'plusieurs',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Logement Traversant: oui',
valeur: 'oui',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
}
]
}
},
{
enum_categorie_fiche_technique_id: '10',
sous_fiche_technique_collection: {
sous_fiche_technique: [
{
description: 'Type de ventilation: VMC SF Auto réglable avant 1982',
valeur: 'VMC SF Auto réglable avant 1982',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Année installation: 1950',
valeur: 1950,
detail_origine_donnee: '',
enum_origine_donnee_id: '1'
},
{
description: 'Energie utilisée: Gaz',
valeur: 'Gaz',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Façades exposées: plusieurs',
valeur: 'aucune',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
},
{
description: 'Logement Traversant: oui',
valeur: 'oui',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
}
]
}
}
]
}
};

it('should return a fiche technique', async () => {
let fiche = getFicheTechnique(dpe, '10', 'exposées');
expect(fiche).not.toBeNull();
expect(fiche.description).toBe('Façades exposées: plusieurs');
expect(fiche.valeur).toBe('plusieurs');

// Some DPE have a fiche_technique node which is not an array
const dpeWithoutArray = {
fiche_technique_collection: {
fiche_technique: {
enum_categorie_fiche_technique_id: '10',
sous_fiche_technique_collection: {
sous_fiche_technique: [
{
description: 'Façades exposées: plusieurs',
valeur: 'plusieurs',
detail_origine_donnee: '',
enum_origine_donnee_id: '2'
}
]
}
}
}
};

fiche = getFicheTechnique(dpeWithoutArray, '10', 'exposées');
expect(fiche).not.toBeNull();
});

it('should return a fiche technique with multiple criteria', async () => {
let fiche = getFicheTechnique(dpe, '10', 'exposées', [1950, 'Gaz']);
expect(fiche).not.toBeNull();
expect(fiche.description).toBe('Façades exposées: plusieurs');
expect(fiche.valeur).toBe('aucune');
});

it('should not return a non existing fiche technique', async () => {
let fiche = getFicheTechnique(dpe, '40', 'exposées');
expect(fiche).toBeNull();

fiche = getFicheTechnique(dpe, '10', 'non existing');
expect(fiche).toBeNull();

dpe.fiche_technique_collection.fiche_technique[0].sous_fiche_technique_collection.sous_fiche_technique =
null;

fiche = getFicheTechnique(dpe, '11', 'non existing');
expect(fiche).toBeNull();

dpe.fiche_technique_collection.fiche_technique[0].sous_fiche_technique_collection = null;

fiche = getFicheTechnique(dpe, '11', 'non existing');
expect(fiche).toBeNull();

dpe.fiche_technique_collection.fiche_technique = null;

fiche = getFicheTechnique(dpe, '10', 'non existing');
expect(fiche).toBeNull();
});
});
3 changes: 2 additions & 1 deletion test/corpus.json
Original file line number Diff line number Diff line change
Expand Up @@ -191,5 +191,6 @@
"2459E0028946S",
"2395E2435060X",
"2438E4094489Y",
"2159E1018555M"
"2159E1018555M",
"2269E1217015Z"
]
Loading

0 comments on commit d911b6e

Please sign in to comment.