[fixes] patch, test cases and validations
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.json b/erpnext/hr/doctype/leave_allocation/leave_allocation.json
index 7108fc0..070e518 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 1b6c899..146c3fa 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -22,7 +22,6 @@
self.validate_new_leaves_allocated_value()
def on_update(self):
- pass
self.get_total_allocated_leaves()
def validate_period(self):
@@ -87,6 +86,11 @@
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 fe4f01b..d36fb2c 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 036dc49..0637a08 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 4f97c43..41b1421 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 d6f865b..0aa88a8 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 @@
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 0000000..1b24841
--- /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