diff --git a/configs/ci_dict.json b/configs/ci_dict.json new file mode 100644 index 0000000..ac776f3 --- /dev/null +++ b/configs/ci_dict.json @@ -0,0 +1,29 @@ +{ + "KPS": [ + "KPS Hardware", + "Bump Bar", + "Sticky Printer", + "Receipt Printer", + "Configuration Issue", + "Order Accuracy Issue", + "New Issue" + ], + "POS_Android": [ + "POS Hardware Android", + "Printer Android", + "Card Reader Android", + "Cash Drawer Android", + "Menu Issue Android", + "Connectivity Android", + "New Issues Android" + ], + "POS_iOS": [ + "POS Hardware iOS", + "Printer iOS", + "Card Reader iOS", + "Cash Drawer iOS", + "Menu Issue iOS", + "Connectivity iOS", + "New Issues iOS" + ] +} \ No newline at end of file diff --git a/configs/new_activations.json b/configs/new_activations.json new file mode 100644 index 0000000..c0dfbc5 --- /dev/null +++ b/configs/new_activations.json @@ -0,0 +1,6 @@ +{ + "Pennsylvania Ave": { + "date": "2025-9-01", + "product": ["KPS", "POS_android", "POS_iOS"] + } +} \ No newline at end of file diff --git a/csv_transformer.py b/csv_transformer.py new file mode 100644 index 0000000..1d2492d --- /dev/null +++ b/csv_transformer.py @@ -0,0 +1,554 @@ +import csv +import pandas as pd +import xlsxwriter +import datetime +import json + +class CSVTransform: + _wip_total = 0 + _on_hold_total = 0 + _weekly_resolved = 0 + _daily_total = 0 + _weekly_total = 0 + _yearly_total = 0 + + _priority_daily_counter = { + 'P1 - Critical': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P2 - High': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P3 - Medium': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P4 - Low': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'Total': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + } + } + + _priority_weekly_counter = { + 'P1 - Critical': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P2 - High': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P3 - Medium': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P4 - Low': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'Total': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + } + } + + _priority_rolling_week_counter = { + 'P1 - Critical': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P2 - High': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P3 - Medium': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P4 - Low': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'Total': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + } + } + + _priority_monthly_counter = { + 'P1 - Critical': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P2 - High': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P3 - Medium': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P4 - Low': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'Total': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + } + } + + _priority_yearly_counter = { + 'P1 - Critical': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P2 - High': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P3 - Medium': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'P4 - Low': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + }, + 'Total': { + 'Closed':0, + 'On Hold':0, + 'Work in Progress':0, + 'Resolved':0, + 'Cancelled':0, + 'Total':0 + } + } + + _se_counter = { + 'Total': {} + } + + _location_counter = { + 'Total': {} + } + + _new_activation_counter = { + 'Total': {} + } + + _new_activation_priority_counter = {} + _new_activation_ci_counter = {} + _new_activations = {} + + _ci_dict = {} + _ci_counter = { + 'Total': { + 'KPS': 0, + 'POS_Android':0, + 'POS_iOS': 0, + 'Misc': 0, + } + } + + _daily_incidents = [] + _weekly_incidents = [] + _8_to_14_incidents = [] + _monthly_incidents = [] + + _sla_tracker = { + 'P1 - Critical': { + 'time': datetime.timedelta(), + 'Total': 0 + }, + 'P2 - High': { + 'time': datetime.timedelta(), + 'Total': 0 + }, + 'P3 - Medium': { + 'time': datetime.timedelta(), + 'Total': 0 + }, + 'P4 - Low': { + 'time': datetime.timedelta(), + 'Total': 0 + } + } + + _today = datetime.date.today() + _last_week = _today - datetime.timedelta(days=7) + _8_days = _today - datetime.timedelta(days=8) + _14_days = _today - datetime.timedelta(days=14) + _this_month = _today.replace(day=1) -datetime.timedelta(days=1) + + def __init__(self, filename): + self._set_new_activation_variables() + self._set_ci_dictionary_variables() + self._ingest_csv(filename) + + def _set_new_activation_variables(self): + with open('./configs/new_activations.json') as new_sites: + temp_dict = json.load(new_sites) + for key in temp_dict.keys(): + ## Used to skip locations who haven't been activated yet. + ## Could also add a lower bound if we want to auto remove + ## locations activated after a certain amount of time. + if temp_dict[key]['date'] > str(self._today): + continue + self._new_activations[key] = temp_dict[key] + self._new_activation_counter['Total'][key] = 0 + self._new_activation_priority_counter[key] = { + 'P1 - Critical': 0, + 'P2 - High': 0, + 'P3 - Medium': 0, + 'P4 - Low': 0 + } + self._new_activation_ci_counter[key] = { + 'KPS': 0, + 'POS_Android':0, + 'POS_iOS': 0, + 'Misc': 0, + } + + def _set_ci_dictionary_variables(self): + with open('./configs/ci_dict.json') as json_file: + self._ci_dict = json.load(json_file) + + def _ingest_csv(self, filename): + with open(filename, newline='', encoding='cp1252') as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + self._update_counters(row) + self._extract_incidents(row) + + def _update_counters(self, row): + created_datetime = row['sys_created_on'] + created_date = datetime.datetime.strptime(created_datetime, '%Y-%m-%d %H:%M:%S %p').date() + row_loc = row['location'] + + if created_date == self._today: + self._update_daily_counters(row) + + if created_date >= self._last_week: + self._update_weekly_counters(row) + if created_date > self._this_month: + self._update_monthly_counters(row) + if created_date <= self._8_days and created_date >= self._14_days: + self._update_last_week_counters(row) + self._yearly_total += 1 + + self._update_state_counter(row['state']) + self._update_assigned_counter(row['assigned_to']) + self._update_location_counter(row_loc) + self._update_new_activations(row) + self._update_ci_counter(row) + + def _update_daily_counters(self, row): + self._daily_total += 1 + if self._priority_daily_counter['Total'][row['state']]: + self._priority_daily_counter['Total'][row['state']] += 1 + else: + self._priority_daily_counter['Total'][row['state']] = 1 + + if self._priority_daily_counter[row['priority']][row['state']]: + self._priority_daily_counter[row['priority']][row['state']] += 1 + else: + self._priority_daily_counter[row['priority']][row['state']] = 1 + + def _update_weekly_counters(self, row): + self._weekly_total += 1 + + if row['state'] == 'Closed' or row['state'] == 'Resolved': + self._weekly_resolved += 1 + + if self._priority_weekly_counter['Total'][row['state']]: + self._priority_weekly_counter['Total'][row['state']] += 1 + else: + self._priority_weekly_counter['Total'][row['state']] = 1 + + if self._priority_weekly_counter[row['priority']][row['state']]: + self._priority_weekly_counter[row['priority']][row['state']] += 1 + else: + self._priority_weekly_counter[row['priority']][row['state']] = 1 + + def _update_last_week_counters(self, row): + if self._priority_rolling_week_counter['Total'][row['state']]: + self._priority_rolling_week_counter['Total'][row['state']] += 1 + else: + self._priority_rolling_week_counter['Total'][row['state']] = 1 + + if self._priority_rolling_week_counter[row['priority']][row['state']]: + self._priority_rolling_week_counter[row['priority']][row['state']] += 1 + else: + self._priority_rolling_week_counter[row['priority']][row['state']] = 1 + + def _update_monthly_counters(self, row): + if self._priority_monthly_counter['Total'][row['state']]: + self._priority_monthly_counter['Total'][row['state']] += 1 + else: + self._priority_monthly_counter['Total'][row['state']] = 1 + + if self._priority_monthly_counter[row['priority']][row['state']]: + self._priority_monthly_counter[row['priority']][row['state']] += 1 + else: + self._priority_monthly_counter[row['priority']][row['state']] = 1 + + if row['resolved_at'] != '': + self._update_resolved_sla(row) + + def _update_ci_counter(self, row): + if row['ci'] in self._ci_dict['KPS']: + self._ci_counter['Total']['KPS'] += 1 + elif row['ci'] in self._ci_dict['POS_Android']: + self._ci_counter['Total']['POS_Android'] += 1 + elif row['ci'] in self._ci_dict['POS_iOS']: + self._ci_counter['Total']['POS_iOS'] += 1 + else: + self._ci_counter['Total']['Misc'] += 1 + + def _update_new_activations(self, row): + created_datetime = row['sys_created_on'] + created_date = datetime.datetime.strptime(created_datetime, '%Y-%m-%d %H:%M:%S %p').date() + row_loc = row['location'] + + if row['ci'] in self._ci_dict['KPS']: + row_ci = 'KPS' + elif row['ci'] in self._ci_dict['POS_Android']: + row_ci = 'POS_Android' + elif row['ci'] in self._ci_dict['POS_iOS']: + row_ci = 'POS_iOS' + else: + return + + if row_loc in self._new_activations.keys(): + if str(created_date) < self._new_activations[row_loc]['date']: + return + if row_ci not in self._new_activations[row_loc]['product']: + return + self._new_activation_counter['Total'][row_loc] += 1 + self._new_activation_priority_counter[row_loc][row['priority']] += 1 + self._new_activation_ci_counter[row_loc][row_ci] += 1 + + def _extract_incidents(self, row): + created_datetime = row['sys_created_on'] + created_date = datetime.datetime.strptime(created_datetime, '%Y-%m-%d %H:%M:%S %p').date() + + if created_date == self._today: + self._daily_incidents.append(row) + if created_date >= self._last_week: + self._weekly_incidents.append(row) + if created_date > self._this_month: + self._monthly_incidents.append(row) + if created_date <= self._8_days and created_date >= self._14_days: + self._8_to_14_incidents.append(row) + + def _update_state_counter(self, state): + if state == 'Work in Progress': + self._wip_total += 1 + if state == 'On Hold': + self._on_hold_total += 1 + + def _update_assigned_counter(self, assignee): + if assignee in self._se_counter['Total']: + self._se_counter['Total'][assignee] += 1 + else: + self._se_counter['Total'][assignee] = 1 + + def _update_location_counter(self, row_loc): + if row_loc in self._location_counter['Total']: + self._location_counter['Total'][row_loc] += 1 + else: + self._location_counter['Total'][row_loc] = 1 + + def _update_resolved_sla(self, row): + created = datetime.datetime.strptime(row['sys_created_on'], '%Y-%m-%d %H:%M:%S %p') + resolved = datetime.datetime.strptime(row['resolved_at'], '%Y-%m-%d %H:%M:%S %p') + + self._sla_tracker[row['priority']]['time'] += (resolved - created) + self._sla_tracker[row['priority']]['Total'] += 1 + +###### Getters ##### + def get_priority_daily_counters(self): + return self._priority_daily_counter + + def get_priority_weekly_counters(self): + return self._priority_weekly_counter + + def get_priority_rolling_week_counters(self): + return self._priority_rolling_week_counter + + def get_priority_monthly_counters(self): + return self._priority_monthly_counter + + def get_se_counter(self): + return self._se_counter + + def get_location_counter(self): + return self._location_counter + + def get_new_activations_counter(self): + return self._new_activation_counter + + def get_na_priority_counter(self): + return self._new_activation_priority_counter + + def get_na_ci_counter(self): + return self._new_activation_ci_counter + + def get_ci_counter(self): + return self._ci_counter + + def get_daily_incident(self): + return self._daily_incidents + + def get_weekly_incident(self): + return self._weekly_incidents + + def get_8_to_14_incident(self): + return self._8_to_14_incidents + + def get_monthly_incident(self): + return self._monthly_incidents + + def get_daily_total(self): + return self._daily_total + + def get_weekly_total(self): + return self._weekly_total + + def get_yearly_total(self): + return self._yearly_total + + def get_weekly_resolved(self): + return self._weekly_resolved + + def get_wip_total(self): + return self._wip_total + + def get_on_hold_total(self): + return self._on_hold_total + + def get_p1_sla_average(self): + if self._sla_tracker['P1 - Critical']['Total'] == 0: + return 'Not enough data.' + return self._sla_tracker['P1 - Critical']['time'] / self._sla_tracker['P1 - Critical']['Total'] + + def get_p2_sla_average(self): + if self._sla_tracker['P2 - High']['Total'] == 0: + return 'Not enough data.' + return self._sla_tracker['P2 - High']['time'] / self._sla_tracker['P2 - High']['Total'] + + def get_p3_sla_average(self): + if self._sla_tracker['P3 - Medium']['Total'] == 0: + return 'Not enough data.' + return self._sla_tracker['P3 - Medium']['time'] / self._sla_tracker['P3 - Medium']['Total'] + + def get_p4_sla_average(self): + if self._sla_tracker['P4 - Low']['Total'] == 0: + return 'Not enough data.' + return self._sla_tracker['P4 - Low']['time'] / self._sla_tracker['P4 - Low']['Total'] + +if __name__ == "__main__": + CSVTransform('incident.csv') \ No newline at end of file diff --git a/incident.csv b/incident.csv new file mode 100644 index 0000000..525e37c --- /dev/null +++ b/incident.csv @@ -0,0 +1,101 @@ +number,location,state,ci,priority,short_description,description,assignment_group,assigned_to,sys_created_on,resolved_at +1000,Pennsylvania Ave,Resolved,Connectivity iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-11-05 10:46:28 AM,2025-11-06 02:51:24 AM +1007,Santa Monica Blvd,On Hold,Connectivity iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-11-05 10:04:26 AM, +1014,Park Ave,Resolved,Receipt Printer,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-11-05 04:08:04 AM,2025-11-05 08:28:12 PM +1021,Pennsylvania Ave,On Hold,Card Reader Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-11-04 05:01:51 PM, +1028,LAX,Work in Progress,Printer Android,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-11-03 08:23:47 PM, +1035,Lombard St,Cancelled,Printer iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-11-03 09:08:02 AM,2025-11-03 03:58:50 PM +1042,Broadway,Cancelled,Menu Issue iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-11-02 10:05:49 AM,2025-11-03 01:50:16 AM +1049,Pennsylvania Ave,Work in Progress,Card Reader iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-11-01 10:56:30 PM, +1056,Pennsylvania Ave,Resolved,New Issue,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-11-01 09:39:10 PM,2025-11-02 08:38:26 PM +1063,DEN,Work in Progress,Cash Drawer iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-11-01 09:11:02 PM, +1070,MIA,Work in Progress,Order Accuracy Issue,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-11-01 04:38:30 PM, +1077,Market St,Work in Progress,Receipt Printer,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-11-01 03:05:37 PM, +1084,Wall St,Work in Progress,Card Reader Android,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-31 08:09:00 PM, +1091,Miccosukee Rd,Cancelled,Printer iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-31 01:49:49 PM,2025-11-01 08:34:36 AM +1098,Lombard St,Work in Progress,Printer iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-30 03:03:17 PM, +1105,LAX,Cancelled,POS Hardware iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-29 11:37:21 PM,2025-10-30 09:02:46 PM +1112,Washington Ave,Cancelled,New Issue,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-29 03:01:36 AM,2025-10-30 01:21:56 AM +1119,Broadway,On Hold,New Issues iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-28 01:33:51 PM, +1126,MIA,On Hold,POS Hardware Android,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-27 11:25:44 PM, +1133,Miccosukee Rd,Cancelled,POS Hardware Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-27 07:34:08 AM,2025-10-28 04:37:44 AM +1140,DFW,On Hold,Menu Issue iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-27 02:02:08 AM, +1147,LAX,Resolved,Card Reader Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-26 11:28:51 AM,2025-10-27 02:48:58 AM +1154,Broadway,On Hold,New Issues iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-26 08:39:26 AM, +1161,DEN,On Hold,Configuration Issue,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-26 07:54:24 AM, +1168,Magnolia Blvd,Cancelled,POS Hardware iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-25 11:12:30 PM,2025-10-26 07:39:44 PM +1175,Abbey Road,Cancelled,Configuration Issue,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-25 04:30:52 PM,2025-10-26 05:50:59 AM +1182,Santa Monica Blvd,Resolved,POS Hardware iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-25 07:15:57 AM,2025-10-25 07:48:49 AM +1189,Magnolia Blvd,Cancelled,Sticky Printer,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-24 10:35:04 PM,2025-10-25 06:56:42 AM +1196,Bourbon St,Resolved,Printer Android,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-24 01:55:49 AM,2025-10-24 09:40:55 AM +1203,LAX,Resolved,Connectivity Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-23 04:30:47 AM,2025-10-23 08:39:08 AM +1210,Pennsylvania Ave,On Hold,Order Accuracy Issue,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-22 09:22:12 AM, +1217,Broadway,On Hold,Printer iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-22 08:03:35 AM, +1224,Canal St,On Hold,Menu Issue iOS,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-22 05:15:08 AM, +1231,Market St,Resolved,Cash Drawer iOS,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-21 04:57:03 PM,2025-10-22 09:27:00 AM +1238,Market St,Cancelled,Printer iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-21 06:42:07 AM,2025-10-21 08:50:27 PM +1245,MIA,Resolved,Connectivity iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-20 11:19:05 PM,2025-10-21 12:22:33 PM +1252,Abbey Road,Cancelled,Connectivity iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-20 10:12:08 PM,2025-10-21 07:10:39 PM +1259,Broadway,Resolved,Connectivity Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-20 08:27:40 AM,2025-10-20 09:56:48 PM +1266,Park Ave,On Hold,Card Reader iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-20 07:05:36 AM, +1273,Bourbon St,Cancelled,Receipt Printer,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-19 09:54:11 PM,2025-10-20 09:09:28 AM +1280,Broadway,Cancelled,POS Hardware iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-19 07:02:49 PM,2025-10-20 12:32:45 PM +1287,Pennsylvania Ave,Resolved,Receipt Printer,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-19 10:19:40 AM,2025-10-20 09:21:52 AM +1294,Miccosukee Rd,On Hold,Cash Drawer Android,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-19 01:00:56 AM, +1301,Park Ave,Cancelled,New Issue,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-18 10:03:44 PM,2025-10-19 04:20:58 AM +1308,Park Ave,Resolved,Sticky Printer,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-18 10:57:09 AM,2025-10-18 07:53:12 PM +1315,Los Vegas Strip,Cancelled,POS Hardware Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-18 08:30:29 AM,2025-10-18 12:30:13 PM +1322,Los Vegas Strip,Cancelled,Connectivity iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-17 11:47:05 PM,2025-10-18 08:42:37 PM +1329,Abbey Road,Cancelled,Card Reader iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-17 09:42:37 AM,2025-10-18 03:50:16 AM +1336,LAX,Resolved,Receipt Printer,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-16 11:15:18 AM,2025-10-17 02:16:53 AM +1343,DFW,Cancelled,Receipt Printer,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-16 06:46:29 AM,2025-10-16 02:59:19 PM +1350,Broadway,Resolved,Menu Issue Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-15 10:48:56 PM,2025-10-16 05:07:18 PM +1357,Market St,Resolved,Sticky Printer,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-15 02:32:52 AM,2025-10-15 08:30:23 AM +1364,Market St,Resolved,Bump Bar,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-14 09:35:50 AM,2025-10-14 11:29:56 AM +1371,Wall St,Cancelled,Card Reader Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-13 11:04:40 AM,2025-10-13 04:16:01 PM +1378,Miccosukee Rd,Cancelled,KPS Hardware,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-12 09:52:38 PM,2025-10-13 11:30:24 AM +1385,DEN,Cancelled,KPS Hardware,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-12 11:20:15 AM,2025-10-12 03:33:48 PM +1392,Park Ave,Resolved,New Issues Android,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-12 09:31:09 AM,2025-10-12 09:24:47 PM +1399,MIA,Cancelled,Configuration Issue,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-10-11 07:17:06 PM,2025-10-12 04:17:58 PM +1406,Bourbon St,Resolved,Order Accuracy Issue,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-11 10:38:41 AM,2025-10-12 08:10:02 AM +1413,Pennsylvania Ave,Cancelled,POS Hardware iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-10 05:02:12 PM,2025-10-11 12:12:28 AM +1420,Los Vegas Strip,Cancelled,New Issue,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-09 05:42:15 PM,2025-10-09 05:42:36 PM +1427,DEN,Resolved,Menu Issue Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-09 04:02:48 AM,2025-10-09 08:03:59 PM +1434,Canal St,Cancelled,KPS Hardware,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-08 10:58:01 PM,2025-10-09 11:50:46 AM +1441,Magnolia Blvd,Cancelled,New Issues Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-08 01:12:50 PM,2025-10-09 02:21:07 AM +1448,Canal St,Cancelled,New Issues iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-07 05:57:56 PM,2025-10-08 10:24:17 AM +1455,Los Vegas Strip,Resolved,Sticky Printer,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-07 04:39:07 PM,2025-10-08 06:16:49 AM +1462,Market St,Cancelled,Cash Drawer iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-07 02:10:53 AM,2025-10-07 11:05:29 PM +1469,LAX,Cancelled,Connectivity Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-06 10:55:52 AM,2025-10-06 03:25:44 PM +1476,Market St,Cancelled,Card Reader Android,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-06 08:14:22 AM,2025-10-07 05:19:17 AM +1483,Magnolia Blvd,Cancelled,Connectivity iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-05 01:23:12 PM,2025-10-06 01:00:15 PM +1490,DFW,Cancelled,Configuration Issue,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-04 03:29:25 PM,2025-10-04 04:51:27 PM +1497,Broadway,Resolved,Connectivity Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-10-04 01:04:19 PM,2025-10-04 02:46:00 PM +1504,Los Vegas Strip,Cancelled,Sticky Printer,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-03 05:17:54 PM,2025-10-04 05:44:13 AM +1511,DFW,Cancelled,Cash Drawer iOS,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-10-03 06:05:22 AM,2025-10-03 03:51:22 PM +1518,Wall St,Cancelled,Receipt Printer,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-03 04:53:13 AM,2025-10-03 01:45:20 PM +1525,MIA,Cancelled,Menu Issue Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-10-02 09:54:22 AM,2025-10-02 03:29:24 PM +1532,Baker St,Cancelled,Card Reader iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-10-01 06:38:19 PM,2025-10-02 07:12:00 AM +1539,Market St,Resolved,Card Reader Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-10-01 02:18:42 AM,2025-10-01 10:13:19 AM +1546,DEN,Resolved,Connectivity Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-09-30 06:22:03 AM,2025-10-01 12:04:45 AM +1553,Wall St,Cancelled,KPS Hardware,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-09-29 12:32:43 PM,2025-09-30 09:08:59 AM +1560,Bourbon St,Resolved,Printer Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-09-28 11:00:38 PM,2025-09-29 12:23:34 AM +1567,Canal St,Resolved,Sticky Printer,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-28 04:43:49 PM,2025-09-29 07:54:52 AM +1574,Abbey Road,Cancelled,KPS Hardware,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-09-27 05:11:58 PM,2025-09-27 07:58:17 PM +1581,Canal St,Resolved,Cash Drawer Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-09-27 10:49:08 AM,2025-09-28 03:19:31 AM +1588,Los Vegas Strip,Resolved,New Issues iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-09-26 11:21:24 PM,2025-09-27 01:47:21 AM +1595,DEN,Resolved,Menu Issue iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-26 09:14:18 PM,2025-09-27 02:00:50 AM +1602,Los Vegas Strip,Resolved,POS Hardware Android,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-09-26 03:49:50 AM,2025-09-26 03:52:48 AM +1609,Washington Ave,Cancelled,Configuration Issue,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-09-25 06:01:03 AM,2025-09-25 12:14:44 PM +1616,LAX,Resolved,Sticky Printer,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-09-24 07:30:15 AM,2025-09-25 02:46:26 AM +1623,LAX,Cancelled,Card Reader Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Kevin Von Stork,2025-09-23 09:26:34 AM,2025-09-24 06:12:10 AM +1630,DFW,Cancelled,Menu Issue iOS,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-22 09:36:55 AM,2025-09-22 12:44:40 PM +1637,Canal St,Resolved,Connectivity iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Adam Lee,2025-09-21 11:54:05 PM,2025-09-22 12:04:50 AM +1644,Santa Monica Blvd,Resolved,Menu Issue Android,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-21 09:48:56 AM,2025-09-22 01:50:13 AM +1651,Park Ave,Resolved,Menu Issue Android,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-09-20 11:07:58 PM,2025-09-21 09:46:15 PM +1658,Baker St,Resolved,New Issues iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Jacob Yero,2025-09-20 02:54:42 PM,2025-09-20 04:12:09 PM +1665,Magnolia Blvd,Cancelled,New Issue,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Michelle Crawford,2025-09-20 12:20:33 PM,2025-09-20 02:55:21 PM +1672,DEN,Cancelled,New Issues iOS,P3 - Medium,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L4,Nick Kalar,2025-09-19 04:09:02 PM,2025-09-20 10:25:52 AM +1679,Fifth Ave,Resolved,Cash Drawer iOS,P2 - High,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-18 04:39:33 PM,2025-09-19 03:36:26 AM +1686,Fifth Ave,Resolved,Menu Issue iOS,P4 - Low,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-17 07:15:49 PM,2025-09-17 10:28:11 PM +1693,Wall St,Cancelled,New Issues Android,P1 - Critical,Lorem ipsum,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",Managed Support L3,Jeff Singleton,2025-09-16 07:58:58 PM,2025-09-16 11:38:20 PM \ No newline at end of file diff --git a/pandas_helper.py b/pandas_helper.py new file mode 100644 index 0000000..9dd46ba --- /dev/null +++ b/pandas_helper.py @@ -0,0 +1,48 @@ +import pandas as pd +import xlsxwriter + +# Just a few functions to help with Pandas + +def set_data_frame_transposed(passed_data): + df_data = pd.DataFrame(data=passed_data) + df_data = df_data.T + (col, row) = df_data.shape + + return (df_data, col, row) + +def set_data_frame(passed_data): + df_data = pd.DataFrame(data=passed_data) + (col, row) = df_data.shape + + return (df_data, col, row) + +def make_bar_chart(workbook, title, series_length, series_height, start_row, start_col): + end_row = (series_height + start_row - 1) + chart = workbook.add_chart({'type': 'column'}) + + chart.set_title({'name': f'{title}'}) + for series in range(series_length): + chart.add_series({ + 'name': ['Tables', start_row-1, start_col+series], + 'categories': ['Tables', start_row, start_col-1, end_row, start_col-1], + 'values': ['Tables', start_row, start_col+series, end_row, start_col+series], + }) + chart.set_size({'x_scale': 1.5, 'y_scale': 1.5}) + + return chart + +def make_pie_chart(workbook, title, series_length, series_height, start_row, start_col): + end_row = (series_height + start_row - 1) + chart = workbook.add_chart({'type': 'pie'}) + + chart.set_title({'name': f'{title}'}) + for series in range(series_length): + chart.add_series({ + 'name': ['Tables', start_row-1, start_col+series], + 'categories': ['Tables', start_row, start_col-1, end_row, start_col-1], + 'values': ['Tables', start_row, start_col+series, end_row, start_col+series], + 'data_labels': {'category': True}, + }) + chart.set_size({'x_scale': 1.5, 'y_scale': 1.5}) + + return chart \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..efe2641 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +pandas +openpyxl +xlsxwriter +jinja2 \ No newline at end of file diff --git a/transform.py b/transform.py new file mode 100644 index 0000000..644b7c6 --- /dev/null +++ b/transform.py @@ -0,0 +1,257 @@ +import csv +import pandas as pd +import xlsxwriter +import csv_transformer as csv_t +import pandas_helper as ph + +def get_letter_from_col(col): + # Excel uses capital English characters for it's columns. + # To simplify finding it, we can mod the index with 26 and + # return the indexed character as done below. + # NOTE: Creaks after index 701. + alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + result = '' + if col > 25: + result += alphabet[(col // 26)-1 % 26] + result += alphabet[col % 26] + return result + +def make_and_insert_title_box(text, row_offset = 0, col_offset = 0): + global title_row + global title_col + title_options = { + 'height': 40, + 'width': 360, + 'fill': {'color': '#D3D3D3'}, + 'align': {'vertical': 'middle', 'horizontal': 'center'}, + 'font': {'bold': True, 'underline': True, 'size': 16} + } + + title_row += row_offset + title_col += col_offset + + worksheet_charts.insert_textbox(title_row, title_col, text, title_options) + +def make_and_insert_body_box(text, row_offset = 0, col_offset = 0, font_size = 125): + global body_row + global body_col + body_options = { + 'height': 178, + 'width' : 360, + 'align' : {'vertical': 'middle', 'horizontal': 'center'}, + 'font' : {'size': font_size}, + } + + body_row += row_offset + body_col += col_offset + + worksheet_charts.insert_textbox(body_row, body_col, text, body_options) + + + +if __name__ == '__main__': + ###### Process Row CSV ###### + raw_data = csv_t.CSVTransform('incident.csv') + + ###### Time Based Counters ###### + (df_p_d_count, pd_col, pd_row) = ph.set_data_frame_transposed(raw_data.get_priority_daily_counters()) + (df_p_w_count, pw_col, pw_row) = ph.set_data_frame_transposed(raw_data.get_priority_weekly_counters()) + (df_p_lw_count, plw_col, plw_row) = ph.set_data_frame_transposed(raw_data.get_priority_rolling_week_counters()) + (df_p_m_count, pm_col, pm_row) = ph.set_data_frame_transposed(raw_data.get_priority_monthly_counters()) + + ###### New Activation Location Incident Counters ###### + (df_na_p_count, nap_col, nap_row) = ph.set_data_frame_transposed(raw_data.get_na_priority_counter()) + (df_na_ci_count, naci_col, naci_row) = ph.set_data_frame_transposed(raw_data.get_na_ci_counter()) + + ###### Category Counters ###### + (df_se_count, df_se_col, df_se_row) = ph.set_data_frame(raw_data.get_se_counter()) + (df_loc_count, df_loc_col, df_loc_row) = ph.set_data_frame(raw_data.get_location_counter()) + (df_ci_count, df_ci_col, df_ci_row) = ph.set_data_frame(raw_data.get_ci_counter()) + (df_na_count, df_na_col, df_na_row) = ph.set_data_frame(raw_data.get_new_activations_counter()) + + ###### Time Based Incident Data ###### + (df_daily_incidents, _, _) = ph.set_data_frame(raw_data.get_daily_incident()) + if not df_daily_incidents.empty: + df_daily_incidents = df_daily_incidents.set_index('number') + (df_weekly_incidents, _, _) = ph.set_data_frame(raw_data.get_weekly_incident()) + if not df_weekly_incidents.empty: + df_weekly_incidents = df_weekly_incidents.set_index('number') + (df_8_to_14_incidents, _, _) = ph.set_data_frame(raw_data.get_8_to_14_incident()) + if not df_8_to_14_incidents.empty: + df_8_to_14_incidents = df_8_to_14_incidents.set_index('number') + (df_monthly_incidents, _, _) = ph.set_data_frame(raw_data.get_monthly_incident()) + if not df_monthly_incidents.empty: + df_monthly_incidents = df_monthly_incidents.set_index('number') + + + with open('incident.csv', newline='', encoding='cp1252') as csvfile: + df_raw_data = pd.DataFrame(data=csv.DictReader(csvfile)) + df_raw_data = df_raw_data.set_index('number') + + with pd.ExcelWriter(f'./outputs/Incident_Report_{raw_data._today}.xlsx', engine='xlsxwriter') as writer: + workbook = writer.book + bold_text = workbook.add_format({'bold': True}) + worksheet_charts = workbook.add_worksheet('Charts') + worksheet_tables = workbook.add_worksheet('Tables') + + ###### Text Boxes for at-a-glance information + title_row = 1 + title_col = 2 + body_row = title_row + 2 + body_col = title_col + + make_and_insert_title_box('New Incidents Logged Today') + make_and_insert_body_box(str(raw_data.get_daily_total())) + + make_and_insert_title_box('New Incidents Logged Last 7 Days', col_offset=6) + make_and_insert_body_box(str(raw_data.get_weekly_total()), col_offset=6) + + make_and_insert_title_box('New Incidents Logged This Year', col_offset=6) + make_and_insert_body_box(str(raw_data.get_yearly_total()), col_offset=6) + + make_and_insert_title_box('P1 Monthly Average Resolved Time', col_offset=6) + make_and_insert_body_box(str(raw_data.get_p1_sla_average()), col_offset=6, font_size=36) + + make_and_insert_title_box("P2 Monthly Average Resolved Time", col_offset=6) + make_and_insert_body_box(str(raw_data.get_p2_sla_average()), col_offset=6, font_size=36) + + make_and_insert_title_box('Work In Progress Incidents', row_offset=12, col_offset=-24) + make_and_insert_body_box(str(raw_data.get_wip_total()), row_offset=12, col_offset=-24) + + make_and_insert_title_box('On Hold Incidents', col_offset=6) + make_and_insert_body_box(str(raw_data.get_on_hold_total()), col_offset=6) + + make_and_insert_title_box('Resolved/Closed Last 7 days', col_offset=6) + make_and_insert_body_box(str(raw_data.get_weekly_resolved()), col_offset=6) + + make_and_insert_title_box('P3 Monthly Average Resolved Time', col_offset=6) + make_and_insert_body_box(str(raw_data.get_p3_sla_average()), col_offset=6, font_size=36) + + make_and_insert_title_box('P4 Monthly Average Resolved Time', col_offset=6) + make_and_insert_body_box(str(raw_data.get_p4_sla_average()), col_offset=6, font_size=36) + + + + ################################## + ### Start Left 'Tables' Column ### + ##### Includes their charts ###### + ################################## + tables_start_row = 1 + tables_start_col = 1 + space = 3 + col_letter = get_letter_from_col(tables_start_col) + + worksheet_tables.write(col_letter + str(tables_start_row), 'Daily Incidents by Priority and Status', bold_text) + df_p_d_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - Daily', pd_row, + pd_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(25, 1, chart) + + tables_start_row = tables_start_row + pd_row + space + + worksheet_tables.write(col_letter + str(tables_start_row), + 'Incidents for Last 7 Days by Priority and Status', bold_text) + df_p_w_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - Last 7 Days', pw_row, + pw_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(48, 1, chart) + + tables_start_row = tables_start_row + pd_row + space + + worksheet_tables.write(col_letter + str(tables_start_row), + 'Incidents Between 8 and 14 Days by Priority and Status', bold_text) + df_p_lw_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - Last 8-14 Days', plw_row, + plw_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(71, 1, chart) + + tables_start_row = tables_start_row + pd_row + space + + worksheet_tables.write(col_letter + str(tables_start_row), 'Monthly incidents by Priority Count', bold_text) + df_p_m_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - Last 8-14 Days', pm_row, + pm_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(91, 1, chart) + + tables_start_row = tables_start_row + pd_row + space + + worksheet_tables.write(col_letter + str(tables_start_row), 'New Activations Priority Count', bold_text) + df_na_p_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'New Activation Site - Incident Priority', nap_row, + nap_col, tables_start_row+1, tables_start_col+1) + if chart.series: + worksheet_charts.insert_chart(48, 25, chart) + + tables_start_row = tables_start_row + pd_row + space + + worksheet_tables.write(col_letter + str(tables_start_row), 'New Activations Platform', bold_text) + df_na_ci_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + + chart = ph.make_bar_chart(workbook, 'New Activation Site - Incident Platform', nap_row, + nap_col, tables_start_row+1, tables_start_col+1) + if chart.series: + worksheet_charts.insert_chart(71, 25, chart) + ################################ + ### End Left 'Tables' Column ### + ################################ + + + #################################### + ### Start Middle 'Tables' Column ### + ###### Includes their charts ####### + #################################### + tables_start_row = 1 + tables_start_col += max(pd_col, pw_col, plw_col, pm_col, nap_col, naci_col) + space + col_letter = get_letter_from_col(tables_start_col) + + worksheet_tables.write(col_letter + str(tables_start_row), 'Incident Count By Support Personnel - CY', bold_text) + df_se_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - Assignee - CY', + df_se_row, df_se_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(25, 13, chart) + + tables_start_row = tables_start_row + df_se_col + space + + worksheet_tables.write(col_letter + str(tables_start_row), 'Incident Count By Known Platform', bold_text) + df_ci_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - Platform - CY', + df_ci_row, df_ci_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(78, 13, chart) + + tables_start_row = tables_start_row + df_ci_col + space + + worksheet_tables.write(col_letter + str(tables_start_row), 'Incident Count By New Activation Site', bold_text) + df_na_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_bar_chart(workbook, 'Incident Chart - New Activations', + df_na_row, df_na_col, tables_start_row+1, tables_start_col+1) + + if chart.series: + worksheet_charts.insert_chart(25, 25, chart) + ################################## + ### End Middle 'Tables' Column ### + ################################## + + + ################################### + ### Start Right 'Tables' Column ### + ###### Includes their charts ###### + ################################### + tables_start_row = 1 + tables_start_col += max(df_se_row, df_ci_row, df_na_row) + space + col_letter = get_letter_from_col(tables_start_col) + + worksheet_tables.write(col_letter + str(tables_start_row), 'Incident Count By Location Number - CY', bold_text) + df_loc_count.to_excel(writer, sheet_name='Tables', startrow=tables_start_row, startcol=tables_start_col) + chart = ph.make_pie_chart(workbook, 'Incident Chart - Location Number - CY', df_loc_row, df_loc_col, tables_start_row+1, tables_start_col+1) + worksheet_charts.insert_chart(48, 13, chart) + ################################# + ### End Right 'Tables' Column ### + ################################# + + + ### Extra Sheets ### + df_daily_incidents.to_excel(writer, sheet_name='Daily Incidents', startrow=0, startcol=0) + df_weekly_incidents.to_excel(writer, sheet_name='Last 7 Day Incidents', startrow=0, startcol=0) + df_8_to_14_incidents.to_excel(writer, sheet_name='8 to 14 Day Incidents', startrow=0, startcol=0) + df_monthly_incidents.to_excel(writer, sheet_name='Monthly Incidents', startrow=0, startcol=0) + df_raw_data.to_excel(writer, sheet_name='Raw Data', startrow=0, startcol=0)