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