diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py
index 857a3927f32..9a299359c70 100644
--- a/addons/hr/models/hr_employee.py
+++ b/addons/hr/models/hr_employee.py
@@ -157,6 +157,22 @@ class HrEmployeePrivate(models.Model):
avatar = base64.b64encode(employee._avatar_get_placeholder())
employee[avatar_field] = avatar
+ def action_create_user(self):
+ self.ensure_one()
+ if self.user_id:
+ raise ValidationError(_("This employee already has an user."))
+ return {
+ 'name': _('Create User'),
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'res.users',
+ 'view_mode': 'form',
+ 'view_id': self.env.ref('base.view_users_simple_form').id,
+ 'target': 'new',
+ 'context': {
+ 'default_create_employee_id': self.id,
+ }
+ }
+
def name_get(self):
if self.check_access_rights('read', raise_exception=False):
return super(HrEmployeePrivate, self).name_get()
diff --git a/addons/hr/models/res_users.py b/addons/hr/models/res_users.py
index b75d541f4e0..4b142772540 100644
--- a/addons/hr/models/res_users.py
+++ b/addons/hr/models/res_users.py
@@ -139,6 +139,9 @@ class User(models.Model):
employee_type = fields.Selection(related='employee_id.employee_type', readonly=False, related_sudo=False)
employee_resource_calendar_id = fields.Many2one(related='employee_id.resource_calendar_id', string="Employee's Working Hours", readonly=True)
+ create_employee = fields.Boolean(store=False, default=True, string="Technical field, whether to create an employee")
+ create_employee_id = fields.Many2one('hr.employee', store=False, string="Technical field, bind user to this employee on create")
+
can_edit = fields.Boolean(compute='_compute_can_edit')
is_system = fields.Boolean(compute="_compute_is_system")
@@ -189,6 +192,25 @@ class User(models.Model):
result['toolbar']['action'] = [act for act in result['toolbar']['action'] if act['id'] != change_password_action.id]
return result
+ @api.model_create_multi
+ def create(self, vals_list):
+ res = super().create(vals_list)
+ employee_create_vals = []
+ for user, vals in zip(res, vals_list):
+ if not vals.get('create_employee') and not vals.get('create_employee_id'):
+ continue
+ if vals.get('create_employee_id'):
+ self.env['hr.employee'].browse(vals.get('create_employee_id')).user_id = user
+ else:
+ employee_create_vals.append(dict(
+ name=user.name,
+ company_id=user.env.company.id,
+ **self.env['hr.employee']._sync_user(user)
+ ))
+ if employee_create_vals:
+ self.env['hr.employee'].create(employee_create_vals)
+ return res
+
def write(self, vals):
"""
Synchronize user and its related employee
diff --git a/addons/hr/views/hr_employee_views.xml b/addons/hr/views/hr_employee_views.xml
index 7078a75a1b1..c0f2983f1bc 100644
--- a/addons/hr/views/hr_employee_views.xml
+++ b/addons/hr/views/hr_employee_views.xml
@@ -404,6 +404,18 @@
+
+ Create User
+
+
+ form
+
+ code
+
+ action = records.action_create_user()
+
+
+
Employees
hr.employee
diff --git a/addons/hr/views/res_users.xml b/addons/hr/views/res_users.xml
index d61884c35bb..20b14bafe21 100644
--- a/addons/hr/views/res_users.xml
+++ b/addons/hr/views/res_users.xml
@@ -199,6 +199,18 @@
+
+ view.users.simple.form.inherit.hr
+ res.users
+
+
+
+
+
+
+
+
+
Change my Preferences
res.users