Merge pull request #18964 from nabinhait/max_carry_forwarded_leaves

feat: Added input field for max carry forwarded leaves
diff --git a/erpnext/erpnext_integrations/doctype/amazon_mws_settings/amazon_mws_api.py b/erpnext/erpnext_integrations/doctype/amazon_mws_settings/amazon_mws_api.py
index fd364e8..cc4ccc5 100755
--- a/erpnext/erpnext_integrations/doctype/amazon_mws_settings/amazon_mws_api.py
+++ b/erpnext/erpnext_integrations/doctype/amazon_mws_settings/amazon_mws_api.py
@@ -71,7 +71,7 @@
 		Helper function that removes all keys from a dictionary (d),
 	that have an empty value.
 	"""
-	for key in d.keys():
+	for key in list(d):
 		if not d[key]:
 			del d[key]
 	return d
diff --git a/erpnext/hr/report/employee_leave_balance_summary/__init__.py b/erpnext/hr/report/employee_leave_balance_summary/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/hr/report/employee_leave_balance_summary/__init__.py
diff --git a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.js b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.js
new file mode 100644
index 0000000..838f4ad
--- /dev/null
+++ b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.js
@@ -0,0 +1,36 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports['Employee Leave Balance Summary'] = {
+	filters: [
+		{
+			fieldname:'company',
+			label: __('Company'),
+			fieldtype: 'Link',
+			options: 'Company',
+			reqd: 1,
+			default: frappe.defaults.get_user_default('Company')
+		},
+		{
+			fieldname:'employee',
+			label: __('Employee'),
+			fieldtype: 'Link',
+			options: 'Employee',
+		},
+		{
+			fieldname:'from_date',
+			label: __('From Date'),
+			fieldtype: 'Date',
+			reqd: 1,
+			default: frappe.defaults.get_default('year_start_date')
+		},
+		{
+			fieldname:'to_date',
+			label: __('To Date'),
+			fieldtype: 'Date',
+			reqd: 1,
+			default: frappe.defaults.get_default('year_end_date')
+		}
+	]
+};
diff --git a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.json b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.json
new file mode 100644
index 0000000..60fe1ae
--- /dev/null
+++ b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.json
@@ -0,0 +1,34 @@
+{
+ "add_total_row": 0,
+ "creation": "2019-09-05 11:18:06.209397",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "letter_head": "sapcon-old",
+ "modified": "2019-09-05 11:18:06.209397",
+ "modified_by": "Administrator",
+ "module": "HR",
+ "name": "Employee Leave Balance Summary",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "Employee",
+ "report_name": "Employee Leave Balance Summary",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "Employee"
+  },
+  {
+   "role": "HR Manager"
+  },
+  {
+   "role": "HR User"
+  },
+  {
+   "role": "Leave Approver"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
new file mode 100644
index 0000000..64a5c1c
--- /dev/null
+++ b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
@@ -0,0 +1,96 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.utils import flt
+from frappe import _
+from erpnext.hr.doctype.leave_application.leave_application import get_leaves_for_period
+
+from erpnext.hr.report.employee_leave_balance.employee_leave_balance import get_total_allocated_leaves
+
+def execute(filters=None):
+	if filters.to_date <= filters.from_date:
+		frappe.throw(_('From date can not be greater than than To date'))
+
+	columns = get_columns()
+	data = get_data(filters)
+
+	return columns, data
+
+def get_columns():
+	columns = [{
+		'label': _('Leave Type'),
+		'fieldtype': 'Link',
+		'fieldname': 'leave_type',
+		'width': 300,
+		'options': 'Leave Type'
+	}, {
+		'label': _('Employee'),
+		'fieldtype': 'Link',
+		'fieldname': 'employee',
+		'width': 100,
+		'options': 'Employee'
+	}, {
+		'label': _('Employee Name'),
+		'fieldtype': 'Data',
+		'fieldname': 'employee_name',
+		'width': 100,
+	}, {
+		'label': _('Opening Balance'),
+		'fieldtype': 'float',
+		'fieldname': 'opening_balance',
+		'width': 160,
+	}, {
+		'label': _('Leaves Taken'),
+		'fieldtype': 'float',
+		'fieldname': 'leaves_taken',
+		'width': 160,
+	}, {
+		'label': _('Closing Balance'),
+		'fieldtype': 'float',
+		'fieldname': 'closing_balance',
+		'width': 160,
+	}]
+
+	return columns
+
+def get_data(filters):
+	leave_types = frappe.db.sql_list("SELECT `name` FROM `tabLeave Type` ORDER BY `name` ASC")
+
+	conditions = {
+		'status': 'Active',
+	}
+
+	if filters.get('employee'):
+		conditions['name'] = filters.get('employee')
+
+	active_employees = frappe.get_all('Employee',
+		filters=conditions,
+		fields=['name', 'employee_name', 'department', 'user_id'])
+
+	data = []
+
+	for leave_type in leave_types:
+		data.append({
+			'leave_type': leave_type
+		})
+		for employee in active_employees:
+			row = frappe._dict({
+				'employee': employee.name,
+				'employee_name': employee.employee_name
+			})
+
+			leaves_taken = get_leaves_for_period(employee.name, leave_type,
+				filters.from_date, filters.to_date) * -1
+
+			opening = get_total_allocated_leaves(employee.name, leave_type, filters.from_date, filters.to_date)
+			closing = flt(opening) - flt(leaves_taken)
+
+			row.opening_balance = opening
+			row.leaves_taken = leaves_taken
+			row.closing_balance = closing
+			row.indent = 1
+			data.append(row)
+
+	return data
diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py
index 7123021..6dbb890 100644
--- a/erpnext/setup/setup_wizard/operations/install_fixtures.py
+++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py
@@ -502,8 +502,17 @@
 
 def add_dashboards():
 	from erpnext.setup.setup_wizard.data.dashboard_charts import get_default_dashboards
+	from frappe.modules.import_file import import_file_by_path
+
 	dashboard_data = get_default_dashboards()
 
+	# create account balance timeline before creating dashbaord charts
+	doctype = "dashboard_chart_source"
+	docname = "account_balance_timeline"
+	folder = os.path.dirname(frappe.get_module("erpnext.accounts").__file__)
+	doc_path = os.path.join(folder, doctype, docname, docname) + ".json"
+	import_file_by_path(doc_path, force=0, for_sync=True)
+
 	make_records(dashboard_data["Charts"])
 	make_records(dashboard_data["Dashboards"])
 
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index 383fb61..46efd4e 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -904,7 +904,7 @@
     "description": "Item Image (if not slideshow)",
     "fieldname": "website_image",
     "fieldtype": "Attach",
-    "label": "Image"
+    "label": "Website Image"
    },
    {
     "fieldname": "thumbnail",
@@ -1040,7 +1040,7 @@
   "idx": 2,
   "image_field": "image",
   "max_attachments": 1,
-  "modified": "2019-07-12 12:18:13.977931",
+  "modified": "2019-09-03 18:34:13.977931",
   "modified_by": "Administrator",
   "module": "Stock",
   "name": "Item",