Merge pull request #3783 from nabinhait/fix2

[fix] Get open SO in production planning tool
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index f1d822a..46f7520 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -23,6 +23,7 @@
 	def validate(self):
 		self.validate_parent()
 		self.validate_root_details()
+		self.set_root_and_report_type()
 		self.validate_mandatory()
 		self.validate_warehouse_account()
 		self.validate_frozen_accounts_modifier()
@@ -32,7 +33,7 @@
 		"""Fetch Parent Details and validate parent account"""
 		if self.parent_account:
 			par = frappe.db.get_value("Account", self.parent_account,
-				["name", "is_group", "report_type", "root_type", "company"], as_dict=1)
+				["name", "is_group", "company"], as_dict=1)
 			if not par:
 				throw(_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account))
 			elif par.name == self.name:
@@ -43,10 +44,24 @@
 				throw(_("Account {0}: Parent account {1} does not belong to company: {2}")
 					.format(self.name, self.parent_account, self.company))
 
+	def set_root_and_report_type(self):
+		if self.parent_account:
+			par = frappe.db.get_value("Account", self.parent_account, ["report_type", "root_type"], as_dict=1)
+			
 			if par.report_type:
 				self.report_type = par.report_type
 			if par.root_type:
 				self.root_type = par.root_type
+			
+		if self.is_group:
+			db_value = frappe.db.get_value("Account", self.name, ["report_type", "root_type"], as_dict=1)
+			if db_value:
+				if self.report_type != db_value.report_type:
+					frappe.db.sql("update `tabAccount` set report_type=%s where lft > %s and rgt < %s", 
+						(self.report_type, self.lft, self.rgt))
+				if self.root_type != db_value.root_type:
+					frappe.db.sql("update `tabAccount` set root_type=%s where lft > %s and rgt < %s", 
+						(self.root_type, self.lft, self.rgt))
 
 	def validate_root_details(self):
 		# does not exists parent
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 1623f3f..bb8c65b 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -11,6 +11,8 @@
 from erpnext.controllers.recurring_document import convert_to_recurring, validate_recurring_document
 from erpnext.controllers.sales_and_purchase_return import validate_return
 
+force_item_fields = ("item_name", "item_group", "barcode", "brand", "stock_uom")
+
 class CustomerFrozen(frappe.ValidationError): pass
 
 class AccountsController(TransactionBase):
@@ -18,12 +20,12 @@
 		if self.get("_action") and self._action != "update_after_submit":
 			self.set_missing_values(for_validate=True)
 		self.validate_date_with_fiscal_year()
-		
+
 		if self.meta.get_field("currency"):
 			self.calculate_taxes_and_totals()
 			if not self.meta.get_field("is_return") or not self.is_return:
 				self.validate_value("base_grand_total", ">=", 0)
-			
+
 			validate_return(self)
 			self.set_total_in_words()
 
@@ -35,7 +37,7 @@
 
 		if self.meta.get_field("taxes_and_charges"):
 			self.validate_enabled_taxes_and_charges()
-			
+
 		self.validate_party()
 
 	def on_submit(self):
@@ -86,7 +88,7 @@
 		if self.doctype == "Sales Invoice":
 			if not self.due_date:
 				frappe.throw(_("Due Date is mandatory"))
-			
+
 			validate_due_date(self.posting_date, self.due_date, "Customer", self.customer, self.company)
 		elif self.doctype == "Purchase Invoice":
 			validate_due_date(self.posting_date, self.due_date, "Supplier", self.supplier, self.company)
@@ -142,7 +144,8 @@
 
 					for fieldname, value in ret.items():
 						if item.meta.get_field(fieldname) and \
-							item.get(fieldname) is None and value is not None:
+							(item.get(fieldname) is None or fieldname in force_item_fields) \
+								and value is not None:
 								item.set(fieldname, value)
 
 						if fieldname == "cost_center" and item.meta.get_field("cost_center") \
@@ -349,14 +352,14 @@
 		frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier')
 		if frozen_accounts_modifier in frappe.get_roles():
 			return
