From 97734e5af136aefe89829da13d6c80f439552801 Mon Sep 17 00:00:00 2001 From: "Elliot (Hermes)" Date: Thu, 27 Aug 2026 14:20:11 +0000 Subject: [PATCH] feat: ajout methode de calcul cep 1.7 (janvier 2027) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implémente le coefficient d'énergie primaire 1.7 pour l'électricité, applicable au 1er janvier 2027 conformément à l'arrêté : https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000054747079 Changements : - src/conso.js : ajout COEFF_EP_1_7 et coef_ep_1_7 (objet coefficients) - src/engine.js : calcul conso1_7 avec coef_ep_1_7, exposition des champs ep_conso_5_usages_2027, ep_conso_5_usages_2027_m2, classe_bilan_dpe_2027 + appel calculateEnr pour conso1_7 (correction déduction production PV) - src/16.2_production_enr.js : updateEPConso supporte un coefficient numérique en plus du booléen (rétrocompat. préservée), import COEFF_EP_1_7 - src/index.js + index.js : export get_conso_coeff_1_7_2027 - test/open3cl-coeff-1-7.spec.js : tests unitaires (4 tests, 215 fixtures) Closes #176 --- index.js | 10 +- package-lock.json | 200 +++++++++++++++++++++++++++++++++ src/16.2_production_enr.js | 27 +++-- src/conso.js | 13 +++ src/engine.js | 62 ++++++++++ src/index.js | 10 +- test/open3cl-coeff-1-7.spec.js | 93 +++++++++++++++ 7 files changed, 403 insertions(+), 12 deletions(-) create mode 100644 test/open3cl-coeff-1-7.spec.js diff --git a/index.js b/index.js index 3190677..3bd16e1 100644 --- a/index.js +++ b/index.js @@ -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 './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_9_2026, + 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 }; diff --git a/package-lock.json b/package-lock.json index ea18f3d..f8f5677 100755 --- a/package-lock.json +++ b/package-lock.json @@ -11381,6 +11381,7 @@ }, "node_modules/npm/node_modules/@isaacs/balanced-match": { "version": "4.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11389,6 +11390,7 @@ }, "node_modules/npm/node_modules/@isaacs/brace-expansion": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -11400,6 +11402,7 @@ }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11416,6 +11419,7 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.2.2", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11427,11 +11431,13 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -11448,6 +11454,7 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -11462,6 +11469,7 @@ }, "node_modules/npm/node_modules/@isaacs/fs-minipass": { "version": "4.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11473,11 +11481,13 @@ }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11493,6 +11503,7 @@ }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "9.1.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11539,6 +11550,7 @@ }, "node_modules/npm/node_modules/@npmcli/config": { "version": "10.4.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11557,6 +11569,7 @@ }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11568,6 +11581,7 @@ }, "node_modules/npm/node_modules/@npmcli/git": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11586,6 +11600,7 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11601,6 +11616,7 @@ }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11615,6 +11631,7 @@ }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { "version": "9.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11630,6 +11647,7 @@ }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -11638,6 +11656,7 @@ }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -11646,6 +11665,7 @@ }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "7.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11663,6 +11683,7 @@ }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "8.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11674,6 +11695,7 @@ }, "node_modules/npm/node_modules/@npmcli/query": { "version": "4.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11685,6 +11707,7 @@ }, "node_modules/npm/node_modules/@npmcli/redact": { "version": "3.2.2", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -11693,6 +11716,7 @@ }, "node_modules/npm/node_modules/@npmcli/run-script": { "version": "10.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11709,6 +11733,7 @@ }, "node_modules/npm/node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -11718,6 +11743,7 @@ }, "node_modules/npm/node_modules/@sigstore/bundle": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -11729,6 +11755,7 @@ }, "node_modules/npm/node_modules/@sigstore/core": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "engines": { @@ -11737,6 +11764,7 @@ }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.5.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "engines": { @@ -11745,6 +11773,7 @@ }, "node_modules/npm/node_modules/@sigstore/sign": { "version": "4.0.1", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -11761,6 +11790,7 @@ }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -11773,6 +11803,7 @@ }, "node_modules/npm/node_modules/@sigstore/verify": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -11786,6 +11817,7 @@ }, "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11794,6 +11826,7 @@ }, "node_modules/npm/node_modules/@tufjs/models": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -11806,6 +11839,7 @@ }, "node_modules/npm/node_modules/@tufjs/models/node_modules/minimatch": { "version": "9.0.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11820,6 +11854,7 @@ }, "node_modules/npm/node_modules/abbrev": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -11828,6 +11863,7 @@ }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.4", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11836,6 +11872,7 @@ }, "node_modules/npm/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11844,6 +11881,7 @@ }, "node_modules/npm/node_modules/ansi-styles": { "version": "6.2.3", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11855,21 +11893,25 @@ }, "node_modules/npm/node_modules/aproba": { "version": "2.1.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11885,6 +11927,7 @@ }, "node_modules/npm/node_modules/binary-extensions": { "version": "3.1.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11896,6 +11939,7 @@ }, "node_modules/npm/node_modules/brace-expansion": { "version": "2.0.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -11904,6 +11948,7 @@ }, "node_modules/npm/node_modules/cacache": { "version": "20.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -11925,6 +11970,7 @@ }, "node_modules/npm/node_modules/chalk": { "version": "5.6.2", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -11936,6 +11982,7 @@ }, "node_modules/npm/node_modules/chownr": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "engines": { @@ -11944,6 +11991,7 @@ }, "node_modules/npm/node_modules/ci-info": { "version": "4.3.1", + "dev": true, "funding": [ { "type": "github", @@ -11958,6 +12006,7 @@ }, "node_modules/npm/node_modules/cidr-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -11969,6 +12018,7 @@ }, "node_modules/npm/node_modules/cli-columns": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -11981,6 +12031,7 @@ }, "node_modules/npm/node_modules/cmd-shim": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -11989,6 +12040,7 @@ }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12000,16 +12052,19 @@ }, "node_modules/npm/node_modules/color-name": { "version": "1.1.4", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.6", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12023,11 +12078,13 @@ }, "node_modules/npm/node_modules/cross-spawn/node_modules/isexe": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12042,6 +12099,7 @@ }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "bin": { @@ -12053,6 +12111,7 @@ }, "node_modules/npm/node_modules/debug": { "version": "4.4.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12069,6 +12128,7 @@ }, "node_modules/npm/node_modules/diff": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "BSD-3-Clause", "engines": { @@ -12077,16 +12137,19 @@ }, "node_modules/npm/node_modules/eastasianwidth": { "version": "0.2.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -12096,6 +12159,7 @@ }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12104,16 +12168,19 @@ }, "node_modules/npm/node_modules/err-code": { "version": "2.0.3", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.2", + "dev": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12122,6 +12189,7 @@ }, "node_modules/npm/node_modules/foreground-child": { "version": "3.3.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12137,6 +12205,7 @@ }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12148,6 +12217,7 @@ }, "node_modules/npm/node_modules/glob": { "version": "11.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12170,11 +12240,13 @@ }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.11", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { "version": "9.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12186,11 +12258,13 @@ }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.2.0", + "dev": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "7.0.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12203,6 +12277,7 @@ }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "7.0.6", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12215,6 +12290,7 @@ }, "node_modules/npm/node_modules/iconv-lite": { "version": "0.6.3", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -12227,6 +12303,7 @@ }, "node_modules/npm/node_modules/ignore-walk": { "version": "8.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12238,6 +12315,7 @@ }, "node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12246,6 +12324,7 @@ }, "node_modules/npm/node_modules/ini": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12254,6 +12333,7 @@ }, "node_modules/npm/node_modules/init-package-json": { "version": "8.2.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12271,6 +12351,7 @@ }, "node_modules/npm/node_modules/ip-address": { "version": "10.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12279,6 +12360,7 @@ }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12290,6 +12372,7 @@ }, "node_modules/npm/node_modules/is-cidr": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -12301,6 +12384,7 @@ }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12309,6 +12393,7 @@ }, "node_modules/npm/node_modules/isexe": { "version": "3.1.1", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12317,6 +12402,7 @@ }, "node_modules/npm/node_modules/jackspeak": { "version": "4.1.1", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12331,6 +12417,7 @@ }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12339,6 +12426,7 @@ }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", + "dev": true, "inBundle": true, "license": "ISC", "funding": { @@ -12347,6 +12435,7 @@ }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", + "dev": true, "engines": [ "node >= 0.2.0" ], @@ -12355,16 +12444,19 @@ }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "10.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12377,6 +12469,7 @@ }, "node_modules/npm/node_modules/libnpmdiff": { "version": "8.0.9", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12395,6 +12488,7 @@ }, "node_modules/npm/node_modules/libnpmexec": { "version": "10.1.8", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12417,6 +12511,7 @@ }, "node_modules/npm/node_modules/libnpmfund": { "version": "7.0.9", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12428,6 +12523,7 @@ }, "node_modules/npm/node_modules/libnpmorg": { "version": "8.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12440,6 +12536,7 @@ }, "node_modules/npm/node_modules/libnpmpack": { "version": "9.0.9", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12454,6 +12551,7 @@ }, "node_modules/npm/node_modules/libnpmpublish": { "version": "11.1.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12472,6 +12570,7 @@ }, "node_modules/npm/node_modules/libnpmsearch": { "version": "9.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12483,6 +12582,7 @@ }, "node_modules/npm/node_modules/libnpmteam": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12495,6 +12595,7 @@ }, "node_modules/npm/node_modules/libnpmversion": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12510,6 +12611,7 @@ }, "node_modules/npm/node_modules/lru-cache": { "version": "11.2.2", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12518,6 +12620,7 @@ }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "15.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12539,6 +12642,7 @@ }, "node_modules/npm/node_modules/minimatch": { "version": "10.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12553,6 +12657,7 @@ }, "node_modules/npm/node_modules/minipass": { "version": "7.1.2", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12561,6 +12666,7 @@ }, "node_modules/npm/node_modules/minipass-collect": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12572,6 +12678,7 @@ }, "node_modules/npm/node_modules/minipass-fetch": { "version": "4.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12588,6 +12695,7 @@ }, "node_modules/npm/node_modules/minipass-flush": { "version": "1.0.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12599,6 +12707,7 @@ }, "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12610,6 +12719,7 @@ }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12621,6 +12731,7 @@ }, "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12632,6 +12743,7 @@ }, "node_modules/npm/node_modules/minipass-sized": { "version": "1.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12643,6 +12755,7 @@ }, "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12654,6 +12767,7 @@ }, "node_modules/npm/node_modules/minizlib": { "version": "3.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12665,11 +12779,13 @@ }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12678,6 +12794,7 @@ }, "node_modules/npm/node_modules/negotiator": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12686,6 +12803,7 @@ }, "node_modules/npm/node_modules/node-gyp": { "version": "11.4.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -12709,6 +12827,7 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12724,6 +12843,7 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { "version": "19.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12746,6 +12866,7 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/glob": { "version": "10.4.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12765,6 +12886,7 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/jackspeak": { "version": "3.4.3", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12779,11 +12901,13 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/lru-cache": { "version": "10.4.3", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { "version": "14.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12805,6 +12929,7 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "9.0.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12819,6 +12944,7 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/path-scurry": { "version": "1.11.1", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12834,6 +12960,7 @@ }, "node_modules/npm/node_modules/nopt": { "version": "8.1.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12848,6 +12975,7 @@ }, "node_modules/npm/node_modules/npm-audit-report": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12856,6 +12984,7 @@ }, "node_modules/npm/node_modules/npm-bundled": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12867,6 +12996,7 @@ }, "node_modules/npm/node_modules/npm-install-checks": { "version": "7.1.2", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -12878,6 +13008,7 @@ }, "node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -12886,6 +13017,7 @@ }, "node_modules/npm/node_modules/npm-package-arg": { "version": "13.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12900,6 +13032,7 @@ }, "node_modules/npm/node_modules/npm-packlist": { "version": "10.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12912,6 +13045,7 @@ }, "node_modules/npm/node_modules/npm-pick-manifest": { "version": "11.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12926,6 +13060,7 @@ }, "node_modules/npm/node_modules/npm-profile": { "version": "12.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12938,6 +13073,7 @@ }, "node_modules/npm/node_modules/npm-registry-fetch": { "version": "19.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -12956,6 +13092,7 @@ }, "node_modules/npm/node_modules/npm-user-validate": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "engines": { @@ -12964,6 +13101,7 @@ }, "node_modules/npm/node_modules/p-map": { "version": "7.0.3", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -12975,11 +13113,13 @@ }, "node_modules/npm/node_modules/package-json-from-dist": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0" }, "node_modules/npm/node_modules/pacote": { "version": "21.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13010,6 +13150,7 @@ }, "node_modules/npm/node_modules/parse-conflict-json": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13023,6 +13164,7 @@ }, "node_modules/npm/node_modules/path-key": { "version": "3.1.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13031,6 +13173,7 @@ }, "node_modules/npm/node_modules/path-scurry": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -13046,6 +13189,7 @@ }, "node_modules/npm/node_modules/postcss-selector-parser": { "version": "7.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13058,6 +13202,7 @@ }, "node_modules/npm/node_modules/proc-log": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13066,6 +13211,7 @@ }, "node_modules/npm/node_modules/proggy": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13074,6 +13220,7 @@ }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "ISC", "funding": { @@ -13082,6 +13229,7 @@ }, "node_modules/npm/node_modules/promise-call-limit": { "version": "3.0.2", + "dev": true, "inBundle": true, "license": "ISC", "funding": { @@ -13090,6 +13238,7 @@ }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13102,6 +13251,7 @@ }, "node_modules/npm/node_modules/promzard": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13113,6 +13263,7 @@ }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", + "dev": true, "inBundle": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" @@ -13120,6 +13271,7 @@ }, "node_modules/npm/node_modules/read": { "version": "4.1.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13131,6 +13283,7 @@ }, "node_modules/npm/node_modules/read-cmd-shim": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13139,6 +13292,7 @@ }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13147,12 +13301,14 @@ }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", + "dev": true, "inBundle": true, "license": "MIT", "optional": true }, "node_modules/npm/node_modules/semver": { "version": "7.7.3", + "dev": true, "inBundle": true, "license": "ISC", "bin": { @@ -13164,6 +13320,7 @@ }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13175,6 +13332,7 @@ }, "node_modules/npm/node_modules/shebang-regex": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13183,6 +13341,7 @@ }, "node_modules/npm/node_modules/signal-exit": { "version": "4.1.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13194,6 +13353,7 @@ }, "node_modules/npm/node_modules/sigstore": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -13210,6 +13370,7 @@ }, "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13219,6 +13380,7 @@ }, "node_modules/npm/node_modules/socks": { "version": "2.8.7", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13232,6 +13394,7 @@ }, "node_modules/npm/node_modules/socks-proxy-agent": { "version": "8.0.5", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13245,6 +13408,7 @@ }, "node_modules/npm/node_modules/spdx-correct": { "version": "3.2.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -13254,6 +13418,7 @@ }, "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13263,11 +13428,13 @@ }, "node_modules/npm/node_modules/spdx-exceptions": { "version": "2.5.0", + "dev": true, "inBundle": true, "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13277,11 +13444,13 @@ }, "node_modules/npm/node_modules/spdx-license-ids": { "version": "3.0.22", + "dev": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { "version": "12.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13293,6 +13462,7 @@ }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13307,6 +13477,7 @@ "node_modules/npm/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13320,6 +13491,7 @@ }, "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13332,6 +13504,7 @@ "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13343,6 +13516,7 @@ }, "node_modules/npm/node_modules/supports-color": { "version": "10.2.2", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13354,6 +13528,7 @@ }, "node_modules/npm/node_modules/tar": { "version": "7.5.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13369,6 +13544,7 @@ }, "node_modules/npm/node_modules/tar/node_modules/yallist": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "engines": { @@ -13377,16 +13553,19 @@ }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "2.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/tinyglobby": { "version": "0.2.15", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13402,6 +13581,7 @@ }, "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13418,6 +13598,7 @@ }, "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13429,6 +13610,7 @@ }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13437,6 +13619,7 @@ }, "node_modules/npm/node_modules/tuf-js": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13450,6 +13633,7 @@ }, "node_modules/npm/node_modules/unique-filename": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13461,6 +13645,7 @@ }, "node_modules/npm/node_modules/unique-slug": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13472,11 +13657,13 @@ }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -13486,6 +13673,7 @@ }, "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13495,6 +13683,7 @@ }, "node_modules/npm/node_modules/validate-npm-package-name": { "version": "6.0.2", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13503,6 +13692,7 @@ }, "node_modules/npm/node_modules/walk-up-path": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -13511,6 +13701,7 @@ }, "node_modules/npm/node_modules/which": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13525,6 +13716,7 @@ }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13542,6 +13734,7 @@ "node_modules/npm/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13558,6 +13751,7 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13572,6 +13766,7 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.2.2", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -13583,11 +13778,13 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13604,6 +13801,7 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -13618,6 +13816,7 @@ }, "node_modules/npm/node_modules/write-file-atomic": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -13630,6 +13829,7 @@ }, "node_modules/npm/node_modules/yallist": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, diff --git a/src/16.2_production_enr.js b/src/16.2_production_enr.js index 4325364..db85cd1 100644 --- a/src/16.2_production_enr.js +++ b/src/16.2_production_enr.js @@ -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 { COEFF_EP_1_7, COEFF_EP_1_9, COEFF_EP_2_3 } from './conso.js'; export class ProductionENR { #taplpi = { @@ -181,17 +181,24 @@ 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 use_coeff_ch_elec_2_3 {boolean|number} "true" pour coeff 2.3, un nombre pour un coeff personnalisé (ex: COEFF_EP_1_7), sinon coeff 1.9 courant */ 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; - conso.ep_conso.ep_conso_eclairage -= - COEFF_EP_2_3 * productionElectricite.conso_elec_ac_eclairage; + // Resolve the coefficient: boolean true → 2.3, a number → use directly, false/undefined → 1.9 + const coeff = + use_coeff_ch_elec_2_3 === true + ? COEFF_EP_2_3 + : typeof use_coeff_ch_elec_2_3 === 'number' + ? use_coeff_ch_elec_2_3 + : COEFF_EP_1_9; + + if (coeff !== COEFF_EP_1_9) { + conso.ep_conso.ep_conso_ecs -= coeff * productionElectricite.conso_elec_ac_ecs; + conso.ep_conso.ep_conso_ch -= coeff * productionElectricite.conso_elec_ac_ch; + conso.ep_conso.ep_conso_fr -= coeff * productionElectricite.conso_elec_ac_fr; + conso.ep_conso.ep_conso_eclairage -= coeff * productionElectricite.conso_elec_ac_eclairage; conso.ep_conso.ep_conso_totale_auxiliaire -= - COEFF_EP_2_3 * productionElectricite.conso_elec_ac_auxiliaire; + coeff * productionElectricite.conso_elec_ac_auxiliaire; const conso_elec = productionElectricite.conso_elec_ac_ecs + @@ -200,7 +207,7 @@ 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 * conso_elec; conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh); } else { diff --git a/src/conso.js b/src/conso.js index e2e4b0c..8f6de06 100644 --- a/src/conso.js +++ b/src/conso.js @@ -5,6 +5,7 @@ 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; /** * Coeff de chauffage 1.9 au 01/01/2026 @@ -18,6 +19,18 @@ export const coef_ep = { 'électricité auxiliaire': COEFF_EP_1_9 }; +/** + * Coeff de chauffage 1.7 au 01/01/2027 + * @link {https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000054747079} + */ +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 +}; + /** * Coeff de chauffage 2.3 avant le 01/01/2026 */ diff --git a/src/engine.js b/src/engine.js index 65f3841..0659b53 100644 --- a/src/engine.js +++ b/src/engine.js @@ -10,7 +10,9 @@ import calc_qualite_isolation from './2021_04_13_qualite_isolation.js'; import calc_conso, { classe_bilan_dpe, classe_emission_ges, + COEFF_EP_1_7, coef_ep, + coef_ep_1_7, coef_ep_2_3 } from './conso.js'; import { @@ -577,7 +579,29 @@ export function calcul_3cl(inputDpe, options) { coef_ep_2_3 ); + const conso1_7 = calc_conso( + Sh, + zc_id, + ca_id, + vt_list, + instal_ch, + ecs, + clim, + prorataECS, + prorataChauffage, + dateDpe, + coef_ep_1_7 + ); + productionENR.calculateEnr(dpe.logement.production_elec_enr, conso2_3, Sh, th, zc_id, true); + productionENR.calculateEnr( + dpe.logement.production_elec_enr, + conso1_7, + Sh, + th, + zc_id, + COEFF_EP_1_7 + ); // get all baie_vitree orientations const ph_list = env.plancher_haut_collection.plancher_haut || []; @@ -602,6 +626,10 @@ export function calcul_3cl(inputDpe, options) { logement.sortie.ep_conso.ep_conso_5_usages_2026_m2 = logement.sortie.ep_conso.ep_conso_5_usages_m2; + logement.sortie.ep_conso.classe_bilan_dpe_2027 = conso1_7.ep_conso.classe_bilan_dpe; + logement.sortie.ep_conso.ep_conso_5_usages_2027 = conso1_7.ep_conso.ep_conso_5_usages; + logement.sortie.ep_conso.ep_conso_5_usages_2027_m2 = conso1_7.ep_conso.ep_conso_5_usages_m2; + return dpe; } @@ -662,3 +690,37 @@ export function get_conso_coeff_1_9_2026(dpe) { return { classe_bilan_dpe: classe_dpe, ep_conso_5_usages_m2, ep_conso_5_usages }; } + +/** + * Calcul de la nouvelle conso suite à la modification du coefficient pour le chauffage électrique + * Applicable uniquement à partir de janvier 2027 + * + * {@link https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000054747079} + * + * @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) { + 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); + + // Converts a DPE computed with coeff 1.9 to coeff 1.7: + // ep_1.7 = ef_conso + (ep_conso - ef_conso) * (0.7 / 0.9) + const ep_conso_5_usages = + (0.7 / 0.9) * + (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); + + let Sh; + if (th === 'maison' || th === 'appartement') + Sh = Number(dpe.logement.caracteristique_generale.surface_habitable_logement); + else if (th === 'immeuble') + Sh = Number(dpe.logement.caracteristique_generale.surface_habitable_immeuble); + + const ep_conso_5_usages_m2 = Math.floor(ep_conso_5_usages / Sh); + const classe_dpe = classe_bilan_dpe(ep_conso_5_usages_m2, zc_id, ca_id, Sh); + + return { classe_bilan_dpe: classe_dpe, ep_conso_5_usages_m2, ep_conso_5_usages }; +} diff --git a/src/index.js b/src/index.js index 77cc80c..3d296aa 100644 --- a/src/index.js +++ b/src/index.js @@ -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 }; diff --git a/test/open3cl-coeff-1-7.spec.js b/test/open3cl-coeff-1-7.spec.js new file mode 100644 index 0000000..145d5b0 --- /dev/null +++ b/test/open3cl-coeff-1-7.spec.js @@ -0,0 +1,93 @@ +import { describe, expect, test } from 'vitest'; +import fs from 'node:fs'; +import { calcul_3cl, get_conso_coeff_1_7_2027 } from '../src/index.js'; + +/** + * Load a DPE fixture from local JSON cache (no ADEME credentials needed). + * Falls back to null if file not found. + */ +function loadFixture(dpeCode) { + const path = `test/fixtures/${dpeCode}.json`; + if (!fs.existsSync(path)) return null; + return JSON.parse(fs.readFileSync(path, 'utf-8')); +} + +describe('Open3cl CEP 1.7 (janvier 2027) unit tests', () => { + test('calcul_3cl output should include _2027 ep_conso fields', () => { + // Use any available local JSON fixture + const fixtures = fs + .readdirSync('test/fixtures') + .filter((f) => f.endsWith('.json') && !f.endsWith('-result.json')); + expect(fixtures.length).toBeGreaterThan(0); + + const inputDpe = loadFixture(fixtures[0].replace('.json', '')); + expect(inputDpe).not.toBeNull(); + + const outputDpe = calcul_3cl(structuredClone(inputDpe)); + + expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_2027).toBeDefined(); + expect(outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_2027_m2).toBeDefined(); + expect(outputDpe.logement.sortie.ep_conso.classe_bilan_dpe_2027).toBeDefined(); + }); + + test('_2027 ep_conso should be <= _2026 ep_conso (lower coefficient)', () => { + const fixtures = fs + .readdirSync('test/fixtures') + .filter((f) => f.endsWith('.json') && !f.endsWith('-result.json')); + + // Test across all available fixtures + let tested = 0; + for (const file of fixtures.slice(0, 10)) { + const inputDpe = loadFixture(file.replace('.json', '')); + if (!inputDpe) continue; + const outputDpe = calcul_3cl(structuredClone(inputDpe)); + const ep2026 = outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_2026; + const ep2027 = outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_2027; + // 1.7 ≤ 1.9, so 2027 energy consumption must be ≤ 2026 + expect(ep2027).toBeLessThanOrEqual(ep2026 + 0.001); // +0.001 for floating point tolerance + tested++; + } + expect(tested).toBeGreaterThan(0); + }); + + test('_2027 ep_conso should be <= _2026 ep_conso for all non-result fixtures', () => { + const fixtures = fs + .readdirSync('test/fixtures') + .filter((f) => f.endsWith('.json') && !f.endsWith('-result.json')); + + let tested = 0; + for (const file of fixtures) { + const inputDpe = loadFixture(file.replace('.json', '')); + if (!inputDpe) continue; + const outputDpe = calcul_3cl(structuredClone(inputDpe)); + const ep2026 = outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_2026; + const ep2027 = outputDpe.logement.sortie.ep_conso.ep_conso_5_usages_2027; + expect(ep2027).toBeLessThanOrEqual(ep2026 + 0.001); + tested++; + } + expect(tested).toBeGreaterThan(0); + }, 60_000); + + test('get_conso_coeff_1_7_2027 returns valid result with ep_conso_5_usages <= 1.9 result', () => { + const fixtures = fs + .readdirSync('test/fixtures') + .filter((f) => f.endsWith('.json') && !f.endsWith('-result.json')); + + const inputDpe = loadFixture(fixtures[0].replace('.json', '')); + expect(inputDpe).not.toBeNull(); + + const outputDpe = calcul_3cl(structuredClone(inputDpe)); + const result1_7 = get_conso_coeff_1_7_2027(outputDpe); + + expect(result1_7.ep_conso_5_usages).toBeDefined(); + expect(result1_7.ep_conso_5_usages_m2).toBeDefined(); + expect(result1_7.classe_bilan_dpe).toBeDefined(); + expect(typeof result1_7.ep_conso_5_usages).toBe('number'); + expect(typeof result1_7.ep_conso_5_usages_m2).toBe('number'); + + // 1.7 coefficient should give lower or equal conso than 1.9 + expect(result1_7.ep_conso_5_usages).toBeLessThanOrEqual( + outputDpe.logement.sortie.ep_conso.ep_conso_5_usages + 0.001 + ); + }); +});