diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index fefa3e9f415..9a8298120aa 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -84,17 +84,7 @@ def get_data(): }, { "type": "doctype", - "name": "Payroll Entry", - "label": _("Payroll Entry"), - "hide_count": True - }, - { - "type": "doctype", - "name": "Employee Benefit Claim", - }, - { - "type": "doctype", - "name": "Employee Incentive", + "name": "Payroll Entry" }, { "type": "doctype", @@ -102,12 +92,20 @@ def get_data(): }, { "type": "doctype", - "name": "Employee Tax Exemption Proof Submission", + "name": "Employee Benefit Claim", }, { "type": "doctype", "name": "Employee Tax Exemption Declaration", - } + }, + { + "type": "doctype", + "name": "Employee Tax Exemption Proof Submission", + }, + { + "type": "doctype", + "name": "Employee Incentive", + }, ] }, { diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.json b/erpnext/hr/doctype/attendance_request/attendance_request.json index 42317ed631f..e33acf35fe0 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.json +++ b/erpnext/hr/doctype/attendance_request/attendance_request.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -242,7 +274,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:02:38.231185", + "modified": "2018-04-14 15:38:14.344570", "modified_by": "Administrator", "module": "HR", "name": "Attendance Request", @@ -332,6 +364,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json index 1003bc5b15a..f8b91a6bc1b 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json @@ -3,6 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 0, + "autoname": "CLR-.####", "beta": 0, "creation": "2018-04-13 14:51:39.326768", "custom": 0, @@ -44,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -136,6 +169,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Type", + "length": 0, + "no_copy": 0, + "options": "Leave Type", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -209,7 +274,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:06:17.469422", + "modified": "2018-04-14 15:36:39.668733", "modified_by": "Administrator", "module": "HR", "name": "Compensatory Leave Request", @@ -299,6 +364,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index bf0212ace97..90d482abcd9 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -7,4 +7,6 @@ import frappe from frappe.model.document import Document class CompensatoryLeaveRequest(Document): - pass + def validate_present(self): + pass + diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py index 5d771baf83f..ea73ca987ad 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py @@ -7,4 +7,35 @@ import frappe import unittest class TestCompensatoryLeaveRequest(unittest.TestCase): - pass + def get_compensatory_leave_request(self): + return frappe.get_doc('Compensatory Leave Request', dict( + employee = employee, + work_from_date = today, + work_to_date = today, + reason = 'test' + )).insert() + + def test_creation_of_leave_allocation(self): + employee = get_employee() + today = get_today() + + compensatory_leave_request = self.get_compensatory_leave_request(today) + + before = get_leave_balance(employee, compensatory_leave_request.leave_type) + + compensatory_leave_request.submit() + + self.assertEqual(get_leave_balance(employee, compensatory_leave_request.leave_type), before + 1) + + def test_max_compensatory_leave(self): + employee = get_employee() + today = get_today() + + compensatory_leave_request = self.get_compensatory_leave_request() + + frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 0) + + self.assertRaises(MaxLeavesLimitCrossed, compensatory_leave_request.submit) + + frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 10) + \ No newline at end of file diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index a1f37608edd..025631b50ea 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1236,7 +1236,43 @@ "bold": 0, "collapsible": 0, "columns": 0, +<<<<<<< HEAD "fieldname": "default_leave_policy", +======= + "description": "The first Leave Approver in the list will be set as the default Leave Approver", + "fieldname": "leave_approvers", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Approvers", + "length": 0, + "no_copy": 0, + "options": "Employee Leave Approver", + "permlevel": 0, + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_policy", +>>>>>>> Removed employee table from Salary Structure and added employee name in all forms "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -1245,7 +1281,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Leave policy", + "label": "Leave Policy", "length": 0, "no_copy": 0, "options": "Leave Policy", diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json index 0b74f4fcffe..0fff4fdab23 100644 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -211,7 +243,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:33:14.303161", + "modified": "2018-04-14 15:35:20.748301", "modified_by": "Administrator", "module": "HR", "name": "Employee Benefit Application", @@ -301,6 +333,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json index 28fdc7245ee..5e2b34b7d7a 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -335,7 +367,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:36:23.572732", + "modified": "2018-04-14 15:38:41.538646", "modified_by": "Administrator", "module": "HR", "name": "Employee Benefit Claim", @@ -425,6 +457,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.json b/erpnext/hr/doctype/employee_incentive/employee_incentive.json index fe9e9c4db56..6d2bf5a9fb8 100644 --- a/erpnext/hr/doctype/employee_incentive/employee_incentive.json +++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -149,7 +181,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:55:05.862607", + "modified": "2018-04-14 15:41:16.126334", "modified_by": "Administrator", "module": "HR", "name": "Employee Incentive", @@ -220,6 +252,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json index 0bf2031f9a6..a7d49bcad36 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -157,7 +189,7 @@ "label": "Employee Promotion Detail", "length": 0, "no_copy": 0, - "options": "Employee Property History", + "options": "Employee Promotion Detail", "permlevel": 0, "precision": "", "print_hide": 0, @@ -213,7 +245,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 11:45:04.685356", + "modified": "2018-04-14 15:42:49.452085", "modified_by": "Administrator", "module": "HR", "name": "Employee Promotion", @@ -284,6 +316,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json index 5d0a3679f71..55fa073fa20 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -189,7 +221,7 @@ "label": "Employee Transfer Detail", "length": 0, "no_copy": 0, - "options": "Employee Property History", + "options": "Employee Transfer Detail", "permlevel": 0, "precision": "", "print_hide": 0, @@ -307,7 +339,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 11:45:36.493830", + "modified": "2018-04-14 15:42:31.098910", "modified_by": "Administrator", "module": "HR", "name": "Employee Transfer", @@ -378,6 +410,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index 0f77fb93b97..f220d7860b8 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -225,6 +225,83 @@ class TestLeaveApplication(unittest.TestCase): frappe.db.set_value("Leave Block List", "_Test Leave Block List", "applies_to_all_departments", 0) + + def test_optional_leave(self): + '''''' + leave_period = get_leave_period() + today = get_today() + + holiday_list = frappe.get_doc(dict( + doctype = 'Holiday List', + name = 'test holiday list for optional holiday' + from_date = year_start_date(), + from_date = year_end_date() + holidays = [ + dict(holiday_date = today, description = 'test') + ] + )) + employee = get_employee() + + frappe.db.set_value('Employee', employee, 'holiday_list', holiday_list) + + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Optional Type', + doctype = 'Leave Type', + is_optional_leave = 1, + holiday_list = holiday_list + )).insert() + + allocate_leaves(employee, leave_period, leave_type.name, 10) + + date = get_today() - 1 + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee, + leave_type = leave_type.name, + from_date = date, + to_date = date, + )) + + # can only apply on optional holidays + self.assertTrue(NotAnOptionalHoliday, leave_application.insert) + + leave_application.from_date = today + leave_application.to_date = today + leave_application.insert() + leave_application.submit() + + # check leave balance is reduced + self.assertEqual(get_leave_balance(employee, leave_period, leave_type.name), 9) + + def test_leaves_allowed(self): + # TODO: test cannot allocate more than max leaves + + def test_applicable_after(self): + # TODO: test not applicable until applicable working days + + def test_max_continuous_leaves(self): + # TODO: test cannot take continuous leaves more than + + def test_earned_leave(self): + leave_period = get_leave_period() + employee = get_employee() + + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Earned Leave Type', + doctype = 'Leave Type', + is_earned_leave = 1, + earned_leave_frequency = 'Monthly', + rounding = 0.5 + )).insert() + + allocate_leaves(employee, leave_period, leave_type.name, 0, eligible_leaves = 12) + + # this method will be called by scheduler + allocate_earned_leaves(leave_type.name, leave_period, as_on = half_of_leave_period) + + self.assertEqual(get_leave_balance(employee, leave_period, leave_type.name), 6) + def make_allocation_record(employee=None, leave_type=None): frappe.db.sql("delete from `tabLeave Allocation`") diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.json b/erpnext/hr/doctype/leave_encashment/leave_encashment.json index 11d903c700e..22f0b20fdb6 100644 --- a/erpnext/hr/doctype/leave_encashment/leave_encashment.json +++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.json @@ -3,6 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, + "autoname": "Leave-Encashment-.####", "beta": 0, "creation": "2018-04-13 15:31:51.197046", "custom": 0, @@ -82,8 +83,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "payroll_date", - "fieldtype": "Date", + "fieldname": "employee_name", + "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -91,44 +92,15 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payroll Date", + "label": "Employee Name", "length": 0, "no_copy": 0, + "options": "employee.employee_name", "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -169,6 +141,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -222,6 +224,68 @@ "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Leave Encashment", + "permlevel": 0, + "print_hide": 1, + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Payroll", + "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, @@ -268,8 +332,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", + "fieldname": "payroll_date", + "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -277,14 +341,14 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Amended From", + "label": "Payroll Date", "length": 0, - "no_copy": 1, - "options": "Leave Encashment", + "no_copy": 0, "permlevel": 0, - "print_hide": 1, + "precision": "", + "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -304,7 +368,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:05:42.659510", + "modified": "2018-04-14 15:35:51.428448", "modified_by": "Administrator", "module": "HR", "name": "Leave Encashment", diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py index 653012a46ed..a5052582a4c 100644 --- a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py @@ -7,4 +7,36 @@ import frappe import unittest class TestLeaveEncashment(unittest.TestCase): - pass + def test_leave_balance_value_and_amount(self): + employee = get_employee() + leave_period = get_leave_period() + today = get_today() + + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Leave Type', + doctype = 'Leave Type', + allow_encashment = 1, + encashment_threshold_days = 3, + earning_component = 'Leave Encashment' + )).insert() + + allocate_leave(employee, leave_period, leave_type.name, 5) + + leave_encashment = frappe.get_doc(dict( + doctype = 'Leave Encashment', + employee = employee, + leave_period = leave_period, + leave_type = leave_type.name, + payroll_date = today + )).insert() + + self.assertEqual(leave_encashment.leave_balance, 5) + self.assertEqual(leave_encashment.encashable_days, 2) + + # TODO; validate value + salary_structure = get_current_structure(employee, today) + self.assertEqual(leave_encashment.encashment_value, + 2 * frappe.db.get_value('Salary Structure', salary_structure, 'leave_encashment_amount_per_day')) + + + diff --git a/erpnext/hr/doctype/leave_period/leave_period.json b/erpnext/hr/doctype/leave_period/leave_period.json index 91727a0b3bf..946ceec238b 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.json +++ b/erpnext/hr/doctype/leave_period/leave_period.json @@ -167,6 +167,288 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "grant_leaves", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Grant Leaves", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "filter_by", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Filter By", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "grant", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Grant", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_12", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "carry_forward_leaves", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Carry Forward Leaves", + "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, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -179,7 +461,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:39:02.199315", + "modified": "2018-04-14 13:29:57.066314", "modified_by": "Administrator", "module": "HR", "name": "Leave Period", diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py index f7a4368c269..381fbb234df 100644 --- a/erpnext/hr/doctype/leave_period/test_leave_period.py +++ b/erpnext/hr/doctype/leave_period/test_leave_period.py @@ -7,4 +7,25 @@ import frappe import unittest class TestLeavePeriod(unittest.TestCase): - pass + def test_leave_grant(self): + employee = get_employee() + leave_policy = get_leave_policy() + leave_period = get_leave_period() + + frappe.db.set_value('Employee', employee, 'leave_policy', leave_policy) + + leave_period.employee = employee + + clear_leave_allocation(employee) + + leave_period.grant_leaves() + + for d in leave_policy: + self.assertEqual(get_leave_balance(employee, d.leave_type), d.annual_allocation) + + return leave_period + + def test_duplicate_grant(self): + leave_period = self.test_leave_grant() + self.assertRaises(DuplicateLeaveGrant, leave_period.grant_leaves) + \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.json b/erpnext/hr/doctype/leave_policy/leave_policy.json index bf7f38aa77c..13cd823f161 100644 --- a/erpnext/hr/doctype/leave_policy/leave_policy.json +++ b/erpnext/hr/doctype/leave_policy/leave_policy.json @@ -3,7 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, - "autoname": "LP.####", + "autoname": "Leave-Policy-.####", "beta": 0, "creation": "2018-04-13 16:06:19.507624", "custom": 0, @@ -19,18 +19,19 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "start_date", - "fieldtype": "Date", + "fieldname": "leave_policy_details", + "fieldtype": "Table", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, - "label": "Start Date", + "label": "Leave Policy Details", "length": 0, "no_copy": 0, + "options": "Leave Policy Detail", "permlevel": 0, "precision": "", "print_hide": 0, @@ -44,98 +45,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "end_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "End Date", - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_active", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Active", - "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, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -166,68 +75,6 @@ "set_only_once": 0, "translatable": 0, "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "leave_policy_details", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Leave Policy Details", - "length": 0, - "no_copy": 0, - "options": "Leave Policy Detail", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 } ], "has_web_view": 0, @@ -240,7 +87,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:57:49.400508", + "modified": "2018-04-14 13:13:27.915855", "modified_by": "Administrator", "module": "HR", "name": "Leave Policy", diff --git a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json index 9c29bf97e77..572b2f7953a 100644 --- a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json +++ b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json @@ -74,68 +74,6 @@ "set_only_once": 0, "translatable": 0, "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 2, - "fieldname": "is_pro_rata_applicable", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Is Pro-rata Applicable", - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 3, - "fieldname": "month_threshold_day", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Month Threshold Day", - "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, - "translatable": 0, - "unique": 0 } ], "has_web_view": 0, @@ -148,7 +86,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 19:59:47.087760", + "modified": "2018-04-14 13:00:34.511109", "modified_by": "Administrator", "module": "HR", "name": "Leave Policy Detail", diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 1a001c53fbf..1d1aef2045e 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -113,7 +113,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "max_continuous_days_allowed", + "fieldname": "max_days_allowed", "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, @@ -448,36 +448,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_11", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "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, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -746,7 +716,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 11:53:59.503513", + "modified": "2018-04-14 14:36:46.824289", "modified_by": "Administrator", "module": "HR", "name": "Leave Type", diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/hr/doctype/salary_structure/salary_structure.js index 8e6b69bd9e3..8e5f8e651fe 100755 --- a/erpnext/hr/doctype/salary_structure/salary_structure.js +++ b/erpnext/hr/doctype/salary_structure/salary_structure.js @@ -2,7 +2,6 @@ // License: GNU General Public License v3. See license.txt {% include "erpnext/public/js/controllers/accounts.js" %} -cur_frm.add_fetch('employee', 'company', 'company'); cur_frm.add_fetch('company', 'default_letter_head', 'letter_head'); @@ -31,14 +30,6 @@ frappe.ui.form.on('Salary Structure', { } } }); - frm.set_query("employee", "employees", function(doc) { - return { - query: "erpnext.controllers.queries.employee_query", - filters: { - company: doc.company - } - } - }); frm.set_query("payment_account", function () { var account_types = ["Bank", "Cash"]; return { @@ -58,61 +49,6 @@ frappe.ui.form.on('Salary Structure', { frm.add_custom_button(__("Preview Salary Slip"), function() { frm.trigger('preview_salary_slip'); }, "fa fa-sitemap", "btn-default"); - - frm.add_custom_button(__("Add Employees"),function () { - frm.trigger('add_employees') - }) - - }, - - add_employees:function (frm) { - frm.$emp_dialog = new frappe.ui.Dialog({ - title: __("Add Employees"), - fields: [ - {fieldname:'company', fieldtype:'Link', options: 'Company', label: __('Company')}, - {fieldname:'branch', fieldtype:'Link', options: 'Branch', label: __('Branch')}, - {fieldname:'department', fieldtype:'Link', options: 'Department', label: __('Department')}, - {fieldname:'designation', fieldtype:'Link', options: 'Designation', label: __('Designation')}, - {fieldname:'base_variable', fieldtype:'Section Break'}, - {fieldname:'base', fieldtype:'Currency', label: __('Base')}, - {fieldname:'base_col_br', fieldtype:'Column Break'}, - {fieldname:'variable', fieldtype:'Currency', label: __('Variable')} - ] - }); - frm.$emp_dialog.set_primary_action(__("Add"), function() { - frm.trigger('get_employees'); - }); - frm.$emp_dialog.show(); - }, - - get_employees:function (frm) { - var filters = frm.$emp_dialog.get_values(); - if ('variable' in filters) { - delete filters.variable - } - if ('base' in filters) { - delete filters.base - } - frappe.call({ - method:'erpnext.hr.doctype.salary_structure.salary_structure.get_employees', - args:{ - filters: filters - }, - callback:function (r) { - var employees = $.map(frm.doc.employees, function(d) { return d.employee }); - for (var i=0; i< r.message.length; i++) { - if (employees.indexOf(r.message[i].name) === -1) { - var row = frappe.model.add_child(frm.doc, frm.fields_dict.employees.df.options, frm.fields_dict.employees.df.fieldname); - row.employee = r.message[i].name; - row.employee_name = r.message[i].employee_name; - row.base = frm.$emp_dialog.get_value('base'); - row.variable = frm.$emp_dialog.get_value('variable'); - } - } - frm.refresh_field('employees'); - frm.$emp_dialog.hide() - } - }) }, salary_slip_based_on_timesheet: function(frm) { @@ -120,38 +56,54 @@ frappe.ui.form.on('Salary Structure', { }, preview_salary_slip: function(frm) { - var d = new frappe.ui.Dialog({ - title: __("Preview Salary Slip"), - fields: [ - { "fieldname":"employee", "fieldtype":"Select", "label":__("Employee"), - options: $.map(frm.doc.employees, function(d) { return d.employee }), reqd: 1 }, - { fieldname:"fetch", "label":__("Show Salary Slip"), "fieldtype":"Button"} - ] - }); - d.get_input("fetch").on("click", function() { - var values = d.get_values(); - if(!values) return; - var print_format; - frm.doc.salary_slip_based_on_timesheet ? - print_format="Salary Slip based on Timesheet" : - print_format="Salary Slip Standard"; + frappe.call({ + method: "erpnext.hr.doctype.salary_structure.salary_structure.get_employees", + args: { + salary_structure: frm.doc.name + }, + callback: function(r) { + var employees = r.message; + var d = new frappe.ui.Dialog({ + title: __("Preview Salary Slip"), + fields: [ + { + "label":__("Employee"), + "fieldname":"employee", + "fieldtype":"Select", + options: employees + }, { + fieldname:"fetch", + "label":__("Show Salary Slip"), + "fieldtype":"Button" + } + ] + }); + d.get_input("fetch").on("click", function() { + var values = d.get_values(); + if(!values) return; + var print_format; + frm.doc.salary_slip_based_on_timesheet ? + print_format="Salary Slip based on Timesheet" : + print_format="Salary Slip Standard"; - frappe.call({ - method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip", - args: { - source_name: frm.doc.name, - employee: values.employee, - as_print: 1, - print_format: print_format - }, - callback: function(r) { - var new_window = window.open(); - new_window.document.write(r.message); - // frappe.msgprint(r.message); - } - }); + frappe.call({ + method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip", + args: { + source_name: frm.doc.name, + employee: values.employee, + as_print: 1, + print_format: print_format + }, + callback: function(r) { + var new_window = window.open(); + new_window.document.write(r.message); + // frappe.msgprint(r.message); + } + }); + }); + d.show(); + } }); - d.show(); }, toggle_fields: function(frm) { @@ -189,7 +141,6 @@ var calculate_totals = function(doc) { cur_frm.cscript.validate = function(doc, cdt, cdn) { calculate_totals(doc); - if(doc.employee && doc.is_active == "Yes") frappe.model.clear_doc("Employee", doc.employee); } diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.json b/erpnext/hr/doctype/salary_structure/salary_structure.json index 4da472fc8c4..5480c0ee92f 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.json +++ b/erpnext/hr/doctype/salary_structure/salary_structure.json @@ -206,69 +206,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee_break", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Select employees for current Salary Structure", - "fieldname": "employees", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employees", - "length": 0, - "no_copy": 0, - "options": "Salary Structure Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -941,6 +878,37 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Salary Structure", + "permlevel": 0, + "print_hide": 1, + "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, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -950,21 +918,21 @@ "idx": 1, "image_view": 0, "in_create": 0, - "is_submittable": 0, + "is_submittable": 1, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 16:31:24.837556", + "modified": "2018-04-14 16:05:11.002259", "modified_by": "Administrator", "module": "HR", "name": "Salary Structure", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, + "amend": 1, + "cancel": 1, "create": 1, - "delete": 0, + "delete": 1, "email": 1, "export": 0, "if_owner": 0, @@ -976,12 +944,12 @@ "role": "HR User", "set_user_permissions": 0, "share": 1, - "submit": 0, + "submit": 1, "write": 1 }, { - "amend": 0, - "cancel": 0, + "amend": 1, + "cancel": 1, "create": 1, "delete": 1, "email": 1, @@ -995,7 +963,7 @@ "role": "HR Manager", "set_user_permissions": 0, "share": 1, - "submit": 0, + "submit": 1, "write": 1 } ], diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py index d8b56e30456..23c57de6516 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.py +++ b/erpnext/hr/doctype/salary_structure/salary_structure.py @@ -4,65 +4,20 @@ from __future__ import unicode_literals import frappe -from frappe.utils import flt, cint, getdate +from frappe.utils import flt, cint from frappe import _ from frappe.model.mapper import get_mapped_doc from frappe.model.document import Document -from erpnext.hr.utils import set_employee_name class SalaryStructure(Document): - def validate(self): self.validate_amount() - for e in self.get('employees'): - set_employee_name(e) - self.validate_date() self.strip_condition_and_formula_fields() - def get_ss_values(self,employee): - basic_info = frappe.db.sql("""select bank_name, bank_ac_no - from `tabEmployee` where name =%s""", employee) - ret = {'bank_name': basic_info and basic_info[0][0] or '', - 'bank_ac_no': basic_info and basic_info[0][1] or ''} - return ret - def validate_amount(self): if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet: frappe.throw(_("Net pay cannot be negative")) - def validate_date(self): - for employee in self.get('employees'): - joining_date, relieving_date = frappe.db.get_value("Employee", employee.employee, - ["date_of_joining", "relieving_date"]) - - if employee.from_date and joining_date and getdate(employee.from_date) < joining_date: - frappe.throw(_("From Date {0} for Employee {1} cannot be before employee's joining Date {2}") - .format(employee.from_date, employee.employee, joining_date)) - - st_name = frappe.db.sql("""select parent from `tabSalary Structure Employee` - where - employee=%(employee)s - and ( - (%(from_date)s between from_date and ifnull(to_date, '2199-12-31')) - or (%(to_date)s between from_date and ifnull(to_date, '2199-12-31')) - or (from_date between %(from_date)s and %(to_date)s) - ) - and ( - exists (select name from `tabSalary Structure` - where name = `tabSalary Structure Employee`.parent and is_active = 'Yes') - ) - and parent != %(salary_struct)s""", - { - 'employee': employee.employee, - 'from_date': employee.from_date, - 'to_date': (employee.to_date or '2199-12-31'), - 'salary_struct': self.name - }) - - if st_name: - frappe.throw(_("Active Salary Structure {0} found for employee {1} for the given dates") - .format(st_name[0][0], employee.employee)) - def strip_condition_and_formula_fields(self): # remove whitespaces from condition and formula fields for row in self.earnings: @@ -78,7 +33,7 @@ def make_salary_slip(source_name, target_doc = None, employee = None, as_print = def postprocess(source, target): if employee: employee_details = frappe.db.get_value("Employee", employee, - ["employee_name", "branch", "designation", "department"], as_dict=1) + ["employee_name", "branch", "designation", "department"], as_dict=1) target.employee = employee target.employee_name = employee_details.employee_name target.branch = employee_details.branch @@ -104,5 +59,7 @@ def make_salary_slip(source_name, target_doc = None, employee = None, as_print = @frappe.whitelist() -def get_employees(**args): - return frappe.get_list('Employee',filters=args['filters'], fields=['name', 'employee_name']) +def get_employees(salary_structure): + employees = frappe.get_list('Salary Structure Assignment', + filters={'salary_structure': salary_structure}, fields=['employee']) + return list(set([d.employee for d in employees])) \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js index 37a6fc87463..e7c65986531 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js @@ -2,6 +2,17 @@ // For license information, please see license.txt frappe.ui.form.on('Salary Structure Assignment', { + setup: function(frm) { + frm.set_query("employee", function() { + return { + query: "erpnext.controllers.queries.employee_query", + filters: { + company: frm.doc.company + } + } + }); + }, + refresh: function(frm) { } diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json index 0dd4f90f894..ab0353636c5 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json @@ -1,9 +1,9 @@ { "allow_copy": 0, "allow_guest_to_view": 0, - "allow_import": 0, + "allow_import": 1, "allow_rename": 0, - "autoname": "SSA.#####", + "autoname": "SSA-.#####", "beta": 0, "creation": "2018-04-13 16:38:41.769237", "custom": 0, @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -77,6 +109,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_6", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -110,7 +172,7 @@ }, { "allow_bulk_edit": 0, - "allow_on_submit": 0, + "allow_on_submit": 1, "bold": 0, "collapsible": 0, "columns": 0, @@ -133,7 +195,161 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Base", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_9", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "variable", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Variable", + "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, "translatable": 0, @@ -181,7 +397,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:54:11.425087", + "modified": "2018-04-14 16:11:12.749326", "modified_by": "Administrator", "module": "HR", "name": "Salary Structure Assignment", @@ -246,12 +462,13 @@ "write": 1 } ], - "quick_entry": 1, + "quick_entry": 0, "read_only": 0, "read_only_onload": 0, "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py index f4fbb3c62e2..e5188c3a299 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py @@ -4,7 +4,49 @@ from __future__ import unicode_literals import frappe +from frappe import _ +from frappe.utils import getdate from frappe.model.document import Document class SalaryStructureAssignment(Document): - pass + def validate(self): + self.validate_dates() + + def validate_date(self): + joining_date, relieving_date = frappe.db.get_value("Employee", self.employee, + ["date_of_joining", "relieving_date"]) + + if self.from_date: + if joining_date and getdate(self.from_date) < joining_date: + frappe.throw(_("From Date {0} cannot be before employee's joining Date {2}") + .format(self.from_date, joining_date)) + if relieving_date and getdate(self.from_date) > relieving_date: + frappe.throw(_("From Date {0} cannot be after employee's relieving Date {2}") + .format(self.from_date, relieving_date)) + + if self.to_date: + if self.from_date and getdate(self.from_date) < getdate(self.to_date): + frappe.throw(_("From Date {0} cannot be before To Date {2}") + .format(self.from_date, self.to_date)) + if relieving_date and getdate(self.to_date) > relieving_date: + frappe.throw(_("To Date {0} cannot be after employee's relieving Date {2}") + .format(self.to_date, relieving_date)) + + def validate_duplicate_assignments(self): + assignment = frappe.db.sql(""" + select name from `tabSalary Structure Assignment` + where employee=%(employee)s + and name != %(salary_struct)s + and ( + (%(from_date)s between from_date and ifnull(to_date, '2199-12-31')) + or (%(to_date)s between from_date and ifnull(to_date, '2199-12-31')) + or (from_date between %(from_date)s and %(to_date)s) + )""", { + 'employee': self.employee, + 'from_date': self.from_date, + 'to_date': (self.to_date or '2199-12-31'), + 'salary_struct': self.salary_struct + }) + + if assignment: + frappe.throw(_("Active Salary Structure Assignment {0} found for employee {1} for the given dates").format(assignment[0][0], self.employee)) \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.json b/erpnext/hr/doctype/shift_assignment/shift_assignment.json index 4d04ab3672e..87d69e4816a 100644 --- a/erpnext/hr/doctype/shift_assignment/shift_assignment.json +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.json @@ -19,7 +19,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "shift_type", + "fieldname": "employee", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -28,10 +28,10 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Shift Type", + "label": "Employee", "length": 0, "no_copy": 0, - "options": "Shift Type", + "options": "Employee", "permlevel": 0, "precision": "", "print_hide": 0, @@ -51,7 +51,39 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "employee", + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_type", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -60,10 +92,10 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Employee", + "label": "Shift Type", "length": 0, "no_copy": 0, - "options": "Employee", + "options": "Shift Type", "permlevel": 0, "precision": "", "print_hide": 0, @@ -243,7 +275,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:53:32.395707", + "modified": "2018-04-14 15:42:12.617715", "modified_by": "Administrator", "module": "HR", "name": "Shift Assignment", @@ -314,6 +346,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_request/shift_request.json b/erpnext/hr/doctype/shift_request/shift_request.json index c22127745a5..1210d157dc6 100644 --- a/erpnext/hr/doctype/shift_request/shift_request.json +++ b/erpnext/hr/doctype/shift_request/shift_request.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "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, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -213,7 +245,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:55:41.428419", + "modified": "2018-04-14 15:40:39.590051", "modified_by": "Administrator", "module": "HR", "name": "Shift Request", @@ -284,6 +316,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 8eab16d8e69..a23324d64de 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -524,3 +524,4 @@ erpnext.patches.v11_0.add_default_email_template_for_leave erpnext.patches.v11_0.set_default_email_template_in_hr erpnext.patches.v10_0.taxes_issue_with_pos erpnext.patches.v11_0.rename_field_max_days_allowed +erpnext.patches.v11_0.create_salary_structure_assignments diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py new file mode 100644 index 00000000000..e321db60a5b --- /dev/null +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -0,0 +1,24 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doc("hr", "doctype", "salary_structure_assignment") + for d in frappe.db.sql(""" + select * from `tabSalary Structure Employee` sse, `tabSalary Structure` ss + where ss.name = sse.parent""", as_dict=1): + + s = frappe.new_doc("Salary Structure Assignment") + s.employee = d.employee + s.employee_name = d.employee_name + s.salary_structure = d.parent + s.from_date = d.from_date + s.to_date = d.to_date + s.base = d.base + s.variable = d.variable + s.company = d.company + s.save() + + frappe.db.sql("update `tabSalary Structure` set docstatus=1") \ No newline at end of file