switch to week cycle and add some KPIs where you can drive the business

This commit is contained in:
2024-03-15 22:24:52 +01:00
parent ffe45a2a5f
commit da84d81082
2 changed files with 60 additions and 43 deletions

View File

@@ -55,11 +55,11 @@ class RequestLoadEstimator:
AVERAGE_PROBLEM_LEVEL_IN_PERCENT = 0.1
def __init__(self):
self._weeks_cycle = 4
self._days_cycle = 4
self.service_desk_employees = 0
self.documentation_level = 0
self._service_desk_knowledge_level = 0
self._systems_complexity = 0
self.service_desk_knowledge_level = 0
self.systems_complexity = 0
self.nr_of_applications = 0
self.nr_of_employees = 0
self.new_application_problems = 0
@@ -70,10 +70,14 @@ class RequestLoadEstimator:
self.actual_week = 0
self.data_set = DataFrame()
self.initialize_data()
self.prev_dict = {"day": 0, "days_cycle": 0, "service_desk_employees": 0, "documentation_level": 0,
"service_desk_knowledge_level": 0, "systems_complexity": 0, "nr_of_applications": 0,
"new_application_problems": 0, "nr_of_open_service_requests": 0, "request_working_time": 0,
"personal_available_time": 0, "processed_service_requests": 0, "nr_of_employees": 0}
pass
def set_weeks_cycle(self, days: int):
self._weeks_cycle = days
self._days_cycle = days
def add_new_applications(self, nr: int):
if nr > 0:
@@ -83,31 +87,31 @@ class RequestLoadEstimator:
if self.documentation_level < DOCUMENTATION_LEVEL_MIN:
self.documentation_level = DOCUMENTATION_LEVEL_MIN
complexity_increase = (nr / self.nr_of_applications) * 0.2
self._systems_complexity += complexity_increase
self.systems_complexity += complexity_increase
self.nr_of_applications += nr
elif nr < 0:
logger.info(MODULE_LOGGER_HEAD + "Removing applications: " + str(nr))
complexity_reduction = (nr / self.nr_of_applications) * 0.2
self._systems_complexity -= complexity_reduction
self.systems_complexity -= complexity_reduction
self.nr_of_applications += nr
def add_new_employees(self, nr: int):
if nr > 0:
logger.info(MODULE_LOGGER_HEAD + "Adding new employees: " + str(nr))
self._systems_complexity += nr / self.nr_of_employees
self.systems_complexity += nr / self.nr_of_employees
self.nr_of_employees += nr
elif nr < 0:
logger.info(MODULE_LOGGER_HEAD + "Removing employees: " + str(nr))
self._systems_complexity -= nr / self.nr_of_employees
self.systems_complexity -= nr / self.nr_of_employees
self.nr_of_employees += nr
def add_service_desk_employees(self, nr: int):
if nr > 0:
logger.info(MODULE_LOGGER_HEAD + "Adding new service desk employees: " + str(nr))
knowledge_level_reduction = (nr / self.service_desk_employees) * 0.2
self._service_desk_knowledge_level = limit_value(self._service_desk_knowledge_level - knowledge_level_reduction,
KNOWLEDGE_LEVEL_MIN,
KNOWLEDGE_LEVEL_MAX)
self.service_desk_knowledge_level = limit_value(self.service_desk_knowledge_level - knowledge_level_reduction,
KNOWLEDGE_LEVEL_MIN,
KNOWLEDGE_LEVEL_MAX)
self.service_desk_employees += nr
elif nr < 0:
logger.info(MODULE_LOGGER_HEAD + "Removing service desk employees: " + str(nr))
@@ -115,7 +119,7 @@ class RequestLoadEstimator:
def process_weeks(self):
logger.info(MODULE_LOGGER_HEAD + "Processing weeks")
for week in range(self._weeks_cycle):
for day in range(self._days_cycle):
self._calc_nr_of_service_requests()
self._calc_request_working_time()
self._calc_personal_available_time()
@@ -127,11 +131,11 @@ class RequestLoadEstimator:
def initialize_data(self):
logger.info(MODULE_LOGGER_HEAD + "Initializing data")
self._weeks_cycle = 7
self._days_cycle = 7
self.service_desk_employees = START_NR_OF_SERVICE_DESK_EMPLOYEES
self.documentation_level = START_DOCUMENTATION_LEVEL
self._service_desk_knowledge_level = START_KNOWLEDGE_LEVEL
self._systems_complexity = START_SYSTEMS_COMPLEXITY
self.service_desk_knowledge_level = START_KNOWLEDGE_LEVEL
self.systems_complexity = START_SYSTEMS_COMPLEXITY
self.nr_of_applications = START_NR_OF_APPLICATIONS
self.nr_of_employees = START_NR_OF_EMPLOYEES
self.new_application_problems = 0
@@ -144,7 +148,7 @@ class RequestLoadEstimator:
def _calc_application_problems(self):
self.new_application_problems = ((self.nr_of_employees * self.nr_of_applications *
self._systems_complexity / self.documentation_level)
self.systems_complexity / self.documentation_level)
* self.AVERAGE_PROBLEM_LEVEL_IN_PERCENT)
if self.new_application_problems < 0:
self.new_application_problems = 0
@@ -155,7 +159,7 @@ class RequestLoadEstimator:
def _calc_request_working_time(self):
self._desired_request_working_time = (self.nr_of_open_service_requests *
(self.AVERAGE_REQUEST_WORKING_TIME / self._service_desk_knowledge_level))
(self.AVERAGE_REQUEST_WORKING_TIME / self.service_desk_knowledge_level))
if self._desired_request_working_time < 0:
self._desired_request_working_time = 0
@@ -166,7 +170,7 @@ class RequestLoadEstimator:
else:
self.processed_service_requests = int((self.service_desk_employees * self.AVERAGE_DAY_WORKING_TIME) /
(
self.AVERAGE_REQUEST_WORKING_TIME / self._service_desk_knowledge_level))
self.AVERAGE_REQUEST_WORKING_TIME / self.service_desk_knowledge_level))
self.nr_of_open_service_requests -= self.processed_service_requests
@@ -188,21 +192,21 @@ class RequestLoadEstimator:
self.nr_of_employees *
self.service_desk_employees)
self._service_desk_knowledge_level += know_how_reduction if know_how_reduction >= 0 else know_how_reduction / 10
self.service_desk_knowledge_level += know_how_reduction if know_how_reduction >= 0 else know_how_reduction / 10
self.documentation_level = limit_value(self.documentation_level, DOCUMENTATION_LEVEL_MIN,
DOCUMENTATION_LEVEL_MAX)
self._service_desk_knowledge_level = limit_value(self._service_desk_knowledge_level, KNOWLEDGE_LEVEL_MIN,
KNOWLEDGE_LEVEL_MAX)
self.service_desk_knowledge_level = limit_value(self.service_desk_knowledge_level, KNOWLEDGE_LEVEL_MIN,
KNOWLEDGE_LEVEL_MAX)
def _process_data_set(self):
row = {
"week": self.actual_week,
"weeks_cycle": self._weeks_cycle,
"day": self.actual_week,
"days_cycle": self._days_cycle,
"service_desk_employees": self.service_desk_employees,
"documentation_level": self.documentation_level,
"service_desk_knowledge_level": self._service_desk_knowledge_level,
"systems_complexity": self._systems_complexity,
"service_desk_knowledge_level": self.service_desk_knowledge_level,
"systems_complexity": self.systems_complexity,
"nr_of_applications": self.nr_of_applications,
"new_application_problems": self.new_application_problems,
"nr_of_open_service_requests": self.nr_of_open_service_requests,