From 985bda46bda841602e0f51c7953fb2470c6d0968 Mon Sep 17 00:00:00 2001 From: stupidcomputer Date: Mon, 24 Jun 2024 04:57:57 -0500 Subject: [PATCH] generate final reports and such --- main.py | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/main.py b/main.py index 826741e..6716b84 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,14 @@ from openpyxl import Workbook from openpyxl.utils import get_column_letter from openpyxl.styles import Font +from openpyxl.chart import ( + PieChart, + ProjectedPieChart, + Reference +) + +from openpyxl.chart.series import DataPoint + def convert_x_y_to_col_id(x, y): return get_column_letter(x) + str(y) @@ -145,6 +153,119 @@ def handle_spreadsheet_decoration(ws, providers, persons, commleads, onsiteleads ws.merge_cells("A5:H5") ws.merge_cells("A6:H6") +def get_all_data_points_from_all_sites(manifest): + files_to_read = [] + record_objects = [] + for site in manifest["sites"]: + files_to_read.append(site["usedrecord"]) + + for file in files_to_read: + handle = open("data/" + file, "r") + handle_data = json.loads(handle.read()) + + payload = handle_data["payload"] + record_objects += payload + + return record_objects + +def dict_to_2d_array(dictionary, keylambda=lambda x: x): + return [(keylambda(k), v) for k, v in dictionary.items()] + +def correct_dict_with_none_values(dictionary): + try: + dictionary["unk"] += dictionary[None] + del dictionary[None] + except KeyError: + pass + + return dictionary + +def generate_final_report_data(ws): + fd = open("data/manifest.json", "r") + manifest = json.loads(fd.read()) + + global_data_points = get_all_data_points_from_all_sites(manifest) + total_sites = len(manifest["sites"]) + + children = [] + for person in global_data_points: + if person["age"] == "c": + children.append(person) + + aggregation = aggregate_demographic_totals(global_data_points, False, False, False, False) + children_aggregation = aggregate_demographic_totals(children, False, False, False, False) + + total_children = children_aggregation["age"]["c"] + total_girls = children_aggregation["gender"]["f"] + total_boys = children_aggregation["gender"]["m"] + race_breakdown = sorted(dict_to_2d_array(correct_dict_with_none_values(children_aggregation["race"]), mapper)) + ethnicity_breakdown = sorted(dict_to_2d_array(correct_dict_with_none_values(children_aggregation["ethnicity"]), mapper)) + + gender_breakdown = [ + ["Gender", "Count"], + ["Boys", total_boys], + ["Girls", total_girls], + ] + + race_breakdown.insert(0, ["Race", "Count"]) + + final_report_data_to_append = [ + ["Final Report", ""], + ["", ""], + ["Gender Breakdown", ""], + *gender_breakdown, + ["", ""], + ["Race Breakdown", ""], + *race_breakdown, + ["", ""], + ["Ethnicity Breakdown", ""], + *ethnicity_breakdown, + ["", ""], + ["Total Children Served", ""], + [total_girls + total_boys, ""], + ["", ""], + ["Number of Sites", ""], + [total_sites, ""], + ["", ""], + ["Average Children per Site", ""], + [(total_girls + total_boys) / total_sites, ""], + ] + + for row in final_report_data_to_append: + ws.append(row) + + gender_pie = PieChart() + data = Reference(ws, min_col=2, min_row=5, max_row=5 + len(gender_breakdown) - 2) + labels = Reference(ws, min_col=1, min_row=5, max_row=5 + len(gender_breakdown) - 2) + gender_pie.add_data(data) + gender_pie.set_categories(labels) + gender_pie.title = "Gender Breakdown" + ws.add_chart(gender_pie, "D1") + + race_pie = PieChart() + data = Reference(ws, min_col=2, min_row=5 + len(gender_breakdown) + 2, max_row=5 + len(gender_breakdown) + len(race_breakdown)) + labels = Reference(ws, min_col=1, min_row=5 + len(gender_breakdown) + 2, max_row=5 + len(gender_breakdown) + len(race_breakdown)) + race_pie.add_data(data) + race_pie.set_categories(labels) + race_pie.title = "Race Breakdown" + ws.add_chart(race_pie, "D17") + + ethnicity_pie = PieChart() + data = Reference(ws, min_col=2, min_row=18, max_row=19) + labels = Reference(ws, min_col=1, min_row=18, max_row=19) + ethnicity_pie.add_data(data) + ethnicity_pie.set_categories(labels) + ethnicity_pie.title = "Ethnicity Breakdown" + ws.add_chart(ethnicity_pie, "D33") + + ws.column_dimensions["A"].width = 27 + + print(children_aggregation) + print(total_children, total_girls, total_boys) + print(race_breakdown) + print(final_report_data_to_append) + + fd = open("data/manifest.json", "r") json_data = json.loads(fd.read()) wb = Workbook() @@ -192,5 +313,9 @@ for site in json_data["sites"]: adjust_column_width(ws, 4) handle_spreadsheet_decoration(ws, providers, persons, commleads, onsiteleads, time, date) +ws = wb.create_sheet("Final Report") + +generate_final_report_data(ws) + del wb["Sheet"] wb.save("test.xlsx")