Skip to content

Commit

Permalink
[DEV] wip: improved rule management
Browse files Browse the repository at this point in the history
  • Loading branch information
mymage committed Aug 10, 2020
1 parent 3d21444 commit 36b1bcb
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 68 deletions.
5 changes: 3 additions & 2 deletions hr_duty_planner/TODO.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ ToDo list

**Models**
* service template
* DEV limit to 1 Container Service for off_duty type service
* DEV management of working/holiday calendar on generation
* service allocate
* DEV activate _compute_emply_name method to update all employees name list
Expand All @@ -20,6 +19,8 @@ ToDo list
* FIX layout
* service allocate tree
* FIX check rule button position
* service allocate form
* DEV filter resources on availability
* service allocate calendar
* DEV text format
* DEV check/alert template expected fulfillment
Expand All @@ -34,7 +35,7 @@ ToDo list
* FIX on deploy lock edit option
* FIX optimize double_assign method
* service profile
* FIX filter available fields for selected rule
* FIX filter available fields for selected rule !!!
* DEV create check for rule-field assignment (association, mandatory)
* reporting
* DEV basic report
Expand Down
53 changes: 26 additions & 27 deletions hr_duty_planner/models/service_allocate.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,7 @@ def check_resource_rule(self, parameters):
return_equipment = self.check_equipment_rule(parameters)
return_vehicle = self.check_vehicle_rule(parameters)

return {
'employee': return_employee,
return {'employee': return_employee,
'equipment': return_equipment,
'vehicle': return_vehicle,
}
Expand All @@ -348,7 +347,7 @@ def check_employee_rule(self, parameters):
}
service_list = (self.env['service.allocate']
.search([('id', '=', parameters['srv_id'])])
if parameters['srv_id']>0
if parameters['srv_id'] > 0
else self.env['service.allocate'].search([])
)
for service in service_list:
Expand All @@ -371,15 +370,15 @@ def check_employee_rule(self, parameters):
# execute the memorized rules
for method in rule_method:
result = self.rule_call({
'rule_name': method,
'parameters': json.dumps(rule_method[method]),
'srv_id': employee.id,
'res_obj': employee,
})
'rule_name': method,
'parameters': json.dumps(rule_method[method]),
'srv_id': employee.id,
'res_obj': employee,
})
result['data'].update(employee_result['data'])
employee_result = {
'message': employee_result['message'] +
employee.name + ': ' + result['message'] + '\n',
'message': (employee_result['message'] +
employee.name + ': ' + result['message'] + '\n'),
'result': True * result['result'],
'data': result['data'],
}
Expand All @@ -402,7 +401,7 @@ def check_vehicle_rule(self, parameters):
}
service_list = (self.env['service.allocate']
.search([('id', '=', parameters['srv_id'])])
if parameters['srv_id']>0
if parameters['srv_id'] > 0
else self.env['service.allocate'].search([])
)
for service in service_list:
Expand All @@ -425,15 +424,15 @@ def check_vehicle_rule(self, parameters):
# execute the memorized rules
for method in rule_method:
result = self.rule_call({
'rule_name': method,
'parameters': json.dumps(rule_method[method]),
'srv_id': vehicle.id,
'res_obj': vehicle,
})
'rule_name': method,
'parameters': json.dumps(rule_method[method]),
'srv_id': vehicle.id,
'res_obj': vehicle,
})
result['data'].update(vehicle_result['data'])
vehicle_result = {
'message': vehicle_result['message'] +
vehicle.name + ': ' + result['message'] + '\n',
'message': (vehicle_result['message'] +
vehicle.name + ': ' + result['message'] + '\n'),
'result': True * result['result'],
'data': result['data'],
}
Expand All @@ -456,7 +455,7 @@ def check_equipment_rule(self, parameters):
}
service_list = (self.env['service.allocate']
.search([('id', '=', parameters['srv_id'])])
if parameters['srv_id']>0
if parameters['srv_id'] > 0
else self.env['service.allocate'].search([])
)
for service in service_list:
Expand All @@ -479,23 +478,23 @@ def check_equipment_rule(self, parameters):
# execute the memorized rules
for method in rule_method:
result = self.rule_call({
'rule_name': method,
'parameters': json.dumps(rule_method[method]),
'srv_id': equipment.id,
'res_obj': equipment,
})
'rule_name': method,
'parameters': json.dumps(rule_method[method]),
'srv_id': equipment.id,
'res_obj': equipment,
})
result['data'].update(equipment_result['data'])
equipment_result = {
'message': equipment_result['message'] +
equipment.name + ': ' + result['message'] + '\n',
'message': (equipment_result['message'] +
equipment.name + ': ' + result['message'] + '\n'),
'result': True * result['result'],
'data': result['data'],
}
return equipment_result

