diff --git a/addons/hr/__init__.py b/addons/hr/__init__.py index dc5e6b693d1..2ae6446f9dc 100644 --- a/addons/hr/__init__.py +++ b/addons/hr/__init__.py @@ -2,3 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import models +from . import wizard diff --git a/addons/hr/__manifest__.py b/addons/hr/__manifest__.py index d77cb860431..028e8fa4712 100644 --- a/addons/hr/__manifest__.py +++ b/addons/hr/__manifest__.py @@ -24,6 +24,8 @@ 'data': [ 'security/hr_security.xml', 'security/ir.model.access.csv', + 'wizard/plan_wizard_views.xml', + 'wizard/departure_wizard_views.xml', 'views/hr_views.xml', 'views/hr_templates.xml', 'views/res_config_settings_views.xml', diff --git a/addons/hr/data/hr_data.xml b/addons/hr/data/hr_data.xml index 53fac18b8c6..7436e422be6 100644 --- a/addons/hr/data/hr_data.xml +++ b/addons/hr/data/hr_data.xml @@ -18,6 +18,80 @@ + + Setup IT Materials + + + + + Setup IT Materials + + + + + Plan Training + + + + + Training + + weeks + 1 + + + + Compute Out Delais + + + + + Take Back HR Materials + + + + + + manager + + + + + manager + + + + + employee + + + + + manager + + + + + manager + + + + Onboarding + + + + + Offboarding + + + HR: mailgateway unknown employee bounce diff --git a/addons/hr/data/hr_demo.xml b/addons/hr/data/hr_demo.xml index 6a57335ad97..fd6084e854a 100644 --- a/addons/hr/data/hr_demo.xml +++ b/addons/hr/data/hr_demo.xml @@ -208,7 +208,7 @@ If you have development competencies, we can propose you specific traineeshipsGilles Gravie - + Building 1, Second Floor diff --git a/addons/hr/models/__init__.py b/addons/hr/models/__init__.py index 6a7da3df60c..6f85baf065b 100644 --- a/addons/hr/models/__init__.py +++ b/addons/hr/models/__init__.py @@ -7,3 +7,5 @@ from . import mail_alias from . import mail_channel from . import res_partner from . import res_users + +from . import plan diff --git a/addons/hr/models/hr.py b/addons/hr/models/hr.py index 353920a9695..b2d5dc6445b 100644 --- a/addons/hr/models/hr.py +++ b/addons/hr/models/hr.py @@ -4,6 +4,7 @@ from random import choice from string import digits import base64 import logging +from werkzeug import url_encode from odoo import api, fields, models from odoo import tools, _ @@ -202,6 +203,12 @@ class Employee(models.Model): color = fields.Integer('Color Index', default=0) barcode = fields.Char(string="Badge ID", help="ID used for employee identification.", copy=False) pin = fields.Char(string="PIN", help="PIN used to Check In/Out in Kiosk Mode (if enabled in Configuration).", copy=False) + departure_reason = fields.Selection([ + ('fired', 'Fired'), + ('resigned', 'Resigned'), + ('retired', 'Retired') + ], string="Departure Reason") + departure_description = fields.Text(string="Additional Information") _sql_constraints = [('barcode_uniq', 'unique (barcode)', "The Badge ID must be unique, this one is already assigned to another employee.")] @@ -256,6 +263,8 @@ class Employee(models.Model): vals.update(self._sync_user(self.env['res.users'].browse(vals['user_id']))) tools.image_resize_images(vals) employee = super(Employee, self).create(vals) + url = '/web#%s' % url_encode({'action': 'hr.plan_wizard_action', 'active_id': employee.id, 'active_model': 'hr.employee'}) + employee._message_log(_('Congratulations ! May I recommand you to setup an onboarding plan ?') % (url)) if employee.department_id: self.env['mail.channel'].sudo().search([ ('subscription_department_ids', 'in', employee.department_id.id) @@ -285,7 +294,25 @@ class Employee(models.Model): resources = self.mapped('resource_id') super(Employee, self).unlink() return resources.unlink() - + + def toggle_active(self): + res = super(Employee, self).toggle_active() + self.filtered(lambda employee: employee.active).write({ + 'departure_reason': False, + 'departure_description': False, + }) + if len(self) == 1 and not self.active: + return { + 'type': 'ir.actions.act_window', + 'name': _('Register Departure'), + 'res_model': 'hr.departure.wizard', + 'view_type': 'form', + 'view_mode': 'form', + 'target': 'new', + 'context': {'active_id': self.id}, + } + return res + @api.multi def generate_random_barcode(self): for i in self: i.barcode = "".join(choice(digits) for i in range(8)) diff --git a/addons/hr/models/plan.py b/addons/hr/models/plan.py new file mode 100644 index 00000000000..fee13675130 --- /dev/null +++ b/addons/hr/models/plan.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, _ +from odoo.exceptions import UserError + + +class PlanActivityType(models.Model): + _name = 'hr.plan.activity.type' + _description = 'Plan activity type' + + activity_type_id = fields.Many2one('mail.activity.type', 'Activity Type', + domain=lambda self: [('res_model_id', '=', self.env['ir.model']._get('hr.employee').id)]) + name = fields.Char(related='activity_type_id.name') + responsible = fields.Selection([ + ('coach', 'Coach'), + ('manager', 'Manager'), + ('employee', 'Employee'), + ('other', 'Other')], default='employee', string='Responsible') + responsible_id = fields.Many2one('res.users', 'Responsible Person') + + def get_responsible_id(self, employee_id): + if self.responsible == 'coach': + self.responsible_id = employee_id.coach_id.user_id + if not self.responsible_id: + raise UserError(_('No user linked to the coach of %s. Please contact an administrator.') % employee_id.name) + elif self.responsible == 'manager': + self.responsible_id = employee_id.parent_id.user_id + if not self.responsible_id: + raise UserError(_('No user linked to the manager of %s. Please contact an administrator.') % employee_id.name) + elif self.responsible == 'employee': + self.responsible_id = employee_id.user_id + if not self.responsible_id: + raise UserError(_('No user linked to the employee %s. Please contact an administrator.') % employee_id.name) + return self.responsible_id + + +class Plan(models.Model): + _name = 'hr.plan' + _description = 'plan' + + name = fields.Char('Name', required=True) + plan_activity_type_ids = fields.Many2many('hr.plan.activity.type', string='Activities') + active = fields.Boolean(default=True) diff --git a/addons/hr/security/ir.model.access.csv b/addons/hr/security/ir.model.access.csv index 74e19969a2a..345374b31fe 100644 --- a/addons/hr/security/ir.model.access.csv +++ b/addons/hr/security/ir.model.access.csv @@ -8,3 +8,7 @@ access_hr_department_user,hr.department.user,model_hr_department,group_hr_user,1 access_hr_department_employee,hr.department.employee,model_hr_department,base.group_user,1,0,0,0 access_hr_job_user,hr.job user,model_hr_job,group_hr_user,1,1,1,1 access_ir_property_hr_user,ir_property hr_user,base.model_ir_property,group_hr_user,1,1,1,0 +access_hr_plan_activity_type_employee,access_hr_plan_activity_type,model_hr_plan_activity_type,base.group_user,1,0,0,0 +access_hr_plan_employee,access_hr_plan_employee,model_hr_plan,base.group_user,1,0,0,0 +access_hr_plan_activity_type_hr_user,access_hr_plan_activity_type,model_hr_plan_activity_type,group_hr_user,1,1,1,1 +access_hr_plan_hr_user,access_hr_plan_hr_user,model_hr_plan,group_hr_user,1,1,1,1 diff --git a/addons/hr/views/hr_views.xml b/addons/hr/views/hr_views.xml index ca5eecab771..9bf5f22c7b8 100644 --- a/addons/hr/views/hr_views.xml +++ b/addons/hr/views/hr_views.xml @@ -30,12 +30,121 @@ groups="group_hr_manager" sequence="100"/> + + hr.plan.search + hr.plan + + + + + + + + hr.plan.tree + hr.plan + + + + + + + + + hr.plan.form + hr.plan + +
+ +
+ +
+
+
+ + + + + + + + + +
+
+
+
+ + + hr.plan.activity.type.form + hr.plan.activity.type + +
+ + + + + + + + +
+
+
+ + + Planning + hr.plan + form + tree,form + + + + + Planning type + hr.plan.activity.type + form + tree,form + + + + + + + + hr.employee.form hr.employee
+
+