diff --git a/src/dpe-sanitizer.service.js b/src/dpe-sanitizer.service.js index 7567624..77211ff 100644 --- a/src/dpe-sanitizer.service.js +++ b/src/dpe-sanitizer.service.js @@ -1,28 +1,39 @@ import { ObjectUtil } from './core/util/infrastructure/object-util.js'; +import { set, has } from 'lodash-es'; const nodesToMap = [ - 'mur', - 'plancher_bas', - 'plancher_haut', - 'baie_vitree', - 'porte', - 'pont_thermique', - 'ventilation', 'installation_ecs', 'generateur_ecs', - 'climatisation', 'installation_chauffage', 'generateur_chauffage', 'emetteur_chauffage', 'sortie_par_energie' ]; +const nodesCollectionToCheck = [ + 'logement.enveloppe.mur_collection.mur', + 'logement.enveloppe.plancher_bas_collection.plancher_bas', + 'logement.enveloppe.plancher_haut_collection.plancher_haut', + 'logement.ventilation_collection.ventilation', + 'logement.climatisation_collection.climatisation', + 'logement.enveloppe.baie_vitree_collection.baie_vitree', + 'logement.enveloppe.porte_collection.porte', + 'logement.enveloppe.pont_thermique_collection.pont_thermique' +]; + /** * Transform single nodes in {@link nodesToMap} into array of nodes. * Transform string number into digits * These transformations should be done inside the open3cl library * * @example + * + * // Will create + * "plancher_haut_collection": { + * "plancher_haut": [] + * } + * if the plancher_haut_collection.plancher_haut nodes does not exist or are not an array + * * // Will transform * "plancher_haut_collection": { * "plancher_haut": {"id": 1} @@ -44,6 +55,12 @@ export default class DpeSanitizerService { * @return {FullDpe} */ execute(dpe) { + for (const path of nodesCollectionToCheck) { + if (!has(dpe, path)) { + set(dpe, path, []); + } + } + return ObjectUtil.deepObjectTransform( dpe, (key) => key, diff --git a/test/fixtures/dpe_without_porte_collection.xml b/test/fixtures/dpe_without_porte_collection.xml new file mode 100644 index 0000000..04831f0 --- /dev/null +++ b/test/fixtures/dpe_without_porte_collection.xml @@ -0,0 +1,1481 @@ + + + NON_DEPOSE + PRE_DEPOT + + 2.4 + + NON_DEPOSE + 1 + + + 4.279 + 2025.11.1.0 + + + + + + + + + + + + + + + 2001 + 7 + 5 + 1 + 92.18 + + 1 + 2.5 + 1 + 1 + Appartement + + + 3 + H1c + 1 + 300 + 0 + + + + 0 + 1 + 0 + 3 + + + + + Mur en béton banché d'épaisseur li_infegale 20 cm avec isolation intérieure (réalisée entre 2001 et 2005) donnant sur l'extérieur + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 1 + 1 + 1 + 41 + 29.48 + 81 + 13 + 2 + 7 + 2 + + + 0.4 + 0.4 + 0.4 + + + + + Mur en béton banché d'épaisseur li_infegale 20 cm avec isolation intérieure (réalisée entre 2001 et 2005) donnant sur l'extérieur + bce00878-a925-4312-a474-bf955f81ce05 + 1 + 1 + 2 + 41 + 37.79 + 81 + 13 + 2 + 7 + 2 + + + 0.4 + 0.4 + 0.4 + + + + + Mur en béton banché d'épaisseur li_infegale 20 cm avec isolation intérieure (réalisée entre 2001 et 2005) donnant sur l'extérieur + 1952d661-8751-4d71-8805-bfbe45501df6 + 1 + 1 + 3 + 20 + 18.5 + 81 + 13 + 2 + 7 + 2 + + + 0.4 + 0.4 + 0.4 + + + + + Mur en béton banché d'épaisseur li_infegale 20 cm avec isolation intérieure (réalisée entre 2001 et 2005) donnant sur l'extérieur + 0ccd7719-3c53-4bec-8670-9e816314a583 + 1 + 1 + 4 + 7 + 7 + 81 + 13 + 2 + 7 + 2 + + + 0.4 + 0.4 + 0.4 + + + + + Mur en béton banché d'épaisseur li_infegale 20 cm donnant sur des circulations avec ouverture directe sur l'extérieur + 8d30abdf-59ae-4562-9962-68ff298663f4 + 96 + 15 + 4 + 13 + 13 + 81 + 13 + 2 + 7 + 4 + + + 0.12 + 0.4 + 0.4 + + + + + + + Dalle béton donnant sur un sous-sol non chauffé avec isolation sous chape flottante (réalisée entre 2001 et 2005) + 50746540-f829-44f2-aefc-2d2ea3a4028f + 6 + 6 + 93 + 9 + + 2 + 7 + 2 + 0 + + + 0.24666667 + 0.24666667 + 0.24666667 + 0.24666667 + + + + + + + Dalle béton non isolée donnant sur un local chauffé + 5995055a-4422-4da7-989e-07698c672d47 + + 22 + 93 + 8 + + 2 + 1 + 1 + + + 0 + 2.5 + 2.5 + + + + + + + Portes-fenêtres battantes avec soubassement bois, orientées Sud, double vitrage + d57e661d-1295-4386-9ede-c698726dfb30 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 2 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 709 + 3 + 8 + 0 + 6 + 199 + 7 + 0 + 0 + 0 + 5 + 105 + 2 + 1 + 13 + + 5 + + 87 + 5 + + + 1 + 2.9 + 2.8 + 2.2 + 2.2 + 0.43 + 0.8 + 1 + + + + + Portes-fenêtres battantes avec soubassement bois, orientées Sud, double vitrage + 6e2424de-5927-4f0b-9af2-ec7b6ccb5b94 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 2.32 + 1 + 1 + 1 + 2 + 2 + 3 + 1 + 0 + 1 + 713 + 3 + 8 + 0 + 6 + 202 + 7 + 0 + 0 + 0 + 5 + 105 + 2 + 1 + 14 + + 5 + + 87 + 5 + + + 1 + 3.3 + 3.1 + 2.4 + 2.4 + 0.43 + 0.6 + 1 + + + + + Portes-fenêtres battantes avec soubassement bois, orientées Sud, double vitrage + f701022f-0067-464d-aa3e-aef9e8c86e34 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 4.2 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 709 + 3 + 8 + 0 + 6 + 199 + 7 + 0 + 0 + 0 + 5 + 105 + 2 + 1 + 13 + + 5 + + 87 + 5 + + + 1 + 2.9 + 2.8 + 2.2 + 2.2 + 0.43 + 0.8 + 1 + + + + + Fenêtres battantes bois, orientées Sud, double vitrage + 1823ecfa-88e7-4ade-b992-de94cef738e4 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 1.5 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + 6 + 201 + 7 + 0 + 0 + 0 + 5 + 90 + 2 + 1 + 13 + + 5 + + 87 + 5 + + + 1 + 2.9 + 3 + 2.4 + 2.4 + 0.47 + 0.8 + 1 + + + + + Fenêtres battantes bois, orientées Sud, double vitrage + f3dabf08-572c-4852-882d-502ca78ae49c + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 1.5 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + 6 + 201 + 7 + 0 + 0 + 0 + 5 + 90 + 2 + 1 + 13 + + 5 + + 87 + 5 + + + 1 + 2.9 + 3 + 2.4 + 2.4 + 0.47 + 0.8 + 1 + + + + + Fenêtres battantes bois, orientées Est, double vitrage + cf695d9b-e9fe-412f-a242-2d1040dc513e + 1952d661-8751-4d71-8805-bfbe45501df6 + 1.5 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + 6 + 201 + 7 + 0 + 0 + 0 + 5 + 90 + 2 + 3 + 13 + + 9 + + 87 + 5 + + + 1 + 2.9 + 3 + 2.4 + 2.4 + 0.47 + 0.8 + 1 + + + + + Fenêtres battantes bois, orientées Nord, double vitrage + 888d1007-67d6-4f47-adf9-55206a88c5ec + bce00878-a925-4312-a474-bf955f81ce05 + 1.32 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + 6 + 201 + 7 + 0 + 0 + 0 + 5 + 90 + 2 + 2 + 13 + + 1 + + 87 + 5 + + + 1 + 2.9 + 3 + 2.4 + 2.4 + 0.47 + 0.8 + 1 + + + + + Fenêtres battantes bois, orientées Nord, double vitrage + ede551bb-510a-491e-8011-a23672e61667 + bce00878-a925-4312-a474-bf955f81ce05 + 0.63 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + + + 1 + 0 + 0 + 0 + 5 + 90 + 2 + 2 + + + 1 + + 87 + 5 + + + 1 + 2.9 + 3 + 0 + 3 + 0.47 + 1 + 1 + + + + + Fenêtres battantes bois, orientées Nord, double vitrage + 72c5fdc2-9ef5-485c-a9f2-b7c571fafb06 + bce00878-a925-4312-a474-bf955f81ce05 + 0.63 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + + + 1 + 0 + 0 + 0 + 5 + 90 + 2 + 2 + + + 1 + + 87 + 5 + + + 1 + 2.9 + 3 + 0 + 3 + 0.47 + 1 + 1 + + + + + Fenêtres battantes bois, orientées Nord, double vitrage + a45c0edc-4ac6-4623-b927-fa4c7a703c24 + bce00878-a925-4312-a474-bf955f81ce05 + 0.63 + 1 + 1 + 1 + 4 + 2 + 3 + 1 + 0 + 1 + 549 + 3 + 4 + 0 + + + 1 + 0 + 0 + 0 + 5 + 90 + 2 + 2 + + + 1 + + 87 + 5 + + + 1 + 2.9 + 3 + 0 + 3 + 0.47 + 1 + 1 + + + + + + + + Mur 1 Sud / Porte-fenêtre 1 Sud + 8f52ec74-29cc-4d30-93fb-3c54e7364bb1 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + d57e661d-1295-4386-9ede-c698726dfb30 + 87 + 5 + 5 + 1.0 + 1 + + + 0 + + + + + Mur 1 Sud / Porte-fenêtre 2 Sud + 6ac7c1e9-3f56-41fe-85b3-b1d9c7802efc + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 6e2424de-5927-4f0b-9af2-ec7b6ccb5b94 + 87 + 5 + 5 + 1.0 + 1 + + + 0 + + + + + Mur 1 Sud / Porte-fenêtre 3 Sud + a6f53008-09a7-4cb1-8523-b37267ccb80a + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + f701022f-0067-464d-aa3e-aef9e8c86e34 + 87 + 5 + 8 + 1.0 + 1 + + + 0 + + + + + Mur 1 Sud / Fenêtre 1 Sud + 2cab8a65-07bd-4cde-a4bc-3ac90eed2197 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 1823ecfa-88e7-4ade-b992-de94cef738e4 + 87 + 5 + 5 + 1.0 + 1 + + + 0 + + + + + Mur 1 Sud / Fenêtre 2 Sud + d3617003-4dd1-4845-b7d5-04bcfde69a4b + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + f3dabf08-572c-4852-882d-502ca78ae49c + 87 + 5 + 5 + 1.0 + 1 + + + 0 + + + + + Mur 3 Est / Fenêtre 3 Est + 3f4aad55-48b5-490b-8819-a9e0892c56fa + 1952d661-8751-4d71-8805-bfbe45501df6 + cf695d9b-e9fe-412f-a242-2d1040dc513e + 87 + 5 + 5 + 1.0 + 1 + + + 0 + + + + + Mur 2 Nord / Fenêtre 4 Nord + 4322fdbb-f23b-4d63-9604-fbb9745d0041 + bce00878-a925-4312-a474-bf955f81ce05 + 888d1007-67d6-4f47-adf9-55206a88c5ec + 87 + 5 + 5 + 1.0 + 1 + + + 0 + + + + + Mur 2 Nord / Fenêtre 5 Nord + 0d65e13f-5d7a-4e6b-beaf-ca6b5aded1ae + bce00878-a925-4312-a474-bf955f81ce05 + ede551bb-510a-491e-8011-a23672e61667 + 87 + 5 + 3 + 1.0 + 1 + + + 0 + + + + + Mur 2 Nord / Fenêtre 6 Nord + b18f753c-e3d4-47b9-b839-109321d82bd2 + bce00878-a925-4312-a474-bf955f81ce05 + 72c5fdc2-9ef5-485c-a9f2-b7c571fafb06 + 87 + 5 + 3 + 1.0 + 1 + + + 0 + + + + + Mur 2 Nord / Fenêtre 7 Nord + 352e1d7c-2520-44f3-bd67-cfbe6cc47796 + bce00878-a925-4312-a474-bf955f81ce05 + a45c0edc-4ac6-4623-b927-fa4c7a703c24 + 87 + 5 + 3 + 1.0 + 1 + + + 0 + + + + + Mur 1 Sud / Plafond + af9abc64-b91a-4c52-82a4-960278285f29 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 5995055a-4422-4da7-989e-07698c672d47 + 30 + 2 + 16.4 + 0.5 + 1 + + + 0.46 + + + + + Mur 1 Sud / Plancher + d215d17c-634c-4381-8cd9-dfd18f799ae8 + 9223779c-ad7d-48ed-ac97-0e9a1435b847 + 50746540-f829-44f2-aefc-2d2ea3a4028f + 6 + 1 + 16.4 + 1.0 + 1 + + + 0.08 + + + + + Mur 2 Nord / Plafond + 09fdd235-5d24-470c-9f4b-107bae95bbac + bce00878-a925-4312-a474-bf955f81ce05 + 5995055a-4422-4da7-989e-07698c672d47 + 30 + 2 + 16.4 + 0.5 + 1 + + + 0.46 + + + + + Mur 2 Nord / Plancher + e6291260-5a40-410c-aea7-d21faf79c2fb + bce00878-a925-4312-a474-bf955f81ce05 + 50746540-f829-44f2-aefc-2d2ea3a4028f + 6 + 1 + 16.4 + 1.0 + 1 + + + 0.08 + + + + + Mur 3 Est / Plafond + 9993b7cb-98db-41e9-bd3c-5ecb624b43f4 + 1952d661-8751-4d71-8805-bfbe45501df6 + 5995055a-4422-4da7-989e-07698c672d47 + 30 + 2 + 8 + 0.5 + 1 + + + 0.46 + + + + + Mur 3 Est / Plancher + b3b28a7a-443d-4319-828d-30372a2341ce + 1952d661-8751-4d71-8805-bfbe45501df6 + 50746540-f829-44f2-aefc-2d2ea3a4028f + 6 + 1 + 8 + 1.0 + 1 + + + 0.08 + + + + + Mur 4 Ouest / Plafond + 59712776-9673-4d3f-bd04-067c4d2e9c12 + 0ccd7719-3c53-4bec-8670-9e816314a583 + 5995055a-4422-4da7-989e-07698c672d47 + 30 + 2 + 2.8 + 0.5 + 1 + + + 0.46 + + + + + Mur 4 Ouest / Plancher + 32053caa-3ccf-409a-9346-752f6981de0d + 0ccd7719-3c53-4bec-8670-9e816314a583 + 50746540-f829-44f2-aefc-2d2ea3a4028f + 6 + 1 + 2.8 + 1.0 + 1 + + + 0.08 + + + + + Mur 5 Ouest / Plafond + fe8709e8-eb94-4498-a94e-240719f0d0dd + 8d30abdf-59ae-4562-9962-68ff298663f4 + 5995055a-4422-4da7-989e-07698c672d47 + + + 5.2 + 1.0 + 1 + + + 0 + + + + + Mur 5 Ouest / Plancher + d89cd463-bc92-42c2-9aea-abc3c460fa82 + 8d30abdf-59ae-4562-9962-68ff298663f4 + 50746540-f829-44f2-aefc-2d2ea3a4028f + + + 5.2 + 1.0 + 1 + + + 0 + + + + + + + + VMC SF Gaz de 2001 à 2012 + fbc89af9-50e4-471d-805a-4b611f258b5b + 92.18 + 0 + 1,53 + 1 + 22 + 0 + 2003 + + + 11.0795999975302 + 47.952036 + + + + + + + + Combiné au système de chauffage + f517a49a-9419-43b3-9770-bc1fa3ad7512 + 1 + + 92.18 + 1 + 1 + 1 + 1 + 0 + + + 1410.34736356399 + 2337.86992337674 + 3033.24455184662 + + + + + Gaz Naturel - Chaudière gaz basse température installée à partir de 2016 + d901dc4a-2d6b-4479-a958-d1a186897dd5 + 53 + 3 + 2 + 0 + 0 + 1 + 0 + + + 24 + 0.334999441591372 + 89.5703168625674 + 0.648668485061083 + 1 + 1 + + + + + + + + + Chaudière individuelle gaz basse température installée à partir de 2016 avec programmateur sans réduit. Emetteur(s): radiateur bitube avec robinet thermostatique + Installation 2026_05_18_15_35_18_8567252006009193 + 92.18 + 1 + 1 + 1 + 1 + 5 + + + 6615.56555376092 + 8268.81232481319 + 9476.77126843081 + 11770.8237760024 + + + + + Radiateur bitube avec robinet thermostatique + e2fefcff-9357-4b3c-ac84-869cbc4c507b + 92.18 + 39 + 2 + 0 + 2 + + + 0.92 + 0.95 + 0.91 + 0.95 + + + + + + + Gaz Naturel - Chaudière gaz basse température installée à partir de 2016 + dc7031fb-3938-46bc-8847-9174fc3f269f + 93 + 1 + 2 + 0 + 0 + 1 + 2023 + + + 24 + 0.334999441591372 + 89.5703168625674 + 89.5703168625674 + 42.5 + 60 + 0.798427768886754 + 0.655728765892469 + 6615.56555376092 + 9476.77126843081 + 8268.81232481319 + 11770.8237760024 + + + + + + + + 11.0796 + 47.952036 + 59.031636 + 38.668 + 22.94000031 + 0 + 38.846 + 0 + 23.544 + 183.029636 + + + 2389272.876108 + 2498415.1225 + 0.369449280198844 + 0.333726846433516 + 40262.5192557172 + 182.216655681518 + 2.19289 + 122.80184 + 6615.56555376092 + 8268.81232481319 + 1410.34736356399 + 0 + + + 9476.77126843081 + 11770.8237760024 + 2337.86992337674 + 3033.24455184662 + 171.4326768 + 568.31624784 + 16.0978761808182 + 160.593654675893 + 3.43184525133905 + 0 + + + 147.129513595453 + 147.1295 + C + 9476.77126843081 + 2337.86992337674 + 325.72208592 + + + 29.7423794876566 + C + 2151.22707793379 + 530.696472606519 + + + 1622 + 1045.14207164589 + 1298.14076944234 + 257.831084632811 + 334.520207877773 + 59.523139711728 + + + 2 + 1 + + + 0.402590910097403 + 1 + 2 + 3 + + + + + + + + 92.18 + 16.27 + 2.50 + + + Séjour + 30.8 + 0 + 1 + + + Salle de bain + 3.61 + 0 + 1 + + + Wc + 1.16 + 0 + 1 + + + Cuisine + 11.21 + 0 + 1 + + + Chambre 1 + 9.42 + 0 + 1 + + + Chambre 2 + 11.69 + 0 + 1 + + + Chambre 3 + 10.08 + 0 + 1 + + + Dégagement + 8.83 + 0 + 1 + + + Terrasse + 0 + 16.27 + 1 + + + buanderie + 3.53 + 0 + 1 + + + SDB 2 + 1.85 + 0 + 1 + + + + + 11770.8237760024 + 3033.24455184662 + 1298.14076944234 + 334.520207877773 + 8268.81232481319 + + + + Chauffage + 0 + Gaz Naturel + 10519.2161079582 + + + Auxiliaires + 1 + Electrique + 16.0978761808182 + + + Auxiliaires + 2 + Electrique + 160.593654675893 + + + ECSanitaires + 0 + Gaz Naturel + 2595.03561494818 + + + Auxiliaires + 3 + Electrique + 3.43184525133905 + + + Eclairage + 0 + Electrique + 171.4326768 + + + Auxiliaires + 0 + Electrique + 568.31624784 + + + + + Plans du logement + + + + + Plan de masse + + + + + Diag Carrez/Boutin + + + + + Taxe d’habitation + + + + + Relevé de propriété + + + + + Règlement de copropriété + + + + + Descriptifs des équipements collectifs - Syndic + + + + + Descriptifs des équipements individuels - Gestionnaire + + + + + Contrat entretien des équipements + + + + + Notices techniques des équipements + + + + + Permis de construire + + + + + Etude thermique réglementaire + + + + + Infiltrometrie + + + + + Rapport mentionnant la composition des parois + + + + + Factures de travaux + + + + + Photographies des travaux + + + + + Justificatifs Crédit d’impôt + + + + + Déclaration préalable des travaux de rénovation + + + + + Cahier des charges / Programme de travaux + + + + + + + + numero_dpe + Attribué par l'ADEME lors du dépôt. Valeur de substitution : 'NON_DEPOSE'. + + + statut + ACTIF/ANNULE attribué par l'ADEME. Valeur de substitution : 'PRE_DEPOT'. + + + date_etablissement_dpe + Peut différer de la date de visite. Renseignée lors du dépôt ADEME. + + + administratif/geolocalisation/idpar + Identifiant parcellaire BAN/cadastre — géocodage effectué côté ADEME. + + + administratif/geolocalisation/immatriculation_copropriete + Non saisie dans LICIEL. + + + administratif/geolocalisation/enum_statut_geocodage_ban_id + Résultat de géocodage ADEME. Non disponible avant dépôt. + + + administratif/diagnostiqueur/usr_logiciel_id + ID ADEME du logiciel. Non disponible dans les exports LICIEL. + + + logement/caracteristique_generale/surface_habitable_immeuble + Présente uniquement si saisie par le diagnostiqueur dans LICIEL. + + + descriptif_simplifie_collection + Texte narratif généré côté ADEME lors du dépôt. + + + descriptif_geste_entretien_collection + Généré par l'ADEME. Absent des exports LICIEL. + + + descriptif_travaux/pack_travaux + Structure spécifique ADEME non reproductible depuis les données LICIEL. + + + justificatif_collection + Partiellement disponible dans branche_kardino/documents_consultes. + + + diff --git a/test/open3cl-sanitize.spec.js b/test/open3cl-sanitize.spec.js new file mode 100644 index 0000000..d2d89e8 --- /dev/null +++ b/test/open3cl-sanitize.spec.js @@ -0,0 +1,11 @@ +import { describe, expect, test } from 'vitest'; +import { getAdemeFileJson } from './test-helpers.js'; +import { calcul_3cl } from '../src/index.js'; + +describe('Open3cl sintizing tests', () => { + test('should create missing collections', () => { + const inputDpe = getAdemeFileJson('dpe_without_porte_collection'); + const outputDpe = calcul_3cl(structuredClone(inputDpe)); + expect(outputDpe.logement.sortie.ep_conso.coeff_2_3_classe_bilan_dpe).toBe('G'); + }); +});