# ##################################################################################
# OVERRIDE ORIGINAL METHOD

@api.model
def create(self, values):
"""
Expand Down
93 changes: 61 additions & 32 deletions hr_duty_planner/models/service_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def double_assign(self, resource_type, obj_id):
rule_result = True
rule_msg = ''

if not resource_type in available_resource:
if resource_type not in available_resource:
return {'message': _('Resource not available: %s') % (resource_type),
'result': False,
'data': {}
Expand Down Expand Up @@ -192,7 +192,7 @@ def rule_call(self, rule_name, parameters, srv_id, res_obj):
'result': False,
'data': {}
}

# Get the method from 'self' or invalid method.
method = getattr(self, rule_name, "_invalid_method")
# Call the method selected
Expand Down Expand Up @@ -241,10 +241,11 @@ def _rule_method_template(self, parameters, srv_id, res_obj):

def hour_active_periond(self, parameters):
"""
Calculate the total of active hours of a resource in a period of time.
Active hours are on no off-duty services.
Calculates the total of active hours of a resource in a period of time.
If period is not defined uses current year.
Active hours are on not off-duty services.
@param parameters dict: parameters to pass to the method
@param period dict: {'date_start':, 'date_stop': } period limit
@param period dict: {'date_start':, 'date_stop': } period limits
@param srv_id int: service to analyze; -1 for all
@param res_obj obj: resourse object to analyze
Expand All @@ -264,17 +265,17 @@ def hour_active_periond(self, parameters):

