Merge branch 'vjFaLk-holiday-list' into develop
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index a2b56fc..db580f4 100755
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -227,3 +227,16 @@
from tabEmployee where day(date_of_birth) = day(%(date)s)
and month(date_of_birth) = month(%(date)s)
and status = 'Active'""", {"date": today()}, as_dict=True)
+
+def get_holiday_list_for_employee(employee, raise_exception=True):
+ employee = frappe.db.get_value("Employee", employee, ["holiday_list", "company"], as_dict=True)
+ holiday_list = employee.holiday_list
+
+ if not holiday_list:
+ holiday_list = frappe.db.get_value("Company", employee.company, "default_holiday_list")
+
+ if not holiday_list and raise_exception:
+ frappe.throw(_("Please set a Holiday List for either the Employee or the Company"))
+
+ return holiday_list
+
diff --git a/erpnext/hr/doctype/holiday/holiday.json b/erpnext/hr/doctype/holiday/holiday.json
index 091dd13..131215c 100644
--- a/erpnext/hr/doctype/holiday/holiday.json
+++ b/erpnext/hr/doctype/holiday/holiday.json
@@ -6,40 +6,17 @@
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
+ "document_type": "Setup",
"fields": [
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "description",
- "fieldtype": "Text Editor",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "label": "Description",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "print_width": "300px",
- "read_only": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0,
- "width": "300px"
- },
- {
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
"fieldname": "holiday_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Date",
@@ -56,6 +33,32 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "description",
+ "fieldtype": "Text Editor",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Description",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": "300px",
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0,
+ "width": "300px"
}
],
"hide_heading": 0,
@@ -67,7 +70,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2016-01-27 11:52:46.864792",
+ "modified": "2016-03-11 06:39:10.913467",
"modified_by": "Administrator",
"module": "HR",
"name": "Holiday",
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.js b/erpnext/hr/doctype/holiday_list/holiday_list.js
new file mode 100644
index 0000000..43ddfea
--- /dev/null
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.js
@@ -0,0 +1,14 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Holiday List', {
+ refresh: function(frm) {
+
+ },
+ from_date: function(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));
+ }
+ }
+});
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.json b/erpnext/hr/doctype/holiday_list/holiday_list.json
index 999709d..ea41654 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.json
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.json
@@ -17,6 +17,7 @@
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Holiday List Name",
@@ -26,6 +27,7 @@
"oldfieldtype": "Data",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -37,20 +39,23 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "is_default",
- "fieldtype": "Check",
+ "fieldname": "from_date",
+ "fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
- "in_list_view": 1,
- "label": "Default",
+ "in_list_view": 0,
+ "label": "From Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
+ "precision": "",
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
- "reqd": 0,
+ "reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@@ -59,20 +64,20 @@
"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_list_view": 1,
- "label": "Fiscal Year",
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "To Date",
"length": 0,
"no_copy": 0,
- "oldfieldname": "fiscal_year",
- "oldfieldtype": "Link",
- "options": "Fiscal Year",
"permlevel": 0,
+ "precision": "",
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -88,6 +93,7 @@
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Weekly Off",
@@ -96,6 +102,7 @@
"options": "\nSunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday",
"permlevel": 0,
"print_hide": 1,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 1,
"reqd": 0,
@@ -111,6 +118,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Weekly Off Dates",
@@ -119,6 +127,7 @@
"options": "get_weekly_off_dates",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -134,6 +143,7 @@
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Holidays",
@@ -144,6 +154,7 @@
"options": "Holiday",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -159,6 +170,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Clear Table",
@@ -167,6 +179,7 @@
"options": "clear_table",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -185,7 +198,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2015-11-16 06:29:47.519087",
+ "modified": "2016-03-11 05:26:24.819829",
"modified_by": "Administrator",
"module": "HR",
"name": "Holiday List",
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py
index b1cbca3..0412624 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.py
@@ -3,22 +3,20 @@
from __future__ import unicode_literals
import frappe
-
-from frappe.utils import cint
-from frappe.model.naming import make_autoname
+import json
+from frappe.utils import cint, getdate, formatdate
from frappe import throw, _
-
from frappe.model.document import Document
+class OverlapError(frappe.ValidationError): pass
+
class HolidayList(Document):
def validate(self):
- self.update_default_holiday_list()
+ self.validate_days()
def get_weekly_off_dates(self):
self.validate_values()
- self.validate_days()
- yr_start_date, yr_end_date = get_fy_start_end_dates(self.fiscal_year)
- date_list = self.get_weekly_off_date_list(yr_start_date, yr_end_date)
+ date_list = self.get_weekly_off_date_list(self.from_date, self.to_date)
last_idx = max([cint(d.idx) for d in self.get("holidays")] or [0,])
for i, d in enumerate(date_list):
ch = self.append('holidays', {})
@@ -27,30 +25,35 @@
ch.idx = last_idx + i + 1
def validate_values(self):
- if not self.fiscal_year:
- throw(_("Please select Fiscal Year"))
if not self.weekly_off:
throw(_("Please select weekly off day"))
- def validate_days(self):
- for day in self.get("holidays"):
- if (self.weekly_off or "").upper() == (day.description or "").upper():
- frappe.throw("Records already exist for mentioned weekly off")
- def get_weekly_off_date_list(self, year_start_date, year_end_date):
- from frappe.utils import getdate
- year_start_date, year_end_date = getdate(year_start_date), getdate(year_end_date)
+ def validate_days(self):
+ if self.from_date > self.to_date:
+ throw(_("To Date cannot be before From Date"))
+
+ for day in self.get("holidays"):
+ if not (self.from_date <= day.holiday_date <= self.to_date):
+ frappe.throw(_("The holiday on {0} is not between From Date and To Date").format(formatdate(day.holiday_date)))
+
+ def get_weekly_off_date_list(self, start_date, end_date):
+ start_date, end_date = getdate(start_date), getdate(end_date)
from dateutil import relativedelta
from datetime import timedelta
import calendar
date_list = []
+ existing_date_list = []
weekday = getattr(calendar, (self.weekly_off).upper())
- reference_date = year_start_date + relativedelta.relativedelta(weekday=weekday)
+ reference_date = start_date + relativedelta.relativedelta(weekday=weekday)
- while reference_date <= year_end_date:
- date_list.append(reference_date)
+ existing_date_list = [getdate(holiday.holiday_date) for holiday in self.get("holidays")]
+
+ while reference_date <= end_date:
+ if reference_date not in existing_date_list:
+ date_list.append(reference_date)
reference_date += timedelta(days=7)
return date_list
@@ -58,42 +61,35 @@
def clear_table(self):
self.set('holidays', [])
- def update_default_holiday_list(self):
- frappe.db.sql("""update `tabHoliday List` set is_default = 0
- where is_default = 1 and fiscal_year = %s""", (self.fiscal_year,))
-
@frappe.whitelist()
def get_events(start, end, filters=None):
- import json
"""Returns events for Gantt / Calendar view rendering.
:param start: Start date-time.
:param end: End date-time.
:param filters: Filters (JSON).
"""
- from frappe.desk.calendar import get_event_conditions
- conditions = get_event_conditions("Holiday List", filters)
+ condition = ''
+ values = {
+ "start_date": getdate(start),
+ "end_date": getdate(end)
+ }
- fiscal_year = None
if filters:
- fiscal_year = json.loads(filters).get("fiscal_year")
+ if isinstance(filters, basestring):
+ filters = json.loads(filters)
- if not fiscal_year:
- fiscal_year = frappe.db.get_value("Global Defaults", None, "current_fiscal_year")
+ if filters.get('holiday_list'):
+ condition = 'and hlist.name=%(holiday_list)s'
+ values['holiday_list'] = filters['holiday_list']
- yr_start_date, yr_end_date = get_fy_start_end_dates(fiscal_year)
-
- data = frappe.db.sql("""select hl.name, hld.holiday_date, hld.description
- from `tabHoliday List` hl, tabHoliday hld
- where hld.parent = hl.name
- and (ifnull(hld.holiday_date, "0000-00-00") != "0000-00-00"
- and hld.holiday_date between %(start)s and %(end)s)
- {conditions}""".format(conditions=conditions), {
- "start": yr_start_date,
- "end": yr_end_date
- }, as_dict=True, update={"allDay": 1})
+ data = frappe.db.sql("""select hlist.name, h.holiday_date, h.description
+ from `tabHoliday List` hlist, tabHoliday h
+ where h.parent = hlist.name
+ and h.holiday_date is not null
+ and h.holiday_date >= %(start_date)s
+ and h.holiday_date <= %(end_date)s
+ {condition}""".format(condition=condition),
+ values, as_dict=True, update={"allDay": 1})
return data
-
-def get_fy_start_end_dates(fiscal_year):
- return frappe.db.get_value("Fiscal Year", fiscal_year, ["year_start_date", "year_end_date"])
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js b/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js
index dee64de..3cc8dd5 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js
+++ b/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js
@@ -9,14 +9,13 @@
"title": "description",
"allDay": "allDay"
},
+ get_events_method: "erpnext.hr.doctype.holiday_list.holiday_list.get_events",
filters: [
{
- "fieldtype": "Link",
- "fieldname": "fiscal_year",
- "options": "Fiscal Year",
- "label": __("Fiscal Year"),
- "default": frappe.defaults.get_user_default("fiscal_year")
+ 'fieldtype': 'Link',
+ 'fieldname': 'holiday_list',
+ 'options': 'Holiday List',
+ 'label': __('Holiday List')
}
- ],
- get_events_method: "erpnext.hr.doctype.holiday_list.holiday_list.get_events"
+ ]
}
diff --git a/erpnext/hr/doctype/holiday_list/test_records.json b/erpnext/hr/doctype/holiday_list/test_records.json
index a8cf56b..0bd096c 100644
--- a/erpnext/hr/doctype/holiday_list/test_records.json
+++ b/erpnext/hr/doctype/holiday_list/test_records.json
@@ -1,22 +1,22 @@
[
{
"doctype": "Holiday List",
- "fiscal_year": "_Test Fiscal Year 2013",
+ "from_date": "2013-01-01",
+ "to_date":"2013-12-31",
"holidays": [
{
- "description": "New Year",
+ "description": "New Year",
"holiday_date": "2013-01-01"
},
{
- "description": "Republic Day",
+ "description": "Republic Day",
"holiday_date": "2013-01-26"
},
{
- "description": "Test Holiday",
+ "description": "Test Holiday",
"holiday_date": "2013-02-01"
}
- ],
- "holiday_list_name": "_Test Holiday List",
- "is_default": 1
+ ],
+ "holiday_list_name": "_Test Holiday List"
}
-]
\ No newline at end of file
+]
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 705ace7..950400d 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -8,6 +8,7 @@
comma_or, get_fullname
from erpnext.hr.utils import set_employee_name
from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
+from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee
class LeaveDayBlockedError(frappe.ValidationError): pass
@@ -422,7 +423,7 @@
cnt+=1
def add_holidays(events, start, end, employee, company):
- applicable_holiday_list = frappe.db.get_value("Employee", employee, "holiday_list")
+ applicable_holiday_list = get_holiday_list_for_employee(employee, company)
if not applicable_holiday_list:
return
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index 671fbb8..f9f7377 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -11,7 +11,7 @@
from erpnext.setup.utils import get_company_currency
from erpnext.hr.utils import set_employee_name
from erpnext.hr.doctype.process_payroll.process_payroll import get_month_details
-
+from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee
from erpnext.utilities.transaction_base import TransactionBase
class SalarySlip(TransactionBase):
@@ -20,11 +20,11 @@
def get_emp_and_leave_details(self):
if self.employee:
- joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
+ joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
["date_of_joining", "relieving_date"])
-
+
self.get_leave_details(joining_date, relieving_date)
-
+
struct = self.check_sal_struct(joining_date, relieving_date)
if struct:
self.set("earnings", [])
@@ -33,10 +33,10 @@
def check_sal_struct(self, joining_date, relieving_date):
m = get_month_details(self.fiscal_year, self.month)
-
+
struct = frappe.db.sql("""select name from `tabSalary Structure`
where employee=%s and is_active = 'Yes'
- and (from_date <= %s or from_date <= %s)
+ and (from_date <= %s or from_date <= %s)
and (to_date is null or to_date >= %s or to_date >= %s)""",
(self.employee, m.month_start_date, joining_date, m.month_end_date, relieving_date))
@@ -62,9 +62,9 @@
self.fiscal_year = frappe.db.get_default("fiscal_year")
if not self.month:
self.month = "%02d" % getdate(nowdate()).month
-
+
if not joining_date:
- joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
+ joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
["date_of_joining", "relieving_date"])
m = get_month_details(self.fiscal_year, self.month)
@@ -82,7 +82,7 @@
self.leave_without_pay = lwp
payment_days = flt(self.get_payment_days(m, joining_date, relieving_date)) - flt(lwp)
self.payment_days = payment_days > 0 and payment_days or 0
-
+
def get_payment_days(self, month, joining_date, relieving_date):
start_date = month['month_start_date']
if joining_date:
@@ -90,15 +90,15 @@
start_date = joining_date
elif joining_date > month['month_end_date']:
return
-
+
end_date = month['month_end_date']
if relieving_date:
if relieving_date > start_date and relieving_date < month['month_end_date']:
end_date = relieving_date
elif relieving_date < month['month_start_date']:
frappe.throw(_("Employee relieved on {0} must be set as 'Left'")
- .format(relieving_date))
-
+ .format(relieving_date))
+
payment_days = date_diff(end_date, start_date) + 1
if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")):
@@ -108,21 +108,19 @@
return payment_days
def get_holidays_for_employee(self, start_date, end_date):
- holidays = frappe.db.sql("""select t1.holiday_date
- from `tabHoliday` t1, tabEmployee t2
- where t1.parent = t2.holiday_list and t2.name = %s
- and t1.holiday_date between %s and %s""",
- (self.employee, start_date, end_date))
-
- if not holidays:
- holidays = frappe.db.sql("""select t1.holiday_date
- from `tabHoliday` t1, `tabHoliday List` t2
- where t1.parent = t2.name and t2.is_default = 1
- and t2.fiscal_year = %s
- and t1.holiday_date between %s and %s""",
- (self.fiscal_year, start_date, end_date))
-
- holidays = [cstr(i[0]) for i in holidays]
+ holiday_list = get_holiday_list_for_employee(self.employee)
+ holidays = frappe.db.sql_list('''select holiday_date from `tabHoliday`
+ where
+ parent=%(holiday_list)s
+ and holiday_date >= %(start_date)s
+ and holiday_date <= %(end_date)s''', {
+ "holiday_list": holiday_list,
+ "start_date": start_date,
+ "end_date": end_date
+ })
+
+ holidays = [cstr(i) for i in holidays]
+
return holidays
def calculate_lwp(self, holidays, m):
diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.py b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
index 387c593..2383aff 100644
--- a/erpnext/hr/doctype/salary_slip/test_salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
@@ -13,11 +13,11 @@
def setUp(self):
for dt in ["Leave Application", "Leave Allocation", "Salary Slip"]:
frappe.db.sql("delete from `tab%s`" % dt)
-
+
make_allocation_record(leave_type="_Test Leave Type LWP")
-
- frappe.db.set_value("Holiday List", "_Test Holiday List", "is_default", 1)
-
+
+ frappe.db.set_value("Company", "_Test Company", "default_holiday_list", "_Test Holiday List")
+
from erpnext.hr.doctype.leave_application.test_leave_application import _test_records as leave_applications
la = frappe.copy_doc(leave_applications[2])
la.insert()
@@ -32,7 +32,7 @@
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
ss = frappe.copy_doc(test_records[0])
ss.insert()
-
+
self.assertEquals(ss.total_days_in_month, 31)
self.assertEquals(ss.payment_days, 30)
self.assertEquals(ss.earnings[0].e_modified_amount, 14516.13)
@@ -46,7 +46,7 @@
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
ss = frappe.copy_doc(test_records[0])
ss.insert()
-
+
self.assertEquals(ss.total_days_in_month, 29)
self.assertEquals(ss.payment_days, 28)
self.assertEquals(ss.earnings[0].e_modified_amount, 14482.76)
@@ -55,32 +55,32 @@
self.assertEquals(ss.deductions[1].d_modified_amount, 48.28)
self.assertEquals(ss.gross_pay, 14982.76)
self.assertEquals(ss.net_pay, 14834.48)
-
+
def test_payment_days(self):
# Holidays not included in working days
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
-
+
# set joinng date in the same month
frappe.db.set_value("Employee", "_T-Employee-0001", "date_of_joining", "2013-01-11")
-
+
ss = frappe.copy_doc(test_records[0])
ss.insert()
-
+
self.assertEquals(ss.total_days_in_month, 29)
self.assertEquals(ss.payment_days, 19)
-
+
# set relieving date in the same month
frappe.db.set_value("Employee", "_T-Employee-0001", "relieving_date", "2013-01-28")
ss.save()
self.assertEquals(ss.total_days_in_month, 29)
self.assertEquals(ss.payment_days, 16)
-
+
# Holidays included in working days
frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
ss.save()
self.assertEquals(ss.total_days_in_month, 31)
self.assertEquals(ss.payment_days, 17)
-
+
frappe.db.set_value("Employee", "_T-Employee-0001", "date_of_joining", "2001-01-11")
frappe.db.set_value("Employee", "_T-Employee-0001", "relieving_date", None)
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index d6ebf5b..e53a506 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -254,3 +254,4 @@
erpnext.patches.v6_24.set_recurring_id
erpnext.patches.v6_20x.set_compact_print
execute:frappe.delete_doc_if_exists("Web Form", "contact") #2016-03-10
+erpnext.patches.v6_20x.remove_fiscal_year_from_holiday_list
diff --git a/erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py b/erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py
new file mode 100644
index 0000000..c8c6203
--- /dev/null
+++ b/erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py
@@ -0,0 +1,17 @@
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+ default_holiday_list = frappe.db.get_value("Holiday List", {"is_default": 1})
+ if default_holiday_list:
+ for company in frappe.get_all("Company", fields=["name", "default_holiday_list"]):
+ if not company.default_holiday_list:
+ frappe.db.set_value("Company", company.name, "default_holiday_list", default_holiday_list)
+
+
+ fiscal_years = frappe._dict((fy.name, fy) for fy in frappe.get_all("Fiscal Year", fields=["name", "year_start_date", "year_end_date"]))
+
+ for holiday_list in frappe.get_all("Holiday List", fields=["name", "fiscal_year"]):
+ fy = fiscal_years[holiday_list.fiscal_year]
+ frappe.db.set_value("Holiday List", holiday_list.name, "from_date", fy.year_start_date)
+ frappe.db.set_value("Holiday List", holiday_list.name, "to_date", fy.year_end_date)
diff --git a/erpnext/setup/doctype/company/test_records.json b/erpnext/setup/doctype/company/test_records.json
index b6918b3..7e26ca3 100644
--- a/erpnext/setup/doctype/company/test_records.json
+++ b/erpnext/setup/doctype/company/test_records.json
@@ -6,7 +6,8 @@
"default_currency": "INR",
"doctype": "Company",
"domain": "Manufacturing",
- "chart_of_accounts": "Standard"
+ "chart_of_accounts": "Standard",
+ "default_holiday_list": "_Test Holiday List"
},
{
"abbr": "_TC1",
@@ -15,7 +16,8 @@
"default_currency": "USD",
"doctype": "Company",
"domain": "Retail",
- "chart_of_accounts": "Standard"
+ "chart_of_accounts": "Standard",
+ "default_holiday_list": "_Test Holiday List"
},
{
"abbr": "_TC2",
@@ -24,6 +26,7 @@
"country": "Germany",
"doctype": "Company",
"domain": "Retail",
- "chart_of_accounts": "Standard"
+ "chart_of_accounts": "Standard",
+ "default_holiday_list": "_Test Holiday List"
}
]
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
index d7ba146..0469972 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
@@ -9,6 +9,7 @@
from frappe import throw, _
from erpnext.utilities.transaction_base import TransactionBase, delete_events
from erpnext.stock.utils import get_valid_serial_nos
+from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee
class MaintenanceSchedule(TransactionBase):
def generate_schedule(self):
@@ -90,35 +91,21 @@
return schedule_list
def validate_schedule_date_for_holiday_list(self, schedule_date, sales_person):
- from erpnext.accounts.utils import get_fiscal_year
validated = False
- fy_details = ""
- try:
- fy_details = get_fiscal_year(date=schedule_date, verbose=0)
- except Exception:
- pass
+ employee = frappe.db.get_value("Sales Person", sales_person, "employee")
+ holiday_list = get_holiday_list_for_employee(employee)
+ holidays = frappe.db.sql_list('''select holiday_date from `tabHoliday` where parent=%s''', holiday_list)
- if fy_details and fy_details[0]:
- # check holiday list in employee master
- holiday_list = frappe.db.sql_list("""select h.holiday_date from `tabEmployee` emp,
- `tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl
- where sp.name=%s and emp.name=sp.employee
- and hl.name=emp.holiday_list and
- h.parent=hl.name and
- hl.fiscal_year=%s""", (sales_person, fy_details[0]))
- if not holiday_list:
- # check global holiday list
- holiday_list = frappe.db.sql("""select h.holiday_date from
- `tabHoliday` h, `tabHoliday List` hl
- where h.parent=hl.name and hl.is_default = 1
- and hl.fiscal_year=%s""", fy_details[0])
+ if not validated and holidays:
- if not validated and holiday_list:
- if schedule_date in holiday_list:
+ # max iterations = len(holidays)
+ for i in xrange(len(holidays)):
+ if schedule_date in holidays:
schedule_date = add_days(schedule_date, -1)
else:
validated = True
+ break
return schedule_date