From 0c96d9ff7a389bfb6e0c3fee12ba75a6c7ddea06 Mon Sep 17 00:00:00 2001 From: Stuart Griffiths Date: Sun, 29 May 2022 19:54:04 +0100 Subject: [PATCH] Updated to work with never completed and produces district reports --- appointments_training_reports.py | 512 ++++++++++++++++++++++++------- 1 file changed, 402 insertions(+), 110 deletions(-) diff --git a/appointments_training_reports.py b/appointments_training_reports.py index cecc0c9..fc5a954 100644 --- a/appointments_training_reports.py +++ b/appointments_training_reports.py @@ -4,13 +4,13 @@ #Licence: #Written by Stuart Griffiths, stuart.griffiths@birminghamscouts.org.uk #Started 19/05/2022 -#Version:0.1 +#Version:0.2 #Released: #Status: Working - outputs to 2 seperate CSV files #Inputs: CSV -#Outputs: 2 x CSV +#Outputs: 6 x CSV #Next Steps: generate list of unique entries, upload to Drive?, retrive automatically, send e-mails, working directory selection, -#Issues: Lots of repeats (can be filtered for), +#Issues: #Background IP: https://automatetheboringstuff.com/, Chapter 16 #Notes - CSV Column Numbers @@ -48,38 +48,18 @@ import csv #required to handle csv files import datetime #required to deal with dates for due items from dateutil.relativedelta import relativedelta #required to calculate 6 months later -#import openpyxl - -#CHANGE ALL OF THIS - #1. Set up Output files #CSV files -safety_late_mandatory_file = open('safety_late_mandatory_training.csv', 'w', newline='') -safety_late_mandatory = csv.writer(safety_late_mandatory_file) -safety_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) +late_mandatory_file = open('late_mandatory_training.csv', 'w', newline='') +late_mandatory = csv.writer(late_mandatory_file) +late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) -safeguarding_late_mandatory_file = open('safeguarding_late_mandatory_training.csv', 'w', newline='') -safeguarding_late_mandatory = csv.writer(safeguarding_late_mandatory_file) -safeguarding_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) - -firstaid_late_mandatory_file = open('firstaid_late_mandatory_training.csv', 'w', newline='') -firstaid_late_mandatory = csv.writer(firstaid_late_mandatory_file) -firstaid_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) - -safety_due_mandatory_file = open('safety_due_mandatory_training.csv', 'w', newline='') -safety_due_mandatory = csv.writer(safety_due_mandatory_file) -safety_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) - -safeguarding_due_mandatory_file = open('safeguarding_due_mandatory_training.csv', 'w', newline='') -safeguarding_due_mandatory = csv.writer(safeguarding_due_mandatory_file) -safeguarding_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) - -firstaid_due_mandatory_file = open('firstaid_due_mandatory_training.csv', 'w', newline='') -firstaid_due_mandatory = csv.writer(firstaid_due_mandatory_file) -firstaid_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) +due_mandatory_file = open('due_mandatory_training.csv', 'w', newline='') +due_mandatory = csv.writer(due_mandatory_file) +due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) #text files -statistics_file = open('_training_statistics_county.txt', 'w') +statistics_file = open('_total_training_statistics.txt', 'w') #Modules def training_report(): @@ -100,6 +80,9 @@ def training_report(): row_num_late = 2 row_num_due = 2 row_num_started = 2 + #create lists to process + due_list = [] + late_list = [] #create lists for counting purposes safety_missing_list = [] safeguarding_missing_list = [] @@ -107,22 +90,54 @@ def training_report(): safety_due_list = [] safeguarding_due_list = [] firstaid_due_list = [] - while line_num < (len(input_data)-4): #while there is an entry to handle, do this - #3.1 Test 1 - Is Safety Complete? - #Read the column - safety = input_data[line_num][37] - #Check - Is it not blank? - if safety != "": - #Convert string to date object, has to be done here for the blanks! - safety = datetime.datetime.strptime(input_data[line_num][37], "%d/%m/%Y") + #to avoid errors + safety_status = False + safeguarding_status = False + firstaid_status = False + safety_due_status = False + safeguarding_due_status = False + firstaid_due_status = False + role_training = False + firstaid_required = False + while line_num < (len(input_data)-1): #while there is an entry to handle, do this + #3.0 Test 0 - Is this the last entry for the person? + #Required to ensure only the primary role is being processed + line_num_next = line_num + 1 + current_line_membership = input_data[line_num][0] + try: + next_line_membership = input_data[line_num_next][0] + except: + a= 1 + #If membership numbers are equal, we are not at primary role so want to skip to next line + #if they are not equal, we are at primary role and so want to process + if next_line_membership != current_line_membership: + #3.1 acquire dates #Get today's date today1 = str(datetime.date.today()) today = datetime.datetime.strptime(today1, "%Y-%m-%d") #dodgy work around comparing datetime to date object error - #today = now.strftime("%d/%m/%Y") + #Establish comparative date - set by variable + Xmonths_later = datetime.datetime.now() + relativedelta(months=+due_months) + + #3.2 Does the role require mandatory training? + #Grab the role type + role = input_data[line_num][8] + role_list = ['Group Occasional Helper', 'District Occasional Helper', 'County Occasional Helper', 'County President', 'County Vice President', 'District President', 'District Vice President', 'Group President', 'Group Vice President', 'County TSA Council - Nominated Representative', 'County Sub-Committee Member', 'County Supporter', 'District Supporter', 'Group Supporter', 'County Award Certificate Recipient', 'County Chair', 'District Chair', 'Group Chair', 'Retired Member', 'Group Chairman', 'Scout Network Member'] + if role not in role_list: + role_training = True + #Of course some roles do need safety and safeguarding but not first aid.... + role_list_first_aid = ['County Treasurer', 'District Treasurer', 'Group Treasurer', 'Section Assistant', 'Group Section Assistant', 'District Section Assistant', 'County Section Assistant', 'County Secretary', 'District Secretary', 'Group Secretary', 'County Treasurer', 'District Treasurer', 'Group Treasurer', 'County Executive Committee Member', 'District Executive Committee Member', 'Group Executive Committee Member', 'Group Executive Committee Member - Elected Member', 'County Appointments Advisory Committee Member', 'District Appointments Advisory Committee Member', 'District Skills Instructor', 'County Skills Instructor', 'Group Skills Instructor', 'County Administrator', 'District Administrator', 'Group Administrator', 'County Badge Secretary', 'District Badge Secretary', 'Group Badge Secretary', 'Scout Active Support Member', 'District Training Administrator', 'County Training Administrator', 'County Chaplain', 'District Chaplain' 'Section Assistant - Squirrel Scouts', 'Section Assistant - Beaver Scouts', 'Section Assistant - Cub Scouts', 'Section Assistant - Scouts', 'District Section Assistant - Explorer Scouts', 'Assistant Section Leader', 'Assistant Section Leader - Beaver Scouts', 'Assistant Section Leader - Cub Scouts', 'Assistant Section Leader - Scouts', 'County Scout Active Support Co-ordinator', 'County Scout Active Support Member', 'District Scout Active Support Member', 'Group Scout Active Support Member', 'County Training Adviser', 'County Scout Active Support Manager', 'District Scout Active Support Manager' ] + if role not in role_list_first_aid: + firstaid_required = True + #3.3 late to complete testing + #3.3.1 safety + #Read the column + safety = input_data[line_num][36] + #print(safety) + #print(input_data[line_num][37]) #Check is it late? - #If date is less than today when program is ran, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due - if safety < today: - safety_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], '', '']) + #If date is blank, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due + if safety == "" and role_training == True: + safety_status = True #marker that safety is late member_number = input_data[line_num][0] #check whether membership number is in the index and add it if not try: @@ -131,31 +146,29 @@ def training_report(): except: #this executes if the membership number is not in the list safety_missing_list.append(member_number) - #Establish comparative date - set by variable - Xmonths_later = datetime.datetime.now() + relativedelta(months=+due_months) - #If date is less than 6 momths from when program is ran, add to list using known_name, surname, email, member_role, group, district, training module - if safety < Xmonths_later and safety >= today: - safety_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], '', '']) - member_number = input_data[line_num][0] - #check whether membership number is in the index and add it if not - try: - x = safety_due_list.index(member_number) - #if it is, nothing happens - except: - #this executes if the membership number is not in the list - safety_due_list.append(member_number) - #3.2 Test 2 - Is Safeguarding Complete? - #Read the column - safeguarding = input_data[line_num][39] - #Check - Is it not blank? - if safeguarding != "": - #Convert string to date object, has to be done here for the blanks! - safeguarding = datetime.datetime.strptime(input_data[line_num][39], "%d/%m/%Y") - #Already got today's date + if input_data[line_num][37] != "" and role_training == True: + #Convert string to date object, has to be done here for the blanks! + safety = datetime.datetime.strptime(input_data[line_num][37], "%d/%m/%Y") + #Check is it late? + #If date is less than today when program is ran, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due + if safety < today: + safety_status = True #marker that safety is late + member_number = input_data[line_num][0] + #check whether membership number is in the index and add it if not + try: + x = safety_missing_list.index(member_number) + #if it is, nothing happens + except: + #this executes if the membership number is not in the list + safety_missing_list.append(member_number) + + #3.3.2 Safeguarding + #Read the column + safeguarding = input_data[line_num][38] #Check is it late? #If date is less than today when program is ran, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due - if safeguarding < today: - safeguarding_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', input_data[line_num][39], '']) + if safeguarding == "" and role_training == True: + safeguarding_status = True member_number = input_data[line_num][0] #check whether membership number is in the index and add it if not try: @@ -164,31 +177,29 @@ def training_report(): except: #this executes if the membership number is not in the list safeguarding_missing_list.append(member_number) - #Check - Is it due soon? - #Already established comparative date - set at 6 months - #If date is less than 6 months from when program is ran, add to list using known_name, surname, email, member_role, group, district, training module - if safeguarding < Xmonths_later and safeguarding >= today: - safeguarding_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', input_data[line_num][39], '']) - member_number = input_data[line_num][0] - #check whether membership number is in the index and add it if not - try: - x = safeguarding_due_list.index(member_number) - #if it is, nothing happens - except: - #this executes if the membership number is not in the list - safeguarding_due_list.append(member_number) - #3.3 Test 3 - Is First Aid Complete? - #Read the column - firstaid = input_data[line_num][41] - #Check - Is it not blank? - if firstaid != "": - #Convert string to date object, has to be done here for the blanks! - firstaid = datetime.datetime.strptime(input_data[line_num][41], "%d/%m/%Y") - #Already got today's date + if input_data[line_num][39] != "" and role_training == True: + #Convert string to date object, has to be done here for the blanks! + safeguarding = datetime.datetime.strptime(input_data[line_num][39], "%d/%m/%Y") + #Check is it late? + #If date is less than today when program is ran, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due + if safeguarding < today: + safeguarding_status = True + member_number = input_data[line_num][0] + #check whether membership number is in the index and add it if not + try: + x = safeguarding_missing_list.index(member_number) + #if it is, nothing happens + except: + #this executes if the membership number is not in the list + safeguarding_missing_list.append(member_number) + + #3.3.3 First Aid + #Read the column + firstaid = input_data[line_num][40] #Check is it late? - #If date is less than today when program is ran, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due - if firstaid < today: - firstaid_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', '', input_data[line_num][41]]) + #If date is blank, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due + if firstaid == "" and role_training == True and firstaid_required == True: + firstaid_status = True member_number = input_data[line_num][0] #check whether membership number is in the index and add it if not try: @@ -197,20 +208,158 @@ def training_report(): except: #this executes if the membership number is not in the list firstaid_missing_list.append(member_number) - #Check - Is it due soon? - #Already established comparative date - set at 6 months - #If date is less than 6 months from when program is ran, add to list using known_name, surname, email, member_role, group, district, training module - if firstaid < Xmonths_later and firstaid >= today: - firstaid_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', '', input_data[line_num][41]]) - member_number = input_data[line_num][0] - #check whether membership number is in the index and add it if not - try: - x = firstaid_due_list.index(member_number) - #if it is, nothing happens - except: - #this executes if the membership number is not in the list - firstaid_due_list.append(member_number) + if input_data[line_num][41] != "" and role_training == True and firstaid_required == True: + #Convert string to date object, has to be done here for the blanks! + firstaid = datetime.datetime.strptime(input_data[line_num][41], "%d/%m/%Y") + #Check is it late? + #If date is less than today when program is ran, add to list using membership no, known_name, surname, email, telephone, member_role, manager, group, district, safety due, safeguarding due, first aid due + if firstaid < today: + firstaid_status = True + member_number = input_data[line_num][0] + #check whether membership number is in the index and add it if not + try: + x = firstaid_missing_list.index(member_number) + #if it is, nothing happens + except: + #this executes if the membership number is not in the list + firstaid_missing_list.append(member_number) + + #3.4 Due training + #3.4.1 Safety + if input_data[line_num][37]: + #Convert string to date object, has to be done here for the blanks! + safety = datetime.datetime.strptime(input_data[line_num][37], "%d/%m/%Y") + #If date is less than 6 momths from when program is ran, add to list using known_name, surname, email, member_role, group, district, training module + if safety < Xmonths_later and safety >= today: + safety_due_status = True + member_number = input_data[line_num][0] + #check whether membership number is in the index and add it if not + try: + x = safety_due_list.index(member_number) + #if it is, nothing happens + except: + #this executes if the membership number is not in the list + safety_due_list.append(member_number) + + #3.4.2 Safeguarding + if input_data[line_num][39] != "": + #Convert string to date object, has to be done here for the blanks! + safeguarding = datetime.datetime.strptime(input_data[line_num][39], "%d/%m/%Y") + #If date is less than 6 months from when program is ran, add to list using known_name, surname, email, member_role, group, district, training module + if safeguarding < Xmonths_later and safeguarding >= today: + safeguarding_due_status = True + member_number = input_data[line_num][0] + #check whether membership number is in the index and add it if not + try: + x = safeguarding_due_list.index(member_number) + #if it is, nothing happens + except: + #this executes if the membership number is not in the list + safeguarding_due_list.append(member_number) + + #3.4.3 First Aid + if input_data[line_num][41] != "": + #Convert string to date object, has to be done here for the blanks! + firstaid = datetime.datetime.strptime(input_data[line_num][41], "%d/%m/%Y") + #If date is less than 6 months from when program is ran, add to list using known_name, surname, email, member_role, group, district, training module + if firstaid < Xmonths_later and firstaid >= today: + firstaid_due_status = True + member_number = input_data[line_num][0] + #check whether membership number is in the index and add it if not + try: + x = firstaid_due_list.index(member_number) + #if it is, nothing happens + except: + #this executes if the membership number is not in the list + firstaid_due_list.append(member_number) + + #4: Construct the file outputs + #Late or missing training + #single one only + if safety_status == True and safeguarding_status != True and firstaid_status != True and role_training == True: + #write only with the safety status + if input_data[line_num][36] == '': + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], 'Never Completed', '', '']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], '', '']) + if safety_status != True and safeguarding_status == True and firstaid_status != True and role_training == True: + #write only with the safeguarding status + if input_data[line_num][38] == '': + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', 'Never Completed', '']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', input_data[line_num][39], '']) + if safety_status != True and safeguarding_status != True and firstaid_status == True and role_training == True and firstaid_required == True: + #write only with the first aid status + if input_data[line_num][40]: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', '', 'Never Completed']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', '', input_data[line_num][41]]) + # x2 combo only + if safety_status == True and safeguarding_status == True and firstaid_status != True and role_training == True: + #write safety and safeguarding status + if input_data[line_num][36] == '' and input_data[line_num][38] == '': + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], 'Never Completed', 'Never Completed', '']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], input_data[line_num][39], '']) + if safety_status == True and safeguarding_status != True and firstaid_status == True and role_training == True and firstaid_required == True: + #write safety and first aid status + if input_data[line_num][36] == '' and input_data[line_num][40] == '': + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], 'Never Completed' , '', 'Never Completed']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37] , '', input_data[line_num][41]]) + if safety_status != True and safeguarding_status == True and firstaid_status == True and role_training == True and firstaid_required == True: + #write safeguarding and first aid status + if input_data[line_num][38] == '' and input_data[line_num][40] == '': + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', 'Never Completed', 'Never Completed']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', input_data[line_num][39], input_data[line_num][41]]) + # all 3 + if safety_status == True and safeguarding_status == True and firstaid_status == True and role_training == True and firstaid_required == True: + #write safety, safeguarding and first aid status + if input_data[line_num][36] == '' and input_data[line_num][38] == '' and input_data[line_num][40] == '': + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], 'Never Completed', 'Never Completed', 'Never Completed']) + else: + late_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], input_data[line_num][39], input_data[line_num][41]]) + + #Due training + #single one only + if safety_due_status == True and safeguarding_due_status != True and firstaid_due_status != True and role_training == True: + #write only with the safety status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], "", ""]) + if safety_due_status != True and safeguarding_due_status == True and firstaid_due_status != True and role_training == True: + #write only with the safeguarding status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', input_data[line_num][39], ""]) + if safety_due_status != True and safeguarding_due_status != True and firstaid_due_status == True and role_training == True: + #write only with the first aid status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', '', input_data[line_num][41]]) + # x2 combo only + if safety_due_status == True and safeguarding_due_status == True and firstaid_due_status != True and role_training == True: + #write safety and safeguarding status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], input_data[line_num][39], ""]) + if safety_due_status == True and safeguarding_due_status != True and firstaid_due_status == True and role_training == True: + #write safety and first aid status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37] , '', input_data[line_num][41]]) + if safety_due_status != True and safeguarding_due_status == True and firstaid_due_status == True and role_training == True: + #write safeguarding and first aid status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], '', input_data[line_num][39], input_data[line_num][41]]) + # all 3 + if safety_due_status == True and safeguarding_due_status == True and firstaid_due_status == True and role_training == True: + #write safety, safeguarding and first aid status + due_mandatory.writerow([input_data[line_num][0], input_data[line_num][3], input_data[line_num][2], input_data[line_num][4], input_data[line_num][5], input_data[line_num][8], input_data[line_num][13], input_data[line_num][21], input_data[line_num][19], input_data[line_num][37], input_data[line_num][39], input_data[line_num][41]]) + + # Clear everything up to avoid printing same old stuff again and again + safety_status = False + safeguarding_status = False + firstaid_status = False + safety_due_status = False + safeguarding_due_status = False + firstaid_due_status = False + role_training = False + firstaid_required = False + line_num = line_num + 1 #continues the loop + #print(input_data[line_num][0]) + #4: Statistics Generation Time statistics_file.write('Statistics File for Training Reports\n') statistics_file.write('====================================\n') @@ -221,15 +370,158 @@ def training_report(): statistics_file.write('Leaders who need to complete the Safeguarding module within ' + str(due_months) + ' months: ' + str(len(safeguarding_due_list))+'\n') statistics_file.write('Leaders who are late with First Aid module: ' + str(len(firstaid_missing_list))+'\n') statistics_file.write('Leaders who need to complete the First Aid module within ' + str(due_months) + ' months: ' + str(len(firstaid_due_list))+'\n') + #5: Close files to show they are done - safety_late_mandatory_file.close() - safeguarding_late_mandatory_file.close() - firstaid_late_mandatory_file.close() - safety_due_mandatory_file.close() - safeguarding_due_mandatory_file.close() - firstaid_due_mandatory_file.close() - statistics_file.close() - print("Finished!") + late_mandatory_file.close() + due_mandatory_file.close() + print("Finished the County part!") + +def districts_reports(): + #Runs after missing and soon due training has been listed. Produces district reports + + #County + + county_late_mandatory_file = open('county_late_mandatory_training.csv', 'w', newline='') + county_late_mandatory = csv.writer(county_late_mandatory_file) + county_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + county_due_mandatory_file = open('county_due_mandatory_training.csv', 'w', newline='') + county_due_mandatory = csv.writer(county_due_mandatory_file) + county_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + + #Districts + + CVS_late_mandatory_file = open('CVS_late_mandatory_training.csv', 'w', newline='') + CVS_late_mandatory = csv.writer(CVS_late_mandatory_file) + CVS_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + CVS_due_mandatory_file = open('CVS_due_mandatory_training.csv', 'w', newline='') + CVS_due_mandatory = csv.writer(CVS_due_mandatory_file) + CVS_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + spitfire_late_mandatory_file = open('spitfire_late_mandatory_training.csv', 'w', newline='') + spitfire_late_mandatory = csv.writer(spitfire_late_mandatory_file) + spitfire_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + spitfire_due_mandatory_file = open('spitfire_due_mandatory_training.csv', 'w', newline='') + spitfire_due_mandatory = csv.writer(spitfire_due_mandatory_file) + spitfire_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + SCE_late_mandatory_file = open('SCE_late_mandatory_training.csv', 'w', newline='') + SCE_late_mandatory = csv.writer(SCE_late_mandatory_file) + SCE_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + SCE_due_mandatory_file = open('SCE_due_mandatory_training.csv', 'w', newline='') + SCE_due_mandatory = csv.writer(SCE_due_mandatory_file) + SCE_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + SCW_late_mandatory_file = open('SCW_late_mandatory_training.csv', 'w', newline='') + SCW_late_mandatory = csv.writer(SCW_late_mandatory_file) + SCW_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + SCW_due_mandatory_file = open('SCW_due_mandatory_training.csv', 'w', newline='') + SCW_due_mandatory = csv.writer(SCW_due_mandatory_file) + SCW_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + rea_late_mandatory_file = open('rea_late_mandatory_training.csv', 'w', newline='') + rea_late_mandatory = csv.writer(rea_late_mandatory_file) + rea_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + rea_due_mandatory_file = open('rea_due_mandatory_training.csv', 'w', newline='') + rea_due_mandatory = csv.writer(rea_due_mandatory_file) + rea_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + tame_late_mandatory_file = open('tame_late_mandatory_training.csv', 'w', newline='') + tame_late_mandatory = csv.writer(tame_late_mandatory_file) + tame_late_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + tame_due_mandatory_file = open('tame_due_mandatory_training.csv', 'w', newline='') + tame_due_mandatory = csv.writer(tame_due_mandatory_file) + tame_due_mandatory.writerow(['Membership Number', 'Known_Name', 'Surname', 'E-Mail', 'Telephone', 'Role', 'Line Manager', 'Group', 'District', 'Safety', 'Safeguarding', 'First Aid']) + + #6. late reports + #Open the file + file_name = str(Path.cwd()) + '/' + str('late_mandatory_training.csv') + input_file = open(file_name) #assumes file is in working directory + #Create a list using the CSV file + input_data_reader = csv.reader(input_file) + input_data = list(input_data_reader) + + #6.2 Process the data + #start at row 2 to strip header out + line_num = int(1) + while line_num < (len(input_data)-1): #While there is an entry to handle, do something + #read District info (8) + district = input_data[line_num][8] + if district == '': + #If no district, must be county + county_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Cole Valley South': + CVS_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Birmingham Spitfire District Scout Association': + spitfire_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Sutton Coldfield East': + SCE_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Sutton Coldfield West': + SCW_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Rea Valley': + rea_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Tame Valley Birmingham': + tame_late_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + + line_num = line_num + 1 + + #7. late reports + #Open the file + file_name = str(Path.cwd()) + '/' + str('due_mandatory_training.csv') + input_file = open(file_name) #assumes file is in working directory + #Create a list using the CSV file + input_data_reader = csv.reader(input_file) + input_data = list(input_data_reader) + + #7.2 Process the data + #start at row 2 to strip header out + line_num = int(1) + while line_num < (len(input_data)-1): #While there is an entry to handle, do something + #read District info (8) + district = input_data[line_num][8] + if district == '': + #If no district, must be county + county_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Cole Valley South': + CVS_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Birmingham Spitfire District Scout Association': + spitfire_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Sutton Coldfield East': + SCE_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Sutton Coldfield West': + SCW_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Rea Valley': + rea_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + if district == 'Tame Valley Birmingham': + tame_due_mandatory.writerow([input_data[line_num][0], input_data[line_num][1], input_data[line_num][2], input_data[line_num][3], input_data[line_num][4], input_data[line_num][5], input_data[line_num][6], input_data[line_num][7], input_data[line_num][8], input_data[line_num][9], input_data[line_num][10], input_data[line_num][11]]) + + line_num = line_num + 1 #continues the loop + + #8: Close the files + county_late_mandatory_file.close() + county_due_mandatory_file.close() + CVS_late_mandatory_file.close() + CVS_due_mandatory_file.close() + spitfire_late_mandatory_file.close() + spitfire_due_mandatory_file.close() + SCE_late_mandatory_file.close() + SCE_due_mandatory_file.close() + SCW_late_mandatory_file.close() + SCW_due_mandatory_file.close() + rea_late_mandatory_file.close() + rea_due_mandatory_file.close() + tame_late_mandatory_file.close() + tame_due_mandatory_file.close() + + print("District reports finised!") #Program training_report() +districts_reports() \ No newline at end of file