Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion dist/reports/corpus/corpus_list_main.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@
"dpe_appartement_individuel_chauffage_collectif_2025.csv",
"dpe_individuel_a_partir_dpe_immeuble_2026.csv"
],
"branches": ["main"]
"branches": ["main", "fix_issue_177"]
}
4 changes: 2 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import {
calcul_3cl,
calcul_3cl_xml,
get_classe_ges_dpe,
get_conso_coeff_1_9_2026,
get_conso_coeff_1_7_2027,
getVersion
} from './src/index.js';
export { calcul_3cl, calcul_3cl_xml, get_classe_ges_dpe, get_conso_coeff_1_9_2026, getVersion };
export { calcul_3cl, calcul_3cl_xml, get_classe_ges_dpe, get_conso_coeff_1_7_2027, getVersion };
import { Umur, Uph, Upb, Uporte, Ubv, Upt, calc_deperdition } from './src/3_deperdition.js';
export { Umur, Uph, Upb, Uporte, Ubv, Upt, calc_deperdition };
42 changes: 23 additions & 19 deletions src/16.2_production_enr.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import enums from './enums.js';
import { mois_liste, tv } from './utils.js';
import tvs from './tv.js';
import { COEFF_EP_1_9, COEFF_EP_2_3 } from './conso.js';
import { DEFAULT_COEFF_EP } from './conso.js';

