Fixed merge conflict
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 65ccec4..61381b2 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -4,7 +4,7 @@
 import frappe
 from erpnext.hooks import regional_overrides
 
-__version__ = '8.11.3'
+__version__ = '8.11.4'
 
 def get_default_company(user=None):
 	'''Get default company for user'''
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index b21027e..710099e 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -91,10 +91,10 @@
 	conditions = ""
 
 	for opts in (("company", " and company=%(company)s"),
-		("supplier", " and pi.supplier = %(supplier)s"),
-		("item_code", " and pi_item.item_code = %(item_code)s"),
-		("from_date", " and pi.posting_date>=%(from_date)s"),
-		("to_date", " and pi.posting_date<=%(to_date)s"),
+		("supplier", " and `tabPurchase Invoice`.supplier = %(supplier)s"),
+		("item_code", " and `tabPurchase Invoice Item`.item_code = %(item_code)s"),
+		("from_date", " and `tabPurchase Invoice`.posting_date>=%(from_date)s"),
+		("to_date", " and `tabPurchase Invoice`.posting_date<=%(to_date)s"),
 		("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s")):
 			if filters.get(opts[0]):
 				conditions += opts[1]
@@ -104,20 +104,29 @@
 def get_items(filters, additional_query_columns):
 	conditions = get_conditions(filters)
 	match_conditions = frappe.build_match_conditions("Purchase Invoice")
+	
+	if match_conditions:
+		match_conditions = " and {0} ".format(match_conditions)
+	
 	if additional_query_columns:
 		additional_query_columns = ', ' + ', '.join(additional_query_columns)
 
 	return frappe.db.sql("""
 		select
-			pi_item.name, pi_item.parent, pi.posting_date, pi.credit_to, pi.company,
-			pi.supplier, pi.remarks, pi.base_net_total, pi_item.item_code, pi_item.item_name,
-			pi_item.item_group, pi_item.project, pi_item.purchase_order, pi_item.purchase_receipt,
-			pi_item.po_detail, pi_item.expense_account, pi_item.stock_qty, pi_item.stock_uom, 
-			pi_item.base_net_rate, pi_item.base_net_amount,
-			pi.supplier_name, pi.mode_of_payment {0}
-		from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item
-		where pi.name = pi_item.parent and pi.docstatus = 1 %s %s
-		order by pi.posting_date desc, pi_item.item_code desc
+			`tabPurchase Invoice Item`.`name`, `tabPurchase Invoice Item`.`parent`,
+			`tabPurchase Invoice`.posting_date, `tabPurchase Invoice`.credit_to, `tabPurchase Invoice`.company,
+			`tabPurchase Invoice`.supplier, `tabPurchase Invoice`.remarks, `tabPurchase Invoice`.base_net_total, `tabPurchase Invoice Item`.`item_code`,
+			`tabPurchase Invoice Item`.`item_name`, `tabPurchase Invoice Item`.`item_group`,
+			`tabPurchase Invoice Item`.`project`, `tabPurchase Invoice Item`.`purchase_order`,
+			`tabPurchase Invoice Item`.`purchase_receipt`, `tabPurchase Invoice Item`.`po_detail`,
+			`tabPurchase Invoice Item`.`expense_account`, `tabPurchase Invoice Item`.`stock_qty`,
+			`tabPurchase Invoice Item`.`stock_uom`, `tabPurchase Invoice Item`.`base_net_rate`,
+			`tabPurchase Invoice Item`.`base_net_amount`,
+			`tabPurchase Invoice`.supplier_name, `tabPurchase Invoice`.mode_of_payment {0}
+		from `tabPurchase Invoice`, `tabPurchase Invoice Item`
+		where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and
+		`tabPurchase Invoice`.docstatus = 1 %s %s
+		order by `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc
 	""".format(additional_query_columns) % (conditions, match_conditions), filters, as_dict=1)
 
 def get_aii_accounts():
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index eb50022..9892e03 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -93,37 +93,49 @@
 	conditions = ""
 
 	for opts in (("company", " and company=%(company)s"),
-		("customer", " and si.customer = %(customer)s"),
-		("item_code", " and si_item.item_code = %(item_code)s"),
-		("from_date", " and si.posting_date>=%(from_date)s"),
-		("to_date", " and si.posting_date<=%(to_date)s")):
+		("customer", " and `tabSales Invoice`.customer = %(customer)s"),
+		("item_code", " and `tabSales Invoice Item`.item_code = %(item_code)s"),
+		("from_date", " and `tabSales Invoice`.posting_date>=%(from_date)s"),
+		("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s")):
 			if filters.get(opts[0]):
 				conditions += opts[1]
 
 	if filters.get("mode_of_payment"):
 		conditions += """ and exists(select name from `tabSales Invoice Payment`
-			 where parent=si.name
-			 	and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
+			where parent=si.name
+				and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
 
 	return conditions
 
 def get_items(filters, additional_query_columns):
+	conditions = get_conditions(filters)
+	match_conditions = frappe.build_match_conditions("Sales Invoice")
+	
+	if match_conditions:
+		match_conditions = " and {0} ".format(match_conditions)
+	
 	if additional_query_columns:
 		additional_query_columns = ', ' + ', '.join(additional_query_columns)
 
-	conditions = get_conditions(filters)
 	return frappe.db.sql("""
 		select
