Skip to content

Commit

Permalink
fix(feat-106): fix inertie calculation and add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Jérôme GAVIGNET committed Oct 9, 2024
1 parent 3729bc6 commit ef764bd
Show file tree
Hide file tree
Showing 4 changed files with 432 additions and 83 deletions.
223 changes: 144 additions & 79 deletions src/7_inertie.js
Original file line number Diff line number Diff line change
@@ -1,88 +1,153 @@
import enums from './enums.js';
import { getKeyByValue, requestInput } from './utils.js';

function inertie_ph_lourd(de, du) {
const methode_saisie_u = requestInput(de, du, 'methode_saisie_u');
if (methode_saisie_u === 'non isolé') {
const type_plancher_haut = requestInput(de, du, 'type_plancher_haut');
if (!type_plancher_haut) return 1;
if (type_plancher_haut.includes('lourd')) return 1;
}
return 0;
}
import { getKeyByValue } from './utils.js';

export class Inertie {
inertie_ph_lourd(de) {
const type_isolation = Number.parseInt(de.enum_type_isolation_id);

function inertie_pb_lourd(de, du) {
const methode_saisie_u = requestInput(de, du, 'methode_saisie_u');
const type_plancher_bas = requestInput(de, du, 'type_plancher_bas');
const type_adjacence = requestInput(de, du, 'type_adjacence');
if (type_plancher_bas.includes('lourd')) return 1;
if (
methode_saisie_u === 'non isolé' &&
type_plancher_bas === 'dalle béton' &&
type_adjacence === 'terre-plein'
) {
return 1;
/**
* Type isolation
* 2 - Non isolé
* 4 - ITE
* 9 - isolé mais type d'isolation inconnu
*/
if ([2, 4, 9].includes(type_isolation)) {
/**
* Type Plancher Haut
* 8 - Dalle béton
* 11 - Plafond lourd type entrevous terre-cuite, poutrelles béton
*/
const type_plancher_haut = Number.parseInt(de.enum_type_plancher_haut_id);
if (!type_plancher_haut) return 1;
if ([8, 11].includes(type_plancher_haut)) return 1;
}
return 0;
}
return 0;
}

function inertie_mur_lourd(de, du) {
const type_isolation = requestInput(de, du, 'type_isolation');
if (type_isolation === 'non isolé' || type_isolation === 'ite') {
const msm = requestInput(de, du, 'materiaux_structure_mur');
if (msm.includes('pierre') || msm.includes('pisé')) return 1;
if (msm.includes('sandwich')) return 1;
inertie_pb_lourd(de) {
const methode_saisie_u = Number.parseInt(de.enum_methode_saisie_u_id);
const type_isolation = Number.parseInt(de.enum_type_isolation_id);

/**
* Type isolation
* 2 - Non isolé
* 4 - ITE
* 9 - isolé mais type d'isolation inconnu
*
* Méthode Saisie
* 1 - non isolé
*/
if (methode_saisie_u === 1 || [2, 4, 9].includes(type_isolation)) {
/**
* Type Plancher Bas
* 9 - Dalle béton
* 11 - Plancher lourd type entrevous terre-cuite, poutrelles béton
* 12 - Plancher à entrevous isolant
*/
const type_plancher_bas = Number.parseInt(de.enum_type_plancher_bas_id);
if (!type_plancher_bas) return 1;
if ([9, 11, 12].includes(type_plancher_bas)) return 1;
}
return 0;
}
return 0;
}

export default function calc_inertie(enveloppe) {
const inertie = {};

// pb
const pb = enveloppe.plancher_bas_collection.plancher_bas || [];
const s_pb_lourd = pb.reduce((acc, pb) => {
const de = pb.donnee_entree;
const du = pb.donnee_utilisateur;
return acc + de.surface_paroi_opaque * inertie_pb_lourd(de, du);
}, 0);
const s_pb_total = pb.reduce((acc, pb) => acc + pb.donnee_entree.surface_paroi_opaque, 0);
inertie.inertie_plancher_bas_lourd = s_pb_lourd / s_pb_total > 0.5 ? 1 : 0;

// ph
const ph = enveloppe.plancher_haut_collection.plancher_haut || [];
const s_ph_lourd = ph.reduce((acc, ph) => {
const de = ph.donnee_entree;
const du = ph.donnee_utilisateur;
return acc + de.surface_paroi_opaque * inertie_ph_lourd(de, du);
}, 0);
const s_ph_total = ph.reduce((acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque, 0);
inertie.inertie_plancher_haut_lourd = s_ph_lourd / s_ph_total > 0.5 ? 1 : 0;

// mur
const mur = enveloppe.mur_collection.mur;
const s_mur_lourd = mur.reduce((acc, mur) => {
const de = mur.donnee_entree;
const du = mur.donnee_utilisateur;
return acc + de.surface_paroi_opaque * inertie_mur_lourd(de, du);
}, 0);
const s_mur_total = mur.reduce((acc, mur) => acc + mur.donnee_entree.surface_paroi_opaque, 0);
inertie.inertie_paroi_verticale_lourd = s_mur_lourd / s_mur_total > 0.5 ? 1 : 0;

const nb_inertie_lourde =
inertie.inertie_plancher_bas_lourd +
inertie.inertie_plancher_haut_lourd +
inertie.inertie_paroi_verticale_lourd;

if (nb_inertie_lourde === 0) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'légère');
} else if (nb_inertie_lourde === 1) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'moyenne');
} else if (nb_inertie_lourde === 2) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'lourde');
} else if (nb_inertie_lourde === 3) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'très lourde');
inertie_mur_lourd(de) {
const methode_saisie_u = Number.parseInt(de.enum_methode_saisie_u_id);
const type_isolation = Number.parseInt(de.enum_type_isolation_id);

/**
* Type isolation
* 2 - Non isolé
* 4 - ITE
* 9 - isolé mais type d'isolation inconnu
*
* Méthode Saisie
* 1 - non isolé
*/
if (methode_saisie_u === 1 || [2, 4, 9].includes(type_isolation)) {
const materiaux_structure_mur = Number.parseInt(de.enum_materiaux_structure_mur_id);
const epaisseur_structure = Number.parseFloat(de.epaisseur_structure);

/**
* Matériaux Structure mur
* 2 - Murs en pierre de taille et moellons constitué d'un seul matériaux
* 3 - Murs en pierre de taille et moellons avec remplissage tout venant
* 4 - Murs en pisé ou béton de terre stabilisé (à partir d'argile crue)
* 19 - Murs sandwich béton/isolant/béton (sans isolation rapportée)
* 21 - Autre matériau traditionel ancien
*/
if ([2, 3, 4, 19].includes(materiaux_structure_mur)) return 1;

/**
* Matériaux Structure mur
* 11 - Murs en blocs de béton pleins
* 13 - Murs en béton banché
*/
if ([11, 13].includes(materiaux_structure_mur) && epaisseur_structure > 7) return 1;

/**
* Matériaux Structure mur
* 12 - Murs en blocs de béton creux
*/
if ([12].includes(materiaux_structure_mur) && epaisseur_structure > 11) return 1;

/**
* Matériaux Structure mur
* 8 - Murs en briques pleines simples
* 9 - Murs en briques pleines doubles avec lame d'air
* 10 - Murs en briques creuses
* 15 - Brique terre cuite alvéolaire
*/
if ([8, 9, 10, 15].includes(materiaux_structure_mur) && epaisseur_structure > 10.5) return 1;
}
return 0;
}

