From a2c668cb778be0a17c3fb3b085daee1f4b4b51ba Mon Sep 17 00:00:00 2001 From: Saurabh Date: Thu, 29 Oct 2015 13:00:30 +0530 Subject: [PATCH] [fixes] patch, test cases and validations --- .../leave_allocation/leave_allocation.json | 6 +- .../leave_allocation/leave_allocation.py | 6 +- .../leave_allocation/test_leave_allocation.py | 67 ++++++++++++++++++- .../leave_allocation/test_records.json | 19 +----- .../employee_leave_balance.js | 15 +++-- .../employee_leave_balance.py | 49 ++++++-------- ...emove_fiscal_year_from_leave_allocation.py | 15 +++++ 7 files changed, 122 insertions(+), 55 deletions(-) create mode 100644 erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.json b/erpnext/hr/doctype/leave_allocation/leave_allocation.json index 7108fc0873..070e518588 100644 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.json +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.json @@ -160,7 +160,7 @@ "print_hide": 0, "read_only": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -182,7 +182,7 @@ "print_hide": 0, "read_only": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -306,7 +306,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-10-28 14:52:26.724671", + "modified": "2015-10-28 18:18:29.137427", "modified_by": "Administrator", "module": "HR", "name": "Leave Allocation", diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py index 1b6c89913b..146c3fa38e 100755 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py @@ -22,7 +22,6 @@ class LeaveAllocation(Document): self.validate_new_leaves_allocated_value() def on_update(self): - pass self.get_total_allocated_leaves() def validate_period(self): @@ -87,6 +86,11 @@ class LeaveAllocation(Document): def get_total_allocated_leaves(self): leave_det = self.get_carry_forwarded_leaves() + self.validate_total_leaves_allocated(leave_det) frappe.db.set(self,'carry_forwarded_leaves',flt(leave_det['carry_forwarded_leaves'])) frappe.db.set(self,'total_leaves_allocated',flt(leave_det['total_leaves_allocated'])) + def validate_total_leaves_allocated(self, leave_det): + if date_diff(self.to_date, self.from_date) <= leave_det['total_leaves_allocated']: + frappe.throw(_("Total allocated leaves are more than period")) + \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py b/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py index fe4f01bd47..d36fb2cb69 100644 --- a/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py @@ -1,4 +1,69 @@ from __future__ import unicode_literals import frappe +import unittest +from frappe.utils import getdate -test_records = frappe.get_test_records('Leave Allocation') +class TestLeaveAllocation(unittest.TestCase): + def test_overlapping_allocation(self): + employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0]) + leaves = [ + { + "doctype": "Leave Allocation", + "__islocal": 1, + "employee": employee.name, + "employee_name": employee.employee_name, + "leave_type": "_Test Leave Type", + "from_date": getdate("2015-10-1"), + "to_date": getdate("2015-10-31"), + "new_leaves_allocated": 5, + "docstatus": 1 + }, + { + "doctype": "Leave Allocation", + "__islocal": 1, + "employee": employee.name, + "employee_name": employee.employee_name, + "leave_type": "_Test Leave Type", + "from_date": getdate("2015-09-1"), + "to_date": getdate("2015-11-30"), + "new_leaves_allocated": 5 + } + ] + + frappe.get_doc(leaves[0]).save() + self.assertRaises(frappe.ValidationError, frappe.get_doc(leaves[1]).save) + + def test_invalid_period(self): + employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0]) + + d = frappe.get_doc({ + "doctype": "Leave Allocation", + "__islocal": 1, + "employee": employee.name, + "employee_name": employee.employee_name, + "leave_type": "_Test Leave Type", + "from_date": getdate("2015-09-30"), + "to_date": getdate("2015-09-1"), + "new_leaves_allocated": 5 + }) + + #invalid period + self.assertRaises(frappe.ValidationError, d.save) + + def test_allocated_leave_days_over_period(self): + employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0]) + d = frappe.get_doc({ + "doctype": "Leave Allocation", + "__islocal": 1, + "employee": employee.name, + "employee_name": employee.employee_name, + "leave_type": "_Test Leave Type", + "from_date": getdate("2015-09-1"), + "to_date": getdate("2015-09-30"), + "new_leaves_allocated": 35 + }) + + #allocated leave more than period + self.assertRaises(frappe.ValidationError, d.save) + +test_dependencies = ["Employee", "Leave Type"] \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_allocation/test_records.json b/erpnext/hr/doctype/leave_allocation/test_records.json index 036dc499bb..0637a088a0 100644 --- a/erpnext/hr/doctype/leave_allocation/test_records.json +++ b/erpnext/hr/doctype/leave_allocation/test_records.json @@ -1,18 +1 @@ -[ - { - "docstatus": 1, - "doctype": "Leave Allocation", - "employee": "_T-Employee-0001", - "fiscal_year": "_Test Fiscal Year 2013", - "leave_type": "_Test Leave Type", - "new_leaves_allocated": 15 - }, - { - "docstatus": 1, - "doctype": "Leave Allocation", - "employee": "_T-Employee-0002", - "fiscal_year": "_Test Fiscal Year 2013", - "leave_type": "_Test Leave Type", - "new_leaves_allocated": 15 - } -] +[] \ No newline at end of file diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.js b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.js index 4f97c4378f..41b1421b71 100644 --- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.js +++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.js @@ -4,11 +4,16 @@ frappe.query_reports["Employee Leave Balance"] = { "filters": [ { - "fieldname":"fiscal_year", - "label": __("Fiscal Year"), - "fieldtype": "Link", - "options": "Fiscal Year", - "default": frappe.defaults.get_user_default("fiscal_year") + "fieldname":"from_date", + "label": __("From Date"), + "fieldtype": "Date", + "default": frappe.datetime.year_start() + }, + { + "fieldname":"to_date", + "label": __("To Date"), + "fieldtype": "Date", + "default": frappe.datetime.year_end() }, { "fieldname":"company", diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py index d6f865ba9f..0aa88a82b0 100644 --- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py +++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py @@ -24,52 +24,47 @@ def execute(filters=None): leave_types = frappe.db.sql_list("select name from `tabLeave Type`") - if filters.get("fiscal_year"): - fiscal_years = [filters["fiscal_year"]] - else: - fiscal_years = frappe.db.sql_list("select name from `tabFiscal Year` order by name desc") - employee_names = [d.name for d in employees] - allocations = frappe.db.sql("""select employee, fiscal_year, leave_type, total_leaves_allocated + allocations = frappe.db.sql("""select employee, leave_type, sum(new_leaves_allocated) as leaves_allocated from `tabLeave Allocation` - where docstatus=1 and employee in (%s)""" % - ','.join(['%s']*len(employee_names)), employee_names, as_dict=True) - - applications = frappe.db.sql("""select employee, fiscal_year, leave_type, + where docstatus=1 and employee in (%s) and from_date >= '%s' and to_date <= '%s'""" % + (','.join(['%s']*len(employee_names)), filters.get("from_date"), + filters.get("to_date")), employee_names, as_dict=True) + + applications = frappe.db.sql("""select employee, leave_type, SUM(total_leave_days) as leaves from `tabLeave Application` where status="Approved" and docstatus = 1 and employee in (%s) - group by employee, fiscal_year, leave_type""" % - ','.join(['%s']*len(employee_names)), employee_names, as_dict=True) + and from_date >= '%s' and to_date <= '%s' + group by employee, leave_type""" % + (','.join(['%s']*len(employee_names)), filters.get("from_date"), + filters.get("to_date")), employee_names, as_dict=True) columns = [ - _("Fiscal Year"), _("Employee") + ":Link/Employee:150", _("Employee Name") + "::200", _("Department") +"::150" + _("Employee") + ":Link/Employee:150", _("Employee Name") + "::200", _("Department") +"::150" ] for leave_type in leave_types: - columns.append(_(leave_type) + " " + _("Allocated") + ":Float") + columns.append(_(leave_type) + " " + _("Opening") + ":Float") columns.append(_(leave_type) + " " + _("Taken") + ":Float") columns.append(_(leave_type) + " " + _("Balance") + ":Float") data = {} for d in allocations: - data.setdefault((d.fiscal_year, d.employee, - d.leave_type), frappe._dict()).allocation = d.total_leaves_allocated + data.setdefault((d.employee,d.leave_type), frappe._dict()).allocation = d.leaves_allocated for d in applications: - data.setdefault((d.fiscal_year, d.employee, - d.leave_type), frappe._dict()).leaves = d.leaves + data.setdefault((d.employee, d.leave_type), frappe._dict()).leaves = d.leaves result = [] - for fiscal_year in fiscal_years: - for employee in employees: - row = [fiscal_year, employee.name, employee.employee_name, employee.department] - result.append(row) - for leave_type in leave_types: - tmp = data.get((fiscal_year, employee.name, leave_type), frappe._dict()) - row.append(tmp.allocation or 0) - row.append(tmp.leaves or 0) - row.append((tmp.allocation or 0) - (tmp.leaves or 0)) + for employee in employees: + row = [employee.name, employee.employee_name, employee.department] + result.append(row) + for leave_type in leave_types: + tmp = data.get((employee.name, leave_type), frappe._dict()) + row.append(tmp.allocation or 0) + row.append(tmp.leaves or 0) + row.append((tmp.allocation or 0) - (tmp.leaves or 0)) return columns, result diff --git a/erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py b/erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py new file mode 100644 index 0000000000..1b248415db --- /dev/null +++ b/erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py @@ -0,0 +1,15 @@ +from __future__ import unicode_literals +import frappe + +def execute(): + for leave_allocation in frappe.db.sql("select name, fiscal_year from `tabLeave Allocation`", as_dict=True): + year_start_date, year_end_date = frappe.db.get_value("Fiscal Year", leave_allocation["fiscal_year"], + ["year_start_date", "year_end_date"]) + + frappe.db.sql("""update `tabLeave Allocation` + set from_date=%s, to_date=%s where name=%s""", + (year_start_date, year_end_date, leave_allocation["name"])) + + frappe.db.commit() + + \ No newline at end of file