Skip to content
This repository was archived by the owner on Feb 13, 2025. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 126 additions & 83 deletions src/2021_04_13_qualite_isolation.js
Original file line number Diff line number Diff line change
@@ -1,130 +1,173 @@
import enums from './enums.js';
import { getKeyByValue } from './utils.js';
/**
* @returns {number}
*/
function qualite_isol(dep, surface, seuil1, seuil2, seuil3) {
/**
* 1 - Très bonne
* 2 - Bonne
* 3 - Moyenne
* 4 - Insuffisante
*/
let u = 0;

function qualite_isol(u, s1, s2, s3) {
if (!u) u = 0;
if (u < s1) return Number(getKeyByValue(enums.qualite_composant, 'très bonne'));
else if (u < s2) return Number(getKeyByValue(enums.qualite_composant, 'bonne'));
else if (u < s3) return Number(getKeyByValue(enums.qualite_composant, 'moyenne'));
return Number(getKeyByValue(enums.qualite_composant, 'insuffisante'));
if (dep && surface) {
u = dep / surface;
}

if (u < seuil1) return 1;
else if (u < seuil2) return 2;
else if (u < seuil3) return 3;
return 4;
}

export default function calc_qualite_isolation(enveloppe, dp) {
const mur_list = enveloppe.mur_collection.mur;
const ph_list = enveloppe.plancher_haut_collection.plancher_haut || [];
const pb_list = enveloppe.plancher_bas_collection.plancher_bas || [];
const bv_list = enveloppe.baie_vitree_collection.baie_vitree;
const porte_list = enveloppe.porte_collection.porte || [];
const plancher_haut_ca = ph_list.filter(
(ph) =>
ph.donnee_entree.enum_type_adjacence_id ===
getKeyByValue(enums.type_adjacence, 'extérieur') &&
ph.donnee_entree.enum_type_plancher_haut ===
getKeyByValue(enums.type_plancher_haut, 'combles aménagés sous rampant')
/**
* enum_type_adjacence_id = 22 - Local non déperditif (local à usage d'habitation chauffé)
*/
const mur_list = (enveloppe.mur_collection.mur || []).filter(
(mur) => mur.donnee_entree.enum_type_adjacence_id !== '22' && mur.donnee_intermediaire.b > 0
);
const plancher_haut_tt = ph_list.filter(
(ph) =>
ph.donnee_entree.enum_type_adjacence_id ===
getKeyByValue(enums.type_adjacence, 'extérieur') &&
ph.donnee_entree.enum_type_plancher_haut !=
getKeyByValue(enums.type_plancher_haut, 'combles aménagés sous rampant')

const planchersHauts = enveloppe.plancher_haut_collection.plancher_haut || [];
const planchersBas = (enveloppe.plancher_bas_collection.plancher_bas || []).filter(
(mur) => mur.donnee_entree.enum_type_adjacence_id !== '22'
);
const plancher_haut_cp = ph_list.filter(
(ph) =>
ph.donnee_entree.enum_type_adjacence_id != getKeyByValue(enums.type_adjacence, 'extérieur')
const baiesVitrees = (enveloppe.baie_vitree_collection.baie_vitree || []).filter(
(porte) => porte.donnee_intermediaire.b > 0
);
const portes = (enveloppe.porte_collection.porte || []).filter(
(porte) => porte.donnee_intermediaire.b > 0
);

// mur
const umur = mur_list.reduce((acc, mur) => {
const type_adjacence = enums.type_adjacence[mur.donnee_entree.enum_type_adjacence_id];
if (type_adjacence.includes('local non déperditif')) return acc;
else return acc + mur.donnee_entree.surface_paroi_opaque * mur.donnee_intermediaire.umur;
}, 0);
const smur = mur_list.reduce((acc, mur) => {
const type_adjacence = enums.type_adjacence[mur.donnee_entree.enum_type_adjacence_id];
if (type_adjacence.includes('local non déperditif')) return acc;
else return acc + mur.donnee_entree.surface_paroi_opaque;
}, 0);
let phCombleAmenagee = [];
let phCombleToitTerrasse = [];
let phComblePerdue = [];

// pb
const upb = pb_list.reduce((acc, pb) => {
const type_adjacence = enums.type_adjacence[pb.donnee_entree.enum_type_adjacence_id];
if (type_adjacence.includes('local non déperditif')) return acc;
else return acc + pb.donnee_entree.surface_paroi_opaque * pb.donnee_intermediaire.upb_final;
}, 0);
const spb = pb_list.reduce((acc, pb) => {
const type_adjacence = enums.type_adjacence[pb.donnee_entree.enum_type_adjacence_id];
if (type_adjacence.includes('local non déperditif')) return acc;
else return acc + pb.donnee_entree.surface_paroi_opaque;
}, 0);
planchersHauts.forEach((plancherHaut) => {
if (plancherHaut.donnee_entree.enum_type_adjacence_id !== '1') {
phComblePerdue.push(plancherHaut);
} else {
if (
plancherHaut.donnee_entree.enum_type_plancher_haut_id === '12' ||
plancherHaut.donnee_entree.description.toLowerCase().indexOf('combles aménagés') !== -1
) {
phCombleAmenagee.push(plancherHaut);
} else {
phCombleToitTerrasse.push(plancherHaut);
}
}
});

// ph
const uph_ca = plancher_haut_ca.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque * ph.donnee_intermediaire.uph,
const Umurs = mur_list.reduce(
(acc, mur) => acc + mur.donnee_entree.surface_paroi_opaque * mur.donnee_intermediaire.umur,
0
);
const uph_cp = plancher_haut_cp.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque * ph.donnee_intermediaire.uph,
const surfaceMurs = mur_list.reduce(
(acc, mur) => acc + mur.donnee_entree.surface_paroi_opaque,
0
);
const uph_tt = plancher_haut_tt.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque * ph.donnee_intermediaire.uph,

const UplancherBas = planchersBas.reduce(
(acc, pb) => acc + pb.donnee_entree.surface_paroi_opaque * pb.donnee_intermediaire.upb,
0
);
const surfacePlanchersBas = planchersBas.reduce(
(acc, pb) => acc + pb.donnee_entree.surface_paroi_opaque,
0
);

const sph_ca = plancher_haut_ca.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque,
const UphComblesAmenagees = phCombleAmenagee.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque * ph.donnee_intermediaire.uph,
0
);
const sph_cp = plancher_haut_cp.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque,
const UphComblesPerdues = phComblePerdue.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque * ph.donnee_intermediaire.uph,
0
);
const sph_tt = plancher_haut_tt.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque,
const UphToitsTerrasses = phCombleToitTerrasse.reduce(
(acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque * ph.donnee_intermediaire.uph,
0
);

// menuiserie
const umen =
bv_list.reduce(
const surfaceComblesAmenagees = phCombleAmenagee
.filter((mur) => mur.donnee_entree.enum_type_adjacence_id !== '22')
.reduce((acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque, 0);
const surfaceComblesPerdues = phComblePerdue
.filter((mur) => mur.donnee_entree.enum_type_adjacence_id !== '22')
.reduce((acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque, 0);
const surfaceToitsTerrasses = phCombleToitTerrasse
.filter((mur) => mur.donnee_entree.enum_type_adjacence_id !== '22')
.reduce((acc, ph) => acc + ph.donnee_entree.surface_paroi_opaque, 0);

const Umenuiseries =
baiesVitrees.reduce(
(acc, bv) =>
acc + bv.donnee_entree.surface_totale_baie * bv.donnee_intermediaire.u_menuiserie,
0
) +
porte_list.reduce(
portes.reduce(
(acc, porte) => acc + porte.donnee_entree.surface_porte * porte.donnee_intermediaire.uporte,
0
);
const sporte = porte_list.reduce((acc, porte) => acc + porte.donnee_entree.surface_porte, 0);
const sbv = bv_list.reduce((acc, bv) => acc + bv.donnee_entree.surface_totale_baie, 0);
const surfacePortes = portes.reduce((acc, porte) => acc + porte.donnee_entree.surface_porte, 0);
const surfaceBaiesVitrees = baiesVitrees.reduce(
(acc, bv) => acc + bv.donnee_entree.surface_totale_baie,
0
);

const dep =
const deperdition =
dp.deperdition_mur +
dp.deperdition_plancher_bas +
dp.deperdition_plancher_haut +
dp.deperdition_baie_vitree +
dp.deperdition_porte +
dp.deperdition_pont_thermique;
const sph = sph_ca + sph_cp + sph_tt;
const sdep = smur + spb + sph + sbv + sporte;
const ubat = dep / sdep;
const surfacePlanchersHauts =
surfaceComblesAmenagees + surfaceComblesPerdues + surfaceToitsTerrasses;
const surfaceDeperditives =
surfaceMurs + surfacePlanchersBas + surfacePlanchersHauts + surfaceBaiesVitrees + surfacePortes;
const ubat = deperdition / surfaceDeperditives;

const ret = {
ubat,
qualite_isol_enveloppe: qualite_isol(ubat, 0.45, 0.65, 0.85),
qualite_isol_mur: qualite_isol(umur / smur, 0.3, 0.45, 0.65),
qualite_isol_plancher_bas: qualite_isol(upb / spb, 0.25, 0.45, 0.65),
qualite_isol_menuiserie: qualite_isol(umen / (sbv + sporte), 1.6, 2.2, 3)
qualite_isol_enveloppe: qualite_isol(deperdition, surfaceDeperditives, 0.45, 0.65, 0.85),
qualite_isol_mur: qualite_isol(Umurs, surfaceMurs, 0.3, 0.45, 0.65),
qualite_isol_plancher_bas: qualite_isol(UplancherBas, surfacePlanchersBas, 0.25, 0.45, 0.65),
qualite_isol_menuiserie: qualite_isol(
Umenuiseries,
surfaceBaiesVitrees + surfacePortes,
1.6,
2.2,
3
)
};
if (sph_ca > 0) {
ret.qualite_isol_plancher_haut_comble_amenage = qualite_isol(uph_ca / sph_ca, 0.18, 0.25, 0.3);

if (UphComblesAmenagees > 0) {
ret.qualite_isol_plancher_haut_comble_amenage = qualite_isol(
UphComblesAmenagees,
surfaceComblesAmenagees,
0.18,
0.25,
0.3
);
}
if (sph_tt > 0) {
ret.qualite_isol_plancher_haut_toit_terrasse = qualite_isol(uph_tt / sph_tt, 0.18, 0.25, 0.3);
if (UphToitsTerrasses > 0) {
ret.qualite_isol_plancher_haut_toit_terrasse = qualite_isol(
UphToitsTerrasses,
surfaceToitsTerrasses,
0.25,
0.3,
0.35
);
}
if (sph_cp > 0) {
ret.qualite_isol_plancher_haut_comble_perdu = qualite_isol(uph_cp / sph_cp, 0.15, 0.2, 0.3);
if (UphComblesPerdues > 0) {
ret.qualite_isol_plancher_haut_comble_perdu = qualite_isol(
UphComblesPerdues,
surfaceComblesPerdues,
0.15,
0.2,
0.3
);
}

return ret;
Expand Down