Merge pull request #1722 from nabinhait/v4-hotfix

multiple fixes
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js
index 032448f..c3ef365 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.js
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.js
@@ -111,7 +111,7 @@
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.item_code && item.uom) {
 			return this.frm.call({
-				method: "erpnext.buying.utils.get_conversion_factor",
+				method: "erpnext.stock.get_item_details.get_conversion_factor",
 				child: item,
 				args: {
 					item_code: item.item_code,
@@ -144,7 +144,7 @@
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.item_code && item.warehouse) {
 			return this.frm.call({
-				method: "erpnext.buying.utils.get_projected_qty",
+				method: "erpnext.stock.get_item_details.get_projected_qty",
 				child: item,
 				args: {
 					item_code: item.item_code,
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 8d6ba46..91cc865 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -45,6 +45,7 @@
 
 		self.validate_with_previous_doc()
 		self.validate_for_subcontracting()
+		self.validate_minimum_order_qty()
 		self.create_raw_materials_supplied("po_raw_material_details")
 
 	def validate_with_previous_doc(self):
@@ -61,6 +62,13 @@
 			}
 		})
 
+	def validate_minimum_order_qty(self):
+		itemwise_min_order_qty = frappe._dict(frappe.db.sql("select name, min_order_qty from tabItem"))
+
+		for d in self.get("po_details"):
+			if flt(d.qty) < flt(itemwise_min_order_qty.get(d.item_code)):
+				frappe.throw(_("Row #{0}: Ordered qty can not less than item's minimum order qty (defined in item master).").format(d.idx))
+
 	def get_schedule_dates(self):
 		for d in self.get('po_details'):
 			if d.prevdoc_detail_docname and not d.schedule_date:
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index 9ae394b..232d6a9 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -33,8 +33,8 @@
 		return struct and struct[0][0] or ''
 
 	def pull_sal_struct(self, struct):
-		from erpnext.hr.doctype.salary_structure.salary_structure import get_mapped_doc
-		self.update(get_mapped_doc(struct, self))
+		from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip
+		self.update(make_salary_slip(struct, self).as_dict())
 
 	def pull_emp_details(self):
 		emp = frappe.db.get_value("Employee", self.employee,
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index dce9916..06eb470 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -89,7 +89,7 @@
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.item_code && item.warehouse) {
 			return this.frm.call({
-				method: "erpnext.selling.utils.get_available_qty",
+				method: "erpnext.stock.get_item_details.get_available_qty",
 				child: item,
 				args: {
 					item_code: item.item_code,
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index b484100..260fbe5 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -215,7 +215,7 @@
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.item_code && item.warehouse) {
 			return this.frm.call({
-				method: "erpnext.selling.utils.get_available_qty",
+				method: "erpnext.stock.get_item_details.get_available_qty",
 				child: item,
 				args: {
 					item_code: item.item_code,
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index cbe8c29..ac81f88 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -297,8 +297,8 @@
 						frappe.DoesNotExistError)
 
 				# validate quantity <= ref item's qty - qty already returned
-				ref_item = ref.doc.getone({"item_code": item.item_code})
-				returnable_qty = ref_item.qty - flt(already_returned_item_qty.get(item.item_code))
+				ref_item_qty = sum([flt(d.qty) for d in ref.doc.get({"item_code": item.item_code})])
+				returnable_qty = ref_item_qty - flt(already_returned_item_qty.get(item.item_code))
 				if not returnable_qty:
 					frappe.throw(_("Item {0} has already been returned").format(item.item_code), StockOverReturnError)
 				elif item.transfer_qty > returnable_qty:
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index b5c98bf..252a296 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -175,6 +175,11 @@
 
 def reorder_item():
 	""" Reorder item if stock reaches reorder level"""
+
+	# if initial setup not completed, return
+	if not frappe.db.sql("select name from `tabFiscal Year` limit 1"):
+		return
+
 	if getattr(frappe.local, "auto_indent", None) is None:
 		frappe.local.auto_indent = cint(frappe.db.get_value('Stock Settings', None, 'auto_indent'))