Removed employee table from Salary Structure and added employee name in all forms
diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py
index fefa3e9..9a82981 100644
--- a/erpnext/config/hr.py
+++ b/erpnext/config/hr.py
@@ -84,17 +84,7 @@
},
{
"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 @@
},
{
"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 42317ed..e33acf3 100644
--- a/erpnext/hr/doctype/attendance_request/attendance_request.json
+++ b/erpnext/hr/doctype/attendance_request/attendance_request.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "from_date",
"fieldtype": "Date",
"hidden": 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 1003bc5..f8b91a6 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,
@@ -50,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "work_from_date",
"fieldtype": "Date",
"hidden": 0,
@@ -142,6 +175,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "reason",
"fieldtype": "Small Text",
"hidden": 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 bf0212a..90d482a 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 @@
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 5d771ba..ea73ca9 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 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 a1f3760..025631b 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 0b74f4f..0fff4fd 100644
--- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json
+++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "column_break_2",
"fieldtype": "Column Break",
"hidden": 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 28fdc72..5e2b34b 100644
--- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json
+++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "claim_date",
"fieldtype": "Date",
"hidden": 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 fe9e9c4..6d2bf5a 100644
--- a/erpnext/hr/doctype/employee_incentive/employee_incentive.json
+++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "incentive_amount",
"fieldtype": "Currency",
"hidden": 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 0bf2031..a7d49bc 100644
--- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json
+++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "promotion_date",
"fieldtype": "Date",
"hidden": 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 5d0a367..55fa073 100644
--- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json
+++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "transfer_date",
"fieldtype": "Date",
"hidden": 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 0f77fb9..f220d78 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 @@
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 11d903c..22f0b20 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,
@@ -175,6 +147,36 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "leave_balance",
"fieldtype": "Float",
"hidden": 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 653012a..a505258 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 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 91727a0..946ceec 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 f7a4368..381fbb2 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 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 bf7f38a..13cd823 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,
@@ -50,98 +51,6 @@
"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,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
"hidden": 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 9c29bf9..572b2f7 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 1a001c5..1d1aef20 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,
@@ -454,36 +454,6 @@
"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,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"depends_on": "allow_encashment",
"fieldname": "earning_component",
"fieldtype": "Link",
@@ -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 8e6b69b..8e5f8e6 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 @@
}
}
});
- 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 @@
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 @@
},
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 @@
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 4da472f..5480c0e 100644
--- a/erpnext/hr/doctype/salary_structure/salary_structure.json
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.json
@@ -212,69 +212,6 @@
"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,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"fieldname": "time_sheet_earning_detail",
"fieldtype": "Section Break",
"hidden": 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 d8b56e3..23c57de 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 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 @@
@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 37a6fc8..e7c6598 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 0dd4f90..ab03536 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,
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "salary_structure",
"fieldtype": "Link",
"hidden": 0,
@@ -83,6 +115,36 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "from_date",
"fieldtype": "Date",
"hidden": 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 f4fbb3c..e5188c3 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 4d04ab3..87d69e4 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 c221277..1210d15 100644
--- a/erpnext/hr/doctype/shift_request/shift_request.json
+++ b/erpnext/hr/doctype/shift_request/shift_request.json
@@ -51,6 +51,38 @@
"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,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "company",
"fieldtype": "Link",
"hidden": 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 8eab16d..a23324d 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -524,3 +524,4 @@
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 0000000..e321db6
--- /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