Merge pull request #30780 from ruchamahabal/promotion-enhancements
diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json
index 8a12f3b..a3638e1 100644
--- a/erpnext/hr/doctype/employee/employee.json
+++ b/erpnext/hr/doctype/employee/employee.json
@@ -62,6 +62,8 @@
"holiday_list",
"default_shift",
"salary_information",
+ "salary_currency",
+ "ctc",
"salary_mode",
"payroll_cost_center",
"column_break_52",
@@ -807,13 +809,25 @@
"fieldtype": "Link",
"label": "Shift Request Approver",
"options": "User"
+ },
+ {
+ "fieldname": "salary_currency",
+ "fieldtype": "Link",
+ "label": "Salary Currency",
+ "options": "Currency"
+ },
+ {
+ "fieldname": "ctc",
+ "fieldtype": "Currency",
+ "label": "Cost to Company (CTC)",
+ "options": "salary_currency"
}
],
"icon": "fa fa-user",
"idx": 24,
"image_field": "image",
"links": [],
- "modified": "2022-03-22 13:44:37.088519",
+ "modified": "2022-04-22 16:21:55.811983",
"modified_by": "Administrator",
"module": "HR",
"name": "Employee",
diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json
index e0fbd23..173573e 100644
--- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json
+++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json
@@ -1,397 +1,172 @@
{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "HR-EMP-PRO-.YYYY.-.#####",
- "beta": 0,
- "creation": "2018-04-13 18:33:59.476562",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
+ "actions": [],
+ "autoname": "HR-EMP-PRO-.YYYY.-.#####",
+ "creation": "2018-04-13 18:33:59.476562",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "employee",
+ "employee_name",
+ "department",
+ "salary_currency",
+ "column_break_3",
+ "promotion_date",
+ "company",
+ "details_section",
+ "promotion_details",
+ "salary_details_section",
+ "current_ctc",
+ "column_break_12",
+ "revised_ctc",
+ "amended_from"
+ ],
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 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": 1,
- "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": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
+ "fieldname": "employee",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Employee",
+ "options": "Employee",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "employee.employee_name",
- "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": "",
- "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
- },
+ "fetch_from": "employee.employee_name",
+ "fieldname": "employee_name",
+ "fieldtype": "Data",
+ "label": "Employee Name",
+ "read_only": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "employee.department",
- "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": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
+ "fetch_from": "employee.department",
+ "fieldname": "department",
+ "fieldtype": "Link",
+ "label": "Department",
+ "options": "Department",
+ "read_only": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 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
- },
+ "fieldname": "column_break_3",
+ "fieldtype": "Column Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "promotion_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": "Promotion 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": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
+ "fieldname": "promotion_date",
+ "fieldtype": "Date",
+ "label": "Promotion Date",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "employee.company",
- "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
- },
+ "fetch_from": "employee.company",
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "label": "Company",
+ "options": "Company"
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "details_section",
- "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": "Employee Promotion Details",
- "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
- },
+ "description": "Set the properties that should be updated in the Employee master on promotion submission",
+ "fieldname": "details_section",
+ "fieldtype": "Section Break",
+ "label": "Employee Promotion Details"
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "promotion_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": "Employee Promotion Detail",
- "length": 0,
- "no_copy": 0,
- "options": "Employee Property History",
- "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
- },
+ "fieldname": "promotion_details",
+ "fieldtype": "Table",
+ "options": "Employee Property History",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 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": "Employee Promotion",
- "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
+ "fieldname": "amended_from",
+ "fieldtype": "Link",
+ "label": "Amended From",
+ "no_copy": 1,
+ "options": "Employee Promotion",
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "fieldname": "salary_details_section",
+ "fieldtype": "Section Break",
+ "label": "Salary Details"
+ },
+ {
+ "fieldname": "column_break_12",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fetch_from": "employee.salary_currency",
+ "fieldname": "salary_currency",
+ "fieldtype": "Link",
+ "label": "Salary Currency",
+ "options": "Currency",
+ "read_only": 1
+ },
+ {
+ "fetch_from": "employee.ctc",
+ "fetch_if_empty": 1,
+ "fieldname": "current_ctc",
+ "fieldtype": "Currency",
+ "label": "Current CTC",
+ "mandatory_depends_on": "revised_ctc",
+ "options": "salary_currency"
+ },
+ {
+ "depends_on": "current_ctc",
+ "fieldname": "revised_ctc",
+ "fieldtype": "Currency",
+ "label": "Revised CTC",
+ "options": "salary_currency"
}
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 1,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-08-21 16:15:40.284987",
- "modified_by": "Administrator",
- "module": "HR",
- "name": "Employee Promotion",
- "name_case": "",
- "owner": "Administrator",
+ ],
+ "is_submittable": 1,
+ "links": [],
+ "modified": "2022-04-22 18:47:10.168744",
+ "modified_by": "Administrator",
+ "module": "HR",
+ "name": "Employee Promotion",
+ "naming_rule": "Expression (old style)",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Employee",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 0
- },
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Employee",
+ "share": 1
+ },
{
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "HR User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 1,
+ "create": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "HR User",
+ "share": 1,
+ "submit": 1,
"write": 1
- },
+ },
{
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "HR Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 1,
+ "amend": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "HR Manager",
+ "share": 1,
+ "submit": 1,
"write": 1
}
- ],
- "quick_entry": 1,
- "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,
- "track_views": 0
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "states": [],
+ "title_field": "employee_name",
+ "track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.py b/erpnext/hr/doctype/employee_promotion/employee_promotion.py
index d77c1dd..8c802e9 100644
--- a/erpnext/hr/doctype/employee_promotion/employee_promotion.py
+++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.py
@@ -26,9 +26,17 @@
employee = update_employee_work_history(
employee, self.promotion_details, date=self.promotion_date
)
+
+ if self.revised_ctc:
+ employee.ctc = self.revised_ctc
+
employee.save()
def on_cancel(self):
employee = frappe.get_doc("Employee", self.employee)
employee = update_employee_work_history(employee, self.promotion_details, cancel=True)
+
+ if self.revised_ctc:
+ employee.ctc = self.current_ctc
+
employee.save()
diff --git a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py
index 06825ec..71bb1a6 100644
--- a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py
+++ b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py
@@ -4,21 +4,22 @@
import unittest
import frappe
+from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, getdate
from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee
-class TestEmployeePromotion(unittest.TestCase):
+class TestEmployeePromotion(FrappeTestCase):
def setUp(self):
- self.employee = make_employee("employee@promotions.com")
- frappe.db.sql("""delete from `tabEmployee Promotion`""")
+ frappe.db.delete("Employee Promotion")
def test_submit_before_promotion_date(self):
- promotion_obj = frappe.get_doc(
+ employee = make_employee("employee@promotions.com")
+ promotion = frappe.get_doc(
{
"doctype": "Employee Promotion",
- "employee": self.employee,
+ "employee": employee,
"promotion_details": [
{
"property": "Designation",
@@ -29,10 +30,68 @@
],
}
)
- promotion_obj.promotion_date = add_days(getdate(), 1)
- promotion_obj.save()
- self.assertRaises(frappe.DocstatusTransitionError, promotion_obj.submit)
- promotion = frappe.get_doc("Employee Promotion", promotion_obj.name)
+ promotion.promotion_date = add_days(getdate(), 1)
+ self.assertRaises(frappe.DocstatusTransitionError, promotion.submit)
+
promotion.promotion_date = getdate()
promotion.submit()
self.assertEqual(promotion.docstatus, 1)
+
+ def test_employee_history(self):
+ for grade in ["L1", "L2"]:
+ frappe.get_doc({"doctype": "Employee Grade", "__newname": grade}).insert()
+
+ employee = make_employee(
+ "test_employee_promotion@example.com",
+ company="_Test Company",
+ date_of_birth=getdate("30-09-1980"),
+ date_of_joining=getdate("01-10-2021"),
+ designation="Software Developer",
+ grade="L1",
+ salary_currency="INR",
+ ctc="500000",
+ )
+
+ promotion = frappe.get_doc(
+ {
+ "doctype": "Employee Promotion",
+ "employee": employee,
+ "promotion_date": getdate(),
+ "revised_ctc": "1000000",
+ "promotion_details": [
+ {
+ "property": "Designation",
+ "current": "Software Developer",
+ "new": "Project Manager",
+ "fieldname": "designation",
+ },
+ {"property": "Grade", "current": "L1", "new": "L2", "fieldname": "grade"},
+ ],
+ }
+ ).submit()
+
+ # employee fields updated
+ employee = frappe.get_doc("Employee", employee)
+ self.assertEqual(employee.grade, "L2")
+ self.assertEqual(employee.designation, "Project Manager")
+ self.assertEqual(employee.ctc, 1000000)
+
+ # internal work history updated
+ self.assertEqual(employee.internal_work_history[0].designation, "Software Developer")
+ self.assertEqual(employee.internal_work_history[0].from_date, getdate("01-10-2021"))
+
+ self.assertEqual(employee.internal_work_history[1].designation, "Project Manager")
+ self.assertEqual(employee.internal_work_history[1].from_date, getdate())
+
+ promotion.cancel()
+ employee.reload()
+
+ # fields restored
+ self.assertEqual(employee.grade, "L1")
+ self.assertEqual(employee.designation, "Software Developer")
+ self.assertEqual(employee.ctc, 500000)
+
+ # internal work history updated on cancellation
+ self.assertEqual(len(employee.internal_work_history), 1)
+ self.assertEqual(employee.internal_work_history[0].designation, "Software Developer")
+ self.assertEqual(employee.internal_work_history[0].from_date, getdate("01-10-2021"))
diff --git a/erpnext/hr/doctype/employee_transfer_property/__init__.py b/erpnext/hr/doctype/employee_transfer_property/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/hr/doctype/employee_transfer_property/__init__.py
+++ /dev/null
diff --git a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js
deleted file mode 100644
index 9987c82..0000000
--- a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Employee Transfer Property', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json
deleted file mode 100644
index 829169d..0000000
--- a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-04-13 18:24:30.579965",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "property",
- "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": "Property",
- "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": "current",
- "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": "Current",
- "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": "new",
- "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": "New",
- "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,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-04-13 18:25:54.889579",
- "modified_by": "Administrator",
- "module": "HR",
- "name": "Employee Transfer Property",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py
deleted file mode 100644
index 76e2006..0000000
--- a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class EmployeeTransferProperty(Document):
- pass
diff --git a/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py b/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py
deleted file mode 100644
index 981d46f..0000000
--- a/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestEmployeeTransferProperty(unittest.TestCase):
- pass
diff --git a/erpnext/hr/employee_property_update.js b/erpnext/hr/employee_property_update.js
index 60d06b4..86130bf 100644
--- a/erpnext/hr/employee_property_update.js
+++ b/erpnext/hr/employee_property_update.js
@@ -8,39 +8,65 @@
};
});
},
- onload: function(frm){
- if(frm.doc.__islocal){
- if(frm.doctype == "Employee Promotion"){
- frm.doc.promotion_details = [];
- }else if (frm.doctype == "Employee Transfer") {
- frm.doc.transfer_details = [];
- }
- }
+
+ onload: function(frm) {
+ if (frm.doc.__islocal)
+ frm.trigger("clear_property_table");
},
+
employee: function(frm) {
- frm.add_fetch("employee", "company", "company");
+ frm.trigger("clear_property_table");
},
+
+ clear_property_table: function(frm) {
+ let table = (frm.doctype == "Employee Promotion") ? "promotion_details" : "transfer_details";
+ frm.clear_table(table);
+ frm.refresh_field(table);
+
+ frm.fields_dict[table].grid.wrapper.find(".grid-add-row").hide();
+ },
+
refresh: function(frm) {
- var table;
- if(frm.doctype == "Employee Promotion"){
+ let table;
+ if (frm.doctype == "Employee Promotion") {
table = "promotion_details";
- }else if (frm.doctype == "Employee Transfer") {
+ } else if (frm.doctype == "Employee Transfer") {
table = "transfer_details";
}
- if(!table){return;}
- cur_frm.fields_dict[table].grid.wrapper.find('.grid-add-row').hide();
- cur_frm.fields_dict[table].grid.add_custom_button(__('Add Row'), () => {
- if(!frm.doc.employee){
- frappe.msgprint(__("Please select Employee"));
+
+ if (!table)
+ return;
+
+ frm.fields_dict[table].grid.wrapper.find(".grid-add-row").hide();
+ frm.events.setup_employee_property_button(frm, table);
+ },
+
+ setup_employee_property_button: function(frm, table) {
+ frm.fields_dict[table].grid.add_custom_button(__("Add Employee Property"), () => {
+ if (!frm.doc.employee) {
+ frappe.msgprint(__("Please select Employee first."));
return;
}
- frappe.call({
- method: 'erpnext.hr.utils.get_employee_fields_label',
- callback: function(r) {
- if(r.message){
- show_dialog(frm, table, r.message);
+
+ const allowed_fields = [];
+ const exclude_fields = ["naming_series", "employee", "first_name", "middle_name", "last_name", "marital_status", "ctc",
+ "employee_name", "status", "image", "gender", "date_of_birth", "date_of_joining", "lft", "rgt", "old_parent"];
+
+ const exclude_field_types = ["HTML", "Section Break", "Column Break", "Button", "Read Only", "Tab Break", "Table"];
+
+ frappe.model.with_doctype("Employee", () => {
+ const field_label_map = {};
+ frappe.get_meta("Employee").fields.forEach(d => {
+ field_label_map[d.fieldname] = __(d.label) + ` (${d.fieldname})`;
+ if (!in_list(exclude_field_types, d.fieldtype) && !in_list(exclude_fields, d.fieldname)) {
+ allowed_fields.push({
+ label: field_label_map[d.fieldname],
+ value: d.fieldname,
+ });
}
- }
+ });
+
+ show_dialog(frm, table, allowed_fields);
});
});
}
@@ -50,21 +76,20 @@
var d = new frappe.ui.Dialog({
title: "Update Property",
fields: [
- {fieldname: "property", label: __('Select Property'), fieldtype:"Select", options: field_labels},
- {fieldname: "current", fieldtype: "Data", label:__('Current'), read_only: true},
- {fieldname: "field_html", fieldtype: "HTML"}
+ {fieldname: "property", label: __("Select Property"), fieldtype: "Autocomplete", options: field_labels},
+ {fieldname: "current", fieldtype: "Data", label: __("Current"), read_only: true},
+ {fieldname: "new_value", fieldtype: "Data", label: __("New")}
],
- primary_action_label: __('Add to Details'),
+ primary_action_label: __("Add to Details"),
primary_action: () => {
- d.get_primary_btn().attr('disabled', true);
- if(d.data) {
- var input = $('[data-fieldname="field_html"] input');
- d.data.new = input.val();
- $(input).remove();
+ d.get_primary_btn().attr("disabled", true);
+ if (d.data) {
+ d.data.new = d.get_values().new_value;
add_to_details(frm, d, table);
}
}
});
+
d.fields_dict["property"].df.onchange = () => {
let property = d.get_values().property;
d.data.fieldname = property;
@@ -73,10 +98,10 @@
method: 'erpnext.hr.utils.get_employee_field_property',
args: {employee: frm.doc.employee, fieldname: property},
callback: function(r) {
- if(r.message){
+ if (r.message) {
d.data.current = r.message.value;
d.data.property = r.message.label;
- d.fields_dict.field_html.$wrapper.html("");
+
d.set_value('current', r.message.value);
render_dynamic_field(d, r.message.datatype, r.message.options, property);
d.get_primary_btn().attr('disabled', false);
@@ -95,25 +120,26 @@
df: {
"fieldtype": fieldtype,
"fieldname": fieldname,
- "options": options || ''
+ "options": options || '',
+ "label": __("New")
},
- parent: d.fields_dict.field_html.wrapper,
+ parent: d.fields_dict.new_value.wrapper,
only_input: false
});
dynamic_field.make_input();
- $(dynamic_field.label_area).text(__("New"));
+ d.replace_field("new_value", dynamic_field.df);
};
var add_to_details = function(frm, d, table) {
let data = d.data;
- if(data.fieldname){
- if(validate_duplicate(frm, table, data.fieldname)){
- frappe.show_alert({message:__("Property already added"), indicator:'orange'});
+ if (data.fieldname) {
+ if (validate_duplicate(frm, table, data.fieldname)) {
+ frappe.show_alert({message: __("Property already added"), indicator: "orange"});
return false;
}
- if(data.current == data.new){
- frappe.show_alert({message:__("Nothing to change"), indicator:'orange'});
- d.get_primary_btn().attr('disabled', false);
+ if (data.current == data.new) {
+ frappe.show_alert({message: __("Nothing to change"), indicator: "orange"});
+ d.get_primary_btn().attr("disabled", false);
return false;
}
frm.add_child(table, {
@@ -123,13 +149,16 @@
new: data.new
});
frm.refresh_field(table);
- d.fields_dict.field_html.$wrapper.html("");
+
+ frm.fields_dict[table].grid.wrapper.find(".grid-add-row").hide();
+
+ d.fields_dict.new_value.$wrapper.html("");
d.set_value("property", "");
- d.set_value('current', "");
- frappe.show_alert({message:__("Added to details"),indicator:'green'});
+ d.set_value("current", "");
+ frappe.show_alert({message: __("Added to details"), indicator: "green"});
d.data = {};
- }else {
- frappe.show_alert({message:__("Value missing"),indicator:'red'});
+ } else {
+ frappe.show_alert({message: __("Value missing"), indicator: "red"});
}
};
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index 40ab805..4e30b0f 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -89,29 +89,6 @@
@frappe.whitelist()
-def get_employee_fields_label():
- fields = []
- for df in frappe.get_meta("Employee").get("fields"):
- if df.fieldname in [
- "salutation",
- "user_id",
- "employee_number",
- "employment_type",
- "holiday_list",
- "branch",
- "department",
- "designation",
- "grade",
- "notice_number_of_days",
- "reports_to",
- "leave_policy",
- "company_email",
- ]:
- fields.append({"value": df.fieldname, "label": df.label})
- return fields
-
-
-@frappe.whitelist()
def get_employee_field_property(employee, fieldname):
if employee and fieldname:
field = frappe.get_meta("Employee").get_field(fieldname)
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index c290551..d163ca5 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -365,3 +365,4 @@
erpnext.patches.v13_0.update_expense_claim_status_for_paid_advances
erpnext.patches.v13_0.create_gst_custom_fields_in_quotation
erpnext.patches.v13_0.copy_custom_field_filters_to_website_item
+erpnext.patches.v14_0.delete_employee_transfer_property_doctype
diff --git a/erpnext/patches/v14_0/delete_employee_transfer_property_doctype.py b/erpnext/patches/v14_0/delete_employee_transfer_property_doctype.py
new file mode 100644
index 0000000..b50e010
--- /dev/null
+++ b/erpnext/patches/v14_0/delete_employee_transfer_property_doctype.py
@@ -0,0 +1,5 @@
+import frappe
+
+
+def execute():
+ frappe.delete_doc("DocType", "Employee Transfer Property", ignore_missing=True)