diff --git a/backend/tests/test_funding.py b/backend/tests/test_funding.py index 8646ab27..ff264159 100644 --- a/backend/tests/test_funding.py +++ b/backend/tests/test_funding.py @@ -1395,7 +1395,7 @@ def test_private_epc_e_solar_with_heating_and_minimum_insulation_produces_uplift assert funding.eco4_funding and funding.eco4_funding > 0 -def test_existing_gshp_to_ashp(): +def test_existing_gshp_to_ashp(mock_project_scores_matrix, mock_partial_scores_matrix, mock_whlg_postcodes): r = {'phase': 3, 'parts': [], 'type': 'heating', 'measure_type': 'air_source_heat_pump', 'description': 'Install a 5KW air source heat pump, and upgrade heating controls to Smart Thermostats, ' 'room sensors and smart radiator valves (time & temperature zone control). Ensure you have a ' diff --git a/etl/epc_clean/tests/test_floor_attributes.py b/etl/epc_clean/tests/test_floor_attributes.py index fc60c343..887cb689 100644 --- a/etl/epc_clean/tests/test_floor_attributes.py +++ b/etl/epc_clean/tests/test_floor_attributes.py @@ -15,7 +15,12 @@ class TestCleanFloor: empty = FloorAttributes('') assert empty.nodata output = empty.process() - assert output == {"no_data": True} + assert output == { + 'thermal_transmittance': None, 'thermal_transmittance_unit': None, 'is_assumed': True, + 'is_to_unheated_space': False, 'is_to_external_air': False, 'is_suspended': True, + 'is_solid': False, 'another_property_below': False, 'insulation_thickness': 'none', + 'no_data': True + } # Test initialization with a description that contains none of the keywords with pytest.raises(ValueError): diff --git a/recommendations/tests/test_data/materials.py b/recommendations/tests/test_data/materials.py index 13b1ea08..3110ebe7 100644 --- a/recommendations/tests/test_data/materials.py +++ b/recommendations/tests/test_data/materials.py @@ -1,351 +1,1010 @@ import datetime materials = [ - { - 'id': 2484, - 'type': 'room_roof_insulation', - 'description': 'Room in roof insulation', - 'depth': 100, - 'depth_unit': 'mm', - 'cost_unit': 'gbp_per_m2', - 'r_value_per_mm': 0.038, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'SCIS', - 'created_at': '2025-03-16 15:26:22.379', - 'cost': None, - 'is_active': True, - 'prime_material_cost': None, - 'material_cost': 0.0, - 'labour_cost': 0.0, - 'labour_hours_per_unit': 0.0, - 'plant_cost': 0.0, - 'total_cost': 210.0, - 'notes': None, - 'is_installer_quote': True - }, - {'id': 1997, 'type': 'cavity_wall_insulation', 'description': 'Imperial Bead cavity wall insulation', 'depth': 75.0, + {'id': 3325, 'type': 'cavity_wall_insulation', 'description': 'Instabead EPS Bead insulation', 'depth': 75.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.030303031, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.033, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 14.21, - 'notes': None, 'is_installer_quote': True}, - {'id': 1998, 'type': 'mechanical_ventilation', 'description': 'Mechanical Extract Ventilation', 'depth': 0.0, - 'depth_unit': None, 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 18.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3326, 'type': 'cavity_wall_insulation', 'description': 'Mineral wool insulation', 'depth': 75.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.025, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.04, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 16.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3327, 'type': 'cavity_wall_extraction', 'description': 'Extraction of existing insulation', 'depth': 75.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, - 'link': 'SCIS', 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, + 'link': 'Instagroup', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, - 'plant_cost': 0.0, 'total_cost': 535.5, 'notes': None, 'is_installer_quote': True}, - {'id': 2015, 'type': 'loft_insulation', 'description': 'Knauf Loft Roll 44 glass fibre roll', 'depth': 100.0, + 'plant_cost': 0.0, 'total_cost': 25.0, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3328, 'type': 'cavity_wall_insulation', 'description': 'Instabead EPS Bead insulation', 'depth': 75.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.030303031, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.033, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 21.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3329, 'type': 'cavity_wall_insulation', 'description': 'Instabead EPS Bead insulation', 'depth': 75.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.030303031, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.033, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'J & J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 16.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3332, 'type': 'mechanical_ventilation', 'description': 'Decentralised mechanical extract ventilation', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Instagroup', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 480.0, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3333, 'type': 'trickle_vent', 'description': 'Trickle vent', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 45.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3334, 'type': 'door_undercut', 'description': 'Door undercut', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 45.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3335, 'type': 'door_undercut', 'description': 'Door undercut', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'CRG', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 45.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3336, 'type': 'trickle_vent', 'description': 'Trickle vent', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'CRG', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 45.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3337, 'type': 'mechanical_ventilation', 'description': 'Decentralised mechanical extract ventilation', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'CRG', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 280.0, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3358, 'type': 'loft_insulation', 'description': 'Knauf Loft Roll 44 glass fibre roll', 'depth': 200.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.09, 'plant_cost': 0.0, 'total_cost': 14.95, - 'notes': 'This is a placeholder cost until SCIS gives us a breakdown by thickness', 'is_installer_quote': True}, - {'id': 2016, 'type': 'loft_insulation', 'description': 'Knauf Loft Roll 44 glass fibre roll', 'depth': 200.0, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.11, 'plant_cost': 0.0, 'total_cost': 14.0, + 'notes': 'This is the cost if there is more than 100mm insulation in place', 'is_installer_quote': True, + 'innovation_rate': 0.0, 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, + 'battery_size': None}, + {'id': 3359, 'type': 'loft_insulation', 'description': 'Knauf Loft Roll 44 glass fibre roll', 'depth': 300.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.11, 'plant_cost': 0.0, 'total_cost': 15.525, - 'notes': 'This is a placeholder cost until SCIS gives us a breakdown by thickness', 'is_installer_quote': True}, - {'id': 2017, 'type': 'loft_insulation', 'description': 'Knauf Loft Roll 44 glass fibre roll', 'depth': 270.0, - 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.11, 'plant_cost': 0.0, 'total_cost': 15.0, + 'notes': 'This is the cost if there is less than 100mm existing insulation', 'is_installer_quote': True, + 'innovation_rate': 0.0, 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, + 'battery_size': None}, + {'id': 3360, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 100.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.11, 'plant_cost': 0.0, 'total_cost': 16.1, - 'notes': 'This is a placeholder cost until SCIS gives us a breakdown by thickness', 'is_installer_quote': True}, - {'id': 2018, 'type': 'loft_insulation', 'description': 'Knauf Loft Roll 44 glass fibre roll', 'depth': 300.0, - 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 17.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3361, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 200.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.11, 'plant_cost': 0.0, 'total_cost': 16.53, - 'notes': 'This is a placeholder cost until SCIS gives us a breakdown by thickness', 'is_installer_quote': True}, - {'id': 2039, 'type': 'internal_wall_insulation', 'description': 'SWIP EcoBatt', 'depth': 95.0, 'depth_unit': 'mm', - 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.03125, 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.032, 'thermal_conductivity_unit': None, 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 2.1, 'plant_cost': 0.0, 'total_cost': 244.8, - 'notes': 'We are awaiting further breakdown of costs by thickness and finishes', 'is_installer_quote': False}, - {'id': 2074, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 50.0, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 19.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3362, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 300.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 21.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3363, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 400.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 22.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3364, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 100.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'J&J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 14.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3365, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 200.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'J&J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 16.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3366, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 300.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'J&J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 18.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3367, 'type': 'loft_insulation', 'description': 'Fibre loft insulation', 'depth': 400.0, 'depth_unit': 'mm', + 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.022727273, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.044, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'J&J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 19.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3425, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 50.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 1.63, 'plant_cost': 0.0, 'total_cost': 75.0, - 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True}, - {'id': 2075, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 75.0, + 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3426, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 75.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 1.63, 'plant_cost': 0.0, 'total_cost': 93.75, - 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True}, - {'id': 2076, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 100.0, + 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3427, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 100.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 1.63, 'plant_cost': 0.0, 'total_cost': 112.5, - 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True}, - {'id': 2077, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 125.0, + 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3428, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 125.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 1.63, 'plant_cost': 0.0, 'total_cost': 112.5, - 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True}, - {'id': 2078, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 150.0, + 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3429, 'type': 'suspended_floor_insulation', 'description': 'Q-bot underfloor insulation', 'depth': 150.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 1.63, 'plant_cost': 0.0, 'total_cost': 150.0, - 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True}, - {'id': 2079, 'type': 'solid_floor_demolition', 'description': 'Removal of carpet and underfelt', 'depth': 0.0, + 'notes': 'Linearly interpolated based on Qbot costs', 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3430, 'type': 'suspended_floor_insulation', 'description': 'Underfloor mineral wool insulation', + 'depth': 100.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'J&J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': None, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3431, 'type': 'solid_floor_demolition', 'description': 'Removal of carpet and underfelt', 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, - 'link': 'SPONs', 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, + 'link': 'SPONs', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 3.32, 'labour_hours_per_unit': 0.11, 'plant_cost': 0.0, 'total_cost': 3.32, 'notes': 'We ignore the plant cost that is in SPONs because we assume the carpet is not scrapped and therefore ' 'there is no need for a skip', - 'is_installer_quote': False}, {'id': 2080, 'type': 'solid_floor_preparation', - 'description': 'clean surface of concrete to receive new damp-proof membrane', - 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, - 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': None, - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, - 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 4.36, - 'labour_hours_per_unit': 0.14, 'plant_cost': 0.0, 'total_cost': 4.36, 'notes': None, - 'is_installer_quote': False}, {'id': 2081, 'type': 'solid_floor_preparation', - 'description': 'Clean out crack to form a ' - '20mm×20mm groove and fill with ' - 'cement: mortar mixed with bonding ' - 'agent', - 'depth': 0.0, 'depth_unit': None, 'cost': None, - 'cost_unit': None, 'r_value_per_mm': None, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': None, - 'thermal_conductivity_unit': None, 'link': None, - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, - 52, 584553), - 'is_active': True, 'prime_material_cost': None, - 'material_cost': 6.91, 'labour_cost': 18.99, - 'labour_hours_per_unit': 0.61, 'plant_cost': 0.16, - 'total_cost': 26.06, - 'notes': 'This step is the assessment and repair ' - 'of any damage to the concrete floor such ' - 'as filling cracks or levelling uneven ' - 'areas', - 'is_installer_quote': False}, - {'id': 2082, 'type': 'solid_floor_vapour_barrier', 'description': 'Visqueen High Performance Vapour Barrier', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3432, 'type': 'solid_floor_preparation', + 'description': 'clean surface of concrete to receive new damp-proof membrane', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 4.36, 'labour_hours_per_unit': 0.14, 'plant_cost': 0.0, 'total_cost': 4.36, + 'notes': None, 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3433, 'type': 'solid_floor_preparation', + 'description': 'Clean out crack to form a 20mm×20mm groove and fill with cement: mortar mixed with bonding agent', 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, - 'link': 'SPONs', 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, + 'link': None, 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 6.91, 'labour_cost': 18.99, 'labour_hours_per_unit': 0.61, + 'plant_cost': 0.16, 'total_cost': 26.06, + 'notes': 'This step is the assessment and repair of any damage to the concrete floor such as filling cracks or ' + 'levelling uneven areas', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3434, 'type': 'solid_floor_vapour_barrier', 'description': 'Visqueen High Performance Vapour Barrier', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'SPONs', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': 0.58, 'material_cost': 1.21, 'labour_cost': 0.48, 'labour_hours_per_unit': 0.02, - 'plant_cost': 0.0, 'total_cost': 1.69, 'notes': None, 'is_installer_quote': False}, - {'id': 2083, 'type': 'solid_floor_insulation', 'description': 'Kay-Cel Expanded Polystyrene Board', 'depth': 25.0, - 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.030303031, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.033, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 3.88, 'labour_cost': 3.24, 'labour_hours_per_unit': 0.14, 'plant_cost': 0.0, 'total_cost': 7.12, - 'notes': None, 'is_installer_quote': False}, - {'id': 2084, 'type': 'solid_floor_insulation', 'description': 'Kay-Cel Expanded Polystyrene Board', 'depth': 50.0, - 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.030303031, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.033, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 6.62, 'labour_cost': 3.71, 'labour_hours_per_unit': 0.16, 'plant_cost': 0.0, 'total_cost': 10.33, - 'notes': None, 'is_installer_quote': False}, - {'id': 2085, 'type': 'solid_floor_insulation', 'description': 'Kay-Cel Expanded Polystyrene Board', 'depth': 75.0, - 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.030303031, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.033, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 9.3, 'labour_cost': 4.17, 'labour_hours_per_unit': 0.18, 'plant_cost': 0.0, 'total_cost': 13.47, - 'notes': None, 'is_installer_quote': False}, {'id': 2086, 'type': 'solid_floor_insulation', - 'description': 'Kingspan Thermafloor TF70 High Performance Rigid ' - 'Floor Insulation', - 'depth': 50.0, 'depth_unit': 'mm', 'cost': None, - 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), - 'is_active': True, 'prime_material_cost': None, - 'material_cost': 10.36, 'labour_cost': 4.06, - 'labour_hours_per_unit': 0.18, 'plant_cost': 0.0, - 'total_cost': 14.42, 'notes': None, 'is_installer_quote': False}, - {'id': 2087, 'type': 'solid_floor_insulation', - 'description': 'Kingspan Thermafloor TF70 High Performance Rigid Floor Insulation', 'depth': 75.0, - 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 15.35, 'labour_cost': 4.06, 'labour_hours_per_unit': 0.18, 'plant_cost': 0.0, 'total_cost': 19.41, - 'notes': None, 'is_installer_quote': False}, {'id': 2088, 'type': 'solid_floor_insulation', - 'description': 'Ecotherm Eco-Versal General Purpose Insulation ' - 'Board', - 'depth': 30.0, 'depth_unit': 'mm', 'cost': None, - 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), - 'is_active': True, 'prime_material_cost': 6.16, - 'material_cost': 16.73, 'labour_cost': 28.34, - 'labour_hours_per_unit': 1.2, 'plant_cost': 0.0, 'total_cost': 45.07, - 'notes': None, 'is_installer_quote': False}, - {'id': 2089, 'type': 'solid_floor_insulation', - 'description': 'Ecotherm Eco-Versal General Purpose Insulation Board', 'depth': 50.0, 'depth_unit': 'mm', - 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': 8.46, - 'material_cost': 19.1, 'labour_cost': 28.34, 'labour_hours_per_unit': 1.2, 'plant_cost': 0.0, 'total_cost': 47.44, - 'notes': None, 'is_installer_quote': False}, {'id': 2090, 'type': 'solid_floor_insulation', - 'description': 'Ecotherm Eco-Versal General Purpose Insulation ' - 'Board', - 'depth': 60.0, 'depth_unit': 'mm', 'cost': None, - 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'https://londonbuildingsupplies.co.uk/products/60mm--ecotherm-eco-versal-general-purpose-pir-insulation-board---2.4m-x-1.2m-x-60mm.html', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), - 'is_active': True, 'prime_material_cost': None, - 'material_cost': 24.081198, 'labour_cost': 28.34, - 'labour_hours_per_unit': 1.2, 'plant_cost': 0.0, - 'total_cost': 52.421196, - 'notes': "This material isn't in SPONs but checking online, " - "is around 92% of the cost of the 100mm", - 'is_installer_quote': False}, - {'id': 2091, 'type': 'solid_floor_insulation', - 'description': 'Ecotherm Eco-Versal General Purpose Insulation Board', 'depth': 70.0, 'depth_unit': 'mm', - 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'https://londonbuildingsupplies.co.uk/products/70mm--ecotherm-eco-versal-general-purpose-pir-insulation' - '-board---2.4m-x-1.2m-x-70mm.html', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 27.089088, 'labour_cost': 28.34, 'labour_hours_per_unit': 1.2, 'plant_cost': 0.0, - 'total_cost': 55.42909, - 'notes': "This material isn't in SPONs but checking online, is around 104% of the cost of the 100mm (more " - "expensive than 100mm)", - 'is_installer_quote': False}, {'id': 2092, 'type': 'solid_floor_insulation', - 'description': 'Ecotherm Eco-Versal General Purpose Insulation Board', - 'depth': 100.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', - 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'SPONs', 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), - 'is_active': True, 'prime_material_cost': 15.12, 'material_cost': 25.96, - 'labour_cost': 30.7, 'labour_hours_per_unit': 1.3, 'plant_cost': 0.0, - 'total_cost': 56.66, 'notes': None, 'is_installer_quote': False}, - {'id': 2093, 'type': 'solid_floor_insulation', 'description': 'Ravatherm XPS X 500 SL Polystyrene Foam', - 'depth': 50.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.032258064, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.031, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 11.07, 'labour_cost': 10.66, 'labour_hours_per_unit': 0.46, 'plant_cost': 0.0, - 'total_cost': 21.73, - 'notes': "In Spons, the thermal conductivity is 0.033 however the datasheet indicates it's 0.32: " - "https://ravagobuildingsolutions.com/uk/wp-content/uploads/sites/30/2022/08/ravatherm-xps-x-500-sl-tds" - "-version-1-20210901.pdf", - 'is_installer_quote': False}, - {'id': 2094, 'type': 'solid_floor_insulation', 'description': 'Ravatherm XPS X 500 SL Polystyrene Foam', - 'depth': 75.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.03125, - 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.032, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 16.28, 'labour_cost': 10.66, 'labour_hours_per_unit': 0.46, 'plant_cost': 0.0, - 'total_cost': 26.94, 'notes': None, 'is_installer_quote': False}, {'id': 2095, 'type': 'solid_floor_redecoration', - 'description': 'Screeded beds; protection to ' - 'compressible formwork ' - 'exceeding 600mm wide', - 'depth': 0.0, 'depth_unit': None, 'cost': None, - 'cost_unit': None, 'r_value_per_mm': None, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': None, - 'thermal_conductivity_unit': None, - 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, - 42, 52, 584553), - 'is_active': True, 'prime_material_cost': 9.6, - 'material_cost': 9.89, 'labour_cost': 2.67, - 'labour_hours_per_unit': 0.15, - 'plant_cost': 0.0, 'total_cost': 12.56, - 'notes': 'This is the screed layer, ' - 'placed on top of the insulation', - 'is_installer_quote': False}, - {'id': 2096, 'type': 'solid_floor_redecoration', 'description': 'Fitting carpet', 'depth': 0.0, 'depth_unit': None, + 'plant_cost': 0.0, 'total_cost': 1.69, 'notes': None, 'is_installer_quote': False, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3447, 'type': 'solid_floor_redecoration', + 'description': 'Screeded beds; protection to compressible formwork exceeding 600mm wide', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'SPONs', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': 9.6, 'material_cost': 9.89, 'labour_cost': 2.67, 'labour_hours_per_unit': 0.15, + 'plant_cost': 0.0, 'total_cost': 12.56, 'notes': 'This is the screed layer, placed on top of the insulation', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3448, 'type': 'solid_floor_redecoration', 'description': 'Fitting carpet', 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 6.59, 'labour_hours_per_unit': 0.37, 'plant_cost': 0.0, 'total_cost': 6.59, 'notes': 'SPONs does not have data on re-fitting the carpet so we use the data in Fitted carpeting; Gradus woven ' 'polypropylene tufted loop\n\n as a baseline. We assume re-use of carpets, therefore we need just ' 'labour rates', - 'is_installer_quote': False}, {'id': 2097, 'type': 'solid_floor_redecoration', - 'description': 'Fitting existing softwood skirting or architrave to new frames; ' - '150mm high', - 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, - 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'SPONs', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, - 'prime_material_cost': None, 'material_cost': 0.01, 'labour_cost': 4.87, - 'labour_hours_per_unit': 0.12, 'plant_cost': 0.0, 'total_cost': 4.88, 'notes': None, - 'is_installer_quote': False}, {'id': 2132, 'type': 'external_wall_insulation', - 'description': 'EWI Pro EPS external wall ' - 'insulation system with Brick Slip ' - 'finish', - 'depth': 150.0, 'depth_unit': 'mm', 'cost': None, - 'cost_unit': 'gbp_per_m2', - 'r_value_per_mm': 0.02631579, - 'r_value_unit': 'square_meter_kelvin_per_watt', - 'thermal_conductivity': 0.038, - 'thermal_conductivity_unit': 'watt_per_meter_kelvin', - 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, - 52, 584553), - 'is_active': True, 'prime_material_cost': None, - 'material_cost': 0.0, 'labour_cost': 0.0, - 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, - 'total_cost': 298.35, - 'notes': 'This is the quoted value from SCIS', - 'is_installer_quote': True}, - {'id': 2133, 'type': 'low_energy_lighting_installation', 'description': 'Installation of fittings and cost of bub', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3449, 'type': 'solid_floor_redecoration', + 'description': 'Fitting existing softwood skirting or architrave to new frames; 150mm high', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'SPONs', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.01, 'labour_cost': 4.87, 'labour_hours_per_unit': 0.12, + 'plant_cost': 0.0, 'total_cost': 4.88, 'notes': None, 'is_installer_quote': False, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3484, 'type': 'external_wall_insulation', + 'description': 'EWI Pro EPS external wall insulation system with Brick Slip finish', 'depth': 150.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.02631579, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.038, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 298.35, + 'notes': 'This is the quoted value from SCIS', 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, + 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3486, 'type': 'low_energy_lighting_installation', 'description': 'Installation of fittings and cost of bub', 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, - 'link': 'https://www.checkatrade.com/blog/cost-guides/cost-install-downlights/ ' - 'https://www.hamuch.com/cost/led-spot-light#:~:text=It%20costs%20an%20average%20of,' - 'will%20drive%20up%20the%20cost.', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, - 'material_cost': 20.0, 'labour_cost': 15.0, 'labour_hours_per_unit': 0.8, 'plant_cost': 0.0, 'total_cost': 35.0, + 'link': 'JJC', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.05, + 'plant_cost': 0.0, 'total_cost': 3.5, 'notes': 'We estimate the unit economics from the checkatrade article. We assume that the average job consists ' 'of installing 6 lights based on the hamuch article. We use the median value of 400 for a job of 6 ' 'lights', - 'is_installer_quote': False}, - {'id': 2147, 'type': 'flat_roof_insulation', 'description': 'Ecotherm Eco-Versal General Purpose Insulation Board', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3500, 'type': 'flat_roof_insulation', 'description': 'Ecotherm Eco-Versal General Purpose Insulation Board', 'depth': 150.0, 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', - 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, 'prime_material_cost': None, + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 195.0, 'notes': 'Rough estimate based on a quote from Nic on 30th May, but the cost is just a rough estimate', - 'is_installer_quote': True}, - {'id': 2149, 'type': 'windows_glazing', 'description': 'REHAU PVCu Casement Windows', 'depth': 0.0, + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3502, 'type': 'windows_glazing', 'description': 'REHAU PVCu Casement Windows', 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, - 'link': 'SCIS', 'created_at': datetime.datetime(2024, 9, 24, 13, 42, 52, 584553), 'is_active': True, + 'link': 'SCIS', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, - 'plant_cost': 0.0, 'total_cost': 1140.0, 'notes': None, 'is_installer_quote': True} + 'plant_cost': 0.0, 'total_cost': 1140.0, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3504, 'type': 'room_roof_insulation', 'description': 'Room in roof insulation', 'depth': 100.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SCIS', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 130.0, + 'notes': 'Assumed u-value products', 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': None, + 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3505, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 4728.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 1.74, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3506, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 4998.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 2.175, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3507, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 5292.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 2.61, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3508, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 5562.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 3.045, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3509, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 5832.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 3.48, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3510, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6102.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 3.915, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3511, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6720.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 4.35, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3512, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6990.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 4.785, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3513, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 7260.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 5.22, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3514, 'type': 'solar_pv', 'description': 'InstaGen 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 7530.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.45, 'size': 5.655, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3515, 'type': 'solar_pv', 'description': 'Trina Vertex S3 445W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Coactivation', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5692.21, 'notes': '445W panels', 'is_installer_quote': True, + 'innovation_rate': 0.0, 'size': 4.45, 'size_unit': 'kWp', 'includes_scaffolding': True, 'includes_battery': False, + 'battery_size': None}, + {'id': 3516, 'type': 'solar_pv', 'description': 'Trina Vertex S3 445W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Coactivation', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5892.21, 'notes': '445W panels', 'is_installer_quote': True, + 'innovation_rate': 0.0, 'size': 5.34, 'size_unit': 'kWp', 'includes_scaffolding': True, 'includes_battery': False, + 'battery_size': None}, + {'id': 3517, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 4440.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 1.74, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3518, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 4625.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 2.18, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3519, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 4810.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 2.61, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3520, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 4995.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 3.05, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3521, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 5195.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 3.48, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3522, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 5395.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 3.92, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3523, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 5575.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 4.35, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3524, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6140.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 4.79, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3525, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6370.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 5.22, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3526, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6560.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 5.66, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3527, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 6810.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 6.09, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3528, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 7060.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 6.53, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3529, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 7310.0, + 'notes': '435W panels', 'is_installer_quote': True, 'innovation_rate': 0.25, 'size': 6.96, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3530, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5985.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 3.48, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3531, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6185.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 3.92, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3532, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6385.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 4.35, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3533, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6950.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 4.79, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3534, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7180.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 5.22, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3535, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7370.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 5.66, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3536, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7620.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 6.09, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3537, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7870.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 6.53, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3538, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 5.8Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 8120.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 6.96, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 5.8}, + {'id': 3539, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6595.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 3.48, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3540, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6795.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 3.92, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3541, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6995.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 4.35, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3542, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7560.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 4.79, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3543, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7790.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 5.22, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3544, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 7990.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 5.66, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3545, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 8240.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 6.09, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3546, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 8490.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 6.53, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3547, 'type': 'solar_pv', 'description': 'UKSol 435W solar panels with 10Kw Growatt battery', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 8740.0, 'notes': '435W panels', 'is_installer_quote': True, + 'innovation_rate': 0.25, 'size': 6.96, 'size_unit': 'kWp', 'includes_scaffolding': False, 'includes_battery': True, + 'battery_size': 10.0}, + {'id': 3548, 'type': 'solar_pv', 'description': '4 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 3940.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 1.6, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3549, 'type': 'solar_pv', 'description': '5 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4000.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 2.0, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3550, 'type': 'solar_pv', 'description': '6 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4060.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 2.4, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3551, 'type': 'solar_pv', 'description': '7 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4120.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 2.8, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3552, 'type': 'solar_pv', 'description': '8 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4220.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 3.2, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3553, 'type': 'solar_pv', 'description': '9 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4320.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 3.6, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3554, 'type': 'solar_pv', 'description': '10 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4420.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 4.0, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3555, 'type': 'solar_pv', 'description': '11 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4540.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 4.4, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3556, 'type': 'solar_pv', 'description': '12 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4640.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 4.8, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3557, 'type': 'solar_pv', 'description': '13 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4740.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 5.2, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3558, 'type': 'solar_pv', 'description': '14 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 4900.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 5.6, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3559, 'type': 'solar_pv', 'description': '15 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5020.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 6.0, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3560, 'type': 'solar_pv', 'description': '16 panel system, 400W solar panels', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5150.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 6.4, 'size_unit': 'kWp', 'includes_scaffolding': False, + 'includes_battery': False, 'battery_size': None}, + {'id': 3561, 'type': 'solar_pv', 'description': '8 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5010.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 3.2, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3562, 'type': 'solar_pv', 'description': '9 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5110.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 3.6, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3563, 'type': 'solar_pv', 'description': '10 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5210.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 4.0, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3564, 'type': 'solar_pv', 'description': '11 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5330.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 4.4, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3565, 'type': 'solar_pv', 'description': '12 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5430.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 4.8, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3566, 'type': 'solar_pv', 'description': '13 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5530.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 5.2, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3567, 'type': 'solar_pv', 'description': '14 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5690.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 5.6, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3568, 'type': 'solar_pv', 'description': '15 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5810.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 6.0, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3569, 'type': 'solar_pv', 'description': '16 panel system, 400W solar panels, 5.8kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5960.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 6.4, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 5.8}, + {'id': 3570, 'type': 'solar_pv', 'description': '8 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5620.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 3.2, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3571, 'type': 'solar_pv', 'description': '9 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5720.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 3.6, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3572, 'type': 'solar_pv', 'description': '10 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5820.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 4.0, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3573, 'type': 'solar_pv', 'description': '11 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 5940.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 4.4, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3574, 'type': 'solar_pv', 'description': '12 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6040.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 4.8, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3575, 'type': 'solar_pv', 'description': '13 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6140.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 5.2, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3576, 'type': 'solar_pv', 'description': '14 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6290.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 5.6, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3577, 'type': 'solar_pv', 'description': '15 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6440.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 6.0, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3578, 'type': 'solar_pv', 'description': '16 panel system, 400W solar panels, 10kw Growatt battery', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 6600.0, 'notes': 'Assumed 400W panels but not specified', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': 6.4, 'size_unit': 'kWp', + 'includes_scaffolding': False, 'includes_battery': True, 'battery_size': 10.0}, + {'id': 3579, 'type': 'solar_battery', 'description': 'Battery add on', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'J&J Crump', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 3769.89, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 5.0, 'size_unit': 'kW', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3580, 'type': 'high_heat_retention_storage_heaters', + 'description': 'Quantum Dimplex 50 high heat retention electric storage heaters', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1029.3, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 500.0, 'size_unit': 'watt', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3581, 'type': 'high_heat_retention_storage_heaters', + 'description': 'Quantum Dimplex 70 high heat retention electric storage heaters', 'depth': 0.0, 'depth_unit': None, + 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1095.5, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 700.0, 'size_unit': 'watt', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3582, 'type': 'high_heat_retention_storage_heaters', + 'description': 'Quantum Dimplex 100 high heat retention electric storage heaters', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 1189.95, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': 1000.0, 'size_unit': 'watt', 'includes_scaffolding': False, 'includes_battery': False, + 'battery_size': None}, {'id': 3583, 'type': 'high_heat_retention_storage_heaters', + 'description': 'Quantum Dimplex 125 high heat retention electric storage heaters', + 'depth': 0.0, 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, + 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, + 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1292.73, 'notes': None, + 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 1250.0, 'size_unit': 'watt', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3584, 'type': 'high_heat_retention_storage_heaters', + 'description': 'Quantum Dimplex 150 high heat retention electric storage heaters', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': None, 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 1372.8, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': 1500.0, 'size_unit': 'watt', 'includes_scaffolding': False, 'includes_battery': False, + 'battery_size': None}, + {'id': 3585, 'type': 'scaffolding', 'description': 'Scaffolding', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 900.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 1.0, 'size_unit': 'storey', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3586, 'type': 'scaffolding', 'description': 'Scaffolding', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1320.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 2.0, 'size_unit': 'storey', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3587, 'type': 'scaffolding', 'description': 'Scaffolding', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Instagroup', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1440.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 3.0, 'size_unit': 'storey', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3588, 'type': 'scaffolding', 'description': 'Scaffolding', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 850.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 1.0, 'size_unit': 'storey', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3589, 'type': 'scaffolding', 'description': 'Scaffolding', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1100.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 2.0, 'size_unit': 'storey', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3590, 'type': 'scaffolding', 'description': 'Scaffolding', 'depth': 0.0, 'depth_unit': None, 'cost': None, + 'cost_unit': None, 'r_value_per_mm': None, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': None, 'thermal_conductivity_unit': None, 'link': 'Warm Front', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, 'plant_cost': 0.0, 'total_cost': 1550.0, + 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, 'size': 3.0, 'size_unit': 'storey', + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3591, 'type': 'sealing_fireplace', 'description': 'Sealing of an open fireplace', 'depth': 0.0, + 'depth_unit': None, 'cost': None, 'cost_unit': 'gbp_per_unit', 'r_value_per_mm': None, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': None, 'thermal_conductivity_unit': None, + 'link': 'Warm Front', 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 0.0, + 'plant_cost': 0.0, 'total_cost': 185.0, 'notes': None, 'is_installer_quote': True, 'innovation_rate': 0.0, + 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3439, 'type': 'solid_floor_insulation', + 'description': 'Kingspan Thermafloor TF70 High Performance Rigid Floor Insulation', 'depth': 75.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.045454547, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.022, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', 'link': 'SPONs', + 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, 'prime_material_cost': None, + 'material_cost': 15.35, 'labour_cost': 4.06, 'labour_hours_per_unit': 0.18, 'plant_cost': 0.0, 'total_cost': 80.0, + 'notes': 'Has been updated based on checkatrade: ' + 'https://www.checkatrade.com/blog/cost-guides/floor-insulation-cost/', + 'is_installer_quote': False, 'innovation_rate': 0.0, 'size': None, 'size_unit': None, + 'includes_scaffolding': False, 'includes_battery': False, 'battery_size': None}, + {'id': 3390, 'type': 'internal_wall_insulation', 'description': 'SWIP EcoBatt & Plastered finish', 'depth': 95.0, + 'depth_unit': 'mm', 'cost': None, 'cost_unit': 'gbp_per_m2', 'r_value_per_mm': 0.03125, + 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.032, 'thermal_conductivity_unit': None, + 'link': None, 'created_at': datetime.datetime(2025, 8, 15, 16, 31, 52, 995292), 'is_active': True, + 'prime_material_cost': None, 'material_cost': 0.0, 'labour_cost': 0.0, 'labour_hours_per_unit': 2.1, + 'plant_cost': 0.0, 'total_cost': 195.0, + 'notes': 'This is a manual override based on the costing from Eco Approach 14/01/2026', 'is_installer_quote': True, + 'innovation_rate': 0.0, 'size': None, 'size_unit': None, 'includes_scaffolding': False, 'includes_battery': False, + 'battery_size': None} ] diff --git a/recommendations/tests/test_window_recommendations.py b/recommendations/tests/test_window_recommendations.py index 51a3118e..56e775c7 100644 --- a/recommendations/tests/test_window_recommendations.py +++ b/recommendations/tests/test_window_recommendations.py @@ -1,5 +1,6 @@ import pytest import pickle +import numpy as np from recommendations.WindowsRecommendations import WindowsRecommendations from backend.Property import Property from recommendations.tests.test_data.materials import materials @@ -245,12 +246,16 @@ class TestWindowRecommendations: address='1', epc_record=epc_record ) - property_6.windows = {'original_description': 'Single glazed', 'has_glazing': False, 'glazing_coverage': None, - 'glazing_type': 'single', - 'no_data': False} + property_6.windows = { + 'original_description': 'Single glazed', 'clean_description': 'Single glazed', + 'has_glazing': False, 'glazing_coverage': None, + 'glazing_type': 'single', + 'no_data': False + } property_6.number_of_windows = 7 property_6.restricted_measures = True property_6.is_heritage = True + property_6.already_installed = [] recommender6 = WindowsRecommendations(property_instance=property_6, materials=materials) @@ -258,26 +263,18 @@ class TestWindowRecommendations: recommender6.recommend() - assert recommender6.recommendation == [ - { - 'phase': 0, 'parts': [], 'type': 'windows_glazing', 'measure_type': 'secondary_glazing', - 'description': 'Install secondary glazing to all windows. Secondary glazing recommended due to ' - 'herigate building status', - 'starting_u_value': None, 'new_u_value': None, 'sap_points': None, 'already_installed': False, - 'total': 7980.0, 'labour_hours': 0.0, 'labour_days': 0.0, 'is_secondary_glazing': True, - 'description_simulation': { - 'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good', - 'windows-description': 'Full secondary glazing', - 'glazed-type': 'secondary glazing' - }, - 'simulation_config': { - 'has_glazing_ending': True, 'glazing_coverage_ending': 'full', - 'glazing_type_ending': 'secondary', 'multi_glaze_proportion_ending': 100, - 'windows_energy_eff_ending': 'Good', 'glazed_type_ending': 'secondary glazing' - }, - "survey": None - }, - ] + assert len(recommender6.recommendation) == 1 + assert recommender6.recommendation[0]["total"] == np.float64(7980.0) + assert recommender6.recommendation[0]["phase"] == 0 + assert recommender6.recommendation[0]["contingency"] == np.float64(1197.0) + assert recommender6.recommendation[0]["description"] == ( + 'Install secondary glazing to all windows. Secondary glazing recommended due to herigate building status' + ) + assert recommender6.recommendation[0]["simulation_config"] == { + 'has_glazing_ending': True, 'glazing_coverage_ending': 'full', 'glazing_type_ending': 'secondary', + 'multi_glaze_proportion_ending': 100, 'windows_energy_eff_ending': 'Good', + 'glazed_type_ending': 'secondary glazing' + } def test_full_triple_glazed(self): epc_record = EPCRecord() @@ -292,10 +289,14 @@ class TestWindowRecommendations: address='1', epc_record=epc_record ) - property_7.windows = {'original_description': 'Fully triple glazed', 'has_glazing': True, - 'glazing_coverage': 'full', - 'glazing_type': 'triple', 'no_data': False} + property_7.windows = { + 'original_description': 'Fully triple glazed', 'clean_description': 'Fully triple glazed', + 'has_glazing': True, + 'glazing_coverage': 'full', + 'glazing_type': 'triple', 'no_data': False + } property_7.number_of_windows = 7 + property_7.already_installed = [] recommender7 = WindowsRecommendations(property_instance=property_7, materials=materials) @@ -394,7 +395,9 @@ class TestWindowRecommendations: epc_record=epc_record ) property_9.windows = { - 'original_description': 'Single glazed', 'has_glazing': False, 'glazing_coverage': None, + 'original_description': 'Single glazed', + 'clean_description': 'Single glazed', + 'has_glazing': False, 'glazing_coverage': None, 'glazing_type': 'single', 'no_data': False } @@ -403,6 +406,7 @@ class TestWindowRecommendations: property_9.number_of_windows = 7 property_9.restricted_measures = False property_9.is_heritage = False + property_9.already_installed = [] recommender9 = WindowsRecommendations(property_instance=property_9, materials=materials) @@ -410,26 +414,10 @@ class TestWindowRecommendations: recommender9.recommend() - assert recommender9.recommendation == [ - { - 'phase': 0, 'parts': [], 'type': 'windows_glazing', 'measure_type': 'double_glazing', - 'description': 'Install double glazing to all windows', 'starting_u_value': None, 'new_u_value': None, - 'sap_points': None, 'already_installed': False, 'total': 7980.0, 'labour_hours': 0.0, - 'labour_days': 0.0, 'is_secondary_glazing': False, - 'description_simulation': { - 'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good', - 'windows-description': 'Fully double glazed', - 'glazed-type': 'double glazing installed during or after 2002' - }, - 'simulation_config': { - 'has_glazing_ending': True, 'glazing_coverage_ending': 'full', - 'glazing_type_ending': 'double', 'multi_glaze_proportion_ending': 100, - 'windows_energy_eff_ending': 'Good', - 'glazed_type_ending': 'double glazing installed during or after 2002' - }, - "survey": None - } - ] + assert recommender9.recommendation[0]["total"] == np.float64(7980.0) + assert recommender9.recommendation[0]["phase"] == 0 + assert recommender9.recommendation[0]["description"] == 'Install double glazing to all windows' + assert recommender9.recommendation[0]["contingency"] == np.float64(1197.0) # We now simulate the outcome windows_rec = recommender9.recommendation.copy() @@ -537,8 +525,10 @@ class TestWindowRecommendations: 'mainheatc_energy_eff_ending': 'Average', 'lighting_energy_eff_starting': 'Very Good', 'lighting_energy_eff_ending': 'Very Good', 'number_habitable_rooms_starting': 4.0, 'number_habitable_rooms_ending': 4.0, 'number_heated_rooms_starting': 4.0, - 'number_heated_rooms_ending': 4.0, 'days_to_starting': 3642, 'days_to_ending': 3642, - 'estimated_perimeter_starting': 23.430749027719962, 'estimated_perimeter_ending': 23.430749027719962 + 'number_heated_rooms_ending': 4.0, 'is_post_sap10_starting': False, 'is_post_sap10_ending': False, + 'lodgement_date_starting': '2024-07-21', 'lodgement_date_ending': '2024-07-21', 'days_to_starting': 3642, + 'days_to_ending': 3642, 'estimated_perimeter_starting': 23.430749027719962, + 'estimated_perimeter_ending': 23.430749027719962 } assert starting_record == expected_base_difference_record @@ -553,104 +543,168 @@ class TestWindowRecommendations: assert len(simulated_data) == 1 expected_simulated_outcome = { - 'uprn': 200001041444, 'rdsap_change': 0, 'heat_demand_change': 0, 'carbon_change': 0.0, + 'uprn': 200001041444, 'rdsap_change': 0, 'heat_demand_change': 0, + 'carbon_change': 0.0, 'potential_energy_efficiency': 82.0, 'environment_impact_potential': 79.0, - 'energy_consumption_potential': 155.0, 'co2_emissions_potential': 1.7, 'property_type': 'House', - 'built_form': 'Semi-Detached', 'constituency': 'E14000909', 'number_habitable_rooms': 4.0, - 'number_heated_rooms': 4.0, 'construction_age_band': 'England and Wales: before 1900', + 'energy_consumption_potential': 155.0, 'co2_emissions_potential': 1.7, + 'property_type': 'House', + 'built_form': 'Semi-Detached', 'constituency': 'E14000909', + 'number_habitable_rooms': 4.0, + 'number_heated_rooms': 4.0, + 'construction_age_band': 'England and Wales: before 1900', 'fixed_lighting_outlets_count': 7.0, 'walls_thermal_transmittance': 1.7, - 'walls_thermal_transmittance_unit': 'Unknown', 'is_cavity_wall': False, 'is_filled_cavity': False, + 'walls_thermal_transmittance_unit': 'Unknown', 'is_cavity_wall': False, + 'is_filled_cavity': False, 'is_solid_brick': True, 'is_system_built': False, 'is_timber_frame': False, - 'is_granite_or_whinstone': False, 'is_as_built': True, 'is_cob': False, 'walls_is_assumed': True, - 'is_sandstone_or_limestone': False, 'is_park_home': False, 'walls_insulation_thickness': 'none', - 'external_insulation': False, 'internal_insulation': False, 'floor_thermal_transmittance': 0.96, - 'is_to_unheated_space': False, 'is_to_external_air': False, 'is_suspended': False, 'is_solid': True, - 'another_property_below': False, 'floor_insulation_thickness': 'none', 'roof_thermal_transmittance': 2.3, - 'is_pitched': True, 'is_roof_room': False, 'is_loft': False, 'is_flat': False, 'is_thatched': False, - 'is_at_rafters': False, 'has_dwelling_above': False, 'roof_insulation_thickness': 'none', - 'heater_type': 'Unknown', 'system_type': 'from main system', 'thermostat_characteristics': 'Unknown', - 'heating_scope': 'Unknown', 'energy_recovery': 'Unknown', 'hotwater_tariff_type': 'Unknown', - 'extra_features': 'Unknown', 'chp_systems': 'Unknown', 'distribution_system': 'Unknown', - 'no_system_present': 'Unknown', 'appliance': 'Unknown', 'has_radiators': True, 'has_fan_coil_units': False, - 'has_pipes_in_screed_above_insulation': False, 'has_pipes_in_insulated_timber_floor': False, - 'has_pipes_in_concrete_slab': False, 'has_boiler': True, 'has_air_source_heat_pump': False, - 'has_room_heaters': False, 'has_electric_storage_heaters': False, 'has_warm_air': False, + 'is_granite_or_whinstone': False, + 'is_as_built': True, 'is_cob': False, 'walls_is_assumed': True, + 'is_sandstone_or_limestone': False, + 'is_park_home': False, 'walls_insulation_thickness': 'none', + 'external_insulation': False, + 'internal_insulation': False, 'floor_thermal_transmittance': 0.96, + 'is_to_unheated_space': False, + 'is_to_external_air': False, 'is_suspended': False, 'is_solid': True, + 'another_property_below': False, + 'floor_insulation_thickness': 'none', 'roof_thermal_transmittance': 2.3, + 'is_pitched': True, + 'is_roof_room': False, 'is_loft': False, 'is_flat': False, 'is_thatched': False, + 'is_at_rafters': False, + 'has_dwelling_above': False, 'roof_insulation_thickness': 'none', + 'heater_type': 'Unknown', + 'system_type': 'from main system', 'thermostat_characteristics': 'Unknown', + 'heating_scope': 'Unknown', + 'energy_recovery': 'Unknown', 'hotwater_tariff_type': 'Unknown', + 'extra_features': 'Unknown', + 'chp_systems': 'Unknown', 'distribution_system': 'Unknown', + 'no_system_present': 'Unknown', + 'appliance': 'Unknown', 'has_radiators': True, 'has_fan_coil_units': False, + 'has_pipes_in_screed_above_insulation': False, + 'has_pipes_in_insulated_timber_floor': False, + 'has_pipes_in_concrete_slab': False, 'has_boiler': True, + 'has_air_source_heat_pump': False, + 'has_room_heaters': False, 'has_electric_storage_heaters': False, + 'has_warm_air': False, 'has_electric_underfloor_heating': False, 'has_electric_ceiling_heating': False, - 'has_community_scheme': False, 'has_ground_source_heat_pump': False, 'has_no_system_present': False, + 'has_community_scheme': False, 'has_ground_source_heat_pump': False, + 'has_no_system_present': False, 'has_portable_electric_heaters': False, 'has_water_source_heat_pump': False, - 'has_electric_heat_pump': False, 'has_micro-cogeneration': False, 'has_solar_assisted_heat_pump': False, - 'has_exhaust_source_heat_pump': False, 'has_community_heat_pump': False, 'has_electric': False, - 'has_mains_gas': True, 'has_wood_logs': False, 'has_coal': False, 'has_oil': False, - 'has_wood_pellets': False, 'has_anthracite': False, 'has_dual_fuel_mineral_and_wood': False, - 'has_smokeless_fuel': False, 'has_lpg': False, 'has_b30k': False, 'has_electricaire': False, - 'has_assumed_for_most_rooms': False, 'has_underfloor_heating': False, - 'thermostatic_control': 'room thermostat', 'charging_system': 'Unknown', 'switch_system': 'programmer', + 'has_electric_heat_pump': False, + 'has_micro-cogeneration': False, 'has_solar_assisted_heat_pump': False, + 'has_exhaust_source_heat_pump': False, + 'has_community_heat_pump': False, 'has_electric': False, 'has_mains_gas': True, + 'has_wood_logs': False, + 'has_coal': False, 'has_oil': False, 'has_wood_pellets': False, + 'has_anthracite': False, + 'has_dual_fuel_mineral_and_wood': False, 'has_smokeless_fuel': False, + 'has_lpg': False, 'has_b30k': False, + 'has_electricaire': False, 'has_assumed_for_most_rooms': False, + 'has_underfloor_heating': False, + 'thermostatic_control': 'room thermostat', 'charging_system': 'Unknown', + 'switch_system': 'programmer', 'no_control': 'Unknown', 'dhw_control': 'Unknown', 'community_heating': 'Unknown', - 'multiple_room_thermostats': False, 'auxiliary_systems': 'Unknown', 'trvs': 'Unknown', + 'multiple_room_thermostats': False, 'auxiliary_systems': 'Unknown', + 'trvs': 'Unknown', 'rate_control': 'Unknown', 'glazing_type': 'single', 'fuel_type': 'mains gas', 'main-fuel_tariff_type': 'Unknown', 'is_community': False, - 'no_individual_heating_or_community_network': False, 'complex_fuel_type': 'Unknown', - 'walls_thermal_transmittance_ending': 1.7, 'walls_thermal_transmittance_unit_ending': 'Unknown', - 'is_filled_cavity_ending': False, 'is_as_built_ending': True, 'walls_is_assumed_ending': True, + 'no_individual_heating_or_community_network': False, + 'complex_fuel_type': 'Unknown', + 'walls_thermal_transmittance_ending': 1.7, + 'walls_thermal_transmittance_unit_ending': 'Unknown', + 'is_filled_cavity_ending': False, 'is_as_built_ending': True, + 'walls_is_assumed_ending': True, 'is_park_home_ending': False, 'walls_insulation_thickness_ending': 'none', 'external_insulation_ending': False, 'internal_insulation_ending': False, - 'floor_thermal_transmittance_ending': 0.96, 'floor_insulation_thickness_ending': 'none', + 'floor_thermal_transmittance_ending': 0.96, + 'floor_insulation_thickness_ending': 'none', 'roof_thermal_transmittance_ending': 2.3, 'is_at_rafters_ending': False, 'roof_insulation_thickness_ending': 'none', 'heater_type_ending': 'Unknown', - 'system_type_ending': 'from main system', 'thermostat_characteristics_ending': 'Unknown', + 'system_type_ending': 'from main system', + 'thermostat_characteristics_ending': 'Unknown', 'heating_scope_ending': 'Unknown', 'energy_recovery_ending': 'Unknown', 'hotwater_tariff_type_ending': 'Unknown', 'extra_features_ending': 'Unknown', - 'chp_systems_ending': 'Unknown', 'distribution_system_ending': 'Unknown', - 'no_system_present_ending': 'Unknown', 'appliance_ending': 'Unknown', 'has_radiators_ending': True, - 'has_fan_coil_units_ending': False, 'has_pipes_in_screed_above_insulation_ending': False, - 'has_pipes_in_insulated_timber_floor_ending': False, 'has_pipes_in_concrete_slab_ending': False, - 'has_boiler_ending': True, 'has_air_source_heat_pump_ending': False, 'has_room_heaters_ending': False, + 'chp_systems_ending': 'Unknown', + 'distribution_system_ending': 'Unknown', 'no_system_present_ending': 'Unknown', + 'appliance_ending': 'Unknown', + 'has_radiators_ending': True, 'has_fan_coil_units_ending': False, + 'has_pipes_in_screed_above_insulation_ending': False, + 'has_pipes_in_insulated_timber_floor_ending': False, + 'has_pipes_in_concrete_slab_ending': False, 'has_boiler_ending': True, + 'has_air_source_heat_pump_ending': False, 'has_room_heaters_ending': False, 'has_electric_storage_heaters_ending': False, 'has_warm_air_ending': False, - 'has_electric_underfloor_heating_ending': False, 'has_electric_ceiling_heating_ending': False, + 'has_electric_underfloor_heating_ending': False, + 'has_electric_ceiling_heating_ending': False, 'has_community_scheme_ending': False, 'has_ground_source_heat_pump_ending': False, - 'has_no_system_present_ending': False, 'has_portable_electric_heaters_ending': False, - 'has_water_source_heat_pump_ending': False, 'has_electric_heat_pump_ending': False, - 'has_micro-cogeneration_ending': False, 'has_solar_assisted_heat_pump_ending': False, - 'has_exhaust_source_heat_pump_ending': False, 'has_community_heat_pump_ending': False, - 'has_electric_ending': False, 'has_mains_gas_ending': True, 'has_wood_logs_ending': False, - 'has_coal_ending': False, 'has_oil_ending': False, 'has_wood_pellets_ending': False, + 'has_no_system_present_ending': False, + 'has_portable_electric_heaters_ending': False, + 'has_water_source_heat_pump_ending': False, + 'has_electric_heat_pump_ending': False, + 'has_micro-cogeneration_ending': False, + 'has_solar_assisted_heat_pump_ending': False, + 'has_exhaust_source_heat_pump_ending': False, + 'has_community_heat_pump_ending': False, + 'has_electric_ending': False, 'has_mains_gas_ending': True, + 'has_wood_logs_ending': False, + 'has_coal_ending': False, 'has_oil_ending': False, + 'has_wood_pellets_ending': False, 'has_anthracite_ending': False, 'has_dual_fuel_mineral_and_wood_ending': False, - 'has_smokeless_fuel_ending': False, 'has_lpg_ending': False, 'has_b30k_ending': False, + 'has_smokeless_fuel_ending': False, 'has_lpg_ending': False, + 'has_b30k_ending': False, 'has_electricaire_ending': False, 'has_assumed_for_most_rooms_ending': False, - 'has_underfloor_heating_ending': False, 'thermostatic_control_ending': 'room thermostat', - 'charging_system_ending': 'Unknown', 'switch_system_ending': 'programmer', 'no_control_ending': 'Unknown', + 'has_underfloor_heating_ending': False, + 'thermostatic_control_ending': 'room thermostat', + 'charging_system_ending': 'Unknown', 'switch_system_ending': 'programmer', + 'no_control_ending': 'Unknown', 'dhw_control_ending': 'Unknown', 'community_heating_ending': 'Unknown', - 'multiple_room_thermostats_ending': False, 'auxiliary_systems_ending': 'Unknown', 'trvs_ending': 'Unknown', - 'rate_control_ending': 'Unknown', 'glazing_type_ending': 'double', 'fuel_type_ending': 'mains gas', + 'multiple_room_thermostats_ending': False, 'auxiliary_systems_ending': 'Unknown', + 'trvs_ending': 'Unknown', + 'rate_control_ending': 'Unknown', 'glazing_type_ending': 'double', + 'fuel_type_ending': 'mains gas', 'main-fuel_tariff_type_ending': 'Unknown', 'is_community_ending': False, - 'no_individual_heating_or_community_network_ending': False, 'complex_fuel_type_ending': 'Unknown', - 'sap_starting': 47, 'sap_ending': 47, 'heat_demand_starting': 478, 'heat_demand_ending': 478, - 'carbon_starting': 5.1, 'carbon_ending': 5.1, 'lighting_cost_starting': 91.0, 'lighting_cost_ending': 91.0, - 'heating_cost_starting': 1677.0, 'heating_cost_ending': 1677.0, 'hot_water_cost_starting': 161.0, + 'no_individual_heating_or_community_network_ending': False, + 'complex_fuel_type_ending': 'Unknown', + 'sap_starting': 47, 'sap_ending': 47, 'heat_demand_starting': 478, + 'heat_demand_ending': 478, + 'carbon_starting': 5.1, 'carbon_ending': 5.1, 'lighting_cost_starting': 91.0, + 'lighting_cost_ending': 91.0, + 'heating_cost_starting': 1677.0, 'heating_cost_ending': 1677.0, + 'hot_water_cost_starting': 161.0, 'hot_water_cost_ending': 161.0, 'mechanical_ventilation_starting': 'natural', - 'mechanical_ventilation_ending': 'natural', 'secondheat_description_starting': 'None', + 'mechanical_ventilation_ending': 'natural', + 'secondheat_description_starting': 'None', 'secondheat_description_ending': 'None', 'glazed_type_starting': 'not defined', 'glazed_type_ending': 'double glazing installed during or after 2002', - 'multi_glaze_proportion_starting': 0.0, 'multi_glaze_proportion_ending': 100, - 'low_energy_lighting_starting': 100.0, 'low_energy_lighting_ending': 100.0, - 'number_open_fireplaces_starting': 0.0, 'number_open_fireplaces_ending': 0.0, - 'solar_water_heating_flag_starting': 'N', 'solar_water_heating_flag_ending': 'N', - 'photo_supply_starting': 0.0, 'photo_supply_ending': 0.0, 'transaction_type_starting': 'rental', - 'transaction_type_ending': 'rental', 'energy_tariff_starting': 'dual', 'energy_tariff_ending': 'dual', - 'extension_count_starting': 3.0, 'extension_count_ending': 3.0, 'total_floor_area_starting': 61.0, - 'total_floor_area_ending': 61.0, 'floor_height_starting': 2.37, 'floor_height_ending': 2.37, - 'hot_water_energy_eff_starting': 'Good', 'hot_water_energy_eff_ending': 'Good', + 'multi_glaze_proportion_starting': 0.0, + 'multi_glaze_proportion_ending': 100, 'low_energy_lighting_starting': 100.0, + 'low_energy_lighting_ending': 100.0, 'number_open_fireplaces_starting': 0.0, + 'number_open_fireplaces_ending': 0.0, 'solar_water_heating_flag_starting': 'N', + 'solar_water_heating_flag_ending': 'N', 'photo_supply_starting': 0.0, + 'photo_supply_ending': 0.0, + 'transaction_type_starting': 'rental', 'transaction_type_ending': 'rental', + 'energy_tariff_starting': 'dual', + 'energy_tariff_ending': 'dual', 'extension_count_starting': 3.0, + 'extension_count_ending': 3.0, + 'total_floor_area_starting': 61.0, 'total_floor_area_ending': 61.0, + 'floor_height_starting': 2.37, + 'floor_height_ending': 2.37, 'hot_water_energy_eff_starting': 'Good', + 'hot_water_energy_eff_ending': 'Good', 'floor_energy_eff_starting': 'NO_RATING', 'floor_energy_eff_ending': 'NO_RATING', 'windows_energy_eff_starting': 'Very Poor', 'windows_energy_eff_ending': 'Good', 'walls_energy_eff_starting': 'Very Poor', 'walls_energy_eff_ending': 'Very Poor', - 'sheating_energy_eff_starting': 'NO_RATING', 'sheating_energy_eff_ending': 'NO_RATING', + 'sheating_energy_eff_starting': 'NO_RATING', + 'sheating_energy_eff_ending': 'NO_RATING', 'roof_energy_eff_starting': 'Very Poor', 'roof_energy_eff_ending': 'Very Poor', 'mainheat_energy_eff_starting': 'Good', 'mainheat_energy_eff_ending': 'Good', - 'mainheatc_energy_eff_starting': 'Average', 'mainheatc_energy_eff_ending': 'Average', - 'lighting_energy_eff_starting': 'Very Good', 'lighting_energy_eff_ending': 'Very Good', + 'mainheatc_energy_eff_starting': 'Average', + 'mainheatc_energy_eff_ending': 'Average', + 'lighting_energy_eff_starting': 'Very Good', + 'lighting_energy_eff_ending': 'Very Good', 'number_habitable_rooms_starting': 4.0, 'number_habitable_rooms_ending': 4.0, - 'number_heated_rooms_starting': 4.0, 'number_heated_rooms_ending': 4.0, 'days_to_starting': 3642, - 'days_to_ending': 3713, 'estimated_perimeter_starting': 23.430749027719962, + 'number_heated_rooms_starting': 4.0, 'number_heated_rooms_ending': 4.0, + 'is_post_sap10_starting': False, + 'is_post_sap10_ending': False, 'lodgement_date_starting': '2024-07-21', + 'lodgement_date_ending': '2024-07-21', + 'days_to_starting': 3642, 'days_to_ending': 4189, + 'estimated_perimeter_starting': 23.430749027719962, 'estimated_perimeter_ending': 23.430749027719962, 'has_glazing_ending': True, 'glazing_coverage_ending': 'full', 'id': '1+1' }