diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json index 33fb793079..64f91c7271 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/hr/doctype/salary_component/salary_component.json @@ -31,6 +31,7 @@ "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, @@ -58,8 +59,9 @@ "print_hide_if_no_value": 0, "print_width": "120px", "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0, @@ -86,6 +88,7 @@ "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, @@ -112,6 +115,7 @@ "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, @@ -137,6 +141,7 @@ "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, @@ -164,6 +169,7 @@ "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, @@ -182,7 +188,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-08-31 08:08:47.359578", + "modified": "2016-11-16 12:44:37.733773", "modified_by": "Administrator", "module": "HR", "name": "Salary Component", @@ -199,6 +205,7 @@ "export": 1, "if_owner": 0, "import": 0, + "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, diff --git a/erpnext/hr/doctype/salary_component/salary_component.py b/erpnext/hr/doctype/salary_component/salary_component.py index ca69568976..8af7311f8f 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.py +++ b/erpnext/hr/doctype/salary_component/salary_component.py @@ -10,7 +10,6 @@ from frappe import _ class SalaryComponent(Document): def validate(self): self.validate_abbr() - def validate_abbr(self): if not self.salary_component_abbr: @@ -21,8 +20,5 @@ class SalaryComponent(Document): if self.get('__islocal') and len(self.salary_component_abbr) > 5: frappe.throw(_("Abbreviation cannot have more than 5 characters")) - if not self.salary_component_abbr.strip(): - frappe.throw(_("Abbreviation is mandatory")) - if frappe.db.sql("select salary_component_abbr from `tabSalary Component` where name!=%s and salary_component_abbr=%s", (self.name, self.salary_component_abbr)): frappe.throw(_("Abbreviation already used for another salary component")) \ No newline at end of file diff --git a/erpnext/patches/v7_1/update_missing_salary_component_type.py b/erpnext/patches/v7_1/update_missing_salary_component_type.py index 7f6002da00..f0e3f6a4ad 100644 --- a/erpnext/patches/v7_1/update_missing_salary_component_type.py +++ b/erpnext/patches/v7_1/update_missing_salary_component_type.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals import frappe +from frappe.utils import cstr ''' Some components do not have type set, try and guess whether they turn up in @@ -8,18 +9,38 @@ earnings or deductions in existing salary slips ''' def execute(): - for s in frappe.db.sql('select name from `tabSalary Component` where ifnull(type, "")=""'): - compontent = frappe.get_doc('Salary Component', s[0]) + for s in frappe.db.sql('''select name, type, salary_component_abbr from `tabSalary Component` + where ifnull(type, "")="" or ifnull(salary_component_abbr, "") = ""''', as_dict=1): + + component = frappe.get_doc('Salary Component', s.name) # guess - guess = frappe.db.sql('''select - parentfield from `tabSalary Detail` - where salary_component=%s limit 1''', s[0]) + if not s.type: + guess = frappe.db.sql('''select + parentfield from `tabSalary Detail` + where salary_component=%s limit 1''', s.name) - if guess: - compontent.type = 'Earning' if guess[0][0]=='earnings' else 'Deduction' + if guess: + component.type = 'Earning' if guess[0][0]=='earnings' else 'Deduction' - else: - compontent.type = 'Deduction' - - compontent.save() \ No newline at end of file + else: + component.type = 'Deduction' + + if not s.salary_component_abbr: + abbr = ''.join([c[0] for c in component.salary_component.split()]).upper() + + abbr_count = frappe.db.sql(""" + select + count(name) + from + `tabSalary Component` + where + salary_component_abbr = %s or salary_component_abbr like %s + """, (abbr, abbr + "-%%")) + + if abbr_count and abbr_count[0][0] > 0: + abbr = abbr + "-" + cstr(abbr_count[0][0]) + + component.salary_component_abbr = abbr + + component.save() \ No newline at end of file