diff --git a/backend/app/db/functions/energy_assessment_functions.py b/backend/app/db/functions/energy_assessment_functions.py index 0970b71f..2d6a611e 100644 --- a/backend/app/db/functions/energy_assessment_functions.py +++ b/backend/app/db/functions/energy_assessment_functions.py @@ -1,6 +1,8 @@ from backend.app.db.models.energy_assessments import EnergyAssessment from sqlalchemy.orm import Session from sqlalchemy.exc import IntegrityError +from typing import Optional +from sqlalchemy import desc def bulk_insert_energy_assessments(session: Session, data_list): @@ -13,12 +15,12 @@ def bulk_insert_energy_assessments(session: Session, data_list): try: for data in data_list: uprn = data.get('uprn') - lodgement_date = data.get('lodgement_date') + inspection_date = data.get('inspection_date') - # Check if a record with the same uprn and lodgement_date exists + # Check if a record with the same uprn and inspection_date exists existing_record = session.query(EnergyAssessment).filter_by( uprn=uprn, - lodgement_date=lodgement_date + inspection_date=inspection_date ).first() if existing_record: @@ -39,3 +41,21 @@ def bulk_insert_energy_assessments(session: Session, data_list): # Rollback the session in case of error session.rollback() print(f"Error occurred: {e}") + + +def get_latest_assessment_by_uprn(session: Session, uprn: int) -> Optional[EnergyAssessment]: + """ + Retrieve the latest energy assessment for a given UPRN based on the inspection date. + + :param session: The database session + :param uprn: The unique property reference number + :return: The latest EnergyAssessment object or None if not found + """ + try: + # Query the EnergyAssessment model, filter by uprn, order by inspection_date in descending order + latest_assessment = session.query(EnergyAssessment).filter_by(uprn=uprn).order_by( + desc(EnergyAssessment.inspection_date)).first() + return latest_assessment.to_dict() if latest_assessment else {} + except Exception as e: + print(f"An error occurred: {e}") + return None diff --git a/backend/app/db/models/energy_assessments.py b/backend/app/db/models/energy_assessments.py index b6f7dd73..86230c00 100644 --- a/backend/app/db/models/energy_assessments.py +++ b/backend/app/db/models/energy_assessments.py @@ -119,3 +119,9 @@ class EnergyAssessment(Base): cylinder_insulation_type = Column(Text) cylinder_insulation_thickness = Column(Integer) cylinder_thermostat = Column(Boolean) + + def to_dict(self): + """ + Convert the SQLAlchemy object to a dictionary. + """ + return {column.name: getattr(self, column.name) for column in self.__table__.columns} diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 00e73b56..c73aff7e 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -21,6 +21,7 @@ from backend.app.db.functions.property_functions import ( from backend.app.db.functions.recommendations_functions import ( create_plan, create_plan_recommendations, upload_recommendations ) +from backend.app.db.functions.energy_assessment_functions import get_latest_assessment_by_uprn from backend.app.db.models.portfolio import rating_lookup from backend.app.dependencies import validate_token from backend.app.plan.schemas import PlanTriggerRequest, MdsRequest @@ -265,6 +266,7 @@ async def trigger_plan(body: PlanTriggerRequest): input_properties = [] for config in tqdm(plan_input): + # We validate each record in the file. If the record is NOT valid, we need to handle this accordingly uprn = config.get("uprn", None) if uprn: @@ -281,6 +283,10 @@ async def trigger_plan(body: PlanTriggerRequest): epc_searcher.ordnance_survey_client.property_type = config.get("property_type", None) # For the moment, our OS API access is unavailable, so we skip and interpolate epc_searcher.find_property(skip_os=True) + + # We check for an energy assessment we have performed on this property: + energy_assessment = get_latest_assessment_by_uprn(session, uprn) + # Create a record in db property_id, is_new = create_property( session, body.portfolio_id, epc_searcher.address_clean, epc_searcher.postcode_clean, epc_searcher.uprn diff --git a/etl/xml_survey_extraction/app.py b/etl/xml_survey_extraction/app.py index 0cb95332..beb47454 100644 --- a/etl/xml_survey_extraction/app.py +++ b/etl/xml_survey_extraction/app.py @@ -107,7 +107,7 @@ def main(): "already_installed_file_path": "", "patches_file_path": "", "non_invasive_recommendations_file_path": "", - "exclusions": "", + # "exclusions": [], "budget": None, } print(body)