made jjc automation work if I'm giving the survey sheet

This commit is contained in:
Jun-te Kim 2025-03-26 12:02:18 +00:00
parent 03ab469a11
commit 985942cc06
3 changed files with 123 additions and 222 deletions

View file

@ -12,7 +12,8 @@
"ms-python.python",
"ms-azuretools.vscode-docker",
"ms-toolsai.jupyter",
"mechatroner.rainbow-csv"
"mechatroner.rainbow-csv",
"ms-toolsai.datawrangler"
]
}
}

View file

@ -275,20 +275,20 @@ file_paths = [{'119 CUTNOOK LANE, M44 6LU': ['/tmp/sharepoint/Andy Rumfitt/W.C.
def get_band(score):
bands = [
("HIGH_A", 96, float("inf")),
("LOW_A", 92, 96),
("HIGH_B", 86, 92),
("LOW_B", 81, 86),
("HIGH_C", 74.5, 81),
("LOW_C", 69, 74.5),
("HIGH_D", 61.5, 69),
("LOW_D", 55, 61.5),
("HIGH_E", 46.5, 55),
("LOW_E", 39, 46.5),
("HIGH_F", 29.5, 39),
("LOW_F", 21, 29.5),
("HIGH_G", 10.5, 21),
("LOW_G", 1, 10.5),
("HIGH A", 96, float("inf")),
("LOW A", 92, 96),
("HIGH B", 86, 92),
("LOW B", 81, 86),
("HIGH C", 74.5, 81),
("LOW C", 69, 74.5),
("HIGH D", 61.5, 69),
("LOW D", 55, 61.5),
("HIGH E", 46.5, 55),
("LOW E", 39, 46.5),
("HIGH F", 29.5, 39),
("LOW F", 21, 29.5),
("HIGH G", 10.5, 21),
("LOW G", 1, 10.5),
]
for band, lower, upper in bands:
@ -320,7 +320,17 @@ def work_out_total_floor_area(pre_site_note):
total += add_all_floors(pre_site_note.property_description.ex4_proprerty.dimensions) if ext4 is True else 0
return math.ceil(total) if total%1 >=0.5 else math.floor(total)
floor_area = math.ceil(total) if total%1 >=0.5 else math.floor(total)
if 0 <= floor_area <= 72:
return '0-72m', floor_area
elif 73 <= floor_area <= 97:
return '73-97m', floor_area
elif 98 <= floor_area <= 199:
return '98-199m', floor_area
elif floor_area >= 200:
return 'over 200m', floor_area
else:
return 'Invalid floor area', floor_area
def fuzzy_match_address(row, target_address, threshold=90):
return fuzz.ratio(row, target_address) >= threshold
@ -378,14 +388,22 @@ def type_of_work(presap, postsap):
def get_trickle_vent(str):
if "vent" in str.lower():
return True
return 1
else:
return False
return 0
def get_sap_letter(str):
for char in str:
if char.isalpha():
return char.upper()
def get_sap_number(str):
num = ""
for char in str:
if char.isnumeric():
num+= char
return int(num)
def get_no_of_wet_rooms(str):
words = ["WC", "BATHROOM", "KITCHEN"]
@ -396,7 +414,6 @@ def get_no_of_wet_rooms(str):
return count
def get_insulation_type(str):
print(str.lower())
if "foam" in str.lower():
return "FOAM"
else:
@ -404,40 +421,44 @@ def get_insulation_type(str):
def get_jjc_price_matrix(file="empty.csv"):
rate_card_df = pd.read_csv(os.path.join(os.getcwd(), "ratecard", "jjcRateCards", file))
rate_card_df = pd.read_csv(os.path.join(os.getcwd(), "ratecard", "jjcRateCards", "empty.csv"))
df = pd.read_csv(os.path.join(os.getcwd(), "ratecard", "jjcRateCards", file))
price_table = []
converter = {
columns_to_check = {
"no extractors or ventilation required": {"Trickle Vent": 0, "wetrooms": 0},
"Trickle Vents ONLY": {"Trickle Vent": 1, "wetrooms": 0},
"1 wet room extractor required": {"Trickle Vent": 0, "wetrooms": 1},
"2 wet room extractor required": {"Trickle Vent": 0, "wetrooms": 2},
"3 wet room extractor required": {"Trickle Vent": 0, "wetrooms": 3},
'Trickle Vents + 1 wet room extractor': {"Trickle Vent": 1, "wetrooms": 1},
'Trickle Vents + 2 wet room extractor': {"Trickle Vent": 1, "wetrooms": 2},
'Trickle Vents + 3 wet room extractor': {"Trickle Vent": 1, "wetrooms": 3},
}
for key, value in rate_card_df.iterrows()
print(key)
print(value)
break
pricing_table = []
for _, row in df.iterrows():
for key, variables in columns_to_check.items():
pricing_table.append(
{
"funding": row["Funding"],
"floor_area_group": row["Total Floor Area"][:-1],
**variables,
"price": row[key][1:] if row[key] != "Not viable" else None,
}
)
pricing_table = pd.DataFrame(pricing_table)
return pricing_table
jjc_rate_card_reader()
jjc_rate_card_reader("foam.csv")
jjc_rate_card_reader("general.csv")
def main():
price_empty = get_jjc_price_matrix()
price_foam = get_jjc_price_matrix("foam.csv")
price_general = get_jjc_price_matrix("general.csv")
csv_file_path = os.path.join(os.getcwd(), "temp", "jjc_submissionData.csv")
submissionData = SubmissionReader(csv_file_path)
total_price = []
data = {
"Address": [],
"Surveyor's Name": [],
"Type of Work": [],
"Pre SAP": [],
"Total Floor Area": [],
"Empty/Cavity": [],
"Trickle Vent": [],
"No of wet rooms": [],
}
# jjc = SharePointScraper(SharePointInstaller.JJC)
# file_paths = jjc.download_file_for_each_address()
@ -447,7 +468,7 @@ def main():
list_of_surveys.append(surveyedDataProcessor(address, files))
for survey in list_of_surveys:
if survey.pre_site_note:
total_floor_area = work_out_total_floor_area(survey.pre_site_note)
floor_banding, total_floor_area = work_out_total_floor_area(survey.pre_site_note)
letter, number = survey.pre_site_note.survey_information.current_sap.split(" ")
pre_sap_score = number+letter
filtered_df = submissionData.df[submissionData.df["PRE INSTALL SAP SCORE"].apply(lambda x: x == pre_sap_score)]
@ -469,32 +490,72 @@ def main():
return num
filtered_df = filtered_df[filtered_df["NO"].apply(lambda x: get_num(house_no) == get_num(x))]
if not filtered_df.empty:
data["Address"].append(survey.address)
data["Surveyor's Name"].append(survey.pre_site_note.assessor_information.name)
data["Type of Work"].append(type_of_work(letter.upper(), get_sap_letter(filtered_df["POST INSTALL SAP SCORE"].values[0])))
data["Pre SAP"].append(survey.pre_site_note.survey_information.current_sap)
data["Total Floor Area"].append(total_floor_area)
data["Empty/Cavity"].append("NONE")
data["Trickle Vent"].append(str(get_trickle_vent(filtered_df["Ventilation Requirements"].values[0])))
data["No of wet rooms"].append(get_no_of_wet_rooms(filtered_df["Ventilation Requirements"].values[0]))
funding_type = type_of_work(letter.upper(), get_sap_letter(filtered_df["POST INSTALL SAP SCORE"].values[0]))
data = {
"Address": survey.address,
"Surveyor's Name": survey.pre_site_note.assessor_information.name,
"floor_area_group" : floor_banding,
"wetrooms" : get_no_of_wet_rooms(filtered_df["Ventilation Requirements"].values[0]),
"Trickle Vent" : int(get_trickle_vent(filtered_df["Ventilation Requirements"].values[0])),
}
insultation = None
merged_df = pd.DataFrame()
if survey.csr:
if survey.csr.insulation_info:
data["Empty/Cavity"].pop()
data["Empty/Cavity"].append(get_insulation_type(survey.csr.insulation_info.type))
data["Price"].append("Caluclating...")
insultation = get_insulation_type(survey.csr.insulation_info.type)
if funding_type == "GBIS":
data.update({"insulation": insultation})
if insultation is None:
data.update({"funding": funding_type.upper()})
df = pd.DataFrame([data])
merged_df = pd.merge(df, price_empty, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left')
elif "GENERAL" in insultation.upper():
data.update({"funding": funding_type.upper() + " Remedial"})
df = pd.DataFrame([data])
merged_df = pd.merge(df, price_general, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left')
elif "FOAM" in insultation.upper():
data.update({"funding": funding_type.upper() + " Remedial"})
df = pd.DataFrame([data])
merged_df = pd.merge(df, price_foam, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left')
else:
raise RuntimeError(f"unknonw insulation in gbis: {insultation}")
elif funding_type == "ECO4":
data.update({"insulation": insultation})
if insultation is None:
formatted_funding_type = f"{funding_type.upper()} - SAP {get_band(int(number))} to {get_band(get_sap_number(filtered_df["POST INSTALL SAP SCORE"].values[0]))}"
data.update({"funding": formatted_funding_type})
df = pd.DataFrame([data])
merged_df = pd.merge(df, price_empty, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left')
elif "GENERAL" in insultation.upper():
formatted_funding_type = f"REMEDIAL - {funding_type.upper()} - SAP {get_band(int(number))} to {get_band(get_sap_number(filtered_df["POST INSTALL SAP SCORE"].values[0]))}"
data.update({"funding": formatted_funding_type})
df = pd.DataFrame([data])
merged_df = pd.merge(df, price_general, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left')
elif "FOAM" in insultation.upper():
formatted_funding_type = f"REMEDIAL - {funding_type.upper()} - SAP {get_band(int(number))} to {get_band(get_sap_number(filtered_df["POST INSTALL SAP SCORE"].values[0]))}"
data.update({"funding": formatted_funding_type})
df = pd.DataFrame([data])
merged_df = pd.merge(df, price_foam, on=['funding', 'Trickle Vent', 'floor_area_group', 'wetrooms'], how='left')
else:
raise RuntimeError(f"unknonw insultation in eco4: {insultation}")
else:
raise RuntimeError(f"UNKNOWN FUNDING TYPE {funding_type}")
if not merged_df.empty:
total_price.append(merged_df)
final_df = pd.concat(total_price, ignore_index=True)
df = pd.DataFrame(data)
# Save to an Excel file
df.to_excel("survey_data.xlsx", index=False)
df.to_csv("survery_data.csv", index=False)
final_df.to_excel("survey_data.xlsx", index=False)
final_df.to_csv("survery_data.csv", index=False)
print(f"WEEK COMMENCING {WEEK_COMMENCING}")
print("Excel file 'survey_data.xlsx' created successfully!")

View file

@ -1,161 +0,0 @@
funding_type,floor_area,trickle_vent,number_of_wet_rooms,price
HIGH D TO HIGH C (ECO4),0-72m,0,0,-1
HIGH D TO HIGH C (ECO4),0-72m,0,1,-1
HIGH D TO HIGH C (ECO4),0-72m,0,2,-1
HIGH D TO HIGH C (ECO4),0-72m,0,3,-1
HIGH D TO HIGH C (ECO4),0-72m,1,0,-1
HIGH D TO HIGH C (ECO4),0-72m,1,1,-1
HIGH D TO HIGH C (ECO4),0-72m,1,2,-1
HIGH D TO HIGH C (ECO4),0-72m,1,3,-1
HIGH D TO HIGH C (ECO4),73-97m,0,0,-1
HIGH D TO HIGH C (ECO4),73-97m,0,1,-1
HIGH D TO HIGH C (ECO4),73-97m,0,2,-1
HIGH D TO HIGH C (ECO4),73-97m,0,3,-1
HIGH D TO HIGH C (ECO4),73-97m,1,0,-1
HIGH D TO HIGH C (ECO4),73-97m,1,1,-1
HIGH D TO HIGH C (ECO4),73-97m,1,2,-1
HIGH D TO HIGH C (ECO4),73-97m,1,3,-1
HIGH D TO HIGH C (ECO4),98-199m,0,0,-1
HIGH D TO HIGH C (ECO4),98-199m,0,1,-1
HIGH D TO HIGH C (ECO4),98-199m,0,2,-1
HIGH D TO HIGH C (ECO4),98-199m,0,3,-1
HIGH D TO HIGH C (ECO4),98-199m,1,0,-1
HIGH D TO HIGH C (ECO4),98-199m,1,1,-1
HIGH D TO HIGH C (ECO4),98-199m,1,2,-1
HIGH D TO HIGH C (ECO4),98-199m,1,3,-1
HIGH D TO HIGH C (ECO4),over 200m,0,0,-1
HIGH D TO HIGH C (ECO4),over 200m,0,1,-1
HIGH D TO HIGH C (ECO4),over 200m,0,2,-1
HIGH D TO HIGH C (ECO4),over 200m,0,3,-1
HIGH D TO HIGH C (ECO4),over 200m,1,0,-1
HIGH D TO HIGH C (ECO4),over 200m,1,1,-1
HIGH D TO HIGH C (ECO4),over 200m,1,2,-1
HIGH D TO HIGH C (ECO4),over 200m,1,3,-1
HIGH D TO LOW C (ECO4),0-72m,0,0,-1
HIGH D TO LOW C (ECO4),0-72m,0,1,-1
HIGH D TO LOW C (ECO4),0-72m,0,2,-1
HIGH D TO LOW C (ECO4),0-72m,0,3,-1
HIGH D TO LOW C (ECO4),0-72m,1,0,-1
HIGH D TO LOW C (ECO4),0-72m,1,1,-1
HIGH D TO LOW C (ECO4),0-72m,1,2,-1
HIGH D TO LOW C (ECO4),0-72m,1,3,-1
HIGH D TO LOW C (ECO4),73-97m,0,0,-1
HIGH D TO LOW C (ECO4),73-97m,0,1,-1
HIGH D TO LOW C (ECO4),73-97m,0,2,-1
HIGH D TO LOW C (ECO4),73-97m,0,3,-1
HIGH D TO LOW C (ECO4),73-97m,1,0,-1
HIGH D TO LOW C (ECO4),73-97m,1,1,-1
HIGH D TO LOW C (ECO4),73-97m,1,2,-1
HIGH D TO LOW C (ECO4),73-97m,1,3,-1
HIGH D TO LOW C (ECO4),98-199m,0,0,-1
HIGH D TO LOW C (ECO4),98-199m,0,1,-1
HIGH D TO LOW C (ECO4),98-199m,0,2,-1
HIGH D TO LOW C (ECO4),98-199m,0,3,-1
HIGH D TO LOW C (ECO4),98-199m,1,0,-1
HIGH D TO LOW C (ECO4),98-199m,1,1,-1
HIGH D TO LOW C (ECO4),98-199m,1,2,-1
HIGH D TO LOW C (ECO4),98-199m,1,3,-1
HIGH D TO LOW C (ECO4),over 200m,0,0,-1
HIGH D TO LOW C (ECO4),over 200m,0,1,-1
HIGH D TO LOW C (ECO4),over 200m,0,2,-1
HIGH D TO LOW C (ECO4),over 200m,0,3,-1
HIGH D TO LOW C (ECO4),over 200m,1,0,-1
HIGH D TO LOW C (ECO4),over 200m,1,1,-1
HIGH D TO LOW C (ECO4),over 200m,1,2,-1
HIGH D TO LOW C (ECO4),over 200m,1,3,-1
LOW D TO HIGH C (ECO4),0-72m,0,0,-1
LOW D TO HIGH C (ECO4),0-72m,0,1,-1
LOW D TO HIGH C (ECO4),0-72m,0,2,-1
LOW D TO HIGH C (ECO4),0-72m,0,3,-1
LOW D TO HIGH C (ECO4),0-72m,1,0,-1
LOW D TO HIGH C (ECO4),0-72m,1,1,-1
LOW D TO HIGH C (ECO4),0-72m,1,2,-1
LOW D TO HIGH C (ECO4),0-72m,1,3,-1
LOW D TO HIGH C (ECO4),73-97m,0,0,-1
LOW D TO HIGH C (ECO4),73-97m,0,1,-1
LOW D TO HIGH C (ECO4),73-97m,0,2,-1
LOW D TO HIGH C (ECO4),73-97m,0,3,-1
LOW D TO HIGH C (ECO4),73-97m,1,0,-1
LOW D TO HIGH C (ECO4),73-97m,1,1,-1
LOW D TO HIGH C (ECO4),73-97m,1,2,-1
LOW D TO HIGH C (ECO4),73-97m,1,3,-1
LOW D TO HIGH C (ECO4),98-199m,0,0,-1
LOW D TO HIGH C (ECO4),98-199m,0,1,-1
LOW D TO HIGH C (ECO4),98-199m,0,2,-1
LOW D TO HIGH C (ECO4),98-199m,0,3,-1
LOW D TO HIGH C (ECO4),98-199m,1,0,-1
LOW D TO HIGH C (ECO4),98-199m,1,1,-1
LOW D TO HIGH C (ECO4),98-199m,1,2,-1
LOW D TO HIGH C (ECO4),98-199m,1,3,-1
LOW D TO HIGH C (ECO4),over 200m,0,0,-1
LOW D TO HIGH C (ECO4),over 200m,0,1,-1
LOW D TO HIGH C (ECO4),over 200m,0,2,-1
LOW D TO HIGH C (ECO4),over 200m,0,3,-1
LOW D TO HIGH C (ECO4),over 200m,1,0,-1
LOW D TO HIGH C (ECO4),over 200m,1,1,-1
LOW D TO HIGH C (ECO4),over 200m,1,2,-1
LOW D TO HIGH C (ECO4),over 200m,1,3,-1
LOW D TO LOW C (ECO4),0-72m,0,0,-1
LOW D TO LOW C (ECO4),0-72m,0,1,-1
LOW D TO LOW C (ECO4),0-72m,0,2,-1
LOW D TO LOW C (ECO4),0-72m,0,3,-1
LOW D TO LOW C (ECO4),0-72m,1,0,-1
LOW D TO LOW C (ECO4),0-72m,1,1,-1
LOW D TO LOW C (ECO4),0-72m,1,2,-1
LOW D TO LOW C (ECO4),0-72m,1,3,-1
LOW D TO LOW C (ECO4),73-97m,0,0,--1
LOW D TO LOW C (ECO4),73-97m,0,1,-1
LOW D TO LOW C (ECO4),73-97m,0,2,-1
LOW D TO LOW C (ECO4),73-97m,0,3,-1
LOW D TO LOW C (ECO4),73-97m,1,0,-1
LOW D TO LOW C (ECO4),73-97m,1,1,-1
LOW D TO LOW C (ECO4),73-97m,1,2,-1
LOW D TO LOW C (ECO4),73-97m,1,3,-1
LOW D TO LOW C (ECO4),98-199m,0,0,-1
LOW D TO LOW C (ECO4),98-199m,0,1,-1
LOW D TO LOW C (ECO4),98-199m,0,2,-1
LOW D TO LOW C (ECO4),98-199m,0,3,-1
LOW D TO LOW C (ECO4),98-199m,1,0,-1
LOW D TO LOW C (ECO4),98-199m,1,1,-1
LOW D TO LOW C (ECO4),98-199m,1,2,-1
LOW D TO LOW C (ECO4),98-199m,1,3,-1
LOW D TO LOW C (ECO4),over 200m,0,0,-1
LOW D TO LOW C (ECO4),over 200m,0,1,-1
LOW D TO LOW C (ECO4),over 200m,0,2,-1
LOW D TO LOW C (ECO4),over 200m,0,3,-1
LOW D TO LOW C (ECO4),over 200m,1,0,-1
LOW D TO LOW C (ECO4),over 200m,1,1,-1
LOW D TO LOW C (ECO4),over 200m,1,2,-1
LOW D TO LOW C (ECO4),over 200m,1,3,-1
GBIS,0-72m,0,0,-1
GBIS,0-72m,0,1,-1
GBIS,0-72m,0,2,-1
GBIS,0-72m,0,3,-1
GBIS,0-72m,1,0,-1
GBIS,0-72m,1,1,-1
GBIS,0-72m,1,2,-1
GBIS,0-72m,1,3,-1
GBIS,73-97m,0,0,-1
GBIS,73-97m,0,1,-1
GBIS,73-97m,0,2,-1
GBIS,73-97m,0,3,-1
GBIS,73-97m,1,0,-1
GBIS,73-97m,1,1,-1
GBIS,73-97m,1,2,-1
GBIS,73-97m,1,3,-1
GBIS,98-199m,0,0,-1
GBIS,98-199m,0,1,-1
GBIS,98-199m,0,2,-1
GBIS,98-199m,0,3,-1
GBIS,98-199m,1,0,-1
GBIS,98-199m,1,1,-1
GBIS,98-199m,1,2,-1
GBIS,98-199m,1,3,-1
GBIS,over 200m,0,0,-1
GBIS,over 200m,0,1,-1
GBIS,over 200m,0,2,-1
GBIS,over 200m,0,3,-1
GBIS,over 200m,1,0,-1
GBIS,over 200m,1,1,-1
GBIS,over 200m,1,2,-1
GBIS,over 200m,1,3,-1
1 funding_type floor_area trickle_vent number_of_wet_rooms price
2 HIGH D TO HIGH C (ECO4) 0-72m 0 0 -1
3 HIGH D TO HIGH C (ECO4) 0-72m 0 1 -1
4 HIGH D TO HIGH C (ECO4) 0-72m 0 2 -1
5 HIGH D TO HIGH C (ECO4) 0-72m 0 3 -1
6 HIGH D TO HIGH C (ECO4) 0-72m 1 0 -1
7 HIGH D TO HIGH C (ECO4) 0-72m 1 1 -1
8 HIGH D TO HIGH C (ECO4) 0-72m 1 2 -1
9 HIGH D TO HIGH C (ECO4) 0-72m 1 3 -1
10 HIGH D TO HIGH C (ECO4) 73-97m 0 0 -1
11 HIGH D TO HIGH C (ECO4) 73-97m 0 1 -1
12 HIGH D TO HIGH C (ECO4) 73-97m 0 2 -1
13 HIGH D TO HIGH C (ECO4) 73-97m 0 3 -1
14 HIGH D TO HIGH C (ECO4) 73-97m 1 0 -1
15 HIGH D TO HIGH C (ECO4) 73-97m 1 1 -1
16 HIGH D TO HIGH C (ECO4) 73-97m 1 2 -1
17 HIGH D TO HIGH C (ECO4) 73-97m 1 3 -1
18 HIGH D TO HIGH C (ECO4) 98-199m 0 0 -1
19 HIGH D TO HIGH C (ECO4) 98-199m 0 1 -1
20 HIGH D TO HIGH C (ECO4) 98-199m 0 2 -1
21 HIGH D TO HIGH C (ECO4) 98-199m 0 3 -1
22 HIGH D TO HIGH C (ECO4) 98-199m 1 0 -1
23 HIGH D TO HIGH C (ECO4) 98-199m 1 1 -1
24 HIGH D TO HIGH C (ECO4) 98-199m 1 2 -1
25 HIGH D TO HIGH C (ECO4) 98-199m 1 3 -1
26 HIGH D TO HIGH C (ECO4) over 200m 0 0 -1
27 HIGH D TO HIGH C (ECO4) over 200m 0 1 -1
28 HIGH D TO HIGH C (ECO4) over 200m 0 2 -1
29 HIGH D TO HIGH C (ECO4) over 200m 0 3 -1
30 HIGH D TO HIGH C (ECO4) over 200m 1 0 -1
31 HIGH D TO HIGH C (ECO4) over 200m 1 1 -1
32 HIGH D TO HIGH C (ECO4) over 200m 1 2 -1
33 HIGH D TO HIGH C (ECO4) over 200m 1 3 -1
34 HIGH D TO LOW C (ECO4) 0-72m 0 0 -1
35 HIGH D TO LOW C (ECO4) 0-72m 0 1 -1
36 HIGH D TO LOW C (ECO4) 0-72m 0 2 -1
37 HIGH D TO LOW C (ECO4) 0-72m 0 3 -1
38 HIGH D TO LOW C (ECO4) 0-72m 1 0 -1
39 HIGH D TO LOW C (ECO4) 0-72m 1 1 -1
40 HIGH D TO LOW C (ECO4) 0-72m 1 2 -1
41 HIGH D TO LOW C (ECO4) 0-72m 1 3 -1
42 HIGH D TO LOW C (ECO4) 73-97m 0 0 -1
43 HIGH D TO LOW C (ECO4) 73-97m 0 1 -1
44 HIGH D TO LOW C (ECO4) 73-97m 0 2 -1
45 HIGH D TO LOW C (ECO4) 73-97m 0 3 -1
46 HIGH D TO LOW C (ECO4) 73-97m 1 0 -1
47 HIGH D TO LOW C (ECO4) 73-97m 1 1 -1
48 HIGH D TO LOW C (ECO4) 73-97m 1 2 -1
49 HIGH D TO LOW C (ECO4) 73-97m 1 3 -1
50 HIGH D TO LOW C (ECO4) 98-199m 0 0 -1
51 HIGH D TO LOW C (ECO4) 98-199m 0 1 -1
52 HIGH D TO LOW C (ECO4) 98-199m 0 2 -1
53 HIGH D TO LOW C (ECO4) 98-199m 0 3 -1
54 HIGH D TO LOW C (ECO4) 98-199m 1 0 -1
55 HIGH D TO LOW C (ECO4) 98-199m 1 1 -1
56 HIGH D TO LOW C (ECO4) 98-199m 1 2 -1
57 HIGH D TO LOW C (ECO4) 98-199m 1 3 -1
58 HIGH D TO LOW C (ECO4) over 200m 0 0 -1
59 HIGH D TO LOW C (ECO4) over 200m 0 1 -1
60 HIGH D TO LOW C (ECO4) over 200m 0 2 -1
61 HIGH D TO LOW C (ECO4) over 200m 0 3 -1
62 HIGH D TO LOW C (ECO4) over 200m 1 0 -1
63 HIGH D TO LOW C (ECO4) over 200m 1 1 -1
64 HIGH D TO LOW C (ECO4) over 200m 1 2 -1
65 HIGH D TO LOW C (ECO4) over 200m 1 3 -1
66 LOW D TO HIGH C (ECO4) 0-72m 0 0 -1
67 LOW D TO HIGH C (ECO4) 0-72m 0 1 -1
68 LOW D TO HIGH C (ECO4) 0-72m 0 2 -1
69 LOW D TO HIGH C (ECO4) 0-72m 0 3 -1
70 LOW D TO HIGH C (ECO4) 0-72m 1 0 -1
71 LOW D TO HIGH C (ECO4) 0-72m 1 1 -1
72 LOW D TO HIGH C (ECO4) 0-72m 1 2 -1
73 LOW D TO HIGH C (ECO4) 0-72m 1 3 -1
74 LOW D TO HIGH C (ECO4) 73-97m 0 0 -1
75 LOW D TO HIGH C (ECO4) 73-97m 0 1 -1
76 LOW D TO HIGH C (ECO4) 73-97m 0 2 -1
77 LOW D TO HIGH C (ECO4) 73-97m 0 3 -1
78 LOW D TO HIGH C (ECO4) 73-97m 1 0 -1
79 LOW D TO HIGH C (ECO4) 73-97m 1 1 -1
80 LOW D TO HIGH C (ECO4) 73-97m 1 2 -1
81 LOW D TO HIGH C (ECO4) 73-97m 1 3 -1
82 LOW D TO HIGH C (ECO4) 98-199m 0 0 -1
83 LOW D TO HIGH C (ECO4) 98-199m 0 1 -1
84 LOW D TO HIGH C (ECO4) 98-199m 0 2 -1
85 LOW D TO HIGH C (ECO4) 98-199m 0 3 -1
86 LOW D TO HIGH C (ECO4) 98-199m 1 0 -1
87 LOW D TO HIGH C (ECO4) 98-199m 1 1 -1
88 LOW D TO HIGH C (ECO4) 98-199m 1 2 -1
89 LOW D TO HIGH C (ECO4) 98-199m 1 3 -1
90 LOW D TO HIGH C (ECO4) over 200m 0 0 -1
91 LOW D TO HIGH C (ECO4) over 200m 0 1 -1
92 LOW D TO HIGH C (ECO4) over 200m 0 2 -1
93 LOW D TO HIGH C (ECO4) over 200m 0 3 -1
94 LOW D TO HIGH C (ECO4) over 200m 1 0 -1
95 LOW D TO HIGH C (ECO4) over 200m 1 1 -1
96 LOW D TO HIGH C (ECO4) over 200m 1 2 -1
97 LOW D TO HIGH C (ECO4) over 200m 1 3 -1
98 LOW D TO LOW C (ECO4) 0-72m 0 0 -1
99 LOW D TO LOW C (ECO4) 0-72m 0 1 -1
100 LOW D TO LOW C (ECO4) 0-72m 0 2 -1
101 LOW D TO LOW C (ECO4) 0-72m 0 3 -1
102 LOW D TO LOW C (ECO4) 0-72m 1 0 -1
103 LOW D TO LOW C (ECO4) 0-72m 1 1 -1
104 LOW D TO LOW C (ECO4) 0-72m 1 2 -1
105 LOW D TO LOW C (ECO4) 0-72m 1 3 -1
106 LOW D TO LOW C (ECO4) 73-97m 0 0 --1
107 LOW D TO LOW C (ECO4) 73-97m 0 1 -1
108 LOW D TO LOW C (ECO4) 73-97m 0 2 -1
109 LOW D TO LOW C (ECO4) 73-97m 0 3 -1
110 LOW D TO LOW C (ECO4) 73-97m 1 0 -1
111 LOW D TO LOW C (ECO4) 73-97m 1 1 -1
112 LOW D TO LOW C (ECO4) 73-97m 1 2 -1
113 LOW D TO LOW C (ECO4) 73-97m 1 3 -1
114 LOW D TO LOW C (ECO4) 98-199m 0 0 -1
115 LOW D TO LOW C (ECO4) 98-199m 0 1 -1
116 LOW D TO LOW C (ECO4) 98-199m 0 2 -1
117 LOW D TO LOW C (ECO4) 98-199m 0 3 -1
118 LOW D TO LOW C (ECO4) 98-199m 1 0 -1
119 LOW D TO LOW C (ECO4) 98-199m 1 1 -1
120 LOW D TO LOW C (ECO4) 98-199m 1 2 -1
121 LOW D TO LOW C (ECO4) 98-199m 1 3 -1
122 LOW D TO LOW C (ECO4) over 200m 0 0 -1
123 LOW D TO LOW C (ECO4) over 200m 0 1 -1
124 LOW D TO LOW C (ECO4) over 200m 0 2 -1
125 LOW D TO LOW C (ECO4) over 200m 0 3 -1
126 LOW D TO LOW C (ECO4) over 200m 1 0 -1
127 LOW D TO LOW C (ECO4) over 200m 1 1 -1
128 LOW D TO LOW C (ECO4) over 200m 1 2 -1
129 LOW D TO LOW C (ECO4) over 200m 1 3 -1
130 GBIS 0-72m 0 0 -1
131 GBIS 0-72m 0 1 -1
132 GBIS 0-72m 0 2 -1
133 GBIS 0-72m 0 3 -1
134 GBIS 0-72m 1 0 -1
135 GBIS 0-72m 1 1 -1
136 GBIS 0-72m 1 2 -1
137 GBIS 0-72m 1 3 -1
138 GBIS 73-97m 0 0 -1
139 GBIS 73-97m 0 1 -1
140 GBIS 73-97m 0 2 -1
141 GBIS 73-97m 0 3 -1
142 GBIS 73-97m 1 0 -1
143 GBIS 73-97m 1 1 -1
144 GBIS 73-97m 1 2 -1
145 GBIS 73-97m 1 3 -1
146 GBIS 98-199m 0 0 -1
147 GBIS 98-199m 0 1 -1
148 GBIS 98-199m 0 2 -1
149 GBIS 98-199m 0 3 -1
150 GBIS 98-199m 1 0 -1
151 GBIS 98-199m 1 1 -1
152 GBIS 98-199m 1 2 -1
153 GBIS 98-199m 1 3 -1
154 GBIS over 200m 0 0 -1
155 GBIS over 200m 0 1 -1
156 GBIS over 200m 0 2 -1
157 GBIS over 200m 0 3 -1
158 GBIS over 200m 1 0 -1
159 GBIS over 200m 1 1 -1
160 GBIS over 200m 1 2 -1
161 GBIS over 200m 1 3 -1