Leave Period - Validate and Create Leave Allocation
diff --git a/erpnext/hr/doctype/leave_period/leave_period.js b/erpnext/hr/doctype/leave_period/leave_period.js
index 2a6010e..9229f0b 100644
--- a/erpnext/hr/doctype/leave_period/leave_period.js
+++ b/erpnext/hr/doctype/leave_period/leave_period.js
@@ -2,7 +2,26 @@
// For license information, please see license.txt
frappe.ui.form.on('Leave Period', {
- refresh: function(frm) {
-
+ refresh: (frm)=>{
+ frm.set_df_property("grant_leaves", "hidden", frm.doc.__islocal ? 1:0);
+ },
+ from_date: (frm)=>{
+ if (frm.doc.from_date && !frm.doc.to_date) {
+ var a_year_from_start = frappe.datetime.add_months(frm.doc.from_date, 12);
+ frm.set_value("to_date", frappe.datetime.add_days(a_year_from_start, -1));
+ }
+ },
+ grant: (frm)=>{
+ frappe.call({
+ doc: frm.doc,
+ method: "grant_leave_allocation",
+ callback: function(r) {
+ if(!r.exc){
+ frm.reload_doc();
+ }
+ },
+ freeze: true,
+ freeze_message: __("Grant allocations......")
+ });
}
});
diff --git a/erpnext/hr/doctype/leave_period/leave_period.json b/erpnext/hr/doctype/leave_period/leave_period.json
index 516d52d..0f3cad4 100644
--- a/erpnext/hr/doctype/leave_period/leave_period.json
+++ b/erpnext/hr/doctype/leave_period/leave_period.json
@@ -478,7 +478,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-05-04 18:25:06.719932",
+ "modified": "2018-05-07 18:25:06.719932",
"modified_by": "Administrator",
"module": "HR",
"name": "Leave Period",
diff --git a/erpnext/hr/doctype/leave_period/leave_period.py b/erpnext/hr/doctype/leave_period/leave_period.py
index 619336a..1ef6f19 100644
--- a/erpnext/hr/doctype/leave_period/leave_period.py
+++ b/erpnext/hr/doctype/leave_period/leave_period.py
@@ -4,7 +4,78 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
+from frappe.utils import getdate, cstr
from frappe.model.document import Document
+from erpnext.hr.utils import validate_overlap, get_employee_leave_policy
class LeavePeriod(Document):
- pass
+ def get_employees(self):
+ conditions, values = [], []
+ for field in ["grade", "designation", "department"]:
+ if self.get(field):
+ conditions.append("{0}=%s".format(field))
+ values.append(self.get(field))
+
+ condition_str = " and " + " and ".join(conditions) if len(conditions) else ""
+
+ e = frappe.db.sql("select name from tabEmployee where status='Active' {condition}"
+ .format(condition=condition_str), tuple(values))
+
+ return e
+
+ def validate(self):
+ self.validate_dates()
+ validate_overlap(self, self.from_date, self.to_date, self.company)
+
+ def grant_leave_allocation(self):
+ if self.employee:
+ self.grant_leave_alloc(self.employee)
+ else:
+ self.grant_leave_alloc_for_employees()
+
+ def grant_leave_alloc_for_employees(self):
+ employees = self.get_employees()
+ if employees:
+ for employee in employees:
+ self.grant_leave_alloc(cstr(employee[0]))
+ else:
+ frappe.msgprint(_("No employee found"))
+
+ def grant_leave_alloc(self, employee):
+ self.validate_allocation_exists(employee)
+ leave_policy = get_employee_leave_policy(employee)
+ if leave_policy:
+ for leave_policy_detail in leave_policy.leave_policy_details:
+ if not frappe.db.get_value("Leave Type", leave_policy_detail.leave_type, "is_lwp"):
+ self.create_leave_allocation(employee, leave_policy_detail.leave_type, leave_policy_detail.annual_allocation)
+
+ def validate_allocation_exists(self, employee):
+ leave_alloc = frappe.db.exists({
+ "doctype": "Leave Allocation",
+ "employee": employee,
+ "leave_period": self.name,
+ "docstatus": 1})
+ if leave_alloc:
+ frappe.throw(_("Employee {0} already have Leave Allocation {1} for this period").format(employee, leave_alloc[0][0])\
+ + """ <b><a href="#Form/Leave Allocation/{0}">{0}</a></b>""".format(leave_alloc[0][0]))
+
+
+ def validate_dates(self):
+ if getdate(self.from_date) >= getdate(self.to_date):
+ frappe.throw(_("To date can not be equal or less than from date"))
+
+ def create_leave_allocation(self, employee, leave_type, new_leaves_allocated):
+ allocation = frappe.new_doc("Leave Allocation")
+ allocation.employee = employee
+ allocation.employee_name = frappe.db.get_value("Employee", employee, "employee_name")
+ allocation.leave_type = leave_type
+ allocation.from_date = self.from_date
+ allocation.to_date = self.to_date
+ allocation.new_leaves_allocated = new_leaves_allocated
+ allocation.leave_period = self.name
+ if self.carry_forward_leaves:
+ if frappe.db.get_value("Leave Type", leave_type, "is_carry_forward"):
+ allocation.carry_forward = self.carry_forward_leaves
+ allocation.save(ignore_permissions = True)
+ allocation.submit()