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 traineeships
Gilles 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