-			si_item.name, si_item.parent, si.posting_date, si.debit_to, si.project,
-			si.customer, si.remarks, si.territory, si.company, si.base_net_total,
-			si_item.item_code, si_item.item_name, si_item.item_group, si_item.sales_order,
-			si_item.delivery_note, si_item.income_account, si_item.cost_center,
-			si_item.stock_qty, si_item.stock_uom, si_item.base_net_rate, si_item.base_net_amount,
-			si.customer_name, si.customer_group, si_item.so_detail, si.update_stock {0}
-		from `tabSales Invoice` si, `tabSales Invoice Item` si_item
-		where si.name = si_item.parent and si.docstatus = 1 %s
-		order by si.posting_date desc, si_item.item_code desc
-		""".format(additional_query_columns or '') % conditions, filters, as_dict=1)
+			`tabSales Invoice Item`.name, `tabSales Invoice Item`.parent,
+			`tabSales Invoice`.posting_date, `tabSales Invoice`.debit_to,
+			`tabSales Invoice`.project, `tabSales Invoice`.customer, `tabSales Invoice`.remarks,
+			`tabSales Invoice`.territory, `tabSales Invoice`.company, `tabSales Invoice`.base_net_total,
+			`tabSales Invoice Item`.item_code, `tabSales Invoice Item`.item_name,
+			`tabSales Invoice Item`.item_group, `tabSales Invoice Item`.sales_order,
+			`tabSales Invoice Item`.delivery_note, `tabSales Invoice Item`.income_account,
+			`tabSales Invoice Item`.cost_center, `tabSales Invoice Item`.stock_qty,
+			`tabSales Invoice Item`.stock_uom, `tabSales Invoice Item`.base_net_rate,
+			`tabSales Invoice Item`.base_net_amount, `tabSales Invoice`.customer_name,
+			`tabSales Invoice`.customer_group, `tabSales Invoice Item`.so_detail,
+			`tabSales Invoice`.update_stock {0}
+		from `tabSales Invoice`, `tabSales Invoice Item`
+		where `tabSales Invoice`.name = `tabSales Invoice Item`.parent
+			and `tabSales Invoice`.docstatus = 1 %s %s
+		order by `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_code desc
+		""".format(additional_query_columns or '') % (conditions, match_conditions), filters, as_dict=1)
 
 def get_delivery_notes_against_sales_order(item_list):
 	so_dn_map = frappe._dict()
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 26c8c61..56f3059 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -295,6 +295,7 @@
 			"field_map": {
 				"name": "purchase_order_item",
 				"parent": "purchase_order",
+				"bom": "bom"
 			},
 			"postprocess": update_item,
 			"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 11c0790..7ada8cc 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -227,21 +227,30 @@
 				"_txt": txt.replace('%', '')
 			})
 
+
 def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters, as_dict):
 	return frappe.db.sql("""
 		select `tabDelivery Note`.name, `tabDelivery Note`.customer, `tabDelivery Note`.posting_date
 		from `tabDelivery Note`
 		where `tabDelivery Note`.`%(key)s` like %(txt)s and
-			`tabDelivery Note`.docstatus = 1 and `tabDelivery Note`.is_return = 0
+			`tabDelivery Note`.docstatus = 1
 			and status not in ("Stopped", "Closed") %(fcond)s
-			and (`tabDelivery Note`.per_billed < 100 or `tabDelivery Note`.grand_total = 0)
+			and (
+				(`tabDelivery Note`.is_return = 0 and `tabDelivery Note`.per_billed < 100)
+				or `tabDelivery Note`.grand_total = 0
+				or (
+					`tabDelivery Note`.is_return = 1
+					and return_against in (select name from `tabDelivery Note` where per_billed < 100)
+				)
+			)
 			%(mcond)s order by `tabDelivery Note`.`%(key)s` asc
 	""" % {
 		"key": searchfield,
 		"fcond": get_filters_cond(doctype, filters, []),
 		"mcond": get_match_cond(doctype),
 		"txt": "%(txt)s"
-	}, { "txt": ("%%%s%%" % txt) }, as_dict=as_dict)
+	}, {"txt": ("%%%s%%" % txt)}, as_dict=as_dict)
+
 
 def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
 	cond = ""
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index d8b4202..d881f18 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -179,6 +179,9 @@
 			return
 
 		for it in self.get("items"):