return inertie;
/**
* @param enveloppe {Enveloppe}
*/
calc_inertie(enveloppe) {
const inertie = {};

const pb = enveloppe.plancher_bas_collection.plancher_bas || [];
const s_pb_lourd = pb.reduce((acc, pb) => {
const de = pb.donnee_entree;
return acc + de.surface_paroi_opaque * this.inertie_pb_lourd(de);
}, 0);
const s_pb_total = pb.reduce((acc, pb) => acc + pb.donnee_entree.surface_paroi_opaque, 0);
inertie.inertie_plancher_bas_lourd = s_pb_lourd / s_pb_total >= 0.5 ? 1 : 0;

const ph = enveloppe.plancher_haut_collection.plancher_haut || [];
const s_ph_lourd = ph.reduce((acc, ph) => {
const de = ph.donnee_entree;
return acc + de.surface_paroi_opaque * this.inertie_ph_lourd(de);
}, 0);
const s_ph_total = ph.reduce((acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque, 0);
inertie.inertie_plancher_haut_lourd = s_ph_lourd / s_ph_total >= 0.5 ? 1 : 0;

const mur = enveloppe.mur_collection.mur || [];
const s_mur_lourd = mur.reduce((acc, mur) => {
const de = mur.donnee_entree;
return acc + de.surface_paroi_opaque * this.inertie_mur_lourd(de);
}, 0);
const s_mur_total = mur.reduce((acc, mur) => acc + mur.donnee_entree.surface_paroi_opaque, 0);
inertie.inertie_paroi_verticale_lourd = s_mur_lourd / s_mur_total >= 0.5 ? 1 : 0;

const nb_inertie_lourde =
inertie.inertie_plancher_bas_lourd +
inertie.inertie_plancher_haut_lourd +
inertie.inertie_paroi_verticale_lourd;

if (nb_inertie_lourde === 0) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'légère');
} else if (nb_inertie_lourde === 1) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'moyenne');
} else if (nb_inertie_lourde === 2) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'lourde');
} else if (nb_inertie_lourde === 3) {
inertie.enum_classe_inertie_id = getKeyByValue(enums.classe_inertie, 'très lourde');
}

return inertie;
}
}
Loading

0 comments on commit ef764bd

Please sign in to comment.