From d0b0a80be3aacf48731f391f1c7f77cd0fc7bbe0 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 28 Oct 2015 17:15:00 +0530 Subject: [PATCH] [enhacement] remove fiscal year from leave allocation --- .../leave_allocation/leave_allocation.json | 36 +++++++------- .../leave_allocation/leave_allocation.py | 48 ++++++++++--------- .../leave_application/leave_application.js | 10 ++-- .../leave_application/leave_application.json | 4 +- .../leave_application/leave_application.py | 17 ++++--- .../leave_control_panel.json | 34 ++++++++++--- .../leave_control_panel.py | 12 +++-- 7 files changed, 92 insertions(+), 69 deletions(-) diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.json b/erpnext/hr/doctype/leave_allocation/leave_allocation.json index 19e8001237c..7108fc08730 100644 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.json +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.json @@ -147,22 +147,20 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "default": "Today", - "fieldname": "posting_date", + "fieldname": "from_date", "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, - "in_list_view": 1, - "label": "Posting Date", - "no_copy": 1, - "oldfieldname": "date", - "oldfieldtype": "Date", + "in_list_view": 0, + "label": "From Date", + "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, - "read_only": 1, + "read_only": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -171,23 +169,21 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "fiscal_year", - "fieldtype": "Link", + "fieldname": "to_date", + "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, - "in_filter": 1, + "in_filter": 0, "in_list_view": 0, - "label": "Fiscal Year", + "label": "To Date", "no_copy": 0, - "oldfieldname": "fiscal_year", - "oldfieldtype": "Data", - "options": "Fiscal Year", "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, - "reqd": 1, - "search_index": 1, + "reqd": 0, + "search_index": 0, "set_only_once": 0, "unique": 0 }, @@ -310,7 +306,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-10-02 07:38:55.314632", + "modified": "2015-10-28 14:52:26.724671", "modified_by": "Administrator", "module": "HR", "name": "Leave Allocation", @@ -359,7 +355,7 @@ ], "read_only": 0, "read_only_onload": 0, - "search_fields": "employee,employee_name,leave_type,total_leaves_allocated,fiscal_year", + "search_fields": "employee,employee_name,leave_type,total_leaves_allocated", "sort_field": "modified", "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py index 4e74b2846d2..1b6c89913b6 100755 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py @@ -3,13 +3,14 @@ from __future__ import unicode_literals import frappe -from frappe.utils import cint, flt +from frappe.utils import cint, flt, date_diff from frappe import _ from frappe.model.document import Document from erpnext.hr.utils import set_employee_name class LeaveAllocation(Document): def validate(self): + self.validate_period() self.validate_new_leaves_allocated_value() self.check_existing_leave_allocation() if not self.total_leaves_allocated: @@ -21,8 +22,13 @@ class LeaveAllocation(Document): self.validate_new_leaves_allocated_value() def on_update(self): + pass self.get_total_allocated_leaves() - + + def validate_period(self): + if date_diff(self.to_date, self.from_date) <= 0: + frappe.throw(_("Invalid period")) + def validate_new_leaves_allocated_value(self): """validate that leave allocation is in multiples of 0.5""" if flt(self.new_leaves_allocated) % 0.5: @@ -30,29 +36,30 @@ class LeaveAllocation(Document): def check_existing_leave_allocation(self): """check whether leave for same type is already allocated or not""" - leave_allocation = frappe.db.sql("""select name from `tabLeave Allocation` - where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""", - (self.employee, self.leave_type, self.fiscal_year)) + leave_allocation = frappe.db.sql("""select name from `tabLeave Allocation` + where employee='%s' and leave_type='%s' and to_date >= '%s' and from_date <= '%s' and docstatus=1 + """%(self.employee, self.leave_type, self.from_date, self.to_date)) + if leave_allocation: - frappe.msgprint(_("Leaves for type {0} already allocated for Employee {1} for Fiscal Year {0}").format(self.leave_type, - self.employee, self.fiscal_year)) + frappe.msgprint(_("Leaves for type {0} already allocated for Employee {1} for period {2} - {3}").format(self.leave_type, + self.employee, self.from_date, self.to_date)) frappe.throw('{0}'.format(leave_allocation[0][0])) - def get_leave_bal(self, prev_fyear): - return self.get_leaves_allocated(prev_fyear) - self.get_leaves_applied(prev_fyear) + def get_leave_bal(self): + return self.get_leaves_allocated() - self.get_leaves_applied() - def get_leaves_applied(self, fiscal_year): + def get_leaves_applied(self): leaves_applied = frappe.db.sql("""select SUM(ifnull(total_leave_days, 0)) from `tabLeave Application` where employee=%s and leave_type=%s - and fiscal_year=%s and docstatus=1""", - (self.employee, self.leave_type, fiscal_year)) + and to_date<=%s and docstatus=1""", + (self.employee, self.leave_type, self.from_date)) return leaves_applied and flt(leaves_applied[0][0]) or 0 - def get_leaves_allocated(self, fiscal_year): + def get_leaves_allocated(self): leaves_allocated = frappe.db.sql("""select SUM(ifnull(total_leaves_allocated, 0)) from `tabLeave Allocation` where employee=%s and leave_type=%s - and fiscal_year=%s and docstatus=1 and name!=%s""", - (self.employee, self.leave_type, fiscal_year, self.name)) + and to_date<=%s and docstatus=1 and name!=%s""", + (self.employee, self.leave_type, self.from_date, self.name)) return leaves_allocated and flt(leaves_allocated[0][0]) or 0 def allow_carry_forward(self): @@ -67,14 +74,11 @@ class LeaveAllocation(Document): def get_carry_forwarded_leaves(self): if self.carry_forward: self.allow_carry_forward() - prev_fiscal_year = frappe.db.sql("""select name from `tabFiscal Year` - where year_start_date = (select date_add(year_start_date, interval -1 year) - from `tabFiscal Year` where name=%s) - order by name desc limit 1""", self.fiscal_year) - prev_fiscal_year = prev_fiscal_year and prev_fiscal_year[0][0] or '' + prev_bal = 0 - if prev_fiscal_year and cint(self.carry_forward) == 1: - prev_bal = self.get_leave_bal(prev_fiscal_year) + if cint(self.carry_forward) == 1: + prev_bal = self.get_leave_bal() + ret = { 'carry_forwarded_leaves': prev_bal, 'total_leaves_allocated': flt(prev_bal) + flt(self.new_leaves_allocated) diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js index 5b5bf8ff439..c8bd753a18c 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.js +++ b/erpnext/hr/doctype/leave_application/leave_application.js @@ -53,10 +53,6 @@ frappe.ui.form.on("Leave Application", { frm.trigger("get_leave_balance"); }, - fiscal_year: function(frm) { - frm.trigger("get_leave_balance"); - }, - leave_type: function(frm) { frm.trigger("get_leave_balance"); }, @@ -85,12 +81,13 @@ frappe.ui.form.on("Leave Application", { }, get_leave_balance: function(frm) { - if(frm.doc.docstatus==0 && frm.doc.employee && frm.doc.leave_type && frm.doc.fiscal_year) { + if(frm.doc.docstatus==0 && frm.doc.employee && frm.doc.leave_type && frm.doc.from_date && frm.doc.to_date) { return frm.call({ method: "get_leave_balance", args: { employee: frm.doc.employee, - fiscal_year: frm.doc.fiscal_year, + from_date: frm.doc.from_date, + to_date: frm.doc.to_date, leave_type: frm.doc.leave_type } }); @@ -109,6 +106,7 @@ frappe.ui.form.on("Leave Application", { callback: function(response) { if (response && response.message) { frm.set_value('total_leave_days', response.message.total_leave_days); + 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 f51c220b6f4..62e4cd8b58e 100644 --- a/erpnext/hr/doctype/leave_application/leave_application.json +++ b/erpnext/hr/doctype/leave_application/leave_application.json @@ -21,7 +21,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Status", + "label": "Status", "no_copy": 1, "options": "Open\nApproved\nRejected", "permlevel": 1, @@ -559,7 +559,7 @@ "issingle": 0, "istable": 0, "max_attachments": 3, - "modified": "2015-10-02 07:38:55.471712", + "modified": "2015-10-28 16:14:25.640730", "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 054117b55fb..8c91173d369 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -100,7 +100,7 @@ class LeaveApplication(Document): if not is_lwp(self.leave_type): self.leave_balance = get_leave_balance(self.employee, - self.leave_type, self.fiscal_year)["leave_balance"] + self.leave_type, self.from_date, self.to_date)["leave_balance"] if self.status != "Rejected" \ and self.leave_balance - self.total_leave_days < 0: @@ -122,9 +122,8 @@ class LeaveApplication(Document): employee = %(employee)s and docstatus < 2 and status in ("Open", "Approved") - and (from_date between %(from_date)s and %(to_date)s - or to_date between %(from_date)s and %(to_date)s - or %(from_date)s between from_date and to_date) + and to_date >= %(from_date)s + and from_date <= %(to_date)s and name != %(name)s""", { "employee": self.employee, "from_date": self.from_date, @@ -251,18 +250,18 @@ def get_total_leave_days(leave_app): return ret @frappe.whitelist() -def get_leave_balance(employee, leave_type, fiscal_year): +def get_leave_balance(employee, leave_type, from_date, to_date): leave_all = frappe.db.sql("""select total_leaves_allocated from `tabLeave Allocation` where employee = %s and leave_type = %s - and fiscal_year = %s and docstatus = 1""", (employee, - leave_type, fiscal_year)) + and from_date<=%s and to_date>=%s and docstatus = 1""", (employee, + leave_type, from_date, to_date)) leave_all = leave_all and flt(leave_all[0][0]) or 0 leave_app = frappe.db.sql("""select SUM(total_leave_days) from `tabLeave Application` - where employee = %s and leave_type = %s and fiscal_year = %s - and status="Approved" and docstatus = 1""", (employee, leave_type, fiscal_year)) + where employee = %s and leave_type = %s and to_date>=%s and from_date<=%s + and status="Approved" and docstatus = 1""", (employee, leave_type, from_date, to_date)) leave_app = leave_app and flt(leave_app[0][0]) or 0 ret = {'leave_balance': leave_all - leave_app} diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json index 0db0410121d..c92fbb8de8c 100644 --- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json +++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json @@ -145,16 +145,38 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "fiscal_year", - "fieldtype": "Link", + "fieldname": "from_date", + "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, - "in_filter": 1, + "in_filter": 0, "in_list_view": 0, - "label": "Fiscal Year", + "label": "From Date", "no_copy": 0, - "options": "Fiscal Year", "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "To Date", + "no_copy": 0, + "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -260,7 +282,7 @@ "is_submittable": 0, "issingle": 1, "istable": 0, - "modified": "2015-06-05 11:38:19.994852", + "modified": "2015-10-28 16:23:57.733900", "modified_by": "Administrator", "module": "HR", "name": "Leave Control Panel", diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py index 706f995f6f9..77c7ad99ced 100644 --- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py +++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import cint, cstr, flt, nowdate, comma_and +from frappe.utils import cint, cstr, flt, nowdate, comma_and, date_diff from frappe import msgprint, _ from frappe.model.document import Document @@ -27,9 +27,13 @@ class LeaveControlPanel(Document): return e def validate_values(self): - for f in ["fiscal_year", "leave_type", "no_of_days"]: + for f in ["from_date", "to_date", "leave_type", "no_of_days"]: if not self.get(f): frappe.throw(_("{0} is required").format(self.meta.get_label(f))) + + def to_date_validation(self): + if date_diff(self.to_date, self.from_date) <= 0: + return "Invalid period" def allocate_leave(self): self.validate_values() @@ -45,8 +49,8 @@ class LeaveControlPanel(Document): la.employee = cstr(d[0]) la.employee_name = frappe.db.get_value('Employee',cstr(d[0]),'employee_name') la.leave_type = self.leave_type - la.fiscal_year = self.fiscal_year - la.posting_date = nowdate() + la.from_date = self.from_date + la.to_date = self.to_date la.carry_forward = cint(self.carry_forward) la.new_leaves_allocated = flt(self.no_of_days) la.docstatus = 1