+			if not it.item_code:
+				continue
+
 			last_purchase_rate, is_stock_item = frappe.db.get_value("Item", it.item_code, ["last_purchase_rate", "is_stock_item"])
 			last_purchase_rate_in_sales_uom = last_purchase_rate / (it.conversion_factor or 1)
 			if flt(it.base_rate) < flt(last_purchase_rate_in_sales_uom):
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index 32c357f..531da8a 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -22,7 +22,7 @@
 		frm.set_query("source_warehouse", "items", function() {
 			return {
 				filters: {
-					'company': frm.doc.company,
+					'company': frm.doc.company
 				}
 			};
 		});
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 8b28a28..f7f99d3 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -443,3 +443,5 @@
 erpnext.patches.v8_7.make_subscription_from_recurring_data
 erpnext.patches.v8_9.set_print_zero_amount_taxes
 erpnext.patches.v8_9.set_default_customer_group
+erpnext.patches.v8_9.remove_employee_from_salary_structure_parent
+erpnext.patches.v8_9.delete_gst_doctypes_for_outside_india_accounts
diff --git a/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py b/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py
index 321b039..39b7f6c 100644
--- a/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py
+++ b/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py
@@ -30,7 +30,7 @@
 		.format(', '.join(['%s']*len(modified_items))), tuple(modified_items)))
 	
 	item_warehouses_with_transactions += list(frappe.db.sql("""
-		select distinct pr_item.item_code, pr.source_warehouse 
+		select distinct pr_item.item_code, pr_item.source_warehouse 
 		from `tabProduction Order` pr, `tabProduction Order Item` pr_item 
 		where pr_item.parent and pr.name and pr.docstatus=1 and pr_item.item_code in ({0})"""
 		.format(', '.join(['%s']*len(modified_items))), tuple(modified_items)))
diff --git a/erpnext/patches/v8_1/setup_gst_india.py b/erpnext/patches/v8_1/setup_gst_india.py
index 5660693..f329916 100644
--- a/erpnext/patches/v8_1/setup_gst_india.py
+++ b/erpnext/patches/v8_1/setup_gst_india.py
@@ -2,21 +2,25 @@
 from frappe.email import sendmail_to_system_managers
 
 def execute():
-	frappe.reload_doc('regional', 'doctype', 'gst_settings')
-	frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
 	frappe.reload_doc('stock', 'doctype', 'item')
 	frappe.reload_doc("stock", "doctype", "customs_tariff_number")
 
+	company = frappe.get_all('Company', filters = {'country': 'India'})
+	if not company:
+		return
+
+	frappe.reload_doc('regional', 'doctype', 'gst_settings')
+	frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
+
 	for report_name in ('GST Sales Register', 'GST Purchase Register',
 		'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
 
 		frappe.reload_doc('regional', 'report', frappe.scrub(report_name))
 
-	if frappe.db.get_single_value('System Settings', 'country')=='India':
-		from erpnext.regional.india.setup import setup
-		delete_custom_field_tax_id_if_exists()
-		setup(patch=True)
-		send_gst_update_email()
+	from erpnext.regional.india.setup import setup
+	delete_custom_field_tax_id_if_exists()
+	setup(patch=True)
+	send_gst_update_email()
 
 def delete_custom_field_tax_id_if_exists():
 	for field in frappe.db.sql_list("""select name from `tabCustom Field` where fieldname='tax_id'
diff --git a/erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py b/erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py
new file mode 100644
index 0000000..2b4ac58
--- /dev/null
+++ b/erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py
@@ -0,0 +1,13 @@
+import frappe
+
+def execute():
+	company = frappe.get_all('Company', filters = {'country': 'India'})
+	if not company:
+		if frappe.db.exists("DocType", "GST Settings"):
+			frappe.delete_doc("DocType", "GST Settings")
+			frappe.delete_doc("DocType", "GST HSN Code")
+		
+			for report_name in ('GST Sales Register', 'GST Purchase Register',
+				'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
+
+				frappe.delete_doc('Report', report_name)
\ No newline at end of file
diff --git a/erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py b/erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py
new file mode 100644
index 0000000..4ab9cf3
--- /dev/null
+++ b/erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py
@@ -0,0 +1,5 @@
+import frappe
+
+def execute():
+	if 'employee' in frappe.db.get_table_columns("Salary Structure"):
+		frappe.db.sql("alter table `tabSalary Structure` drop column employee")
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index fbadbc5..fc45f13 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -631,7 +631,8 @@
 			fetch_exploded = self.use_multi_level_bom)
 
 		for item in item_dict.values():
-			item.from_warehouse = self.from_warehouse or item.default_warehouse
+			# if source warehouse presents in BOM set from_warehouse as bom source_warehouse
+			item.from_warehouse = self.from_warehouse or item.source_warehouse or item.default_warehouse
 		return item_dict
 
 	def get_bom_scrap_material(self, qty):
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 8d084dc..72a83c6 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -90,7 +90,7 @@
 			item.lead_time_days)
 
 	if args.get("is_subcontracted") == "Yes":
-		out.bom = get_default_bom(args.item_code)
+		out.bom = args.get('bom') or get_default_bom(args.item_code)
 
 	get_gross_profit(out)