-		
+
 		party_type = None
 		if self.meta.get_field("customer"):
 			party_type = 'Customer'
 
 		elif self.meta.get_field("supplier"):
 			party_type = 'Supplier'
-			
+
 		if party_type:
 			party = self.get(party_type.lower())
 			if frappe.db.get_value(party_type, party, "is_frozen"):
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index cebeaf5..cfde04b 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -218,7 +218,7 @@
 				tuple(item_codes))
 
 		return serialized_items
-		
+
 	def get_incoming_rate_for_sales_return(self, item_code, against_document):
 		incoming_rate = 0.0
 		if against_document and item_code:
@@ -229,12 +229,12 @@
 			incoming_rate = incoming_rate[0][0] if incoming_rate else 0.0
 
 		return incoming_rate
-		
+
 	def update_reserved_qty(self, d):
 		if d['reserved_qty'] < 0 :
 			# Reduce reserved qty from reserved warehouse mentioned in so
 			if not d["reserved_warehouse"]:
-				frappe.throw(_("Reserved Warehouse is missing in Sales Order"))
+				frappe.throw(_("Delivery Warehouse is missing in Sales Order"))
 
 			args = {
 				"item_code": d['item_code'],
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 75c1dff..78e1609 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -183,4 +183,5 @@
 execute:frappe.delete_doc("Module Def", "Contacts")
 erpnext.patches.v5_4.fix_reserved_qty_and_sle_for_packed_items # 30-07-2015
 execute:frappe.reload_doctype("Leave Type")
-execute:frappe.db.sql("update `tabLeave Type` set include_holiday=0")
\ No newline at end of file
+execute:frappe.db.sql("update `tabLeave Type` set include_holiday=0")
+erpnext.patches.v5_4.set_root_and_report_type
\ No newline at end of file
diff --git a/erpnext/patches/v5_4/set_root_and_report_type.py b/erpnext/patches/v5_4/set_root_and_report_type.py
new file mode 100644
index 0000000..9147644
--- /dev/null
+++ b/erpnext/patches/v5_4/set_root_and_report_type.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	roots = frappe.db.sql("""select lft, rgt, report_type, root_type 
+		from `tabAccount` where ifnull(parent_account, '')=''""", as_dict=1)
+	for d in roots:
+		frappe.db.sql("update `tabAccount` set report_type=%s, root_type=%s where lft > %s and rgt < %s", 
+			(d.report_type, d.root_type, d.lft, d.rgt))
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 608d01a..089c067 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -108,9 +108,13 @@
 
 	def check_stock_uom_with_bin(self):
 		if not self.get("__islocal"):
+			if self.stock_uom == frappe.db.get_value("Item", self.name, "stock_uom"):
+				return
+
 			matched=True
 			ref_uom = frappe.db.get_value("Stock Ledger Entry",
 				{"item_code": self.name}, "stock_uom")
+
 			if ref_uom:
 				if cstr(ref_uom) != cstr(self.stock_uom):
 					matched = False
@@ -128,7 +132,7 @@
 						(self.stock_uom, self.name))
 
 			if not matched:
-				frappe.throw(_("Default Unit of Measure can not be changed directly because you have already made some transaction(s) with another UOM. To change default UOM, use 'UOM Replace Utility' tool under Stock module."))
+				frappe.throw(_("Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. To change default UOM, use 'UOM Replace Utility' tool under Stock module.").format(self.name))
 
 	def update_template_tables(self):
 		template = frappe.get_doc("Item", self.variant_of)
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 249815f..797b2a0 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -82,8 +82,7 @@
 			frappe.throw(_("Stock cannot exist for Item {0} since has variants").format(self.item_code),
 				ItemTemplateCannotHaveStock)
 
-		if not self.stock_uom:
-			self.stock_uom = item_det.stock_uom
+		self.stock_uom = item_det.stock_uom
 
 	def check_stock_frozen_date(self):
 		stock_frozen_upto = frappe.db.get_value('Stock Settings', None, 'stock_frozen_upto') or ''