Skip to content

Commit

Permalink
fix: remove ESS role when not mapped to employee (backport #37867) (#…
Browse files Browse the repository at this point in the history
…38132)

fix: remove ESS role when not mapped to employee (#37867)

* fix: remove ESS role when not mapped to employee

* fix: emp role removal on unlinking

* fix: test case for user employee role mapping

* fix: mapped employee and user on creation

(cherry picked from commit 56b8d1b)

Co-authored-by: Dany Robert <danyrt@wahni.com>
  • Loading branch information
mergify[bot] and rtdany10 committed Nov 16, 2023
1 parent 58cb430 commit bc01007
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 6 deletions.
4 changes: 3 additions & 1 deletion erpnext/setup/doctype/employee/employee.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,10 @@ frappe.ui.form.on("Employee", {
employee: frm.doc.name,
email: frm.doc.prefered_email
},
freeze: true,
freeze_message: __("Creating User..."),
callback: function (r) {
frm.set_value("user_id", r.message);
frm.reload_doc();
}
});
}
Expand Down
29 changes: 24 additions & 5 deletions erpnext/setup/doctype/employee/employee.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ def validate(self):
else:
existing_user_id = frappe.db.get_value("Employee", self.name, "user_id")
if existing_user_id:
user = frappe.get_doc("User", existing_user_id)
validate_employee_role(user, ignore_emp_check=True)
user.save(ignore_permissions=True)
remove_user_permission("Employee", self.name, existing_user_id)

def after_rename(self, old, new, merge):
Expand Down Expand Up @@ -254,12 +257,26 @@ def reset_employee_emails_cache(self):
frappe.cache().hdel("employees_with_number", prev_number)


def validate_employee_role(doc, method):
def validate_employee_role(doc, method=None, ignore_emp_check=False):
# called via User hook
if "Employee" in [d.role for d in doc.get("roles")]:
if not frappe.db.get_value("Employee", {"user_id": doc.name}):
frappe.msgprint(_("Please set User ID field in an Employee record to set Employee Role"))
doc.get("roles").remove(doc.get("roles", {"role": "Employee"})[0])
if not ignore_emp_check:
if frappe.db.get_value("Employee", {"user_id": doc.name}):
return

user_roles = [d.role for d in doc.get("roles")]
if "Employee" in user_roles:
frappe.msgprint(
_("User {0}: Removed Employee role as there is no mapped employee.").format(doc.name)
)
doc.get("roles").remove(doc.get("roles", {"role": "Employee"})[0])

if "Employee Self Service" in user_roles:
frappe.msgprint(
_("User {0}: Removed Employee Self Service role as there is no mapped employee.").format(
doc.name
)
)
doc.get("roles").remove(doc.get("roles", {"role": "Employee Self Service"})[0])


def update_user_permissions(doc, method):
Expand Down Expand Up @@ -371,6 +388,8 @@ def create_user(employee, user=None, email=None):
}
)
user.insert()
emp.user_id = user.name
emp.save()
return user.name


Expand Down
9 changes: 9 additions & 0 deletions erpnext/setup/doctype/employee/test_employee.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,15 @@ def test_employee_status_left(self):
employee1_doc.status = "Left"
self.assertRaises(InactiveEmployeeStatusError, employee1_doc.save)

def test_user_has_employee(self):
employee = make_employee("test_emp_user_creation@company.com")
employee_doc = frappe.get_doc("Employee", employee)
user = employee_doc.user_id
self.assertTrue("Employee" in frappe.get_roles(user))
employee_doc.user_id = ""
employee_doc.save()
self.assertTrue("Employee" not in frappe.get_roles(user))

def tearDown(self):
frappe.db.rollback()

Expand Down

0 comments on commit bc01007

Please sign in to comment.