Merge pull request #4510 from nabinhait/account_merge

[fix] Group account merging with sub-ordinate group
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js
index 2fb3bc7..0860bca 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.js
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.js
@@ -59,7 +59,8 @@
 		this.frm.toggle_display("supplier_name",
 			(this.supplier_name && this.frm.doc.supplier_name!==this.frm.doc.supplier));
 
-		if(this.frm.doctype==="Purchase Order" || this.frm.doctype==="Material Request") {
+		if(this.frm.docstatus==0 &&
+			(this.frm.doctype==="Purchase Order" || this.frm.doctype==="Material Request")) {
 			this.set_from_product_bundle();
 		}
 
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 0fc0faa..dfe17e8 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -541,7 +541,8 @@
 		if self.variant_of:
 			template_uom = frappe.db.get_value("Item", self.variant_of, "stock_uom")
 			if template_uom != self.stock_uom:
-				frappe.throw(_("Default Unit of Measure for Variant must be same as Template"))
+				frappe.throw(_("Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'")
+					.format(self.stock_uom, template_uom))
 
 	def validate_attributes(self):
 		if self.has_variants or self.variant_of:
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 0efc8bc..3ce6707 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -39,24 +39,23 @@
 					this.make_supplier_quotation,
 						frappe.boot.doctype_icons["Supplier Quotation"]);
 
-			if(doc.material_request_type === "Material Transfer" && doc.status === "Submitted")
-				cur_frm.add_custom_button(__("Transfer Material"), this.make_stock_entry,
-					frappe.boot.doctype_icons["Stock Entry"]);
-
-			if(doc.material_request_type === "Material Issue" && doc.status === "Submitted")
-				cur_frm.add_custom_button(__("Issue Material"), this.make_stock_entry,
-					frappe.boot.doctype_icons["Stock Entry"]);
-
 			if(flt(doc.per_ordered, 2) < 100) {
+				if(doc.material_request_type === "Material Transfer" && doc.status === "Submitted")
+					cur_frm.add_custom_button(__("Transfer Material"), this.make_stock_entry,
+						frappe.boot.doctype_icons["Stock Entry"]);
+
+				if(doc.material_request_type === "Material Issue" && doc.status === "Submitted")
+					cur_frm.add_custom_button(__("Issue Material"), this.make_stock_entry,
+						frappe.boot.doctype_icons["Stock Entry"]);
+
 				if(doc.material_request_type === "Purchase")
 					cur_frm.add_custom_button(__('Make Purchase Order'),
 						this.make_purchase_order, frappe.boot.doctype_icons["Purchase Order"]);
 
 				cur_frm.add_custom_button(__('Stop'),
 					cur_frm.cscript['Stop Material Request'], "icon-exclamation", "btn-default");
+
 			}
-
-
 		}
 
 		if (this.frm.doc.docstatus===0) {
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index fd82784..5462228 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -123,6 +123,10 @@
 					from `tabStock Entry Detail` where material_request = %s
 					and material_request_item = %s and docstatus = 1""",
 					(self.name, d.name))[0][0])
+
+				if d.ordered_qty and d.ordered_qty > d.qty:
+					frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
+
 				frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
 
 			# note: if qty is 0, its row is still counted in len(self.get("items"))
diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py
index 5cd7de1..0905b39 100644
--- a/erpnext/stock/doctype/material_request/test_material_request.py
+++ b/erpnext/stock/doctype/material_request/test_material_request.py
@@ -276,8 +276,8 @@
 			"fiscal_year": "_Test Fiscal Year 2013",
 		})
 		se_doc.get("items")[0].update({
-			"qty": 60.0,
-			"transfer_qty": 60.0,
+			"qty": 54.0,
+			"transfer_qty": 54.0,
 			"s_warehouse": "_Test Warehouse 1 - _TC",
 			"basic_rate": 1.0
 		})
@@ -307,7 +307,7 @@
 		mr.load_from_db()
 
 		self.assertEquals(mr.per_ordered, 100)
-		self.assertEquals(mr.get("items")[0].ordered_qty, 60.0)
+		self.assertEquals(mr.get("items")[0].ordered_qty, 54.0)
 		self.assertEquals(mr.get("items")[1].ordered_qty, 3.0)
 
 		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
@@ -383,7 +383,7 @@
 	def _get_requested_qty(self, item_code, warehouse):
 		return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty"))
 
-	def test_make_stock_entry_for_Material_Issue(self):
+	def test_make_stock_entry_for_material_issue(self):
 		from erpnext.stock.doctype.material_request.material_request import make_stock_entry
 
 		mr = frappe.copy_doc(test_records[0]).insert()
@@ -422,13 +422,13 @@
 
 		se_doc = make_stock_entry(mr.name)
 		se_doc.fiscal_year = "_Test Fiscal Year 2014"
-		se_doc.get("items")[0].qty = 60.0
+		se_doc.get("items")[0].qty = 54.0
 		se_doc.insert()
 		se_doc.submit()
 
 		# check if per complete is as expected
 		mr.load_from_db()
-		self.assertEquals(mr.get("items")[0].ordered_qty, 60.0)
+		self.assertEquals(mr.get("items")[0].ordered_qty, 54.0)
 		self.assertEquals(mr.get("items")[1].ordered_qty, 3.0)
 
 		#testing bin requested qty after issuing stock against material request