Leave Application Enchancement
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 79c6d95..3bf41bb 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -23,6 +23,10 @@
},
+ validate: function(frm) {
+ frm.toggle_reqd("half_day_date", frm.doc.half_day == 1);
+ },
+
refresh: function(frm) {
if (frm.is_new()) {
frm.set_value("status", "Open");
@@ -45,28 +49,38 @@
},
half_day: function(frm) {
- if (frm.doc.from_date) {
- frm.set_value("to_date", frm.doc.from_date);
- frm.trigger("calculate_total_days");
+ if (frm.doc.from_date == frm.doc.to_date) {
+ frm.set_value("half_day_date", frm.doc.from_date);
}
+ else {
+ frm.trigger("half_day_datepicker");
+ }
+ frm.trigger("calculate_total_days");
},
from_date: function(frm) {
- if (cint(frm.doc.half_day)==1) {
- frm.set_value("to_date", frm.doc.from_date);
- }
+ frm.trigger("half_day_datepicker");
frm.trigger("calculate_total_days");
},
to_date: function(frm) {
- if (cint(frm.doc.half_day)==1 && cstr(frm.doc.from_date) && frm.doc.from_date != frm.doc.to_date) {
- msgprint(__("To Date should be same as From Date for Half Day leave"));
- frm.set_value("to_date", frm.doc.from_date);
- }
-
+ frm.trigger("half_day_datepicker");
frm.trigger("calculate_total_days");
},
+ half_day_date(frm) {
+ frm.trigger("calculate_total_days");
+ },
+
+ half_day_datepicker: function(frm) {
+ frm.set_value('half_day_date', '');
+ var half_day_datepicker = frm.fields_dict.half_day_date.datepicker;
+ half_day_datepicker.update({
+ minDate: frappe.datetime.str_to_obj(frm.doc.from_date),
+ maxDate: frappe.datetime.str_to_obj(frm.doc.to_date)
+ })
+ },
+
get_leave_balance: function(frm) {
if(frm.doc.docstatus==0 && frm.doc.employee && frm.doc.leave_type && frm.doc.from_date) {
return frappe.call({
@@ -87,29 +101,25 @@
},
calculate_total_days: function(frm) {
- if(frm.doc.from_date && frm.doc.to_date) {
- if (cint(frm.doc.half_day)==1) {
- frm.set_value("total_leave_days", 0.5);
- } else if (frm.doc.employee && frm.doc.leave_type){
+ if(frm.doc.from_date && frm.doc.to_date && frm.doc.employee && frm.doc.leave_type) {
// server call is done to include holidays in leave days calculations
- return frappe.call({
- method: 'erpnext.hr.doctype.leave_application.leave_application.get_number_of_leave_days',
- args: {
- "employee": frm.doc.employee,
- "leave_type": frm.doc.leave_type,
- "from_date": frm.doc.from_date,
- "to_date": frm.doc.to_date,
- "half_day": frm.doc.half_day
- },
- callback: function(r) {
- if (r && r.message) {
- frm.set_value('total_leave_days', r.message);
- frm.trigger("get_leave_balance");
- }
+ return frappe.call({
+ method: 'erpnext.hr.doctype.leave_application.leave_application.get_number_of_leave_days',
+ args: {
+ "employee": frm.doc.employee,
+ "leave_type": frm.doc.leave_type,
+ "from_date": frm.doc.from_date,
+ "to_date": frm.doc.to_date,
+ "half_day": frm.doc.half_day,
+ "half_day_date": frm.doc.half_day_date,
+ },
+ callback: function(r) {
+ if (r && r.message) {
+ frm.set_value('total_leave_days', r.message);
+ frm.trigger("get_leave_balance");
}
- });
- }
+ }
+ });
}
},
-
});
diff --git a/erpnext/hr/doctype/leave_application/leave_application.json b/erpnext/hr/doctype/leave_application/leave_application.json
index 3939739..ca69417 100644
--- a/erpnext/hr/doctype/leave_application/leave_application.json
+++ b/erpnext/hr/doctype/leave_application/leave_application.json
@@ -274,6 +274,36 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "depends_on": "eval:doc.half_day && (doc.from_date != doc.to_date)",
+ "fieldname": "half_day_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": "Half Day 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": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "total_leave_days",
"fieldtype": "Float",
"hidden": 0,
@@ -287,6 +317,7 @@
"length": 0,
"no_copy": 1,
"permlevel": 0,
+ "precision": "1",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
@@ -738,7 +769,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 3,
- "modified": "2017-02-17 17:09:38.828496",
+ "modified": "2017-02-24 07:33:08.907824",
"modified_by": "Administrator",
"module": "HR",
"name": "Leave Application",
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 84c14c9..d869e0a 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -63,7 +63,10 @@
def validate_dates(self):
if self.from_date and self.to_date and (getdate(self.to_date) < getdate(self.from_date)):
frappe.throw(_("To date cannot be before from date"))
-
+
+ if self.half_day and (getdate(self.half_day_date) < getdate(self.from_date) or (getdate(self.half_day_date) > getdate(self.to_date))):
+ frappe.throw(_("Half Day Date should be between From Date and To Date"))
+
if not is_lwp(self.leave_type):
self.validate_dates_acorss_allocation()
self.validate_back_dated_application()
@@ -129,7 +132,7 @@
def validate_balance_leaves(self):
if self.from_date and self.to_date:
self.total_leave_days = get_number_of_leave_days(self.employee, self.leave_type,
- self.from_date, self.to_date, self.half_day)
+ self.from_date, self.to_date, self.half_day, self.half_day_date)
if self.total_leave_days == 0:
frappe.throw(_("The day(s) on which you are applying for leave are holidays. You need not apply for leave."))
@@ -294,13 +297,18 @@
return approvers_list
@frappe.whitelist()
-def get_number_of_leave_days(employee, leave_type, from_date, to_date, half_day=None):
- if half_day==1:
- return 0.5
- number_of_days = date_diff(to_date, from_date) + 1
+def get_number_of_leave_days(employee, leave_type, from_date, to_date, half_day = None, half_day_date = None):
+ number_of_days = 0
+ if half_day == 1:
+ if from_date == to_date:
+ number_of_days = 0.5
+ else:
+ number_of_days = date_diff(to_date, from_date) + .5
+ else:
+ number_of_days = date_diff(to_date, from_date) + 1
+
if not frappe.db.get_value("Leave Type", leave_type, "include_holiday"):
number_of_days = flt(number_of_days) - flt(get_holidays(employee, from_date, to_date))
-
return number_of_days
@frappe.whitelist()