Employee tree (#11667)

* nested set implemented

* treeview for employee

* patch added to assign lft rgt, update nsm_model on trash

* call on_trash method of super class
This commit is contained in:
Zarrar 2017-11-29 18:44:02 +05:30 committed by Nabin Hait
parent facf503f11
commit 95ee7654a1
5 changed files with 169 additions and 8 deletions

View File

@ -2418,6 +2418,96 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "lft",
"fieldtype": "Int",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "lft",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "rgt",
"fieldtype": "Int",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "rgt",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "old_parent",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 1,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Old Parent",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
}
],
"has_web_view": 0,
@ -2432,7 +2522,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2017-10-04 11:42:02.495731",
"modified": "2017-11-19 01:27:48.222343",
"modified_by": "Administrator",
"module": "HR",
"name": "Employee",

View File

@ -10,13 +10,14 @@ from frappe import throw, _, scrub
import frappe.permissions
from frappe.model.document import Document
from erpnext.utilities.transaction_base import delete_events
from frappe.utils.nestedset import NestedSet
class EmployeeUserDisabledError(frappe.ValidationError):
pass
class Employee(NestedSet):
nsm_parent_field = 'reports_to'
class Employee(Document):
def autoname(self):
naming_method = frappe.db.get_value("HR Settings", None, "emp_created_by")
if not naming_method:
@ -52,7 +53,11 @@ class Employee(Document):
frappe.permissions.remove_user_permission(
"Employee", self.name, existing_user_id)
def update_nsm_model(self):
frappe.utils.nestedset.update_nsm(self)
def on_update(self):
self.update_nsm_model()
if self.user_id:
self.update_user()
self.update_user_permissions()
@ -154,13 +159,13 @@ class Employee(Document):
throw(_("Employee cannot report to himself."))
def on_trash(self):
super(Employee, self).on_trash()
delete_events(self.doctype, self.name)
def validate_prefered_email(self):
if self.prefered_contact_email and not self.get(scrub(self.prefered_contact_email)):
frappe.msgprint(_("Please enter " + self.prefered_contact_email))
def get_timeline_data(doctype, name):
'''Return timeline for attendance'''
return dict(frappe.db.sql('''select unix_timestamp(attendance_date), count(*)
@ -183,7 +188,6 @@ def get_retirement_date(date_of_birth=None):
return ret
def validate_employee_role(doc, method):
# called via User hook
if "Employee" in [d.role for d in doc.get("roles")]:
@ -241,7 +245,6 @@ def get_holiday_list_for_employee(employee, raise_exception=True):
def is_holiday(employee, date=None):
'''Returns True if given Employee has an holiday on the given date
:param employee: Employee `name`
:param date: Date to check. Will check for today if None'''
@ -300,4 +303,27 @@ def get_employee_emails(employee_list):
if user or email:
employee_emails.append(user or email)
return employee_emails
return employee_emails
@frappe.whitelist()
def get_children(doctype, parent=None, company=None, is_root=False, is_tree=False):
condition = ''
if is_root:
parent = ""
if parent and company and parent!=company:
condition = ' and reports_to = "{0}"'.format(frappe.db.escape(parent))
else:
condition = ' and ifnull(reports_to, "")=""'
employee = frappe.db.sql("""
select
name as value, employee_name as title,
exists(select name from `tabEmployee` where reports_to=emp.name) as expandable
from
`tabEmployee` emp
where company='{company}' {condition} order by name"""
.format(company=company, condition=condition), as_dict=1)
# return employee
return employee

View File

@ -0,0 +1,36 @@
frappe.treeview_settings['Employee'] = {
get_tree_nodes: "erpnext.hr.doctype.employee.employee.get_children",
filters: [
{
fieldname: "company",
fieldtype:"Select",
options: $.map(locals[':Company'], function(c) { return c.name; }).sort(),
label: __("Company"),
default: frappe.defaults.get_default('company') ? frappe.defaults.get_default('company') : ""
}
],
breadcrumb: "Hr",
disable_add_node: true,
get_tree_root: false,
toolbar: [
{ toggle_btn: true },
{
label:__("Edit"),
condition: function(node) {
return !node.is_root;
},
click: function(node) {
frappe.set_route("Form", "Employee", node.data.value);
}
}
],
menu_items: [
{
label: __("New Employee"),
action: function() {
frappe.new_doc("Employee", true);
},
condition: 'frappe.boot.user.can_create.indexOf("Employee") !== -1'
}
],
};

View File

@ -472,4 +472,5 @@ erpnext.patches.v9_0.update_multi_uom_fields_in_material_request
erpnext.patches.v10_0.rename_schools_to_education
erpnext.patches.v9_2.repost_reserved_qty_for_production
erpnext.patches.v9_2.remove_company_from_patient
erpnext.patches.v9_2.set_item_name_in_production_order
erpnext.patches.v9_2.set_item_name_in_production_order
erpnext.patches.v10_0.update_lft_rgt_for_employee

View File

@ -0,0 +1,8 @@
import frappe
from frappe.utils.nestedset import rebuild_tree
def execute():
""" assign lft and rgt appropriately """
frappe.reload_doc("hr", "doctype", "employee")
rebuild_tree("Employee", "reports_to")