diff --git a/.db-env b/.db-env index 04f24d5..9174c1b 100644 --- a/.db-env +++ b/.db-env @@ -6,6 +6,5 @@ POSTGRES_PORT=5432 PGADMIN_DEFAULT_EMAIL=junte@domna.homes PGADMIN_DEFAULT_PASSWORD=makingwarmhomes DATABASE_URL=postgresql://postgres:makingwarmhomes@db:5432/postgres - # Prod(dev-aws) Database Don't use!!!! #DATABASE_URL=postgresql://postgres:makingwarmhomes@terraform-20250331175522503500000002.cdgzupxvdyp0.eu-west-2.rds.amazonaws.com:5432/surveyDB \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 1b5b5f0..df4eccc 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,9 +1,5 @@ version: '3.8' -networks: - survey-net: - driver: bridge - services: survey-extractor: user: "${UID}:${GID}" @@ -45,5 +41,9 @@ services: networks: - survey-net +networks: + survey-net: + driver: bridge + volumes: postgres-data: diff --git a/etl/expense_to_csv.py b/etl/expense_to_csv.py new file mode 100644 index 0000000..808f200 --- /dev/null +++ b/etl/expense_to_csv.py @@ -0,0 +1,11 @@ +# Make a a folder in a new directory from a string +# Great time to work out asynchrnous functionality if i have time +from etl.scraper.scraper import SharePointInstaller +from etl.scraper.scraper import SharePointScraper + +domna_sharepoint = SharePointScraper(SharePointInstaller.DOMNA) + +domna_sharepoint.get_folders_in_path("/") + +jjc = SharePointScraper(SharePointInstaller.JJC) +jjc.get_folders_in_path("/") \ No newline at end of file diff --git a/etl/jjc_invoice.py b/etl/jjc_invoice.py index 2db0916..9c14720 100644 --- a/etl/jjc_invoice.py +++ b/etl/jjc_invoice.py @@ -1,3 +1,8 @@ +import os +os.environ["SHAREPOINT_CLIENT_ID"] = "895e3b77-b1d7-43ec-b18f-dcfe07cdfeaf" +os.environ["SHAREPOINT_CLIENT_SECRET"] = "SOf8Q~-is4wdQiqvEEm9FlJQRAY9ELGaj5Qz-a6E" +os.environ["SHAREPOINT_TENANT_ID"] = "c3f7519c-2719-4547-af04-6da6cbfd8f8f" +os.environ["JJC_SERVICE_SHAREPOINT_ID"] = "7fdd0485-bbf3-4b29-b30f-98c81c2a6284" from etl.scraper.scraper import SharePointScraper, SharePointInstaller, WEEK_COMMENCING from pprint import pformat from etl.pdfReader.pdfReaderToText import pdfReaderToText @@ -7,271 +12,10 @@ import math from etl.temp.submissionReader import SubmissionReader import os from fuzzywuzzy import fuzz +import os + + -file_paths = [{'119 CUTNOOK LANE, M44 6LU': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/119 CUTNOOK LANE, M44 6LU/CSR - 119 Cutnook.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/119 CUTNOOK LANE, M44 6LU/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/119 CUTNOOK LANE, M44 6LU/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/119 CUTNOOK LANE, M44 6LU/UB.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/119 CUTNOOK LANE, M44 6LU/XML.xml']}, - {'22 LINNET DRIVE, M44 6LW': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/22 LINNET DRIVE, M44 6LW/CSR - 22 Linnet.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/22 LINNET DRIVE, M44 6LW/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/22 LINNET DRIVE, M44 6LW/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/22 LINNET DRIVE, M44 6LW/XML.xml']}, - {'50 PARKSTONE ROAD, M44 6LN': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/50 PARKSTONE ROAD, M44 6LN/CSR - 50 Parkstone.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/50 PARKSTONE ROAD, M44 6LN/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/50 PARKSTONE ROAD, M44 6LN/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/50 PARKSTONE ROAD, M44 6LN/XML.xml']}, - {'89 PARKSTONE ROAD, M44 6LJ': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/89 PARKSTONE ROAD, M44 6LJ/CSR - 89 Parkstone.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/89 PARKSTONE ROAD, M44 6LJ/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/89 PARKSTONE ROAD, M44 6LJ/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/FOR HOUSING/89 PARKSTONE ROAD, M44 6LJ/XML.xml']}, - {'153 HEATHCOTE STREET, ST3 1AD': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/153 HEATHCOTE STREET, ST3 1AD/CSR - 153 Heathcote.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/153 HEATHCOTE STREET, ST3 1AD/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/153 HEATHCOTE STREET, ST3 1AD/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/153 HEATHCOTE STREET, ST3 1AD/XML.xml']}, - {'16 IONA PLACE, ST3 2DY': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/16 IONA PLACE, ST3 2DY/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/16 IONA PLACE, ST3 2DY/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/16 IONA PLACE, ST3 2DY/XML.xml']}, - {'24 SEEDFIELDS ROAD, ST3 2BZ': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/24 SEEDFIELDS ROAD, ST3 2BZ/CSR - 24 Seedfields.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/24 SEEDFIELDS ROAD, ST3 2BZ/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/24 SEEDFIELDS ROAD, ST3 2BZ/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/24 SEEDFIELDS ROAD, ST3 2BZ/XML.xml']}, - {'27 ROUNDWAY, ST3 2BH': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/27 ROUNDWAY, ST3 2BH/CSR - 27 Roundway.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/27 ROUNDWAY, ST3 2BH/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/27 ROUNDWAY, ST3 2BH/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/27 ROUNDWAY, ST3 2BH/XML.xml']}, - {'30 ANGLESEY DRIVE, ST3 2SS': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/30 ANGLESEY DRIVE, ST3 2SS/CSR - 30 Anglesey.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/30 ANGLESEY DRIVE, ST3 2SS/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/30 ANGLESEY DRIVE, ST3 2SS/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/30 ANGLESEY DRIVE, ST3 2SS/XML.xml']}, - {'37 MEAFORD DRIVE, ST3 2BY': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/37 MEAFORD DRIVE, ST3 2BY/CSR - 37 Meaford.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/37 MEAFORD DRIVE, ST3 2BY/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/37 MEAFORD DRIVE, ST3 2BY/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/37 MEAFORD DRIVE, ST3 2BY/UB.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/37 MEAFORD DRIVE, ST3 2BY/XML.xml']}, - {'50 LOUISE DRIVE, ST3 2DT': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/50 LOUISE DRIVE, ST3 2DT/CSR - 50 Louise.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/50 LOUISE DRIVE, ST3 2DT/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/50 LOUISE DRIVE, ST3 2DT/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/50 LOUISE DRIVE, ST3 2DT/UB.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/50 LOUISE DRIVE, ST3 2DT/XML.xml']}, - {'90 MEAFORD DRIVE, ST3 2BB': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/90 MEAFORD DRIVE, ST3 2BB/CSR - 90 Meaford.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/90 MEAFORD DRIVE, ST3 2BB/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/90 MEAFORD DRIVE, ST3 2BB/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/90 MEAFORD DRIVE, ST3 2BB/XML.xml']}, - {'99 MEAFORD DRIVE, ST3 2BG': ['/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/99 MEAFORD DRIVE, ST3 2BG/CSR - 99 Meaford.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/99 MEAFORD DRIVE, ST3 2BG/EPR.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/99 MEAFORD DRIVE, ST3 2BG/INPUTS.pdf', - '/tmp/sharepoint/Andy Rumfitt/W.C. 10.03.2025/UNITAS/99 MEAFORD DRIVE, ST3 2BG/XML.xml']}, - {'1 Till Walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/1 Till Walk/1 Till Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/1 Till Walk/1 Till Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/1 Till Walk/1 Till Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/1 Till Walk/1 Till Walk ST3 5DF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/1 Till Walk/Dec - 1 Till Walk ST3 5DF.pdf']}, - {'10 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Lomond walk/10 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Lomond walk/10 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Lomond walk/10 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Lomond walk/10 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Lomond walk/Dec - 10 Lomond Walk ST3 3HW.pdf']}, - {'10 Pembridge road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Pembridge road/10 Pembridge Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Pembridge road/10 Pembridge Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Pembridge road/10 Pembridge Road PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Pembridge road/10 Pembridge Road ST3 3BX.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10 Pembridge road/Dec - 10 Pembridge Road ST3 3BX.pdf']}, - {'10A Pembridge road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10A Pembridge road/10A Pembridge Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10A Pembridge road/10A Pembridge Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10A Pembridge road/10A Pembridge Road PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10A Pembridge road/10A Pembridge Road ST3 3BX.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/10A Pembridge road/Dec - 10A Pembridge Road ST3 3BX.pdf']}, - {'12 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12 Lomond walk/12 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12 Lomond walk/12 Lomond Walk PRE ERP PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12 Lomond walk/12 Lomond Walk PRE ERP SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12 Lomond walk/12 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12 Lomond walk/Dec - 12 Lomond Walk ST3 3HW.pdf']}, - {'12A Pembridge road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12A Pembridge road/12A Pembridge Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12A Pembridge road/12A Pembridge Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/12A Pembridge road/12A Pembridge Road PRE EPR SITE NOTES.pdf']}, - {'15 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/15 Lomond walk/15 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/15 Lomond walk/15 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/15 Lomond walk/15 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/15 Lomond walk/15 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/15 Lomond walk/Dec - 15 Lomond Walk ST3 3HW.pdf']}, - {'18 Bilston street': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Bilston street/18 Bilston Street PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Bilston street/18 Bilston Street PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Bilston street/18 Bilston Street PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Bilston street/18 Bilston Street ST4 5DA.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Bilston street/Dec - 18 Bilston Street ST4 5DA.pdf']}, - {'18 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Lomond walk/18 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Lomond walk/18 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Lomond walk/18 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Lomond walk/18 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/18 Lomond walk/Dec - 18 Lomond Walk ST3 3HW.pdf']}, - {'19 sedgley walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/19 sedgley walk/19 Sedgley Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/19 sedgley walk/19 Sedgley Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/19 sedgley walk/19 Sedgley Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/19 sedgley walk/19 Sedgley Walk ST3 1RY.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/19 sedgley walk/Dec - 19 Sedgley Walk ST3 1RY.pdf']}, - {'2 Gregson close': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Gregson close/2 Gregson close PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Gregson close/2 Gregson close PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Gregson close/2 Gregson close PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Gregson close/2 Gregson close ST3 2SJ.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Gregson close/Dec - 2 Gregson close ST3 2SJ.pdf']}, - {'2 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Lomond walk/2 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Lomond walk/2 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Lomond walk/2 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Lomond walk/2 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/2 Lomond walk/Dec - 2 Lomond Walk ST3 3HW.pdf']}, - {'20 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/20 Lomond walk/20 Lomond Walk PRE ERR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/20 Lomond walk/20 Lomond Walk PRE ERR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/20 Lomond walk/20 Lomond Walk PRE ERR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/20 Lomond walk/20 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/20 Lomond walk/Dec - 20 Lomond Walk ST3 3HW.pdf']}, - {'3 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/3 Lomond walk/3 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/3 Lomond walk/3 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/3 Lomond walk/3 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/3 Lomond walk/3 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/3 Lomond walk/Dec - 3 Lomond Walk ST3 3HW.pdf']}, - {'32 Anglesey drive': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/32 Anglesey drive/32 Anglesey Drive PRER EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/32 Anglesey drive/32 Anglesey Drive PRER EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/32 Anglesey drive/32 Anglesey Drive PRER EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/32 Anglesey drive/32 Anglesey Drive ST3 2SS.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/32 Anglesey drive/Dec - 32 Anglesey Drive ST3 2SS.pdf']}, - {'36 Woodville road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/36 Woodville road/36 Woodville Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/36 Woodville road/36 Woodville Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/36 Woodville road/36 Woodville Road PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/36 Woodville road/36 Woodville Road ST3 6BX.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/36 Woodville road/Dec - 36 Woodville Road ST3 6BX.pdf']}, - {'379 lightwood road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/379 lightwood road/379 Lightwood Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/379 lightwood road/379 Lightwood Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/379 lightwood road/379 Lightwood Road PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/379 lightwood road/379 Lightwood Road ST3 4JT.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/379 lightwood road/Dec - 379 Lightwood Road ST3 4JT.pdf']}, - {'387 Lightwood road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/387 Lightwood road/387 Lightwood Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/387 Lightwood road/387 Lightwood Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/387 Lightwood road/387 Lightwood Road PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/387 Lightwood road/387 Lightwood Road ST3 4JT.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/387 Lightwood road/Dec - 387 Lightwood Road ST3 4JT.pdf']}, - {'4 Pembridge road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/4 Pembridge road/4 Pembridge Road PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/4 Pembridge road/4 Pembridge Road PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/4 Pembridge road/4 Pembridge Road PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/4 Pembridge road/4 Pembridge Road ST3 3BX.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/4 Pembridge road/Dec - 4 Pembridge Road ST3 3BX.pdf']}, - {'49 bridle path': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/49 bridle path/49 Bridle Path PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/49 bridle path/49 Bridle Path PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/49 bridle path/49 Bridle Path PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/49 bridle path/49 Bridle Path ST3 4SB.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/49 bridle path/Dec - 49 Bridle Path ST3 4SB.pdf']}, - {'5 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Lomond walk/5 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Lomond walk/5 Lomond Walk PRE EPR RDSASP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Lomond walk/5 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Lomond walk/5 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Lomond walk/Dec - 5 Lomond Walk ST3 3HW.pdf']}, - {'5 Poolside': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Poolside/5 Poolside PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Poolside/5 Poolside PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Poolside/5 Poolside PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Poolside/5 Poolside ST3 3NY.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/5 Poolside/Dec - 5 Poolside ST3 3NY.pdf']}, - {'52 Bridle path': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/52 Bridle path/52 Bridle Path PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/52 Bridle path/52 Bridle Path PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/52 Bridle path/52 Bridle Path PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/52 Bridle path/52 Bridle Path ST3 4SB.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/52 Bridle path/Dec - 52 Bridle Path ST3 4SB.pdf']}, - {'58 Wise street': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/58 Wise street/58 Wise Street PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/58 Wise street/58 Wise Street PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/58 Wise street/58 Wise Street PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/58 Wise street/58 Wise Street ST3 4PQ.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/58 Wise street/Dec - 58 Wise Street ST3 4PQ.pdf']}, - {'7 ingleby road': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 ingleby road/7 Ingleby Road PRE ERP PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 ingleby road/7 Ingleby Road PRE ERP RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 ingleby road/7 Ingleby Road PRE ERP SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 ingleby road/7 Ingleby Road ST3 3JY.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 ingleby road/Dec - 7 Ingleby Road ST3 3JY.pdf']}, - {'7 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Lomond walk/7 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Lomond walk/7 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Lomond walk/7 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Lomond walk/7 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Lomond walk/Dec - 7 Lomond Walk ST3 3HW.pdf']}, - {'7 Peel Street': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Peel Street/7 Peel Street PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Peel Street/7 Peel Street PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Peel Street/7 Peel Street PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Peel Street/7 Peel Street ST3 4PE.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/7 Peel Street/Dec - 7 Peel Street ST3 4PE.pdf']}, - {'83 Wimbourne avenue': []}, - {'85 Wimbourne avenue': []}, - {'87 Wimbourne avenue': []}, - {'9 Farrington close': []}, - {'9 Lomond walk': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Lomond walk/9 Lomond Walk PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Lomond walk/9 Lomond Walk PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Lomond walk/9 Lomond Walk ST3 3HW.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Lomond walk/Dec - 9 Lomond Walk PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Lomond walk/Dec - 9 Lomond Walk ST3 3HW.pdf']}, - {'9 Melbourne street': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Melbourne street/9 Melbourne Street PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Melbourne street/9 Melbourne Street PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Melbourne street/9 Melbourne Street PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Melbourne street/9 Melbourne Street ST3 5AA.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/9 Melbourne street/Dec - 9 Melbourne Street ST3 5AA.pdf']}, - {'91 Wimbourne avenue': ['/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/91 Wimbourne avenue/91 Wimbourne Avenue PRE EPR PDF.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/91 Wimbourne avenue/91 Wimbourne Avenue PRE EPR RDSAP XML.xml', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/91 Wimbourne avenue/91 Wimbourne Avenue PRE EPR SITE NOTES.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/91 Wimbourne avenue/91 Wimbourne Avenue ST3 3LS.pdf', - '/tmp/sharepoint/Ben Langslow/W.C. 10.03.2025/UNITAS/91 Wimbourne avenue/Dec - 91 Wimbourne Avenue ST3 3LS.pdf']}, - {'101 Edgefield Road ST3 1AF': []}, - {'103 Edgefield Road ST3 1AF': []}, - {'105 Edgefield Road ST3 1AF': []}, - {'111 Edgefield Road ST3 1AF': []}, - {'113 Edgefield Road ST3 1AF': []}, - {'114 Foley Road ST3 2LH': ['/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/114 Foley Road ST3 2LH/5209-8505-3432-0097-5106 epr.pdf', - '/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/114 Foley Road ST3 2LH/5209-8505-3432-0097-5106.pdf', - '/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/114 Foley Road ST3 2LH/5209-8505-3432-0097-5106.xml']}, - {'114 Longley Road ST3 1AN': []}, - {'15 Sedgley Walk ST3 1RY': ['/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/15 Sedgley Walk ST3 1RY/0976-0245-5835-8209-5804 epr.pdf', - '/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/15 Sedgley Walk ST3 1RY/0976-0245-5835-8209-5804.pdf', - '/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/15 Sedgley Walk ST3 1RY/0976-0245-5835-8209-5804.xml']}, - {'151 Edgefield Road ST3 1AF': []}, - {'155 Edgefield Road ST3 1AF': []}, - {'17 Conewood Place ST3 2NW': []}, - {'17 Sedgley Walk ST3 1RY': ['/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/17 Sedgley Walk ST3 1RY/2080-2607-5453-9500-2595 epr.pdf', - '/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/17 Sedgley Walk ST3 1RY/2080-2607-5453-9500-2595.pdf', - '/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/17 Sedgley Walk ST3 1RY/2080-2607-5453-9500-2595.xml']}, - {'21 Conewood Place ST3 2NW': []}, - {'27 Conewood Place ST3 2NW': []}, - {'30 Caroline Street ST3 1DE': []}, - {'32 Caroline Street ST3 1DE': []}, - {'34 Caroline Street ST3 1DE': []}, - {'35 Heathcote Street ST3 1AA': []}, - {'4 Milverton Place ST3 2SH': []}, - {'47 Hurst Road ST3 2LT': []}, - {'48 Lundy Road ST3 2DZ': []}, - {'5 Conewood Place ST3 2NW': []}, - {'54 Kirkup Walk ST3 2RR': []}, - {'56 Heathcote Road ST3 2LX': []}, - {'59 Caroline Street ST3 1DE': []}, - {'96 Edgefield Road ST3 1AF': []}, - {'96 Longley Road ST3 1AN': []}, - {'97 Edgefield Road ST3 1AF': ['/tmp/sharepoint/Mev Malik/W.C. 10.03.2025/UNITAS/97 Edgefield Road ST3 1AF/CS reports 16032025.pdf']}, - {'112 Chiltern Drive WD3 8JZ': []}, - {'13 Hubbards Road WD3 5JL': []}, - {'13 Orchard Way WD3 8HZ': []}, - {'14 Orchard Way WD3 8HZ': []}, - {'15 Hubbards Road WD3 5JL': []}, - {'19 Orchard Way WD3 8HZ': []}, - {'20 Edinburgh Avenue WD3 8LB': []}, - {'21 Clitheroe Gardens WD19 6RP': []}, - {'26 Clitheroe Gardens WD19 6RP': []}, - {'29 The Queens Drive WD3 8LN': []}, - {'31 The Queens Drive WD3 8LN': []}, - {'34 Hubbards Road WD3 5JJ': []}, - {'36 Orchard Way WD3 8HZ': []}, - {'42 The Queens Drive WD3 8LT': []}, - {'45 Orchard Way WD3 8HZ': []}, - {'5 Hubbards Road WD3 5JJ': []}, - {'56 The Queens Drive WD3 8LT': []}, - {'7 Hubbards Road WD3 5JL': []}, - {'8 The Greenway WD3 8HU': []}, - {'80 The Queens Drive WD3 8LX': []}, - {'82 The Queens Drive WD3 8LX': []}, - {'9 Orchard Way WD3 8HZ': []}, - {'90 Chiltern Drive WD3 8JZ': []}, - {'96 Chiltern Drive WD3 8JZ': []}] def get_band(score): bands = [ @@ -323,14 +67,14 @@ def work_out_total_floor_area(pre_site_note): floor_area = math.ceil(total) if total%1 >=0.5 else math.floor(total) if 0 <= floor_area <= 72: return '0-72m', floor_area - elif 73 <= floor_area <= 97: + elif 72 < floor_area <= 97: return '73-97m', floor_area - elif 98 <= floor_area <= 199: + elif 97 < floor_area <= 199: return '98-199m', floor_area - elif floor_area >= 200: + elif 199 <= floor_area: return 'over 200m', floor_area else: - return 'Invalid floor area', floor_area + raise NotImplementedError(f"unknown floor area {floor_area} {pre_site_note.summary_information.address}") def fuzzy_match_address(row, target_address, threshold=90): return fuzz.ratio(row, target_address) >= threshold @@ -413,15 +157,9 @@ def get_no_of_wet_rooms(str): count += 1 return count -def get_insulation_type(str): - if "foam" in str.lower(): - return "FOAM" - else: - return "GENERAL" - def get_jjc_price_matrix(file="empty.csv"): - df = pd.read_csv(os.path.join(os.getcwd(), "ratecard", "jjcRateCards", file)) + df = pd.read_csv(os.path.join(os.path.dirname(os.path.abspath(__file__)), "ratecard", "jjcRateCards", file)) columns_to_check = { "no extractors or ventilation required": {"Trickle Vent": 0, "wetrooms": 0}, @@ -454,14 +192,14 @@ def main(): price_foam = get_jjc_price_matrix("foam.csv") price_general = get_jjc_price_matrix("general.csv") - csv_file_path = os.path.join(os.getcwd(), "temp", "jjc_submissionData.csv") + csv_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"temp", "jjc_submissionData.csv") submissionData = SubmissionReader(csv_file_path) total_price = [] - # jjc = SharePointScraper(SharePointInstaller.JJC) - # file_paths = jjc.download_file_for_each_address() + jjc = SharePointScraper(SharePointInstaller.JJC) + file_paths = jjc.download_file_for_each_address() list_of_surveys = [] for eachAddress in file_paths: for address, files in eachAddress.items(): @@ -472,40 +210,32 @@ def main(): letter, number = survey.pre_site_note.survey_information.current_sap.split(" ") pre_sap_score = number+letter filtered_df = submissionData.df[submissionData.df["PRE INSTALL SAP SCORE"].apply(lambda x: x == pre_sap_score)] - if not filtered_df.empty: + if not filtered_df.empty and len(filtered_df) > 1: filtered_df = filtered_df[filtered_df["FLOOR AREA"].apply(lambda x: rounding(x) == total_floor_area)] - if not filtered_df.empty: + if not filtered_df.empty and len(filtered_df) > 1: postcode = survey.pre_site_note.survey_information.address.split(",")[-1].strip().replace(" ", "") filtered_df = filtered_df[filtered_df["Post Code"].apply(lambda x: x.replace(" ", "").upper() == postcode.upper())] - if not filtered_df.empty: + if not filtered_df.empty and len(filtered_df) > 1: house_no = survey.pre_site_note.survey_information.address.split(" ")[0].strip() - filtered_df = filtered_df[filtered_df["NO"].apply(lambda x: house_no in x)] - if len(filtered_df) > 1: - def get_num(x): - num = "" - for char in x: - if char.isnumeric(): - num += char - num = int(num) - return num - - filtered_df = filtered_df[filtered_df["NO"].apply(lambda x: get_num(house_no) == get_num(x))] + filtered_df = filtered_df[filtered_df["NO"].apply(lambda x: house_no in str(x))] if not filtered_df.empty: funding_type = type_of_work(letter.upper(), get_sap_letter(filtered_df["POST INSTALL SAP SCORE"].values[0])) data = { - "Address": survey.address, + "Address": survey.pre_site_note.survey_information.address, + "Deem score Address": f"{filtered_df["NO"].values[0]} {filtered_df["Street Name"].values[0]}, {filtered_df["Post Code"].values[0]}", "Surveyor's Name": survey.pre_site_note.assessor_information.name, "floor_area_group" : floor_banding, "wetrooms" : get_no_of_wet_rooms(filtered_df["Ventilation Requirements"].values[0]), "Trickle Vent" : int(get_trickle_vent(filtered_df["Ventilation Requirements"].values[0])), + "lewis_price": str(filtered_df["LEWIS_PRICE"].values[0]), } insultation = None merged_df = pd.DataFrame() if survey.csr: if survey.csr.insulation_info: - insultation = get_insulation_type(survey.csr.insulation_info.type) + insultation = survey.csr.insulation_info.type.upper() if funding_type == "GBIS": data.update({"insulation": insultation}) @@ -514,16 +244,14 @@ def main(): data.update({"funding": funding_type.upper()}) df = pd.DataFrame([data]) merged_df = pd.merge(df, price_empty, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') - elif "GENERAL" in insultation.upper(): - data.update({"funding": funding_type.upper() + " Remedial"}) - df = pd.DataFrame([data]) - merged_df = pd.merge(df, price_general, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') elif "FOAM" in insultation.upper(): data.update({"funding": funding_type.upper() + " Remedial"}) df = pd.DataFrame([data]) merged_df = pd.merge(df, price_foam, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') else: - raise RuntimeError(f"unknonw insulation in gbis: {insultation}") + data.update({"funding": funding_type.upper() + " Remedial"}) + df = pd.DataFrame([data]) + merged_df = pd.merge(df, price_general, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') elif funding_type == "ECO4": data.update({"insulation": insultation}) if insultation is None: @@ -531,18 +259,17 @@ def main(): data.update({"funding": formatted_funding_type}) df = pd.DataFrame([data]) merged_df = pd.merge(df, price_empty, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') - elif "GENERAL" in insultation.upper(): - formatted_funding_type = f"REMEDIAL - {funding_type.upper()} - SAP {get_band(int(number))} to {get_band(get_sap_number(filtered_df["POST INSTALL SAP SCORE"].values[0]))}" - data.update({"funding": formatted_funding_type}) - df = pd.DataFrame([data]) - merged_df = pd.merge(df, price_general, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') + elif "FOAM" in insultation.upper(): formatted_funding_type = f"REMEDIAL - {funding_type.upper()} - SAP {get_band(int(number))} to {get_band(get_sap_number(filtered_df["POST INSTALL SAP SCORE"].values[0]))}" data.update({"funding": formatted_funding_type}) df = pd.DataFrame([data]) merged_df = pd.merge(df, price_foam, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') else: - raise RuntimeError(f"unknonw insultation in eco4: {insultation}") + formatted_funding_type = f"REMEDIAL - {funding_type.upper()} - SAP {get_band(int(number))} to {get_band(get_sap_number(filtered_df["POST INSTALL SAP SCORE"].values[0]))}" + data.update({"funding": formatted_funding_type}) + df = pd.DataFrame([data]) + merged_df = pd.merge(df, price_general, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left') else: raise RuntimeError(f"UNKNOWN FUNDING TYPE {funding_type}") @@ -565,6 +292,4 @@ def main(): if __name__ == "__main__": main() - -# left join on the price after making a truth table of every variation and the price -# Make sure i catch one that don't match so i have list of address that didn't match in share point \ No newline at end of file +# TODO Add both address from deem score submission and presite notes so I can compare \ No newline at end of file diff --git a/etl/osmosis_data/asset_list.xlsx b/etl/osmosis_data/asset_list.xlsx new file mode 100644 index 0000000..965de92 Binary files /dev/null and b/etl/osmosis_data/asset_list.xlsx differ diff --git a/etl/osmosis_monday_to_sharepoint_automation.py b/etl/osmosis_monday_to_sharepoint_automation.py new file mode 100644 index 0000000..30356b0 --- /dev/null +++ b/etl/osmosis_monday_to_sharepoint_automation.py @@ -0,0 +1,63 @@ +import os +# osmsis keys +os.environ["SHAREPOINT_CLIENT_ID"] = "6832a4c5-fb8c-4082-a746-4f51e1020f0d" +os.environ["SHAREPOINT_CLIENT_SECRET"] = "xpC8Q~Frww48SM1V-D8lGy5iOY7P_cJ7FF3jgarQ" +os.environ["SHAREPOINT_TENANT_ID"] = "10d5af8b-2cfd-4882-9ccd-b96e4812dacf" + +from etl.scraper.scraper import SharePointInstaller +from etl.scraper.scraper import SharePointScraper +import pandas as pd + + +osmosis = SharePointScraper(SharePointInstaller.OSMOSIS) +parent_folder = "Automated Example" +osmosis.create_file(parent_folder, "/JTK Test Folder") + +asset_list = pd.read_excel("osmosis_data/asset_list.xlsx", sheet_name="2502 accent housing") + + +new_asset_list = [] +parent_folder = "JTK Test Folder/Automated Example" +# Create asset list and location +for index, address in asset_list.iterrows(): + webUrl = osmosis.create_file(address['Name'], parent_folder) + + first_folder = "1. Retrofit Assessment" + osmosis.create_file(first_folder, parent_folder + f"/{address['Name']}") + osmosis.create_file("A. Assessment", parent_folder + f"/{address['Name']}/{first_folder}") + osmosis.create_file("B. Air Tightness Tests", parent_folder + f"/{address['Name']}/{first_folder}") + + second_folder = "2. RC Mid-Term Plan" + osmosis.create_file(second_folder, parent_folder + f"/{address['Name']}") + osmosis.create_file("SAP", parent_folder + f"/{address['Name']}/{second_folder}") + + third_folder = "3. Retrofit Design" + osmosis.create_file(third_folder, parent_folder + f"/{address['Name']}") + + fourth_folder = "4. Post EPC" + osmosis.create_file(fourth_folder, parent_folder + f"/{address['Name']}") + osmosis.create_file(f"{address['Name']} - POST EPC Photos", parent_folder + f"/{address['Name']}/{fourth_folder}") + + fifth_folder = "5. Trustmark Lodgement" + osmosis.create_file(fifth_folder, parent_folder + f"/{address['Name']}") + osmosis.create_file("1. Works", parent_folder + f"/{address['Name']}/{fifth_folder}") + + osmosis.create_file("2. Required Documents", parent_folder + f"/{address['Name']}/{fifth_folder}") + osmosis.create_file("3. Additional Documents", parent_folder + f"/{address['Name']}/{fifth_folder}") + + asset_data = { + "Name": address['Name'], + "Sharepoint": webUrl, + } + + new_asset_list.append(asset_data) + + +# Osmosist File strucutre + + +df = pd.DataFrame(new_asset_list) +df.to_csv("output.csv", index=False) + + + diff --git a/etl/pdfReader/sitenotes.py b/etl/pdfReader/sitenotes.py index 3ed2f1a..ce9ed0f 100644 --- a/etl/pdfReader/sitenotes.py +++ b/etl/pdfReader/sitenotes.py @@ -50,11 +50,14 @@ class CSR(SiteNotesExtractor): def get_materials(self): lst = self.get_data_between("Detailed description of existing Cavity Wall Insulation ", "Detailed description of Defects in existing Cavity Wall Insulation") - dict_ = self.two_columns_processor(lst, ["Detailed description of existing Cavity Wall Insulation "], ["Detailed description of Defects in existing Cavity Wall Insulation"]) + if len(lst) > 2: + self.insulation_info = Insulation(type=lst[-1]) + else: + dict_ = self.two_columns_processor(lst, ["Detailed description of existing Cavity Wall Insulation "], ["Detailed description of Defects in existing Cavity Wall Insulation"]) - self.insulation_info = Insulation( - type=dict_.get('detailed_description_of_existing_cavity_wall_insulation_', "") - ) if dict_ is not None else None + self.insulation_info = Insulation( + type=dict_.get('detailed_description_of_existing_cavity_wall_insulation_', "") + ) if dict_ is not None else None diff --git a/etl/scraper/scraper.py b/etl/scraper/scraper.py index 961ec3d..02a2edb 100644 --- a/etl/scraper/scraper.py +++ b/etl/scraper/scraper.py @@ -14,16 +14,19 @@ from datetime import datetime, timedelta def previous_monday(): today = datetime.today() last_monday = today - timedelta(days=today.weekday() + 7) # Go back to last week's Monday - # return "W.C. 10.03.2025" # Quick one off script for nic. Hopefully get 199 Do not merge!!!! + # return f"W.C. 17.03.2025" return f"W.C. {last_monday.strftime('%d.%m.%Y')}" WEEK_COMMENCING = os.getenv("WEEK_COMMENCING", previous_monday()) class SharePointInstaller(Enum): + # https//{tenant}.sharepoint.com/sites/{site}/_api/site/id SOUTH_COAST_INSULATION = os.getenv("SOUTH_COAST_INSULATION_SERVICE_SHAREPOINT_ID", None) JJC = os.getenv("JJC_SERVICE_SHAREPOINT_ID", None) SGEC = os.getenv("SGEC_SERVICE_SHAREPOINT_ID", None) - BAXTER_KELLY = os.getenv("BAXTER_KELLY_SERVICE_SHAREPOINT_ID", None) + BAXTER_KELLY = os.getenv("BAXTER_KELLY_SERVICE_SHAREPOINT_ID", "6f930bf3-572d-4f91-b1ae-ec536fa319e2") + DOMNA = os.getenv("DOMNA_SHAREPOINT_ID", "8ab64924-ccde-4b56-b0dc-4e11596446e4") + OSMOSIS = os.getenv("OSMOSIS_SHAREPOINT_ID", "350a3b48-8311-4506-8abb-69bafc280d6f") class SharePointScraper(): """ @@ -40,7 +43,7 @@ class SharePointScraper(): assert self.sharepoint_client_id is not None, "Please assign SHAREPOINT_CLIENT_ID env variable" assert self.sharepoint_client_secret is not None, "Please assign SHAREPOINT_CLIENT_SECRET env variable" assert self.sharepoint_tenant_id is not None, "Please assign SHAREPOINT_TENANT_ID env variable" - assert self.sharepoint_drive is not None, "Please set sharepoint driver id env variable. See SharePointInstaller for more information" + assert self.sharepoint_drive.value is not None, "Please set sharepoint driver id env variable. See SharePointInstaller for more information" self.surveyor_names = [] @@ -103,6 +106,33 @@ class SharePointScraper(): self.surveyor_names = new_list + + def does_folder_exists_at(self, file_name, file_path): + folders = self.get_folders_in_path(file_path) + if 'value' in folders: + for folder in folders['value']: + if file_name.upper() in folder["name"].upper(): + return True + return False + + def create_file(self, file_name, at_path="/"): + + sharepoint_client = SharePointClient( + tenant_id=self.sharepoint_tenant_id, + client_id=self.sharepoint_client_id, + client_secret=self.sharepoint_client_secret, + site_id=self.sharepoint_drive.value, + ) + + if self.does_folder_exists_at(file_name, at_path) is False: + return sharepoint_client.create_folder(file_name, at_path)['webUrl'] + else: + for folders in self.get_folders_in_path(at_path)['value']: + if file_name.upper() in folders["name"].upper(): + return folders["webUrl"] + + + @ensure_surveyor_names_loaded def get_surveryor_names(self): return self.surveyor_names @@ -248,7 +278,7 @@ class SharePointScraper(): raise RuntimeError("Failed to get files to download") else: file_names_to_download = {} - avoid = [".jpg",".mov"] + avoid = [".jpg",".mov", ".JPG", ".heic", ".HEIC", ".png", ".PNG", ".jpeg", ".JPEG", ".mov", ".MOV", ".mp4", ".MP4"] for file in files_to_download_sharepoint_info['value']: if 'file' in file: diff --git a/etl/temp/jjc_submissionData.csv b/etl/temp/jjc_submissionData.csv index 01d1fd9..62b2f73 100644 --- a/etl/temp/jjc_submissionData.csv +++ b/etl/temp/jjc_submissionData.csv @@ -1,222 +1,345 @@ -SUBMISSION TYPE,Ventilation Requirements,PRE INSTALL SAP SCORE,POST INSTALL SAP SCORE,NO,Street Name,Post Code,FLOOR AREA -ECO4 - CAVITY ONLY,NONE,64D,71C,2, HICKMORE WALK,SW4 6EQ,105.1 -ECO4 - CAVITY ONLY,Trickle vents and kitchen extractor ,68D,72C,6, HICKMORE WALK,SW4 6EQ,96.2 -ECO4 - CAVITY ONLY,NONE,66D,72C,28, HICKMORE WALK,SW4 6EQ,89 -ECO4 - CAVITY ONLY,NONE,63D,70C,98, St. Alphonsus Road,SW4 7AT,79.18 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,73C,140, St. Alphonsus Road,SW4 7BN,98.71 -ECO4 - CAVITY ONLY,Trickle Vents,66D,73C,132, St. Alphonsus Road,SW4 7BN,98.71 -ECO4 - CAVITY ONLY,Bathroom Extractor,64D,70C,141, St. Alphonsus Road,SW4 7BP,79.18 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,71C,39, Haselrigge Road,SW4 7EN,107.67 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,69C,43, Haselrigge Road,SW4 7EN,107.67 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,70C,51, Haselrigge Road,SW4 7EN,78.21 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,24, Felmersham Close,SW4 7EU,120.16 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,70C,26, Felmersham Close,SW4 7EU,107.67 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,71C,16, Bowland Road,SW4 7LE,107.67 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,37, Britannia Close,SW4 7NN,120.16 -N/A,Kitchen Extractor,65D,,FLAT 1,3 Willis Road,CB1 2AQ,35.24 -N/A,Kitchen Extractor,57D,,FLAT 2,3 Willis Road,CB1 2AQ,35.65 -N/A,NONE,65D,,FLAT 3,3 Willis Road,CB1 2AQ,16.57 -N/A,Kitchen Extractor,72C,,FLAT4,3 Willis Road,CB1 2AQ,45.12 -N/A,Bathroom&Kitchen extractor,30F,,FLAT 5,3 Willis Road,CB1 2AQ,43.56 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,66D,72C,15,Brookfield Road,CB23 3RP,75.1 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,72,Ermine Street South,CB23 3QA,86.71 -ECO4 - REMEDIAL CWI ONLY,WC&Bathroom extractor,66D,70C,36,Ermine Street South,CB23 3QA,86.71 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,20,Barons Way,CB23 3QJ,93.22 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,65D,70C,76,Ermine Street South,CB23 3QA,86.71 -ECO4 - REMEDIAL CWI ONLY,WC&Bathroom extractor,65D,70C,4,Brookfield Road,CB23 3RP,75.1 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,66D,70C,50,Ermine Street South,CB23 3QA,86.71 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,23,Ridgeway,CB23 3RW,92.11 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,148,PEEL GREEN ROAD,M30 7BA,61 -ECO4 GBIS REMEDIAL,NONE,58D,65D,122,PEEL GREEN ROAD,M30 7AZ,61 -ECO4 GBIS REMEDIAL,NONE,63D,67D,130,PEEL GREEN ROAD,M30 7AZ,70 -ECO4 GBIS REMEDIAL,NONE,61D,65D,146,PEEL GREEN ROAD,M30 7BA,70 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,63D,69C,56,PEEL GREEN ROAD,M30 7AY,90 -ECO4 - REMEDIAL CWI ONLY,WC&Bathroom extractor,68D,71C,62,PEEL GREEN ROAD,M30 7AY,90 -ECO4 - REMEDIAL CWI ONLY,Kitchen&WC extractor,67D,70C,17,MARSDEN STREET,M30 9QP,78 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,64D,69C,7,KEAN PLACE,M30 0PS,51 -ECO4 GBIS REMEDIAL,Bathroom Extractor,61D,65D,41,PEEL GREEN ROAD,M30 7AY,92 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,67D,70C,65,PEEL GREEN ROAD,M30 7AY,85 -ECO4 GBIS REMEDIAL,NONE,62D,67D,1,Ermine Street South,CB23 3RD,87.73 -ECO4 GBIS REMEDIAL,Kitchen Extractor,55D,68D,21,Barons Way,CB23 3QJ,93.22 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,1,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,2,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,5,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,6,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,65D,70C,7,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,71C,8,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,10,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,66D,71C,11,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,71C,14,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,15,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,29,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,30,BULLSLAND GARDENS,WD3 5BH,61.25 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,73C,26,ST LAWRENCE CLOSE,WD5 0AU,56.76 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,71C,29,ST LAWRENCE CLOSE,WD5 0AU,56.76 -ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR,67D,72C,5,TUDOR WAY,WD3 8JA,91 -ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR AND TRICKLE VENTS,67D,72C,14,TUDOR WAY,WD3 8JB,82 -ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,66D,71C,21,TUDOR WAY,WD3 8JA,91 -ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR AND TRICKLE VENTS,64D,70C,26,TUDOR WAY,WD3 8JB,91 -ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR AND TRICKLE VENTS,66D,71C,33,TUDOR WAY,WD3 8JA,91 -ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR AND TRICKLE VENTS,67D,72C,42,TUDOR WAY,WD3 8JB,82 -ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,64D,70C,56,TUDOR WAY,WD3 8JB,91 -ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR AND TRICKLE VENTS,66D,71C,59,TUDOR WAY,WD3 8JA,82 -ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,66D,71C,12,CHILTERN DRIVE,WD3 8JS,78 -ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR ,67D,72C,14,CHILTERN DRIVE,WD3 8JS,84 -ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR AND TRICKLE VENTS,68D,72C,20,CHILTERN DRIVE,WD3 8JS,84 -ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR,67D,72C,25,CHILTERN DRIVE,WD3 8JX,90 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,35,CHILTERN DRIVE,WD3 8JX,80 -ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,66D,71C,9,BERRY LANE,WD3 7HJ,82 -ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,68D,72C,13,BERRY LANE,WD3 7HJ,82 -ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,1,LONGCLIFFE PATH,WD19 7PH,34 -ECO4 GBIS,WC Extractor,66D,71C,21,MARLBOROUGH ROAD,M44 6HH,102 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,70C,57,SILVER STREET,M44 6HT,66 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,69C,5,DUNLIN DRIVE,M44 6PL,86 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,67D,72C,71,SILVER STREET,M44 6JJ,96 -ECO4 GBIS REMEDIAL,WC Extractor,63D,67D,85,SILVER STREET,M44 6JJ,86 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,70C,22,HAWK ROAD,M44 6LE,73 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,66D,69C,16,HAWK ROAD,M44 6LE,86 -ECO4 GBIS REMEDIAL,Bathroom Extractor,61D,66D,1,HAWK ROAD,M44 6LE,73 -ECO4 GBIS,Bathroom&Kitchen extractor,66D,70C,52,PARKSTONE ROAD,M44 6LN,73 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,4,RAVEN DRIVE,M44 6LH,92 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,10,PEREGRINE DRIVE,M44 6PF,92 -ECO4 GBIS REMEDIAL,Bathroom Extractor,62D,65D,4,PEREGRINE DRIVE,M44 6PF,92 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,15,MORILLON ROAD,M44 6PN,72 -ECO4 GBIS - JJC <73m�,NONE,60D,66D,14,ABBEY DRIVE,M27 6AS,62 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,71C,11,ST LAWRENCE CLOSE,WD5 0AU,45.97 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,72C,12,ST LAWRENCE CLOSE,WD5 0AU,45.97 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,16,ST LAWRENCE CLOSE,WD5 0AU,56.76 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,62D,69C,17,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,67D,72C,18,ST LAWRENCE CLOSE,WD5 0AU,56.76 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,71C,19,ST LAWRENCE CLOSE,WD5 0AU,56.76 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,63D,70C,20,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,71C,21,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,66D,72C,22,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,62D,70C,23,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,64D,71C,24,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,67D,72C,25,ST LAWRENCE CLOSE,WD5 0AU,48.31 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,65D,71C,28,ST LAWRENCE CLOSE,WD5 0AU,56.76 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,64D,71C,30,ST LAWRENCE CLOSE,WD5 0AU,50.78 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,72C,31,ST LAWRENCE CLOSE,WD5 0AU,50.78 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,68D,72C,32,ST LAWRENCE CLOSE,WD5 0AU,50.78 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,72C,33,ST LAWRENCE CLOSE,WD5 0AU,50.78 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,73C,103,THE QUEENS DRIVE,WD3 8LY,75.3 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,73C,135,THE QUEENS DRIVE,WD3 8LY,75.3 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,64D,71C,26,LONGCROFT ROAD,WD3 9TR,59.39 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,64D,71C,28,LONGCROFT ROAD,WD3 9TR,59.39 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,60D,69C,30,LONGCROFT ROAD,WD3 9TR,59.39 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,61D,70C,36,LONGCROFT ROAD,WD3 9TR,59.39 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,1,CLITHEROE GARDENS,WD19 6RP,35.68 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,3,CLITHEROE GARDENS,WD19 6RP,35.68 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,70C,50,PARKSTONE ROAD,M44 6LN,73 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,119,CUTNOOK LANE,M44 6LU,72 -ECO4 GBIS REMEDIAL,NONE,62D,67D,89,PARKSTONE ROAD,M44 6LJ,68 -ECO4 GBIS REMEDIAL,WC&Bathroom extractor,61D,66D,22,LINNET DRIVE,M44 6LW,81 -ECO4 - REMEDIAL CWI ONLY,All wet rooms need extractors,68D,75C,153,HEATHCOTE STREET,ST3 1AD,74 -ECO4 GBIS REMEDIAL,NONE,61D,67D,37,MEAFORD DRIVE,ST3 2BY,83 -ECO4 GBIS REMEDIAL,NONE,61D,67D,24,SEEDFIELDS ROAD,ST3 2BZ,84 -ECO4 GBIS,WC&Bathroom extractor,61D,67D,16,IONA PLACE ,ST3 2DY,82 -ECO4 GBIS REMEDIAL,NONE,62D,68D,27,ROUNDWAY,ST3 2BH,83 -ECO4 GBIS REMEDIAL,Bathroom Extractor,62D,67D,50,LOUISE DRIVE,ST3 2DT,82 -ECO4 GBIS REMEDIAL,NONE,63D,66D,30,ANGLESEY DRIVE,ST3 2SS,49 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,99,MEAFORD DRIVE,ST3 2BG,83 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,66D,71C,90,MEAFORD DRIVE,ST3 2BB,83 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,2, GREGSON CLOSE,ST3 2SJ,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,32, ANGLESEY DRIVE,ST3 2SS,50.62 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,64D,70C,4, PEMBRIDGE ROAD,ST3 3BX,41.68 -ECO4 - REMEDIAL CWI ONLY,NONE,60D,69C,12A,PEMBRIDGE ROAD,ST3 3BX,41.68 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,62D,69C,10, PEMBRIDGE ROAD,ST3 3BX,41.68 -ECO4 - REMEDIAL CWI ONLY,NONE,63D,69C,10A, PEMBRIDGE ROAD,ST3 3BX,41.68 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,9, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,7, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,5, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,3, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,71C,2, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,20, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,18, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,71C,15, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,12, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,10, LOMOND WALK,ST3 3HW,50.62 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,65D,71C,7, INGLEBY ROAD,ST3 3JY,49.45 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,91, WIMBORNE AVENUE,ST3 3LS,49.45 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,87, WIMBORNE AVENUE,ST3 3LS,49.45 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,71C,85, WIMBORNE AVENUE,ST3 3LS,49.45 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,83, WIMBORNE AVENUE,ST3 3LS,49.45 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,5, POOLSIDE,ST3 3NY,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,61D,69C,387, LIGHTWOOD ROAD,ST3 4JT,58.7 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,63D,69C,379, LIGHTWOOD ROAD,ST3 4JT,42.68 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,7, PEEL STREET,ST3 4PE,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,58, WISE STREET,ST3 4PQ,41.88 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,70C,52, BRIDLE PATH,ST3 4SB,41.88 -ECO4 - REMEDIAL CWI ONLY,NONE,63D,70C,49, BRIDLE PATH,ST3 4SB,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,71C,9, MELBOURNE STREET,ST3 5AA,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,62D,69C,1,TILL WALK,ST3 5DF,41.88 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,75C,36,Woodville road,ST3 6BX,73.92 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,70C,18,Bilston street,ST4 5DA,41.88 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,72C,19,Sedgley walk,ST3 1RY,50.62 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,72C,9,Farrington close,ST6 8DQ,49.45 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,33,Oakfield,WD3 8LR,67.43 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,49,Oakfield,WD3 8NA,67.43 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,71C,45,Oakfield,WD3 8NA,67.43 -ECO4 - REMEDIAL CWI ONLY,WC Extractor,67D,72C,5,Owens way,WD3 3PS,82.14 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,72C,7,Owens way,WD3 3PS,82.14 -ECO4 - REMEDIAL CWI ONLY,NONE,60D,69C,5,Fyfield Road,SW9 7HT,98.36 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,17,Willington Road,SW9 9NA,79.2 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,74C,19,Willington Road,SW9 9NA,82.33 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,27,Willington Road,SW9 9NA,82.33 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,33,Willington Road,SW9 9NA,82.33 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,74C,41,Willington Road,SW9 9NA,82.33 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,5,Mallams Mews,SW9 7HR,98.36 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,67D,71C,35,HEATHCOTE STREET,ST3 1AA,38.99 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,96,EDGEFIELD ROAD,ST3 1AF,49.88 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,70C,97,EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,68D,72C,155,EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,70C,151, EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,113, EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,111, EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,70C,105, EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,103, EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,71C,101, EDGEFIELD ROAD,ST3 1AG,38.99 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,96,LONGLEY ROAD,ST3 1AN,38.99 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,114, LONGLEY ROAD,ST3 1AN,48.51 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,70C,30,Caroline Street,ST3 1DE,44.18 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,32,Caroline Street,ST3 1DE,30.68 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,34,Caroline Street,ST3 1DE,30.68 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,5,Conewood Place,ST3 2NW,40.26 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,17,Conewood Place,ST3 2NW,57.09 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,21,Conewood Place,ST3 2NW,42.51 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,27,Conewood Place,ST3 2NW,42.5 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,70C,54,Kirkup Walk,ST3 2SD,36.94 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,4,Milverton Place,ST3 2SH,37.96 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,48,Lundy Road,ST3 2DZ,38.22 -ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,56,Heathcote Road,ST3 2LX,41.94 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,47,Hurst Street,ST3 2LT,47.79 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,59,Caroline Street,ST3 1DE,49.44 -ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,15,Sedgley Walk,ST3 1RY,47.79 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,17,Sedgley Walk,ST31RY,47.79 -ECO4 - REMEDIAL CWI ONLY,NONE,66D,69C,144,Foley Road,ST 2LH,48.51 -ECO4 - CAVITY ONLY,Trickle Vents,68D,71C,13,Logepole clos ,M30 7GF,79.44 -ECO4 - CAVITY ONLY,NONE,68D,71C,21,Earlsdon crescent ,M38 9HF,80.2 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,64D,70C,5,HUBBARDS ROAD,WD3 5JL,49.87 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,67D,72C,7,HUBBARDS ROAD,WD3 5JL,49.87 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,71C,13,HUBBARDS ROAD,WD3 5JL,49.87 -ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,66D,72C,15,HUBBARDS ROAD,WD3 5JL,49.87 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,72C,34,HUBBARDS ROAD,WD3 5JJ,81.86 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,74C,8,THE GREENWAY,WD3 8HU,94.26 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,65D,74C,9,ORCHARD WAY,WD3 8HZ,94.26 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,64D,72C,13,ORCHARD WAY,WD3 8HZ,74.39 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,65D,73C,14,ORCHARD WAY,WD3 8HZ,73.1 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,67D,73C,19,ORCHARD WAY,WD3 8HZ,87.45 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,73C,36,ORCHARD WAY,WD3 8HZ,73.1 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,74C,45,ORCHARD WAY,WD3 8HZ,73.1 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,62D,71C,2O,EDINBURGH AVENUE,WD3 8LB,72.72 -ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,64D,73C,29,THE QUEENS DRIVE,WD3 8LN,98.36 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,74C,31,THE QUEENS DRIVE,WD3 8LN,98.36 -ECO4 - REMEDIAL CWI ONLY,NONE,63D,72C,42,THE QUEENS DRIVE,WD3 8LT,78.9 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,66D,74C,56,THE QUEENS DRIVE,WD3 8LT,78.06 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,72C,80,THE QUEENS DRIVE,WD3 8LX,78.06 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,74C,82,THE QUEENS DRIVE,WD3 8LX,84.48 -ECO4 - REMEDIAL CWI ONLY,NONE,65D,73C,90,CHILTERN DRIVE,WD3 8JZ,74.8 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,74C,96,CHILTERN DRIVE,WD3 8JZ,74.8 -ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,73C,112,CHILTERN DRIVE,WD3 8JZ,74.8 -ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,21,CLITHEROE GARDENS,WD19 6RP,35.68 -ECO4 - REMEDIAL CWI ONLY,NONE,64D,70C,26,CLITHEROE GARDENS,WD19 6RP,35.68 \ No newline at end of file +SUBMISSION TYPE,Ventilation Requirements,PRE INSTALL SAP SCORE,POST INSTALL SAP SCORE,NO,Street Name,Post Code,FLOOR AREA,LEWIS_PRICE, +ECO4 - CAVITY ONLY,NONE,64D,71C,2, HICKMORE WALK,SW4 6EQ,105.1,£825.00, +ECO4 - CAVITY ONLY,Trickle vents and kitchen extractor ,68D,72C,6, HICKMORE WALK,SW4 6EQ,96.2,£600.00, +ECO4 - CAVITY ONLY,NONE,66D,72C,28, HICKMORE WALK,SW4 6EQ,89,£800.00, +ECO4 - CAVITY ONLY,NONE,63D,70C,98, St. Alphonsus Road,SW4 7AT,79.18,£800.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,73C,140, St. Alphonsus Road,SW4 7BN,98.71,£600.00, +ECO4 - CAVITY ONLY,Trickle Vents,66D,73C,132, St. Alphonsus Road,SW4 7BN,98.71,£825.00, +ECO4 - CAVITY ONLY,Bathroom Extractor,64D,70C,141, St. Alphonsus Road,SW4 7BP,79.18,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,71C,39, Haselrigge Road,SW4 7EN,107.67,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,69C,43, Haselrigge Road,SW4 7EN,107.67,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,70C,51, Haselrigge Road,SW4 7EN,78.21,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,24, Felmersham Close,SW4 7EU,120.16,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,70C,26, Felmersham Close,SW4 7EU,107.67,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,71C,16, Bowland Road,SW4 7LE,107.67,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,37, Britannia Close,SW4 7NN,120.16,£750.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,66D,72C,15,Brookfield Road,CB23 3RP,75.1,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,72,Ermine Street South,CB23 3QA,86.71,£750.00, +ECO4 - REMEDIAL CWI ONLY,WC&Bathroom extractor,66D,70C,36,Ermine Street South,CB23 3QA,86.71,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,20,Barons Way,CB23 3QJ,93.22,£750.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,65D,70C,76,Ermine Street South,CB23 3QA,86.71,£600.00, +ECO4 - REMEDIAL CWI ONLY,WC&Bathroom extractor,65D,70C,4,Brookfield Road,CB23 3RP,75.1,£500.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,66D,70C,50,Ermine Street South,CB23 3QA,86.71,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,23,Ridgeway,CB23 3RW,92.11,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,148,PEEL GREEN ROAD,M30 7BA,61,£750.00, +ECO4 GBIS REMEDIAL,NONE,58D,65D,122,PEEL GREEN ROAD,M30 7AZ,61,£500.00, +ECO4 GBIS REMEDIAL,NONE,63D,67D,130,PEEL GREEN ROAD,M30 7AZ,70,£500.00, +ECO4 GBIS REMEDIAL,NONE,61D,65D,146,PEEL GREEN ROAD,M30 7BA,70,£500.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,63D,69C,56,PEEL GREEN ROAD,M30 7AY,90,£600.00, +ECO4 - REMEDIAL CWI ONLY,WC&Bathroom extractor,68D,71C,62,PEEL GREEN ROAD,M30 7AY,90,£500.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen&WC extractor,67D,70C,17,MARSDEN STREET,M30 9QP,78,£500.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,64D,69C,7,KEAN PLACE,M30 0PS,51,£525.00, +ECO4 GBIS REMEDIAL,Bathroom Extractor,61D,65D,41,PEEL GREEN ROAD,M30 7AY,92,£500.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,67D,70C,65,PEEL GREEN ROAD,M30 7AY,85,£600.00, +ECO4 GBIS REMEDIAL,NONE,62D,67D,1,Ermine Street South,CB23 3RD,87.73,£500.00, +ECO4 GBIS REMEDIAL,Kitchen Extractor,55D,68D,21,Barons Way,CB23 3QJ,93.22,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,1,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,2,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,5,BULLSLAND GARDENS,WD3 5BH,61.25,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,6,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,65D,70C,7,BULLSLAND GARDENS,WD3 5BH,61.25,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,71C,8,BULLSLAND GARDENS,WD3 5BH,61.25,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,10,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,66D,71C,11,BULLSLAND GARDENS,WD3 5BH,61.25,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,71C,14,BULLSLAND GARDENS,WD3 5BH,61.25,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,15,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,29,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,30,BULLSLAND GARDENS,WD3 5BH,61.25,£750.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,73C,26,ST LAWRENCE CLOSE,WD5 0AU,56.76,£525.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,71C,29,ST LAWRENCE CLOSE,WD5 0AU,56.76,£750.00, +ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR,67D,72C,5,TUDOR WAY,WD3 8JA,91,£400.00, +ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR AND TRICKLE VENTS,67D,72C,14,TUDOR WAY,WD3 8JB,82,£401.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,66D,71C,21,TUDOR WAY,WD3 8JA,91,NOT VIABLE , +ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR AND TRICKLE VENTS,64D,70C,26,TUDOR WAY,WD3 8JB,91,£401.00, +ECO4 - REMEDIAL CWI ONLY,BATHROOM EXTRACTOR AND TRICKLE VENTS,66D,71C,33,TUDOR WAY,WD3 8JA,91,£401.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR AND TRICKLE VENTS,67D,72C,42,TUDOR WAY,WD3 8JB,82,£401.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,64D,70C,56,TUDOR WAY,WD3 8JB,91,£500.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR AND TRICKLE VENTS,66D,71C,59,TUDOR WAY,WD3 8JA,82,£401.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,66D,71C,12,CHILTERN DRIVE,WD3 8JS,78,NOT VIABLE , +ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR ,67D,72C,14,CHILTERN DRIVE,WD3 8JS,84,£400.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR AND TRICKLE VENTS,68D,72C,20,CHILTERN DRIVE,WD3 8JS,84,£401.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN EXTRACTOR,67D,72C,25,CHILTERN DRIVE,WD3 8JX,90,£400.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,35,CHILTERN DRIVE,WD3 8JX,80,£500.00, +ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,66D,71C,9,BERRY LANE,WD3 7HJ,82,NOT VIABLE , +ECO4 - REMEDIAL CWI ONLY,KITCHEN AND BATHROOM EXTRACTORS AND TRICKLE VENTS,68D,72C,13,BERRY LANE,WD3 7HJ,82,NOT VIABLE , +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,1,LONGCLIFFE PATH,WD19 7PH,34,£750.00, +ECO4 GBIS,WC Extractor,66D,71C,21,MARLBOROUGH ROAD,M44 6HH,102,"£1,000.00", +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,70C,57,SILVER STREET,M44 6HT,66,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,69C,5,DUNLIN DRIVE,M44 6PL,86,£750.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,67D,72C,71,SILVER STREET,M44 6JJ,96,£750.00, +ECO4 GBIS REMEDIAL,WC Extractor,63D,67D,85,SILVER STREET,M44 6JJ,86,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,70C,22,HAWK ROAD,M44 6LE,73,£750.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,66D,69C,16,HAWK ROAD,M44 6LE,86,£750.00, +ECO4 GBIS REMEDIAL,Bathroom Extractor,61D,66D,1,HAWK ROAD,M44 6LE,73,£750.00, +ECO4 GBIS,Bathroom&Kitchen extractor,66D,70C,52,PARKSTONE ROAD,M44 6LN,73,"£1,000.00", +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,4,RAVEN DRIVE,M44 6LH,92,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,10,PEREGRINE DRIVE,M44 6PF,92,£750.00, +ECO4 GBIS REMEDIAL,Bathroom Extractor,62D,65D,4,PEREGRINE DRIVE,M44 6PF,92,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,15,MORILLON ROAD,M44 6PN,72,£750.00, +ECO4 GBIS - JJC <73m²,NONE,60D,66D,14,ABBEY DRIVE,M27 6AS,62,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,71C,11,ST LAWRENCE CLOSE,WD5 0AU,45.97,£525.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,72C,12,ST LAWRENCE CLOSE,WD5 0AU,45.97,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,16,ST LAWRENCE CLOSE,WD5 0AU,56.76,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,62D,69C,17,ST LAWRENCE CLOSE,WD5 0AU,48.31,£525.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,67D,72C,18,ST LAWRENCE CLOSE,WD5 0AU,56.76,£750.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,71C,19,ST LAWRENCE CLOSE,WD5 0AU,56.76,£750.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,63D,70C,20,ST LAWRENCE CLOSE,WD5 0AU,48.31,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,71C,21,ST LAWRENCE CLOSE,WD5 0AU,48.31,£525.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,66D,72C,22,ST LAWRENCE CLOSE,WD5 0AU,48.31,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,62D,70C,23,ST LAWRENCE CLOSE,WD5 0AU,48.31,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,64D,71C,24,ST LAWRENCE CLOSE,WD5 0AU,48.31,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,67D,72C,25,ST LAWRENCE CLOSE,WD5 0AU,48.31,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,65D,71C,28,ST LAWRENCE CLOSE,WD5 0AU,56.76,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,64D,71C,30,ST LAWRENCE CLOSE,WD5 0AU,50.78,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,72C,31,ST LAWRENCE CLOSE,WD5 0AU,50.78,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,68D,72C,32,ST LAWRENCE CLOSE,WD5 0AU,50.78,£750.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,68D,72C,33,ST LAWRENCE CLOSE,WD5 0AU,50.78,£400.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,73C,103,THE QUEENS DRIVE,WD3 8LY,75.3,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,73C,135,THE QUEENS DRIVE,WD3 8LY,75.3,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,64D,71C,26,LONGCROFT ROAD,WD3 9TR,59.39,£400.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,64D,71C,28,LONGCROFT ROAD,WD3 9TR,59.39,£400.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,60D,69C,30,LONGCROFT ROAD,WD3 9TR,59.39,£400.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,61D,70C,36,LONGCROFT ROAD,WD3 9TR,59.39,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,1,CLITHEROE GARDENS,WD19 6RP,35.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,3,CLITHEROE GARDENS,WD19 6RP,35.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,66D,70C,50,PARKSTONE ROAD,M44 6LN,73,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,119,CUTNOOK LANE,M44 6LU,72,£750.00, +ECO4 GBIS REMEDIAL,NONE,62D,67D,89,PARKSTONE ROAD,M44 6LJ,68,£500.00, +ECO4 GBIS REMEDIAL,WC&Bathroom extractor,61D,66D,22,LINNET DRIVE,M44 6LW,81,£500.00, +ECO4 - REMEDIAL CWI ONLY,All wet rooms need extractors,68D,75C,153,HEATHCOTE STREET,ST3 1AD,74,"£1,500.00", +ECO4 GBIS REMEDIAL,NONE,61D,67D,37,MEAFORD DRIVE,ST3 2BY,83,£500.00, +ECO4 GBIS REMEDIAL,NONE,61D,67D,24,SEEDFIELDS ROAD,ST3 2BZ,84,£500.00, +ECO4 GBIS,WC&Bathroom extractor,61D,67D,16,IONA PLACE ,ST3 2DY,82,"£1,000.00", +ECO4 GBIS REMEDIAL,NONE,62D,68D,27,ROUNDWAY,ST3 2BH,83,£500.00, +ECO4 GBIS REMEDIAL,Bathroom Extractor,62D,67D,50,LOUISE DRIVE,ST3 2DT,82,£500.00, +ECO4 GBIS REMEDIAL,NONE,63D,66D,30,ANGLESEY DRIVE,ST3 2SS,49,£375.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,99,MEAFORD DRIVE,ST3 2BG,83,£750.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,66D,71C,90,MEAFORD DRIVE,ST3 2BB,83,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,2, GREGSON CLOSE,ST3 2SJ,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,32, ANGLESEY DRIVE,ST3 2SS,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,64D,70C,4, PEMBRIDGE ROAD,ST3 3BX,41.68,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,60D,69C,12A,PEMBRIDGE ROAD,ST3 3BX,41.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,62D,69C,10, PEMBRIDGE ROAD,ST3 3BX,41.68,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,63D,69C,10A, PEMBRIDGE ROAD,ST3 3BX,41.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,9, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,7, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,5, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,3, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,71C,2, LOMOND WALK,ST3 3HW,50.62,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,20, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,18, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,71C,15, LOMOND WALK,ST3 3HW,50.62,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,12, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,10, LOMOND WALK,ST3 3HW,50.62,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,65D,71C,7, INGLEBY ROAD,ST3 3JY,49.45,£400.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,91, WIMBORNE AVENUE,ST3 3LS,49.45,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,87, WIMBORNE AVENUE,ST3 3LS,49.45,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,71C,85, WIMBORNE AVENUE,ST3 3LS,49.45,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,83, WIMBORNE AVENUE,ST3 3LS,49.45,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,5, POOLSIDE,ST3 3NY,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,61D,69C,387, LIGHTWOOD ROAD,ST3 4JT,58.7,£500.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,63D,69C,379, LIGHTWOOD ROAD,ST3 4JT,42.68,£400.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,7, PEEL STREET,ST3 4PE,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,58, WISE STREET,ST3 4PQ,41.88,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,70C,52, BRIDLE PATH,ST3 4SB,41.88,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,63D,70C,49, BRIDLE PATH,ST3 4SB,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,71C,9, MELBOURNE STREET,ST3 5AA,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,62D,69C,1,TILL WALK,ST3 5DF,41.88,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,75C,36,Woodville road,ST3 6BX,73.92,"£1,500.00", +ECO4 - REMEDIAL CWI ONLY,NONE,64D,70C,18,Bilston street,ST4 5DA,41.88,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,72C,19,Sedgley walk,ST3 1RY,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,72C,9,Farrington close,ST6 8DQ,49.45,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,33,Oakfield,WD3 8LR,67.43,£525.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,49,Oakfield,WD3 8NA,67.43,£525.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,71C,45,Oakfield,WD3 8NA,67.43,£525.00, +ECO4 - REMEDIAL CWI ONLY,WC Extractor,67D,72C,5,Owens way,WD3 3PS,82.14,£600.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,72C,7,Owens way,WD3 3PS,82.14,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,60D,69C,5,Fyfield Road,SW9 7HT,98.36,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,17,Willington Road,SW9 9NA,79.2,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,74C,19,Willington Road,SW9 9NA,82.33,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,27,Willington Road,SW9 9NA,82.33,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,33,Willington Road,SW9 9NA,82.33,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,74C,41,Willington Road,SW9 9NA,82.33,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,5,Mallams Mews,SW9 7HR,98.36,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,67D,71C,35,HEATHCOTE STREET,ST3 1AA,38.99,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,96,EDGEFIELD ROAD,ST3 1AF,49.88,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,70C,97,EDGEFIELD ROAD,ST3 1AG,38.99,£525.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,68D,72C,155,EDGEFIELD ROAD,ST3 1AG,38.99,£525.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,70C,151, EDGEFIELD ROAD,ST3 1AG,38.99,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,113, EDGEFIELD ROAD,ST3 1AG,38.99,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,111, EDGEFIELD ROAD,ST3 1AG,38.99,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,70C,105, EDGEFIELD ROAD,ST3 1AG,38.99,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,103, EDGEFIELD ROAD,ST3 1AG,38.99,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,67D,71C,101, EDGEFIELD ROAD,ST3 1AG,38.99,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,96,LONGLEY ROAD,ST3 1AN,38.99,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,114, LONGLEY ROAD,ST3 1AN,48.51,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,70C,30,Caroline Street,ST3 1DE,44.18,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,32,Caroline Street,ST3 1DE,30.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,34,Caroline Street,ST3 1DE,30.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,5,Conewood Place,ST3 2NW,40.26,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,17,Conewood Place,ST3 2NW,57.09,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,71C,21,Conewood Place,ST3 2NW,42.51,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,27,Conewood Place,ST3 2NW,42.5,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,70C,54,Kirkup Walk,ST3 2SD,36.94,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,4,Milverton Place,ST3 2SH,37.96,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,48,Lundy Road,ST3 2DZ,38.22,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,56,Heathcote Road,ST3 2LX,41.94,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,47,Hurst Street,ST3 2LT,47.79,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,59,Caroline Street,ST3 1DE,49.44,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,15,Sedgley Walk,ST3 1RY,47.79,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,17,Sedgley Walk,ST31RY,47.79,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,69C,144,Foley Road,ST 2LH,48.51,£750.00, +ECO4 - CAVITY ONLY,Trickle Vents,68D,71C,13,Logepole clos ,M30 7GF,79.44,£800.00, +ECO4 - CAVITY ONLY,NONE,68D,71C,21,Earlsdon crescent ,M38 9HF,80.2,£800.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,64D,70C,5,HUBBARDS ROAD,WD3 5JL,49.87,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,67D,72C,7,HUBBARDS ROAD,WD3 5JL,49.87,£400.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,71C,13,HUBBARDS ROAD,WD3 5JL,49.87,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,66D,72C,15,HUBBARDS ROAD,WD3 5JL,49.87,£400.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,72C,34,HUBBARDS ROAD,WD3 5JJ,81.86,£500.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,74C,8,THE GREENWAY,WD3 8HU,94.26,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,65D,74C,9,ORCHARD WAY,WD3 8HZ,94.26,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,64D,72C,13,ORCHARD WAY,WD3 8HZ,74.39,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,65D,73C,14,ORCHARD WAY,WD3 8HZ,73.1,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,67D,73C,19,ORCHARD WAY,WD3 8HZ,87.45,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,73C,36,ORCHARD WAY,WD3 8HZ,73.1,£500.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,74C,45,ORCHARD WAY,WD3 8HZ,73.1,£500.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,62D,71C,2O,EDINBURGH AVENUE,WD3 8LB,72.72,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,64D,73C,29,THE QUEENS DRIVE,WD3 8LN,98.36,£500.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,74C,31,THE QUEENS DRIVE,WD3 8LN,98.36,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,63D,72C,42,THE QUEENS DRIVE,WD3 8LT,78.9,£500.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents and Extractors for the whole house,66D,74C,56,THE QUEENS DRIVE,WD3 8LT,78.06,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,65D,72C,80,THE QUEENS DRIVE,WD3 8LX,78.06,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,74C,82,THE QUEENS DRIVE,WD3 8LX,84.48,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,73C,90,CHILTERN DRIVE,WD3 8JZ,74.8,£500.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,74C,96,CHILTERN DRIVE,WD3 8JZ,74.8,£400.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,73C,112,CHILTERN DRIVE,WD3 8JZ,74.8,£400.00, +ECO4 - REMEDIAL CWI ONLY,Trickle Vents,64D,70C,21,CLITHEROE GARDENS,WD19 6RP,35.68,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,70C,26,CLITHEROE GARDENS,WD19 6RP,35.68,£500.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,63D,69C,6,GAINSBOROUGH ROAD,ST3 3JR,75,£500.00, +ECO4 - REMEDIAL CWI ONLY,All wet rooms need extractors,65D,70C,24,URMSTON PLACE,ST3 3NH,82,£500.00, +ECO4 GBIS REMEDIAL,NONE,64D,67D,75,COBDEN STREET,ST3 4EZ,49,£375.00, +ECO4 GBIS REMEDIAL,NONE,63D,67D,8,BARDSEY WALK,ST3 2SW,49,£375.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,65D,70C,31,ELLERBY ROAD,ST3 3JJ,74,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,26,WITCHFORD CRESCENT,ST3 3LZ,82,£750.00, +ECO4 GBIS REMEDIAL,Bathroom&Kitchen extractor,57D,62D,4,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,69C,22,HUDSON WALK,ST3 1RU,46,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,48,WATERSIDE DRIVE,ST3 3LZ,82,£750.00, +ECO4 GBIS REMEDIAL,Bathroom&Kitchen extractor,60D,64D,8,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 GBIS REMEDIAL,Bathroom&Kitchen extractor,61D,65D,10,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 GBIS REMEDIAL,NONE,61D,65D,12,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,69C,16,HUDSON WALK,ST3 1RU,46,£400.00, +ECO4 GBIS REMEDIAL,NONE,62D,65D,18,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 GBIS REMEDIAL,NONE,60D,64D,20,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 GBIS REMEDIAL,Bathroom&Kitchen extractor,62D,66D,24,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 GBIS REMEDIAL,Bathroom Extractor,58D,63D,28,HUDSON WALK,ST3 1RU,46,£375.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,75C,96, Harvey Road,ST3 6BD,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,84, Harvey Road,ST3 6BD,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,69, Harvey Road,ST3 6BD,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,73C,58, Harvey Road,ST3 6BD,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,44, Harvey Road,ST3 6BD,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,72C,41, Harvey Road,ST3 6BD,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,73C,1, Brookhouse Road,ST3 6BE,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,73C,7,Harvey Road,ST3 6BG,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,74C,22,Harvey Road,ST3 6BG,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,73C,12, Harvey Road,ST3 6BG,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,74C,11, Harvey Road,ST3 6BG,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,22, Westwood Road,ST3 6BH,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,21,Westwood Road,ST3 6BH,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,72C,26, Leason Road,ST3 6BN,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,55, Grangewood Road,ST3 7AZ,73.92,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,32,Cotterill Grove,ST6 3DT,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,62D,70C,53,Cotterill Grove,ST6 3DT,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,24, Hillgreen Road,ST3 5AE,81.96,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,73C,177, Weston Road,ST3 6AW,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,86,Leason Road,ST3 6AX,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,74C,82,Leason Road,ST3 6AX,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,74C,58,Leason Road,ST3 6AX,75.13,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,66D,74C,54,Leason Road,ST3 6AX,75.13,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,73C,26,Cotterill Grove,ST6 3DT,50.62,£500.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,63D,70C,12, Pembridge Road,ST6 3BX,41.68,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,144,Waverton Road,ST2 0QY,50.48,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,23,Tiverton Road,ST2 0AZ,50.48,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,52,Janson Street,ST4 4QH,49.02,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,69C,62,Zamenhoff Grove,ST6 1RX,45.72,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,65,Zamenhoff Grove,ST6 1RX,45.72,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,6,Cadman Crescent,ST6 8DH,44.85,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,22,Rainford Close,ST7 4SX,59.12,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,22,Wendover Grove,ST2 0BD,49.92,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,6,Wendover Grove,ST2 0BD,49.92,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,16,Tierney Street,ST1 2EE,47.76,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,3,Westhead walk,ST1 4DR,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,2,Westhead walk,ST1 4DR,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,70C,4,Westhead walk,ST1 4DR,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,8,Westhead walk,ST1 4DR,48.16,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,69C,12,Easthead walk,ST1 4DZ,47.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,70C,6,Chichester walk ,ST1 2DD,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,8,Chichester walk ,ST1 2DD,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,69C,12,Chichester walk ,ST1 2DD,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,1,Bargrave street,ST2 0HQ,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,70C,12,Latebrook close,ST6 5NL,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,70C,92,Mount street,ST1 2NP,48.18,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,71C,79,Sun street,ST1 4JP,44.82,£500.00, +ECO4 - CAVITY ONLY,NONE,65D,70C,9,Margill close,ST1 4LG,48.18,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,1,MENDIP GREEN,ST2 7EL,46,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,71C,4,MENDIP GREEN,ST2 7EL,46,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,7,MENDIP GREEN,ST2 7EL,46,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,9,MENDIP GREEN,ST2 7EL,46,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,71C,7,BROCKLEHURST WAY,ST1 6HN,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,11,BROCKLEHURST WAY,ST1 6HN,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,33,BROCKLEHURST WAY,ST1 6HN,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,BATHROOM + TRICKLE VENTS,68D,71C,24,NOBLETT ROAD,ST1 6HJ,46,£525.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,50,NOBLETT ROAD,ST1 6HJ,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,71C,6,BOTANY BAY ROAD,ST1 6PX,50,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,71C,50,BOTANY BAY ROAD,ST1 6PX,40,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,70C,3,BOLD STREET,ST1 6PD,40,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,66D,69C,97,BOLD STREET,ST1 6PF,49,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,66D,70C,193,KEELINGS ROAD,ST1 6QR,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,66D,69C,11,HASLEMERE AVENUE,ST2 7AT,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,70C,14,KENDAL GROVE,ST2 0NE,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,4,MOFFAT GROVE,ST2 0RA,46,£750.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,66D,69C,100,ROSE STREET,ST1 6PG,49,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,70C,263,DAWLISH DRIVE,ST2 0HQ,49,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,67D,69C,6,PRIME STREET,ST1 6PS,40,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,67D,71C,13,TASMAN SQUARE,ST1 6RQ,50,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,68D,71C,16,GILES WALK,ST1 6RH,50,£400.00, +ECO4 - REMEDIAL CWI ONLY,TRICKLE VENTS,65D,69C,14,NEWLEIGH STREET,ST2 7AG,50,£400.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,66,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,68,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,67D,72C,70,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,72,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,76,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,78,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,80,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,82,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,71C,84,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,86,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,88,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,69C,90,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,92,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,64D,69C,94,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,70C,96,Chell Street,ST1 6B,46.54,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,63D,69C,37,The meadows ,M44 5AP,46.78,£750.00, +ECO4 - CAVITY ONLY,NONE,63D,69C,141,Rosary Road ,OL8 2SA,43.1,£750.00, +ECO4 - REMEDIAL CWI ONLY,Kitchen Extractor,65D,73C,66,BROOKHOUSE ROAD ,ST3 6BB,75.8,£600.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,62D,70C,206,GROVE ROAD,ST4 4LE,56.93,£525.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,68D,72C,98,CHAMBERLAIN AVENUE,ST4 5EQ,40.09,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,66D,72C,22,RICHMOND ROAD,ST4 8RH,45.5,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,67D,71C,109,CHRISTCHURCH STREET,ST4 3AJ,45.5,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,64D,70C,65,HILTON ROAD,ST4 6QZ,42.64,£400.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom Extractor,68D,73C,48,CAUSELEY ROAD,ST2 9HL,45.5,£525.00, +ECO4 - REMEDIAL CWI ONLY,NONE,65D,71C,50,CAUSELEY ROAD,ST2 9HL,45.5,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,72C,45,WESTFIELD ROAD,ST2 9HW,45.5,£750.00, +ECO4 - REMEDIAL CWI ONLY,Bathroom&Kitchen extractor,64D,70C,14,KESTEVEN WALK,ST2 9JF,45.5,£400.00, +ECO4 GBIS REMEDIAL - JJC <73m²,Kitchen Extractor,65D,68D,43,Albert Street,ST3 5ED,52.02,£375.00, +ECO4 GBIS REMEDIAL - JJC <73m²,NONE,66D,70C,35,Albert Street,ST3 5ED,52.02,£375.00, +ECO4 GBIS REMEDIAL - JJC <73m²,NONE,58D,64D,1,Havergal Walk,ST3 5ES,47.77,£375.00, +ECO4 GBIS REMEDIAL - JJC <73m²,NONE,59D,64D,3,Havergal Walk,ST3 5ES,47.77,£375.00, +ECO4 GBIS REMEDIAL - JJC <73m²,NONE,63D,67D,9,Havergal Walk,ST3 5ES,47.77,£375.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,2,Addington Way,ST3 5TQ,47.77,£500.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,71C,8,Addington Way,ST3 5TQ,47.77,£500.00, +ECO4 GBIS REMEDIAL - JJC <73m²,NONE,62D,66D,1,Walpole street,ST3 5TH,47.77,£375.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,75C,12,Tindal Street,SW9 6UP,85.28,£750.00, +ECO4 - CAVITY ONLY,All wet rooms need extractors,63D,72C,12,Melbourne Mews,SW9 6PY,82.8,£600.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,75C,11,Chrysell Road,SW9 6NQ,80.08,£750.00, +ECO4 - REMEDIAL CWI ONLY,NONE,68D,75C,20,Tindal Street,SW9 6UP,85.28,£750.00, +ECO4 GBIS REMEDIAL - JJC <73m²,NONE,63D,66D,8,Walpole street,ST3 5TH,47.77,£375.00, \ No newline at end of file diff --git a/etl/tests/test_csr_class.py b/etl/tests/test_csr_class.py new file mode 100644 index 0000000..db1524a --- /dev/null +++ b/etl/tests/test_csr_class.py @@ -0,0 +1,20 @@ +# A very simple script to read a presite note and load to a postgres database +import os +from etl.surveyedData.surveryedData import surveyedDataProcessor +from etl.db.db import get_db_session, init_db +from etl.transform.types import AssessorInfo +import pytest +from etl.jjc_invoice import work_out_total_floor_area + +@pytest.fixture(scope="module") +def pre_site_note_path(): + """Fixture for the path to the example pre-site note.""" + return os.path.join(os.getcwd(), "example_data", "csr_special_case.pdf") + +@pytest.fixture(scope="module") +def local_survey(pre_site_note_path): + """Fixture to create a surveyedDataProcessor instance.""" + return surveyedDataProcessor("122 Fake Street", [pre_site_note_path]) + +def test_material(local_survey): + assert local_survey.csr.insulation_info.type == "Foam" diff --git a/etl/utils/sharepoint/sharepoint.py b/etl/utils/sharepoint/sharepoint.py index 1d1de17..a366161 100644 --- a/etl/utils/sharepoint/sharepoint.py +++ b/etl/utils/sharepoint/sharepoint.py @@ -15,6 +15,7 @@ from etl.utils.logger import Logger import tempfile import os +# Api Documentation: https://learn.microsoft.com/en-us/graph/api/drive-get?view=graph-rest-1.0&tabs=http logger = Logger(name="SharePoint.py", level=logging.DEBUG).get_logger() @@ -88,7 +89,7 @@ def api_call_decorator(func): response = requests.request(http_method, url, headers=self.headers, json=data) # Handle the response - if response.status_code == 200: + if response.status_code == 200 or response.status_code == 201: response_json = response.json() # Store the response JSON if page_size: results.extend(response_json.get('value', [])) @@ -240,6 +241,8 @@ class SharePointClient: @api_call_decorator def list_folder_contents(self, folder_path: str, page_size: int = 100): """ + GET drive/root/children + This function will list the contents of a folder in SharePoint. :param drive_id: The ID of the drive. :param folder_path: The path of the folder. @@ -250,6 +253,28 @@ class SharePointClient: logger.debug(f"Listing folder contents from URL: {url}") return 'GET', url, None + + @api_call_decorator + def create_folder(self, file_name, folder_path): + """ + POST https://graph.microsoft.com/v1.0/me/drive/root/children + Content-Type: application/json + { + "name": "New Folder", + "folder": { }, + "@microsoft.graph.conflictBehavior": "rename" + } + + """ + data = { + "name": file_name, + "folder": { }, + "@microsoft.graph.conflictBehavior": "rename" + } + url = f"https://graph.microsoft.com/v1.0/drives/{self.document_drive_id}/root:/{folder_path}:/children" + + return 'POST', url, data + @staticmethod def download_sharepoint_file(download_url): """ diff --git a/example_data/csr_special_case.pdf b/example_data/csr_special_case.pdf new file mode 100644 index 0000000..d0a3f2a Binary files /dev/null and b/example_data/csr_special_case.pdf differ