Merge pull request #14166 from rohitwaghchaure/version_11_patch_budget

[Fix] Patch, default cost center, expense account for the item
diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py
old mode 100644
new mode 100755
index 4d2e7cc..52b59d4
--- a/erpnext/accounts/doctype/sales_invoice/pos.py
+++ b/erpnext/accounts/doctype/sales_invoice/pos.py
@@ -153,12 +153,14 @@
 
 def get_items_list(pos_profile, company):
 	cond = ""
-	args_list = [company]
+	args_list = []
 	if pos_profile.get('item_groups'):
 		# Get items based on the item groups defined in the POS profile
 		for d in pos_profile.get('item_groups'):
 			args_list.extend([d.name for d in get_child_nodes('Item Group', d.item_group)])
 		cond = "and i.item_group in (%s)" % (', '.join(['%s'] * len(args_list)))
+		
+		args_list = [company] + args_list
 
 	return frappe.db.sql("""
 		select
@@ -285,13 +287,13 @@
 	itemwise_barcode = {}
 	for item in items_list:
 		barcodes = frappe.db.sql("""
-		select barcode from `tabItem Barcode` where parent = '{0}'
-		""".format(item.item_code), as_dict=1)
+			select barcode from `tabItem Barcode` where parent = %s
+		""", item.item_code, as_dict=1)
 
 		for barcode in barcodes:
 			if item.item_code not in itemwise_barcode:
 				itemwise_barcode.setdefault(item.item_code, [])
-			itemwise_barcode[item.item_code].append(barcode)
+			itemwise_barcode[item.item_code].append(barcode.get("barcode"))
 
 	return itemwise_barcode
 
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 017771a..bf906ce 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -332,12 +332,14 @@
 			conditions.append("company=%s")
 			values.append(self.filters.company)
 
-		if self.filters.finance_book:
+		company_finance_book = erpnext.get_default_finance_book(self.filters.company)
+
+		if not self.filters.finance_book or (self.filters.finance_book == company_finance_book):
 			conditions.append("ifnull(finance_book,'') in (%s, '')")
+			values.append(company_finance_book)
+		elif self.filters.finance_book:
+			conditions.append("ifnull(finance_book,'') = %s")
 			values.append(self.filters.finance_book)
-		else:
-			conditions.append("ifnull(finance_book,'') in (%s, '')")
-			values.append(erpnext.get_default_finance_book(self.filters.company))
 
 		if self.filters.get(party_type_field):
 			conditions.append("party=%s")
diff --git a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
index 318c590..fb59882 100644
--- a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
+++ b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
@@ -42,11 +42,13 @@
 	if filters.get("asset_category"):
 		conditions += " and a.asset_category = %(asset_category)s"
 		
-	if filters.get("finance_book"):
+	company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+
+	if (not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book)):
+		filters['finance_book'] = company_finance_book
 		conditions += " and ifnull(ds.finance_book, '') in (%(finance_book)s, '') "
-	else:
-		filters['finance_book'] = erpnext.get_default_finance_book(filters.get("company"))
-		conditions += " and ifnull(ds.finance_book, '') in (%(finance_book)s, '') "
+	elif filters.get("finance_book"):
+		conditions += " and ifnull(ds.finance_book, '') = %(finance_book)s"
 
 	return conditions
 	
diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js
index 63f263f..91a06f4 100644
--- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js
+++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js
@@ -29,6 +29,12 @@
 			"reqd": 1
 		},
 		{
+			"fieldname":"finance_book",
+			"label": __("Finance Book"),
+			"fieldtype": "Link",
+			"options": "Finance Book"
+		},
+		{
 			"fieldname":"report",
 			"label": __("Report"),
 			"fieldtype": "Select",
diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
index 750120b..39f4771 100644
--- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
+++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
@@ -2,7 +2,7 @@
 # For license information, please see license.txt
 
 from __future__ import unicode_literals
-import frappe
+import frappe, erpnext
 from frappe import _
 from frappe.utils import flt, cint
 from erpnext.accounts.report.financial_statements import get_fiscal_year_data, sort_accounts
@@ -322,7 +322,7 @@
 	company_lft, company_rgt = frappe.db.get_value('Company',
 		filters.get('company'), ["lft", "rgt"])
 
-	additional_conditions = get_additional_conditions(from_date, ignore_closing_entries)
+	additional_conditions = get_additional_conditions(from_date, ignore_closing_entries, filters)
 
 	gl_entries = frappe.db.sql("""select gl.posting_date, gl.account, gl.debit, gl.credit, gl.is_opening, gl.company,
 		gl.fiscal_year, gl.debit_in_account_currency, gl.credit_in_account_currency, gl.account_currency,
@@ -353,7 +353,7 @@
 		field = "Account number" if entry.account_number else "Account name"
 		frappe.throw(_("{0} {1} is not present in the parent company").format(field, key))
 
-def get_additional_conditions(from_date, ignore_closing_entries):
+def get_additional_conditions(from_date, ignore_closing_entries, filters):
 	additional_conditions = []
 
 	if ignore_closing_entries:
@@ -362,6 +362,15 @@
 	if from_date:
 		additional_conditions.append("gl.posting_date >= %(from_date)s")
 
+	company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+
+	if not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book):
+		additional_conditions.append("finance_book in ('%s', '')" %
+			frappe.db.escape(company_finance_book))
+	elif filters.get("finance_book"):
+		additional_conditions.append("finance_book = '%s' " %
+			frappe.db.escape(filters.get("finance_book")))
+
 	return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
 
 def add_total_row(out, root_type, balance_must_be, companies, company_currency):
diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py
index f7bde6c..41abc3f 100644
--- a/erpnext/accounts/report/financial_statements.py
+++ b/erpnext/accounts/report/financial_statements.py
@@ -375,13 +375,15 @@
 			additional_conditions.append("project = '%s'" % (frappe.db.escape(filters.get("project"))))
 		if filters.get("cost_center"):
 			additional_conditions.append(get_cost_center_cond(filters.get("cost_center")))
-		if filters.get("finance_book"):
-			additional_conditions.append("finance_book in ('%s', '')" %
-				frappe.db.escape(filters.get("finance_book")))
-		else:
-			additional_conditions.append("finance_book in ('%s', '')" %
-				frappe.db.escape(erpnext.get_default_finance_book(filters.get("company"))))
 
+		company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+
+		if not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book):
+			additional_conditions.append("finance_book in ('%s', '')" %
+				frappe.db.escape(company_finance_book))
+		elif filters.get("finance_book"):
+			additional_conditions.append("finance_book = '%s' " %
+				frappe.db.escape(filters.get("finance_book")))
 
 	return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
 
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index bd4dfb2..6aecab9 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -167,11 +167,12 @@
 	if filters.get("project"):
 		conditions.append("project=%(project)s")
 
-	if filters.get("finance_book"):
+	company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+	if not filters.get("finance_book") or (filters.get("finance_book") == company_finance_book):
+		filters['finance_book'] = company_finance_book
 		conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')")
-	else:
-		filters['finance_book'] = erpnext.get_default_finance_book(filters.get("company"))
-		conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')")
+	elif filters.get("finance_book"):
+		conditions.append("ifnull(finance_book, '') = %(finance_book)s")
 
 	from frappe.desk.reportview import build_match_conditions
 	match_conditions = build_match_conditions("GL Entry")
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
index 1583daf..3c135d4 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
@@ -24,7 +24,28 @@
 				return indicator;
 			}
 		);
+
+		frm.set_query('select_serial_no', function(doc){
+			return {
+				asset: frm.doc.asset_name
+			}
+		})
 	},
+
+	select_serial_no: (frm) => {
+		let serial_nos = frm.doc.serial_no || frm.doc.select_serial_no;
+		if (serial_nos) {
+			serial_nos = serial_nos.split('\n');
+			serial_nos.push(frm.doc.select_serial_no);
+
+			const unique_sn = serial_nos.filter(function(elem, index, self) {
+			    return index === self.indexOf(elem);
+			});
+
+			frm.set_value("serial_no", unique_sn.join('\n'));
+		}
+	},
+
 	refresh: (frm) => {
 		if(!frm.is_new()) {
 			frm.trigger('make_dashboard');
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
index f36fe4e..c254fe1 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
@@ -209,6 +209,38 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
+   "fieldname": "select_serial_no", 
+   "fieldtype": "Link", 
+   "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": "Select Serial No", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Serial No", 
+   "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, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
    "fieldname": "serial_no", 
    "fieldtype": "Small Text", 
    "hidden": 0, 
@@ -221,12 +253,12 @@
    "label": "Serial No", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "asset_name.serial_no", 
+   "options": "", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 1, 
+   "read_only": 0, 
    "remember_last_selected_value": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -465,7 +497,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2018-04-20 08:39:27.072622", 
+ "modified": "2018-05-18 16:16:56.181695", 
  "modified_by": "Administrator", 
  "module": "Assets", 
  "name": "Asset Maintenance", 
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
index b30685f..7551eae 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
@@ -11,9 +11,6 @@
 
 class AssetMaintenance(Document):
 	def validate(self):
-		if not self.serial_no:
-			self.serial_no = frappe.db.get_value("Asset", self.asset_name, 'serial_no')
-
 		for task in self.get('asset_maintenance_tasks'):
 			if task.end_date and (getdate(task.start_date) >= getdate(task.end_date)):
 				throw(_("Start date should be less than end date for task {0}").format(task.maintenance_task))
diff --git a/erpnext/config/selling.py b/erpnext/config/selling.py
index b48cafc..496617a 100644
--- a/erpnext/config/selling.py
+++ b/erpnext/config/selling.py
@@ -285,6 +285,12 @@
 					"name": "Customer Credit Balance",
 					"doctype": "Customer"
 				},
+				{
+					"type": "report",
+					"is_query_report": True,
+					"name": "Customers Without Any Sales Transactions",
+					"doctype": "Customer"
+				},
 			]
 		},
 		{
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index f9d1c43..0da8ac2 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -147,6 +147,15 @@
 				]
 			};
 		});
+		frm.set_query("expense_approver", function() {
+			return {
+				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
+				filters: {
+					employee: frm.doc.employee,
+					doctype: frm.doc.doctype
+				}
+			};
+		});
 	},
 
 	onload: function(frm) {
@@ -163,15 +172,6 @@
 				}
 			});
 		}
-		frm.set_query("expense_approver", function() {
-			return {
-				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
-				filters: {
-					employee: frm.doc.employee,
-					doctype: frm.doc.doctype
-				}
-			};
-		});
 	},
 
 	refresh: function(frm) {
diff --git a/erpnext/hr/doctype/job_opening/job_opening.json b/erpnext/hr/doctype/job_opening/job_opening.json
index 7906439..4437e02 100644
--- a/erpnext/hr/doctype/job_opening/job_opening.json
+++ b/erpnext/hr/doctype/job_opening/job_opening.json
@@ -41,6 +41,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -72,6 +73,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -102,6 +104,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -131,6 +134,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -159,9 +163,10 @@
    "read_only": 0, 
    "remember_last_selected_value": 0, 
    "report_hide": 0, 
-   "reqd": 0, 
+   "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -193,6 +198,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -224,6 +230,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -255,6 +262,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -284,6 +292,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -314,6 +323,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -345,6 +355,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 1
   }, 
   {
@@ -375,6 +386,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }
  ], 
@@ -389,7 +401,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2018-05-07 14:16:50.300247", 
+ "modified": "2018-05-20 15:38:44.705823", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Job Opening", 
@@ -397,7 +409,6 @@
  "permissions": [
   {
    "amend": 0, 
-   "apply_user_permissions": 0, 
    "cancel": 0, 
    "create": 1, 
    "delete": 1, 
@@ -417,7 +428,6 @@
   }, 
   {
    "amend": 0, 
-   "apply_user_permissions": 0, 
    "cancel": 0, 
    "create": 0, 
    "delete": 0, 
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 7a6b246..0b48706 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -5,6 +5,19 @@
 cur_frm.add_fetch('employee','company','company');
 
 frappe.ui.form.on("Leave Application", {
+	setup: function(frm) {
+		frm.set_query("leave_approver", function() {
+			return {
+				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
+				filters: {
+					employee: frm.doc.employee,
+					doctype: frm.doc.doctype
+				}
+			};
+		}); 
+
+		frm.set_query("employee", erpnext.queries.employee);
+	},
 	onload: function(frm) {
 		if (!frm.doc.posting_date) {
 			frm.set_value("posting_date", frappe.datetime.get_today());
@@ -22,17 +35,6 @@
 				}
 			});
 		}
-		frm.set_query("leave_approver", function() {
-			return {
-				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
-				filters: {
-					employee: frm.doc.employee,
-					doctype: frm.doc.doctype
-				}
-			};
-		}); 
-
-		frm.set_query("employee", erpnext.queries.employee);
 	},
 
 	validate: function(frm) {
diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py
index 26e7fce..d4e8ccd 100644
--- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py
+++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py
@@ -21,7 +21,9 @@
 			if joining_date and getdate(self.from_date) < joining_date:
 				frappe.throw(_("From Date {0} cannot be before employee's joining Date {1}")
 					.format(self.from_date, joining_date))
-			if relieving_date and getdate(self.from_date) > relieving_date:
+
+			# flag - old_employee is for migrating the old employees data via patch
+			if relieving_date and getdate(self.from_date) > relieving_date and not self.flags.old_employee:
 				frappe.throw(_("From Date {0} cannot be after employee's relieving Date {1}")
 					.format(self.from_date, relieving_date))
 
@@ -29,7 +31,7 @@
 			if self.from_date and getdate(self.from_date) > getdate(self.to_date):
 				frappe.throw(_("From Date {0} cannot be after To Date {1}")
 					.format(self.from_date, self.to_date))
-			if relieving_date and getdate(self.to_date) > relieving_date:
+			if relieving_date and getdate(self.to_date) > getdate(relieving_date) and not self.flags.old_employee:
 				frappe.throw(_("To Date {0} cannot be after employee's relieving Date {1}")
 					.format(self.to_date, relieving_date))
 
diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
index 8105e1a..a603015 100644
--- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
@@ -39,8 +39,7 @@
 	
 	data = []
 	for employee in active_employees:
-		leave_approvers = [l.leave_approver for l in frappe.db.sql("""select leave_approver from `tabEmployee Leave Approver` where parent = %s""",
-							(employee.name),as_dict=True)]
+		leave_approvers = get_approvers(employee.department)
 		if (len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) or ("HR Manager" in frappe.get_roles(user)):
 			row = [employee.name, employee.employee_name, employee.department]
 
@@ -54,7 +53,25 @@
 					allocation_records_based_on_to_date.get(employee.name, frappe._dict()))
 
 				row += [leaves_taken, closing]
-			
+
 			data.append(row)
 		
-	return data
\ No newline at end of file
+	return data
+
+def get_approvers(department):
+	if not department:
+		return []
+
+	approvers = []
+	# get current department and all its child
+	department_details = frappe.db.get_value("Department", {"name": department}, ["lft", "rgt"], as_dict=True)
+	department_list = frappe.db.sql("""select name from `tabDepartment`
+		where lft >= %s and rgt <= %s order by lft desc
+		""", (department_details.lft, department_details.rgt), as_list = True)
+
+	# retrieve approvers list from current department and from its subsequent child departments
+	for d in department_list:
+		approvers.extend([l.leave_approver for l in frappe.db.sql("""select approver from `tabDepartment Approver` \
+			where parent = %s and parentfield = 'leave_approver'""", (d), as_dict=True)])
+
+	return approvers
diff --git a/erpnext/non_profit/doctype/chapter/templates/chapter.html b/erpnext/non_profit/doctype/chapter/templates/chapter.html
index 0110950..321828f 100644
--- a/erpnext/non_profit/doctype/chapter/templates/chapter.html
+++ b/erpnext/non_profit/doctype/chapter/templates/chapter.html
@@ -2,38 +2,40 @@
 
 {% block page_content %}
 <h1>{{ title }}</h1>
-<h3>Details</h3>
 <p>{{ introduction }}</p>
 {% if meetup_embed_html %}
 	{{ meetup_embed_html }}
 {% endif %}
-<h3>List of Members</h3>
+<h3>Member Details</h3>
 
 {% if members  %}
-	<table class="table table-bordered small" style="max-width: 500px;">
-		<tr>
-			<th width="15%" ></th>
-			<th>Member Details</th>
-		</tr>
+	<table class="table" style="max-width: 600px;">
 		{% set index = [1] %}
 		{% for user in members %}
 			{% if user.enabled == 1 %}
 				<tr>
-					<td>{{ index|length }}</td>
 					<td>
+						<div style="margin-bottom: 30px; max-width: 600px" class="with-border">
 						<div class="row">
-							<div class="col-lg-6 col-md-6 col-sm-6">{{ frappe.db.get_value('User', user.user, 'full_name') }}</div>
-							<div class="col-lg-6 col-md-6 col-sm-6 text-right">
+							<div class="col-lg-6 col-md-6 col-sm-6">
+             <div class="pull-left">
+								<b>{{ index|length }}. {{ frappe.db.get_value('User', user.user, 'full_name') }}</b></div>
+							</div>
+								<div class="pull-right">
 								{% if user.website_url %}
-									<a href="{{ user.website_url }}">{{ user.website_url or '' }}</a>
+									<a href="{{ user.website_url }}">{{ user.website_url | truncate (50) or '' }}</a>
 								{% endif %}
 							</div>
+							<div class="clearfix"></div>
+							</div>
+							<br><br>
 							<div class="col-lg-12">
 							{% if user.introduction %}
 								{{ user.introduction }}
 							{% endif %}
 							</div>
 						</div>
+					</div>
 					</td>
 				</tr>
 				{% set __ = index.append(1) %}
@@ -45,11 +47,13 @@
 {% endif %}
 
 <h3>Chapter Head</h3>
-<table class="table table-bordered small" style="max-width: 500px;">
+<div style="margin-bottom: 30px; max-width: 600px" class="with-border">
+
+<table class="table table-bordered small" style="max-width: 600px;">
 	{% set doc = frappe.get_doc('Member',chapter_head) %}
 	<tr>
 		<td style='width: 15%'>Name</td>
-		<td>{{ doc.member_name }}</td>
+		<td><b>{{ doc.member_name }}<b></td>
 	</tr>
 	<tr>
 		<td>Email</td>
@@ -60,8 +64,14 @@
 		<td>{{ frappe.db.get_value('User', doc.email, 'phone') or '' }}</td>
 	</tr>
 </table>
+</div>
+
+{% if address  %}
 <h3>Address</h3>
-<p>{{ address }}</p>
+<div style="margin-bottom: 30px; max-width: 600px" class="with-border">
+<p>{{ address or ''}}</p>
+</div>
+{% endif %}
 
 <p style="margin: 20px 0 30px;"><a href="/non_profit/join-chapter?name={{ name }}" class='btn btn-primary'>Join this Chapter</a></p>
 <p style="margin: 20px 0 30px;"><a href="/non_profit/leave-chapter?name={{ name }}" class=''>Leave this Chapter</a></p>
diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py
index 6f869b0..17e3ebd 100644
--- a/erpnext/patches/v11_0/create_department_records_for_each_company.py
+++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py
@@ -47,6 +47,9 @@
 				THEN "%s"
 			'''%(company, department, records[department]))
 
+	if not when_then:
+		return
+
 	frappe.db.sql("""
 		update
 			`tab%s`
@@ -67,6 +70,9 @@
 				THEN "%s"
 			'''%(employee.name, department, records[department]))
 
+	if not when_then:
+		return
+
 	frappe.db.sql("""
 		update
 			`tabInstructor`
diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py
index 289554e..24874f6 100644
--- a/erpnext/patches/v11_0/create_salary_structure_assignments.py
+++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py
@@ -18,6 +18,9 @@
 		s.base = d.base
 		s.variable = d.variable
 		s.company = d.company
+
+		# to migrate the data of the old employees
+		s.flags.old_employee = True
 		s.save()
 
 	frappe.db.sql("update `tabSalary Structure` set docstatus=1")
\ No newline at end of file
diff --git a/erpnext/patches/v11_0/refactor_erpnext_shopify.py b/erpnext/patches/v11_0/refactor_erpnext_shopify.py
index c8d4de8..d344ae3 100644
--- a/erpnext/patches/v11_0/refactor_erpnext_shopify.py
+++ b/erpnext/patches/v11_0/refactor_erpnext_shopify.py
@@ -22,7 +22,7 @@
 def setup_app_type():
 	shopify_settings = frappe.get_doc("Shopify Settings")
 	shopify_settings.app_type = 'Private'
-	shopify_settings.update_price_in_erpnext_price_list =  0 if shopify_settings.push_prices_to_shopify else 1
+	shopify_settings.update_price_in_erpnext_price_list =  0 if getattr(shopify_settings, 'push_prices_to_shopify', None) else 1
 	shopify_settings.flags.ignore_mandatory = True
 	shopify_settings.ignore_permissions = True
 	shopify_settings.save()
diff --git a/erpnext/selling/report/customers_without_any_sales_transactions/__init__.py b/erpnext/selling/report/customers_without_any_sales_transactions/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/selling/report/customers_without_any_sales_transactions/__init__.py
diff --git a/erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json b/erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json
new file mode 100644
index 0000000..2a4c2ae
--- /dev/null
+++ b/erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json
@@ -0,0 +1,30 @@
+{
+ "add_total_row": 0, 
+ "apply_user_permissions": 0, 
+ "creation": "2018-05-17 15:25:06.015111", 
+ "disabled": 0, 
+ "docstatus": 0, 
+ "doctype": "Report", 
+ "idx": 0, 
+ "is_standard": "Yes", 
+ "modified": "2018-05-21 11:06:11.920622", 
+ "modified_by": "Administrator", 
+ "module": "Selling", 
+ "name": "Customers Without Any Sales Transactions", 
+ "owner": "Administrator", 
+ "query": "SELECT\n\t`tabCustomer`.name as \"Customer:Link/Customer:120\",\n\t`tabCustomer`.customer_name as \"Customer Name::120\",\n\t`tabCustomer`.territory as \"Territory:Link/Territory:120\",\n\t`tabCustomer`.customer_group as \"Customer Group:Link/Customer Group:120\"\nFROM\n\t`tabCustomer`\nWHERE\n\tnot exists(select name from `tabSales Invoice` where `tabCustomer`.name = `tabSales Invoice`.customer and `tabSales Invoice`.docstatus=1 limit 1)\n\tand not exists(select name from `tabSales Order` where `tabCustomer`.name = `tabSales Order`.customer and `tabSales Order`.docstatus=1 limit 1)", 
+ "ref_doctype": "Sales Invoice", 
+ "report_name": "Customers Without Any Sales Transactions", 
+ "report_type": "Query Report", 
+ "roles": [
+  {
+   "role": "Sales User"
+  }, 
+  {
+   "role": "Sales Manager"
+  }, 
+  {
+   "role": "System Manager"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/supplier_group/test_records.json b/erpnext/setup/doctype/supplier_group/test_records.json
index 1681e2a..5848963 100644
--- a/erpnext/setup/doctype/supplier_group/test_records.json
+++ b/erpnext/setup/doctype/supplier_group/test_records.json
@@ -1,7 +1,8 @@
 [
 	{
 		"doctype": "Supplier Group",
-		"supplier_group_name": "_Test Supplier Group"
+		"supplier_group_name": "_Test Supplier Group",
+		"parent_supplier_group": "All Supplier Groups"
 	}
 ]
    
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index cdfbcae..59e2f58 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -216,27 +216,39 @@
 
 $.extend(erpnext.item, {
 	setup_queries: function(frm) {
-		frm.fields_dict["item_defaults"].grid.get_field("expense_account").get_query = function(doc) {
+		frm.fields_dict["item_defaults"].grid.get_field("expense_account").get_query = function(doc, cdt, cdn) {
+			const row = locals[cdt][cdn];
 			return {
 				query: "erpnext.controllers.queries.get_expense_account",
+				filters: { company: row.company }
 			}
 		}
 
-		frm.fields_dict["item_defaults"].grid.get_field("income_account").get_query = function(doc) {
+		frm.fields_dict["item_defaults"].grid.get_field("income_account").get_query = function(doc, cdt, cdn) {
+			const row = locals[cdt][cdn];
 			return {
-				query: "erpnext.controllers.queries.get_income_account"
+				query: "erpnext.controllers.queries.get_income_account",
+				filters: { company: row.company }
 			}
 		}
 
-		frm.fields_dict["item_defaults"].grid.get_field("buying_cost_center").get_query = function(doc) {
+		frm.fields_dict["item_defaults"].grid.get_field("buying_cost_center").get_query = function(doc, cdt, cdn) {
+			const row = locals[cdt][cdn];
 			return {
-				filters: { "is_group": 0 }
+				filters: { 
+					"is_group": 0,
+					"company": row.company
+				}
 			}
 		}
 
-		frm.fields_dict["item_defaults"].grid.get_field("selling_cost_center").get_query = function(doc) {
+		frm.fields_dict["item_defaults"].grid.get_field("selling_cost_center").get_query = function(doc, cdt, cdn) {
+			const row = locals[cdt][cdn];
 			return {
-				filters: { "is_group": 0 }
+				filters: {
+					"is_group": 0,
+					"company": row.company
+				}
 			}
 		}
 
@@ -267,9 +279,13 @@
 			return { query: "erpnext.controllers.queries.supplier_query" }
 		}
 
-		frm.fields_dict["item_defaults"].grid.get_field("default_warehouse").get_query = function(doc) {
+		frm.fields_dict["item_defaults"].grid.get_field("default_warehouse").get_query = function(doc, cdt, cdn) {
+			const row = locals[cdt][cdn];
 			return {
-				filters: { "is_group": 0 }
+				filters: {
+					"is_group": 0,
+					"company": row.company
+				}
 			}
 		}
 
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 068b913..1269705 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -890,7 +890,7 @@
 	item_defaults = frappe.db.sql('''
 		select
 			i.item_name, i.description, i.stock_uom, i.name, i.is_stock_item, i.item_code, i.item_group,
-			id.expense_account, id.buying_cost_center, id.default_warehouse, id.selling_cost_center
+			id.expense_account, id.buying_cost_center, id.default_warehouse, id.selling_cost_center, id.default_supplier
 		from
 			`tabItem` i, `tabItem Default` id
 		where
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 8e66b55..62ea2b6 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -45,6 +45,8 @@
 					stock_qty: item.stock_qty,
 					company: frm.doc.company,
 					conversion_rate: 1,
+					name: frm.doc.name,
+					material_request_type: frm.doc.material_request_type,
 					plc_conversion_rate: 1,
 					rate: item.rate,
 					conversion_factor: item.conversion_factor
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index 1a73ae5..9289d69 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -35,6 +35,10 @@
 
 	},
 
+	onload_post_render: function(frm) {
+		frm.get_field("items").grid.set_multiple_add("item_code", "qty");
+	},
+
 	refresh: function(frm) {
 		if(frm.doc.company) {
 			frm.trigger("toggle_display_account_head");
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 849a294..4a9c029 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -566,7 +566,7 @@
 		item = frappe.db.sql("""select i.stock_uom, i.description, i.image, i.item_name, i.item_group,
 				i.has_batch_no, i.sample_quantity, i.has_serial_no,
 				id.expense_account, id.buying_cost_center
-			from `tabItem`, `tabItem Default` id
+			from `tabItem` i, `tabItem Default` id
 			where i.name=%s and i.name=id.parent and id.company=%s
 				and i.disabled=0
 				and (i.end_of_life is null or i.end_of_life='0000-00-00' or i.end_of_life > %s)""",
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 562ac68..68936ac 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -210,8 +210,8 @@
 	warehouse = user_default_warehouse or item_defaults.get("default_warehouse") or args.warehouse
 
 	material_request_type = ''
-	if args.get('doctype') == "Material Request":
-		material_request_type = frappe.db.get_value('Material Request',
+	if args.get('doctype') == "Material Request" and not args.get('material_request_type'):
+		args['material_request_type'] = frappe.db.get_value('Material Request',
 			args.get('name'), 'material_request_type')
 
 	#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
@@ -219,7 +219,7 @@
 		if args.get('doctype') in ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']:
 			args.uom = item.sales_uom if item.sales_uom else item.stock_uom
 		elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \
-			(args.get('doctype') == 'Material Request' and material_request_type == 'Purchase'):
+			(args.get('doctype') == 'Material Request' and args.get('material_request_type') == 'Purchase'):
 			args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
 		else:
 			args.uom = item.stock_uom
@@ -251,7 +251,7 @@
 		"net_rate": 0.0,
 		"net_amount": 0.0,
 		"discount_percentage": 0.0,
-		"supplier": item.default_supplier,
+		"supplier": item_defaults.get("default_supplier"),
 		"update_stock": args.get("update_stock") if args.get('doctype') in ['Sales Invoice', 'Purchase Invoice'] else 0,
 		"delivered_by_supplier": item.delivered_by_supplier if args.get("doctype") in ["Sales Order", "Sales Invoice"] else 0,
 		"is_fixed_asset": item.is_fixed_asset,