service_list = (self.env['service.allocate']
.search([('id', '=', parameters['srv_id'])])
if parameters['srv_id']>0
if parameters['srv_id'] > 0
else self.env['service.allocate'].search([])
)
for service in service_list:
for employee in service.employee_ids:
result = self.hour_active_periond_employee(
{'period' : {'date_start': date_start,
'date_stop': date_stop,
},
'employee_id': employee.id,
})
{'period' : {'date_start': date_start,
'date_stop': date_stop,
},
'employee_id': employee.id,
})
total_time += result['data']['hours']
global_result['message'] += (_('Employees hours %s') % (total_time)) + '\n'
global_result['data']['hour_empl'] = total_time
Expand All @@ -283,11 +284,11 @@ def hour_active_periond(self, parameters):
for service in service_list:
for equipment in service.equipment_ids:
result = self.hour_active_periond_equipment(
{'period' : {'date_start': date_start,
'date_stop': date_stop,
},
'equipment_id': equipment.id,
})
{'period' : {'date_start': date_start,
'date_stop': date_stop,
},
'equipment_id': equipment.id,
})
total_time += result['data']['hours']
global_result['message'] += (_('Equipments hours %s') % (total_time)) + '\n'
global_result['data']['hour_eqpm'] = total_time
Expand All @@ -296,11 +297,11 @@ def hour_active_periond(self, parameters):
for service in service_list:
for vehicle in service.vehicle_ids:
result = self.hour_active_periond_vehicle(
{'period' : {'date_start': date_start,
'date_stop': date_stop,
},
'vehicle_id': vehicle.id,
})
{'period' : {'date_start': date_start,
'date_stop': date_stop,
},
'vehicle_id': vehicle.id,
})
total_time += result['data']['hours']
global_result['message'] += (_('Vehicle hours %s') % (total_time)) + '\n'
global_result['data']['hour_vhcl'] = total_time
Expand All @@ -318,7 +319,7 @@ def hour_active_periond_employee(self, parameters):
@param period dict: {'date_start':, 'date_stop': } period limit
@param employee_id int: employee to analyze
_todo_
_todo_
manage on-call shift
manage real start/stop date
"""
Expand All @@ -343,8 +344,8 @@ def hour_active_periond_employee(self, parameters):
# get duration of each service
for fetch_srv_id in self.env.cr.fetchall():
total_time += self.env['service.allocate'] \
.search([('id', 'in', fetch_srv_id)]) \
.service_template_id.duration
.search([('id', 'in', fetch_srv_id)]) \
.service_template_id.duration
# _todo_
# raise UserError(_('Totale ore %s') % (total_time))
return {'message': _('Totale ore: %s') % (total_time),
Expand All @@ -360,7 +361,7 @@ def hour_active_periond_equipment(self, parameters):
@param period dict: {'date_start':, 'date_stop': } period limit
@param equipment_id int: equipment to analyze
_todo_
_todo_
manage on-call shift
manage real start/stop date
"""
Expand All @@ -385,8 +386,8 @@ def hour_active_periond_equipment(self, parameters):
# get duration of each service
for fetch_srv_id in self.env.cr.fetchall():
total_time += self.env['service.allocate'] \
.search([('id', 'in', fetch_srv_id)]) \
.service_template_id.duration
.search([('id', 'in', fetch_srv_id)]) \
.service_template_id.duration
# _todo_
# raise UserError(_('Totale ore %s') % (total_time))
return {'message': _('Totale ore: %s') % (total_time),
Expand All @@ -402,7 +403,7 @@ def hour_active_periond_vehicle(self, parameters):
@param period dict: {'date_start':, 'date_stop': } period limit
@param vehicle_id int: vehicle to analyze
_todo_
_todo_
manage on-call shift
manage real start/stop date
"""
Expand All @@ -427,15 +428,39 @@ def hour_active_periond_vehicle(self, parameters):
# get duration of each service
for fetch_srv_id in self.env.cr.fetchall():
total_time += self.env['service.allocate'] \
.search([('id', 'in', fetch_srv_id)]) \
.service_template_id.duration
.search([('id', 'in', fetch_srv_id)]) \
.service_template_id.duration
# _todo_
# raise UserError(_('Totale ore %s') % (total_time))
return {'message': _('Totale ore: %s') % (total_time),
'result': True,
'data': {'hours': total_time}
}

def hour_active_month(self, parameters):
"""
Calculate the total of active hours of a resource in the last 28 days.
Active hours are on no off-duty services.
@param parameters dict: {'date_start':} last day of month to check
@param srv_id int: service to analyze
@param res_obj obj: resourse object to analyze
"""

date_stop = parameters['period']['date_stop'] \
if parameters['period'] and parameters['period']['date_stop'] \
else datetime.datetime.now()
date_start = date_stop - datetime.timedelta(days=28)

result = self.env['service.rule'] \
.hour_active_periond({'period': {'date_start': date_start,
'date_stop': date_stop,
},
'srv_id': parameters['srv_id'],
'res_obj': False,
})
self.result_message = result['message']
return result

def hour_active_week(self, param, srv_id, res_obj):
"""
Calculate the total of active hours of a resource in a week.
Expand Down Expand Up @@ -472,10 +497,14 @@ def hour_rest_week(self, param, srv_id, res_obj):
By active hours is meant not work or on call
_todo_ define/set active shift
"""
return {'message': 'hour_rest_week To DO', 'result': True, 'data': {'hour': 8}}
return {'message': 'hour_rest_week _ToDo_',
'result': True,
'data': {'hour': 8}}

def hour_active_month(self, param, srv_id, res_obj):
def hour_active_month_copy(self, param, srv_id, res_obj):
"""
_todo_ temporary copy to use/delete
Calculate the total of active hours of a resource in a month.
By active hours is meant work+on call
Expand Down
10 changes: 10 additions & 0 deletions hr_duty_planner/models/service_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,16 @@ class ServiceTemplate(models.Model):
help='Next service will allocate Vehicles of the parent service',
)

@api.multi
@api.onchange('service_container_ids')
def _limit_container_count(self):
"""
Limit service container to 1
"""
if self.off_duty and len(self.service_container_ids) > 1:
raise ValidationError(_('Only one Container Service allowed'))
return

@api.multi
def write(self, values):
"""
Expand Down
Loading

0 comments on commit 36b1bcb

Please sign in to comment.