export class ProductionENR {
#taplpi = {
Expand All @@ -18,9 +18,13 @@ export class ProductionENR {
* Calcul des consommations d'électricité auto-consommée par enveloppe
* Mise à jour des conso ef en prenant en compte ces auto-consommations
* @param productionElecEnr
* @param Sh {string}
* @param conso
* @param Sh {number}
* @param th {string}
* @param zc_id {string}
* @param coeff_ep_override {number?}
*/
calculateEnr(productionElecEnr, conso, Sh, th, zc_id, use_coeff_ch_elec_2_3) {
calculateEnr(productionElecEnr, conso, Sh, th, zc_id, coeff_ep_override) {
const productionElectricite = {
conso_elec_ac: 0,
production_pv: 0,
Expand All @@ -45,7 +49,7 @@ export class ProductionENR {
this.updateEfConso(productionElectricite, conso, Sh);

// Mise à jour des consommations d'énergie primaire en minorant l'énergie consommée par l'énergie autoconsommée par le poste
this.updateEPConso(productionElectricite, conso, Sh, use_coeff_ch_elec_2_3);
this.updateEPConso(productionElectricite, conso, Sh, coeff_ep_override);
}

return {
Expand Down Expand Up @@ -181,17 +185,17 @@ export class ProductionENR {
* @param productionElectricite
* @param conso {{ep_conso: Ep_conso}}
* @param Sh {number}
* @param use_coeff_ch_elec_2_3 {boolean} "true" pour ne pas utiliser le dernier coeff de chauffage électrique
* @param coeff_ep_override {number?} coeff ep à surcharger si définit
*/
updateEPConso(productionElectricite, conso, Sh, use_coeff_ch_elec_2_3) {
if (use_coeff_ch_elec_2_3) {
conso.ep_conso.ep_conso_ecs -= COEFF_EP_2_3 * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= COEFF_EP_2_3 * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= COEFF_EP_2_3 * productionElectricite.conso_elec_ac_fr;
updateEPConso(productionElectricite, conso, Sh, coeff_ep_override) {
if (coeff_ep_override) {
conso.ep_conso.ep_conso_ecs -= coeff_ep_override * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= coeff_ep_override * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= coeff_ep_override * productionElectricite.conso_elec_ac_fr;
conso.ep_conso.ep_conso_eclairage -=
COEFF_EP_2_3 * productionElectricite.conso_elec_ac_eclairage;
coeff_ep_override * productionElectricite.conso_elec_ac_eclairage;
conso.ep_conso.ep_conso_totale_auxiliaire -=
COEFF_EP_2_3 * productionElectricite.conso_elec_ac_auxiliaire;
coeff_ep_override * productionElectricite.conso_elec_ac_auxiliaire;

const conso_elec =
productionElectricite.conso_elec_ac_ecs +
Expand All @@ -200,17 +204,17 @@ export class ProductionENR {
productionElectricite.conso_elec_ac_eclairage +
productionElectricite.conso_elec_ac_auxiliaire;

conso.ep_conso.ep_conso_5_usages -= COEFF_EP_2_3 * conso_elec;
conso.ep_conso.ep_conso_5_usages -= coeff_ep_override * conso_elec;

conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh);
} else {
conso.ep_conso.ep_conso_ecs -= COEFF_EP_1_9 * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= COEFF_EP_1_9 * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= COEFF_EP_1_9 * productionElectricite.conso_elec_ac_fr;
conso.ep_conso.ep_conso_ecs -= DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_fr;
conso.ep_conso.ep_conso_eclairage -=
COEFF_EP_1_9 * productionElectricite.conso_elec_ac_eclairage;
DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_eclairage;
conso.ep_conso.ep_conso_totale_auxiliaire -=
COEFF_EP_1_9 * productionElectricite.conso_elec_ac_auxiliaire;
DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_auxiliaire;

const conso_elec =
productionElectricite.conso_elec_ac_ecs +
Expand All @@ -219,7 +223,7 @@ export class ProductionENR {
productionElectricite.conso_elec_ac_eclairage +
productionElectricite.conso_elec_ac_auxiliaire;

conso.ep_conso.ep_conso_5_usages -= COEFF_EP_1_9 * conso_elec;
conso.ep_conso.ep_conso_5_usages -= DEFAULT_COEFF_EP * conso_elec;

conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh);
}
Expand Down
13 changes: 13 additions & 0 deletions src/conso.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { tv } from './utils.js';

export const COEFF_EP_2_3 = 2.3;
export const COEFF_EP_1_9 = 1.9;
export const COEFF_EP_1_7 = 1.7;
export const DEFAULT_COEFF_EP = COEFF_EP_1_9;

/**
* Coeff de chauffage 1.9 au 01/01/2026
Expand All @@ -29,6 +31,17 @@ export const coef_ep_2_3 = {
'électricité auxiliaire': COEFF_EP_2_3
};

/**
* Coeff de chauffage 1.7 au 01/01/2027
*/
export const coef_ep_1_7 = {
'électricité ch': COEFF_EP_1_7,
'électricité ecs': COEFF_EP_1_7,
'électricité fr': COEFF_EP_1_7,
'électricité éclairage': COEFF_EP_1_7,
'électricité auxiliaire': COEFF_EP_1_7
};

/**
* Au 31 mars 2021
* @link {https://www.legifrance.gouv.fr/download/pdf?id=doxMrRr0wbfJVvtWjfDP4gHzzERt1iX0PtobthCE6A0=}
Expand Down
68 changes: 57 additions & 11 deletions src/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import calc_conso, {
classe_bilan_dpe,
classe_emission_ges,
coef_ep,
coef_ep_2_3
coef_ep_1_7,
coef_ep_2_3,
COEFF_EP_1_7,
COEFF_EP_2_3
} from './conso.js';
import {
add_references,
Expand Down Expand Up @@ -559,8 +562,30 @@ export function calcul_3cl(inputDpe, options) {
conso,
Sh,
th,
zc_id
);

const conso1_7 = calc_conso(
Sh,
zc_id,
false
ca_id,
vt_list,
instal_ch,
ecs,
clim,
prorataECS,
prorataChauffage,
dateDpe,
coef_ep_1_7
);

productionENR.calculateEnr(
dpe.logement.production_elec_enr,
conso1_7,
Sh,
th,
zc_id,
COEFF_EP_1_7
);

const conso2_3 = calc_conso(
Expand All @@ -577,7 +602,14 @@ export function calcul_3cl(inputDpe, options) {
coef_ep_2_3
);

productionENR.calculateEnr(dpe.logement.production_elec_enr, conso2_3, Sh, th, zc_id, true);
productionENR.calculateEnr(
dpe.logement.production_elec_enr,
conso2_3,
Sh,
th,
zc_id,
COEFF_EP_2_3
);

// get all baie_vitree orientations
const ph_list = env.plancher_haut_collection.plancher_haut || [];
Expand All @@ -594,12 +626,15 @@ export function calcul_3cl(inputDpe, options) {
...logement.sortie.ep_conso,
coeff_2_3_classe_bilan_dpe: conso2_3.ep_conso.classe_bilan_dpe,
coeff_2_3_ep_conso_5_usages: conso2_3.ep_conso.ep_conso_5_usages,
coeff_2_3_ep_conso_5_usages_m2: conso2_3.ep_conso.ep_conso_5_usages_m2
coeff_2_3_ep_conso_5_usages_m2: conso2_3.ep_conso.ep_conso_5_usages_m2,
coeff_1_7_classe_bilan_dpe: conso1_7.ep_conso.classe_bilan_dpe,
coeff_1_7_ep_conso_5_usages: conso1_7.ep_conso.ep_conso_5_usages,
coeff_1_7_ep_conso_5_usages_m2: conso1_7.ep_conso.ep_conso_5_usages_m2
};

logement.sortie.ep_conso.classe_bilan_dpe_2026 = logement.sortie.ep_conso.classe_bilan_dpe;
logement.sortie.ep_conso.ep_conso_5_usages_2026 = logement.sortie.ep_conso.ep_conso_5_usages;
logement.sortie.ep_conso.ep_conso_5_usages_2026_m2 =
logement.sortie.ep_conso.classe_bilan_dpe_2027 = logement.sortie.ep_conso.classe_bilan_dpe;
logement.sortie.ep_conso.ep_conso_5_usages_2027 = logement.sortie.ep_conso.ep_conso_5_usages;
logement.sortie.ep_conso.ep_conso_5_usages_2027_m2 =
logement.sortie.ep_conso.ep_conso_5_usages_m2;

return dpe;
Expand Down Expand Up @@ -633,20 +668,31 @@ export function get_classe_ges_dpe(dpe) {

/**
* Calcul de la nouvelle conso suite à la modification du coefficient pour le chauffage électrique
* Applicable uniquement à partir de janvier 2026
* Applicable uniquement à partir de janvier 2027
*
* {@link https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000054747079}
*
* {@link https://www.ecologie.gouv.fr/actualites/evolutions-du-calcul-du-dpe-reponses-vos-questions#:~:text=Les%20DPE%20r%C3%A9alis%C3%A9s%20avant%20le,%2DAudit%20de%20l'Ademe.}
* @param dpe {FullDpe}
* @returns {{ep_conso_5_usages: number; ep_conso_5_usages_m2: number; classe_bilan_dpe: string}}
*/
export function get_conso_coeff_1_7_2027(dpe) {
return get_conso_with_coeff(dpe, 0.7 / 0.9);
}

/**
* Calcul de la nouvelle conso suite à la modification du coefficient pour le chauffage électrique
*
* @param dpe {FullDpe}
* @param coeff {number}
* @returns {{ep_conso_5_usages: number; ep_conso_5_usages_m2: number; classe_bilan_dpe: string}}
*/
export function get_conso_coeff_1_9_2026(dpe) {
function get_conso_with_coeff(dpe, coeff) {
const zc_id = dpe.logement.meteo.enum_zone_climatique_id;
const ca_id = dpe.logement.meteo.enum_classe_altitude_id;
const th = calc_th(dpe.logement.caracteristique_generale.enum_methode_application_dpe_log_id);

const ep_conso_5_usages =
(0.9 / 1.3) *
coeff *
(Number(dpe.logement.sortie.ep_conso.ep_conso_5_usages) -
Number(dpe.logement.sortie.ef_conso.conso_5_usages)) +
Number(dpe.logement.sortie.ef_conso.conso_5_usages);
Expand Down
10 changes: 9 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,16 @@ import {
calcul_3cl_xml,
get_classe_ges_dpe,
get_conso_coeff_1_9_2026,
get_conso_coeff_1_7_2027,
getVersion
} from './engine.js';
export { calcul_3cl, calcul_3cl_xml, get_classe_ges_dpe, get_conso_coeff_1_9_2026, getVersion };
export {
calcul_3cl,
calcul_3cl_xml,
get_classe_ges_dpe,
get_conso_coeff_1_9_2026,
get_conso_coeff_1_7_2027,
getVersion
};
import { Umur, Uph, Upb, Uporte, Ubv, Upt } from './3_deperdition.js';
export { Umur, Uph, Upb, Uporte, Ubv, Upt };
60 changes: 30 additions & 30 deletions test/open3cl-coeff-1-9.spec.js → test/open3cl-coeff-1-7.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,71 +3,71 @@ import { getAdemeFileJsonOrDownload } from './test-helpers.js';
import { calcul_3cl } from '../src/index.js';

describe('Open3cl misc unit tests', () => {
test('should calculate primary conso with coeff 1.9 (since janvier 2026) for dpe: 2369E2791083C', async () => {
test('should calculate primary conso with coeff 1.7 (since janvier 2027) for dpe: 2369E2791083C', async () => {
const inputDpe = await getAdemeFileJsonOrDownload('2369E2791083C');
const outputDpe = calcul_3cl(structuredClone(inputDpe));
expect(outputDpe.logement.sortie.ep_conso.coeff_2_3_classe_bilan_dpe).toBe('G');
expect(outputDpe.logement.sortie.ep_conso.coeff_1_7_classe_bilan_dpe).toBe('F');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe).toBe('F');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2026).toBe('F');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2027).toBe('F');

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages
);

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages
);

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_m2).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages_m2
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_m2).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages_m2
);
});

test('should calculate primary conso with coeff 1.9 (since janvier 2026) for dpe: 2513E1166911W', async () => {
test('should calculate primary conso with coeff 1.7 (since janvier 2027) for dpe: 2513E1166911W', async () => {
const inputDpe = await getAdemeFileJsonOrDownload('2513E1166911W');
const outputDpe = calcul_3cl(structuredClone(inputDpe));
expect(outputDpe.logement.sortie.ep_conso.coeff_2_3_classe_bilan_dpe).toBe('C');
expect(outputDpe.logement.sortie.ep_conso.coeff_1_7_classe_bilan_dpe).toBe('B');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe).toBe('B');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2026).toBe('B');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2027).toBe('B');

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages
);

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages
);

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_m2).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages_m2
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_m2).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages_m2
);
});

test('should calculate primary conso with coeff 1.9 (since janvier 2026) for dpe: 2528E1249844E', async () => {
test('should calculate primary conso with coeff 1.7 (since janvier 2027) for dpe: 2528E1249844E', async () => {
const inputDpe = await getAdemeFileJsonOrDownload('2528E1249844E');
const outputDpe = calcul_3cl(structuredClone(inputDpe));
expect(outputDpe.logement.sortie.ep_conso.coeff_2_3_classe_bilan_dpe).toBe('A');
expect(outputDpe.logement.sortie.ep_conso.coeff_1_7_classe_bilan_dpe).toBe('A');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe).toBe('A');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2026).toBe('A');
expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2027).toBe('A');

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages
);

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages
);

expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_m2).toBeLessThan(
outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages_m2
expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_m2).toBeGreaterThan(
outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages_m2
);
});

test('should calculate primary conso with coeff 1.9 (since janvier 2026) for dpe: 2464E1799476F', async () => {
test('should calculate primary conso with coeff 1.7 (since janvier 2027) for dpe: 2464E1799476F', async () => {
const inputDpe = await getAdemeFileJsonOrDownload('2464E1799476F');
const outputDpe = calcul_3cl(structuredClone(inputDpe));
expect(outputDpe.logement.sortie.ep_conso.coeff_2_3_ep_conso_5_usages).toBeCloseTo(
44852.95,
expect(outputDpe.logement.sortie.ep_conso.coeff_1_7_ep_conso_5_usages).toBeCloseTo(
33669.79,
0.5
);
});
Expand Down
Loading
Loading