@open3cl/engine
Version:
Open Source 3CL-DPE engine
142 lines (130 loc) • 5.03 kB
JavaScript
import enums from './enums.js';
import { tv, requestInput, requestInputID, bug_for_bug_compat } from './utils.js';
function findRanges(inputNumber) {
const ranges = [0.25, 0.5, 0.75, 1, 1.25, 2, 2.5, 3, 3.5, 4, 6, 8, 10, 25, 50];
const result = [];
if (inputNumber < ranges[0]) {
result.push(null);
result.push(ranges[0]);
} else if (inputNumber > ranges[ranges.length - 1]) {
result.push(ranges[ranges.length - 1]);
result.push(null);
} else {
for (let i = 0; i < ranges.length; i++) {
if (inputNumber <= ranges[i]) {
if (i > 0) {
result.push(ranges[i - 1]);
}
result.push(ranges[i]);
break;
}
}
}
return result;
}
export default function b(di, de, du, zc_id) {
const zc = enums.zone_climatique[zc_id].slice(0, 2);
du.enum_type_adjacence_id = Object.keys(enums.type_adjacence);
const matcher = {
enum_type_adjacence_id: requestInputID(de, du, 'type_adjacence')
};
if (de.enum_type_adjacence_id === '10') {
matcher.zone_climatique = zc;
matcher.enum_cfg_isolation_lnc_id = requestInputID(de, du, 'cfg_isolation_lnc');
/* du.enum_cfg_isolation_lnc_id = ['6', '7', '8', '9', '10', '11'] */
} else if (
['8', '9', '11', '12', '13', '14', '15', '16', '17', '18', '19', '21'].includes(
de.enum_type_adjacence_id.toString()
)
) {
if (de.surface_aue === 0) {
// cf page 10
// NOTE: bizarre de regarder aue pour un local chauffé non accessible
// voir 2287E2336469P
di.b = 0;
return;
}
matcher.enum_cfg_isolation_lnc_id = requestInputID(de, du, 'cfg_isolation_lnc');
if (matcher.enum_cfg_isolation_lnc_id === '1') {
// local chauffé non accessible
// aiu/aue non connu
delete matcher.enum_type_adjacence_id;
} else {
requestInput(de, du, 'surface_aiu', 'float');
requestInput(de, du, 'surface_aue', 'float');
if (de.surface_aiu === de.surface_aue) {
const defaultAiuAueMin = '0,75 <';
const defaultAiuAueMax = '≤ 1,00';
matcher.aiu_aue_min = defaultAiuAueMin;
matcher.aiu_aue_max = defaultAiuAueMax;
/**
* Certains DPE utilisent seulement aiu_aue_max = '≤ 0,25' alors que le ratio surface_aiu / surface_aue est 1 et donc
* on devrait avoir aiu_aue_min: '0,75 <' et aiu_aue_max: '≤ 1,00',
*/
if (bug_for_bug_compat && de.tv_coef_reduction_deperdition_id) {
const rowCoeffReductionpertes = tv('coef_reduction_deperdition', {
tv_coef_reduction_deperdition_id: de.tv_coef_reduction_deperdition_id
});
if (rowCoeffReductionpertes) {
matcher.aiu_aue_min = rowCoeffReductionpertes.aiu_aue_min || defaultAiuAueMin;
matcher.aiu_aue_max = rowCoeffReductionpertes.aiu_aue_max || defaultAiuAueMax;
if (
matcher.aiu_aue_min !== defaultAiuAueMin ||
matcher.aiu_aue_max !== defaultAiuAueMax
) {
console.error(
`Le calcul de b pour ${de.description} devrait se faire avec aiu_aue_min: '0,75 <' et aiu_aue_max: '≤ 1,00'
car surface_aiu === surface_aue. aiu_aue_min = ${matcher.aiu_aue_min} et aiu_aue_max = ${matcher.aiu_aue_max}
sont cependant utilisés par le DPE. Prise en compte de ces valeurs pour la suite des calculs`
);
}
}
}
} else {
const ranges = findRanges(de.surface_aiu / de.surface_aue);
if (ranges[0]) {
// Si le rapport des surfaces est égale à la borne inférieure, utilisation de la borne supérieure
// et prise en compte de l'égalité
if (ranges[0] === de.surface_aiu / de.surface_aue) {
matcher.aiu_aue_max =
'≤ ' +
ranges[0]
.toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
useGrouping: false
})
.replace('.', ',');
} else {
matcher.aiu_aue_min =
ranges[0]
.toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
useGrouping: false
})
.replace('.', ',') + ' <';
}
}
if (ranges[1]) {
matcher.aiu_aue_max =
'≤ ' +
ranges[1]
.toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
useGrouping: false
})
.replace('.', ',');
}
}
}
}
const row = tv('coef_reduction_deperdition', matcher);
if (row) {
di.b = Number(row.b);
de.tv_coef_reduction_deperdition_id = Number(row.tv_coef_reduction_deperdition_id);
} else {
console.error('!! pas de valeur forfaitaire trouvée pour b !!');
}
}