[fixes] tests and moved reorder_item to separate module
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index f9ac629..6ef3c43 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -42,7 +42,7 @@
 scheduler_events = {
 	"daily": [
 		"erpnext.controllers.recurring_document.create_recurring_documents",
-		"erpnext.stock.utils.reorder_item",
+		"erpnext.stock.reorder_item.reorder_item",
 		"erpnext.setup.doctype.email_digest.email_digest.send",
 		"erpnext.support.doctype.support_ticket.support_ticket.auto_close_tickets"
 	],
diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.py b/erpnext/manufacturing/doctype/production_order/test_production_order.py
index 8a0dbe1..96fe6e4 100644
--- a/erpnext/manufacturing/doctype/production_order/test_production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/test_production_order.py
@@ -20,8 +20,10 @@
 		pro_doc.submit()
 
 		# add raw materials to stores
-		test_stock_entry.make_stock_entry("_Test Item", None, "Stores - _TC", 100, 100)
-		test_stock_entry.make_stock_entry("_Test Item Home Desktop 100", None, "Stores - _TC", 100, 100)
+		test_stock_entry.make_stock_entry(item_code="_Test Item",
+			target="Stores - _TC", qty=100, incoming_rate=100)
+		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
+			target="Stores - _TC", qty=100, incoming_rate=100)
 
 		# from stores to wip
 		s = frappe.get_doc(make_stock_entry(pro_doc.name, "Material Transfer", 4))
@@ -46,8 +48,10 @@
 		from erpnext.manufacturing.doctype.production_order.production_order import StockOverProductionError
 		pro_doc = self.test_planned_qty()
 
-		test_stock_entry.make_stock_entry("_Test Item", None, "_Test Warehouse - _TC", 100, 100)
-		test_stock_entry.make_stock_entry("_Test Item Home Desktop 100", None, "_Test Warehouse - _TC", 100, 100)
+		test_stock_entry.make_stock_entry(item_code="_Test Item",
+			target="_Test Warehouse - _TC", qty=100, incoming_rate=100)
+		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse - _TC", qty=100, incoming_rate=100)
 
 		s = frappe.get_doc(make_stock_entry(pro_doc.name, "Manufacture", 7))
 		s.insert()
diff --git a/erpnext/stock/doctype/item/test_records.json b/erpnext/stock/doctype/item/test_records.json
index eb0d7c9..7f5271e 100644
--- a/erpnext/stock/doctype/item/test_records.json
+++ b/erpnext/stock/doctype/item/test_records.json
@@ -9,7 +9,7 @@
   "income_account": "Sales - _TC",
   "inspection_required": "No",
   "is_asset_item": "No",
-  "is_pro_applicable": "Yes",
+  "is_pro_applicable": "No",
   "is_purchase_item": "Yes",
   "is_sales_item": "Yes",
   "is_service_item": "No",
@@ -20,9 +20,7 @@
   "item_name": "_Test Item",
   "item_reorder": [
    {
-    "doctype": "Item Reorder",
     "material_request_type": "Purchase",
-    "parentfield": "item_reorder",
     "warehouse": "_Test Warehouse - _TC",
     "warehouse_reorder_level": 20,
     "warehouse_reorder_qty": 20
@@ -105,7 +103,7 @@
   "item_code": "_Test Item Home Desktop 200",
   "item_group": "_Test Item Group Desktops",
   "item_name": "_Test Item Home Desktop 200",
-  "stock_uom": "_Test UOM"
+  "stock_uom": "_Test UOM 1"
  },
  {
   "description": "_Test Sales BOM Item 5",
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 5562e5a..bf7b2eb 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -230,7 +230,7 @@
 				"posting_date": self.posting_date,
 				"posting_time": self.posting_time,
 				"qty": d.s_warehouse and -1*d.transfer_qty or d.transfer_qty,
-				"serial_no": d.serial_no
+				"serial_no": d.serial_no,
 			})
 
 			# get actual stock at source warehouse
@@ -243,7 +243,7 @@
 					self.posting_date, self.posting_time, d.actual_qty, d.transfer_qty))
 
 			# get incoming rate
-			if not d.bom_no:
+			if not d.t_warehouse:
 				if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return" or force:
 					incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d))
 					if incoming_rate > 0:
@@ -253,7 +253,7 @@
 					raw_material_cost += flt(d.amount)
 
 		# set incoming rate for fg item
-		if self.purpose in ["Manufacture", "Repack"]:
+		if self.purpose in ("Manufacture", "Repack"):
 			number_of_fg_items = len([t.t_warehouse for t in self.get("mtn_details") if t.t_warehouse])
 			for d in self.get("mtn_details"):
 				if d.bom_no or (d.t_warehouse and number_of_fg_items == 1):
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index 6d8dc8b..95e4a89 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -10,7 +10,6 @@
 from erpnext.stock.doctype.stock_ledger_entry.stock_ledger_entry import StockFreezeError
 
 class TestStockEntry(unittest.TestCase):
-
 	def tearDown(self):
 		frappe.set_user("Administrator")
 		set_perpetual_inventory(0)
@@ -18,60 +17,34 @@
 			frappe.db.set_default("company", self.old_default_company)
 
 	def test_auto_material_request(self):
-		frappe.db.sql("""delete from `tabMaterial Request Item`""")
-		frappe.db.sql("""delete from `tabMaterial Request`""")
-		self._clear_stock_account_balance()
-
-		frappe.db.set_value("Stock Settings", None, "auto_indent", 1)
-
-		st1 = frappe.copy_doc(test_records[0])
-		st1.insert()
-		st1.submit()
-		st2 = frappe.copy_doc(test_records[1])
-		st2.insert()
-		st2.submit()
-
-		from erpnext.stock.utils import reorder_item
-		reorder_item()
-
-		mr_name = frappe.db.sql("""select parent from `tabMaterial Request Item`
-			where item_code='_Test Item'""")
-
-		frappe.db.set_value("Stock Settings", None, "auto_indent", 0)
-
-		self.assertTrue(mr_name)
+		self._test_auto_material_request("_Test Item")
 
 	def test_auto_material_request_for_variant(self):
-		item_code = "_Test Variant Item-S"
+		self._test_auto_material_request("_Test Variant Item-S")
+
+	def _test_auto_material_request(self, item_code):
 		item = frappe.get_doc("Item", item_code)
-		template = frappe.get_doc("Item", item.variant_of)
+
+		if item.variant_of:
+			template = frappe.get_doc("Item", item.variant_of)
+		else:
+			template = item
 
 		warehouse = "_Test Warehouse - _TC"
 
 		# stock entry reqd for auto-reorder
-		se = frappe.new_doc("Stock Entry")
-		se.purpose = "Material Receipt"
-		se.company = "_Test Company"
-		se.append("mtn_details", {
-			"item_code": item_code,
-			"t_warehouse": "_Test Warehouse - _TC",
-			"qty": 1,
-			"incoming_rate": 1
-		})
-		se.insert()
-		se.submit()
+		make_stock_entry(item_code=item_code, target="_Test Warehouse 1 - _TC", qty=1)
 
 		frappe.db.set_value("Stock Settings", None, "auto_indent", 1)
 		projected_qty = frappe.db.get_value("Bin", {"item_code": item_code,
 			"warehouse": warehouse}, "projected_qty") or 0
 
-
 		# update re-level qty so that it is more than projected_qty
 		if projected_qty > template.item_reorder[0].warehouse_reorder_level:
 			template.item_reorder[0].warehouse_reorder_level += projected_qty
 			template.save()
 
-		from erpnext.stock.utils import reorder_item
+		from erpnext.stock.reorder_item import reorder_item
 		mr_list = reorder_item()
 
 		frappe.db.set_value("Stock Settings", None, "auto_indent", 0)
@@ -897,6 +870,7 @@
 			"total_fixed_cost": 1000
 		})
 		stock_entry.get_items()
+
 		fg_rate = [d.amount for d in stock_entry.get("mtn_details") if d.item_code=="_Test FG Item 2"][0]
 		self.assertEqual(fg_rate, 1200.00)
 		fg_rate = [d.amount for d in stock_entry.get("mtn_details") if d.item_code=="_Test Item"][0]
@@ -939,21 +913,27 @@
 	se.submit()
 	return se
 
-def make_stock_entry(item, source, target, qty, incoming_rate=None):
+def make_stock_entry(**args):
 	s = frappe.new_doc("Stock Entry")
-	if source and target:
-		s.purpose = "Material Transfer"
-	elif source:
-		s.purpose = "Material Issue"
-	else:
-		s.purpose = "Material Receipt"
-	s.company = "_Test Company"
+	args = frappe._dict(args)
+	if args.posting_date:
+		s.posting_date = args.posting_date
+	if args.posting_time:
+		s.posting_time = args.posting_time
+	if not args.purpose:
+		if args.source and args.target:
+			s.purpose = "Material Transfer"
+		elif args.source:
+			s.purpose = "Material Issue"
+		else:
+			s.purpose = "Material Receipt"
+	s.company = args.company or "_Test Company"
 	s.append("mtn_details", {
-		"item_code": item,
-		"s_warehouse": source,
-		"t_warehouse": target,
-		"qty": qty,
-		"incoming_rate": incoming_rate,
+		"item_code": args.item,
+		"s_warehouse": args.from_warehouse or args.source,
+		"t_warehouse": args.to_warehouse or args.target,
+		"qty": args.qty,
+		"incoming_rate": args.incoming_rate,
 		"conversion_factor": 1.0
 	})
 	s.insert()
diff --git a/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py b/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
index a14c21e..864a2c6 100644
--- a/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
+++ b/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
@@ -33,7 +33,7 @@
 		item_doc.stock_uom = self.new_stock_uom
 		item_doc.save()
 
-		frappe.msgprint(_("Stock UOM updatd for Item {0}").format(self.item_code))
+		frappe.msgprint(_("Stock UOM updated for Item {0}").format(self.item_code))
 
 	def update_bin(self):
 		# update bin
diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py
new file mode 100644
index 0000000..3afbb4b
--- /dev/null
+++ b/erpnext/stock/reorder_item.py
@@ -0,0 +1,196 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+import frappe
+from frappe import _
+from frappe.utils import flt, cstr, nowdate, add_days, cint
+from erpnext.accounts.utils import get_fiscal_year, FiscalYearError
+
+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'))
+
+	if frappe.local.auto_indent:
+		return _reorder_item()
+
+def _reorder_item():
+	material_requests = {"Purchase": {}, "Transfer": {}}
+
+	item_warehouse_projected_qty = get_item_warehouse_projected_qty()
+
+	warehouse_company = frappe._dict(frappe.db.sql("""select name, company
+		from `tabWarehouse`"""))
+	default_company = (frappe.defaults.get_defaults().get("company") or
+		frappe.db.sql("""select name from tabCompany limit 1""")[0][0])
+
+	def add_to_material_request(item_code, warehouse, reorder_level, reorder_qty, material_request_type):
+		if warehouse not in item_warehouse_projected_qty[item_code]:
+			# likely a disabled warehouse or a warehouse where BIN does not exist
+			return
+
+		reorder_level = flt(reorder_level)
+		reorder_qty = flt(reorder_qty)
+		projected_qty = item_warehouse_projected_qty[item_code][warehouse]
+
+		if reorder_level and projected_qty < reorder_level:
+			deficiency = reorder_level - projected_qty
+			if deficiency > reorder_qty:
+				reorder_qty = deficiency
+
+			company = warehouse_company.get(warehouse) or default_company
+
+			material_requests[material_request_type].setdefault(company, []).append({
+				"item_code": item_code,
+				"warehouse": warehouse,
+				"reorder_qty": reorder_qty
+			})
+
+	for item_code in item_warehouse_projected_qty:
+		item = frappe.get_doc("Item", item_code)
+
+		if item.variant_of and not item.get("item_reorder"):
+			item.update_template_tables()
+
+		if item.get("item_reorder"):
+			for d in item.get("item_reorder"):
+				add_to_material_request(item_code, d.warehouse, d.warehouse_reorder_level,
+					d.warehouse_reorder_qty, d.material_request_type)
+
+		else:
+			# raise for default warehouse
+			add_to_material_request(item_code, item.default_warehouse, item.re_order_level, item.re_order_qty, "Purchase")
+
+	if material_requests:
+		return create_material_request(material_requests)
+
+def get_item_warehouse_projected_qty():
+	item_warehouse_projected_qty = {}
+
+	for item_code, warehouse, projected_qty in frappe.db.sql("""select item_code, warehouse, projected_qty
+		from tabBin where ifnull(item_code, '') != '' and ifnull(warehouse, '') != ''
+		and exists (select name from `tabItem`
+			where `tabItem`.name = `tabBin`.item_code and
+			is_stock_item='Yes' and (is_purchase_item='Yes' or is_sub_contracted_item='Yes') and
+			(ifnull(end_of_life, '0000-00-00')='0000-00-00' or end_of_life > %s))
+		and exists (select name from `tabWarehouse`
+			where `tabWarehouse`.name = `tabBin`.warehouse
+			and ifnull(disabled, 0)=0)""", nowdate()):
+
+		item_warehouse_projected_qty.setdefault(item_code, {})[warehouse] = flt(projected_qty)
+
+	return item_warehouse_projected_qty
+
+def create_material_request(material_requests):
+	"""	Create indent on reaching reorder level	"""
+	mr_list = []
+	defaults = frappe.defaults.get_defaults()
+	exceptions_list = []
+
+	def _log_exception():
+		if frappe.local.message_log:
+			exceptions_list.extend(frappe.local.message_log)
+			frappe.local.message_log = []
+		else:
+			exceptions_list.append(frappe.get_traceback())
+
+	try:
+		current_fiscal_year = get_fiscal_year(nowdate())[0] or defaults.fiscal_year
+
+	except FiscalYearError:
+		_log_exception()
+		notify_errors(exceptions_list)
+		return
+
+	for request_type in material_requests:
+		for company in material_requests[request_type]:
+			try:
+				items = material_requests[request_type][company]
+				if not items:
+					continue
+
+				mr = frappe.new_doc("Material Request")
+				mr.update({
+					"company": company,
+					"fiscal_year": current_fiscal_year,
+					"transaction_date": nowdate(),
+					"material_request_type": request_type
+				})
+
+				for d in items:
+					d = frappe._dict(d)
+					item = frappe.get_doc("Item", d.item_code)
+					mr.append("indent_details", {
+						"doctype": "Material Request Item",
+						"item_code": d.item_code,
+						"schedule_date": add_days(nowdate(),cint(item.lead_time_days)),
+						"uom":	item.stock_uom,
+						"warehouse": d.warehouse,
+						"item_name": item.item_name,
+						"description": item.description,
+						"item_group": item.item_group,
+						"qty": d.reorder_qty,
+						"brand": item.brand,
+					})
+
+				mr.insert()
+				mr.submit()
+				mr_list.append(mr)
+
+			except:
+				_log_exception()
+
+	if mr_list:
+		if getattr(frappe.local, "reorder_email_notify", None) is None:
+			frappe.local.reorder_email_notify = cint(frappe.db.get_value('Stock Settings', None,
+				'reorder_email_notify'))
+
+		if(frappe.local.reorder_email_notify):
+			send_email_notification(mr_list)
+
+	if exceptions_list:
+		notify_errors(exceptions_list)
+
+	return mr_list
+
+def send_email_notification(mr_list):
+	""" Notify user about auto creation of indent"""
+
+	email_list = frappe.db.sql_list("""select distinct r.parent
+		from tabUserRole r, tabUser p
+		where p.name = r.parent and p.enabled = 1 and p.docstatus < 2
+		and r.role in ('Purchase Manager','Material Manager')
+		and p.name not in ('Administrator', 'All', 'Guest')""")
+
+	msg="""<h3>Following Material Requests has been raised automatically \
+		based on item reorder level:</h3>"""
+	for mr in mr_list:
+		msg += "<p><b><u>" + mr.name + """</u></b></p><table class='table table-bordered'><tr>
+			<th>Item Code</th><th>Warehouse</th><th>Qty</th><th>UOM</th></tr>"""
+		for item in mr.get("indent_details"):
+			msg += "<tr><td>" + item.item_code + "</td><td>" + item.warehouse + "</td><td>" + \
+				cstr(item.qty) + "</td><td>" + cstr(item.uom) + "</td></tr>"
+		msg += "</table>"
+	frappe.sendmail(recipients=email_list, subject='Auto Material Request Generation Notification', msg = msg)
+
+def notify_errors(exceptions_list):
+	subject = "[Important] [ERPNext] Auto Reorder Errors"
+	content = """Dear System Manager,
+
+An error occured for certain Items while creating Material Requests based on Re-order level.
+
+Please rectify these issues:
+---
+<pre>
+%s
+</pre>
+---
+Regards,
+Administrator""" % ("\n\n".join(exceptions_list),)
+
+	from frappe.email import sendmail_to_system_managers
+	sendmail_to_system_managers(subject, content)
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index 0a4be40..092f580 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -4,24 +4,30 @@
 import frappe
 from frappe import _
 import json
-from frappe.utils import flt, cstr, nowdate, add_days, cint
+from frappe.utils import flt, cstr, nowdate, nowtime
 from frappe.defaults import get_global_default
-from erpnext.accounts.utils import get_fiscal_year, FiscalYearError
 
 class InvalidWarehouseCompany(frappe.ValidationError): pass
 
-def get_stock_balance_on(warehouse, posting_date=None):
+def get_stock_value_on(warehouse=None, posting_date=None, item_code=None):
 	if not posting_date: posting_date = nowdate()
 
+	values, condition = [posting_date], ""
+
+	if warehouse:
+		values.append(warehouse)
+		condition += " AND warehouse = %s"
+
+	if item_code:
+		values.append(item_code)
+		condition.append(" AND item_code = %s")
+
 	stock_ledger_entries = frappe.db.sql("""
-		SELECT
-			item_code, stock_value
-		FROM
-			`tabStock Ledger Entry`
-		WHERE
-			warehouse=%s AND posting_date <= %s
+		SELECT item_code, stock_value
+		FROM `tabStock Ledger Entry`
+		WHERE posting_date <= %s {0}
 		ORDER BY timestamp(posting_date, posting_time) DESC, name DESC
-	""", (warehouse, posting_date), as_dict=1)
+	""".format(condition), values, as_dict=1)
 
 	sle_map = {}
 	for sle in stock_ledger_entries:
@@ -29,6 +35,20 @@
 
 	return sum(sle_map.values())
 
+def get_stock_balance(item_code, warehouse, posting_date=None, posting_time=None):
+	if not posting_date: posting_date = nowdate()
+	if not posting_time: posting_time = nowtime()
+	last_entry = frappe.db.sql("""select qty_after_transaction from `tabStock Ledger Entry`
+		where item_code=%s and warehouse=%s
+			and timestamp(posting_date, posting_time) < timestamp(%s, %s)
+		order by timestamp(posting_date, posting_time) limit 1""",
+			(item_code, warehouse, posting_date, posting_time))
+
+	if last_entry:
+		return last_entry[0][0]
+	else:
+		return 0.0
+
 def get_latest_stock_balance():
 	bin_map = {}
 	for d in frappe.db.sql("""SELECT item_code, warehouse, stock_value as stock_value
@@ -181,192 +201,3 @@
 
 	return 0.0
 
-
-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'))
-
-	if frappe.local.auto_indent:
-		return _reorder_item()
-
-def _reorder_item():
-	material_requests = {"Purchase": {}, "Transfer": {}}
-
-	item_warehouse_projected_qty = get_item_warehouse_projected_qty()
-
-	warehouse_company = frappe._dict(frappe.db.sql("""select name, company
-		from `tabWarehouse`"""))
-	default_company = (frappe.defaults.get_defaults().get("company") or
-		frappe.db.sql("""select name from tabCompany limit 1""")[0][0])
-
-	def add_to_material_request(item_code, warehouse, reorder_level, reorder_qty, material_request_type):
-		if warehouse not in item_warehouse_projected_qty[item_code]:
-			# likely a disabled warehouse or a warehouse where BIN does not exist
-			return
-
-		reorder_level = flt(reorder_level)
-		reorder_qty = flt(reorder_qty)
-		projected_qty = item_warehouse_projected_qty[item_code][warehouse]
-
-		if reorder_level and projected_qty < reorder_level:
-			deficiency = reorder_level - projected_qty
-			if deficiency > reorder_qty:
-				reorder_qty = deficiency
-
-			company = warehouse_company.get(warehouse) or default_company
-
-			material_requests[material_request_type].setdefault(company, []).append({
-				"item_code": item_code,
-				"warehouse": warehouse,
-				"reorder_qty": reorder_qty
-			})
-
-	for item_code in item_warehouse_projected_qty:
-		item = frappe.get_doc("Item", item_code)
-
-		if item.variant_of and not item.get("item_reorder"):
-			item.update_template_tables()
-
-		if item.get("item_reorder"):
-			for d in item.get("item_reorder"):
-				add_to_material_request(item_code, d.warehouse, d.warehouse_reorder_level,
-					d.warehouse_reorder_qty, d.material_request_type)
-
-		else:
-			# raise for default warehouse
-			add_to_material_request(item_code, item.default_warehouse, item.re_order_level, item.re_order_qty, "Purchase")
-
-	if material_requests:
-		return create_material_request(material_requests)
-
-def get_item_warehouse_projected_qty():
-	item_warehouse_projected_qty = {}
-
-	for item_code, warehouse, projected_qty in frappe.db.sql("""select item_code, warehouse, projected_qty
-		from tabBin where ifnull(item_code, '') != '' and ifnull(warehouse, '') != ''
-		and exists (select name from `tabItem`
-			where `tabItem`.name = `tabBin`.item_code and
-			is_stock_item='Yes' and (is_purchase_item='Yes' or is_sub_contracted_item='Yes') and
-			(ifnull(end_of_life, '0000-00-00')='0000-00-00' or end_of_life > %s))
-		and exists (select name from `tabWarehouse`
-			where `tabWarehouse`.name = `tabBin`.warehouse
-			and ifnull(disabled, 0)=0)""", nowdate()):
-
-		item_warehouse_projected_qty.setdefault(item_code, {})[warehouse] = flt(projected_qty)
-
-	return item_warehouse_projected_qty
-
-def create_material_request(material_requests):
-	"""	Create indent on reaching reorder level	"""
-	mr_list = []
-	defaults = frappe.defaults.get_defaults()
-	exceptions_list = []
-
-	def _log_exception():
-		if frappe.local.message_log:
-			exceptions_list.extend(frappe.local.message_log)
-			frappe.local.message_log = []
-		else:
-			exceptions_list.append(frappe.get_traceback())
-
-	try:
-		current_fiscal_year = get_fiscal_year(nowdate())[0] or defaults.fiscal_year
-
-	except FiscalYearError:
-		_log_exception()
-		notify_errors(exceptions_list)
-		return
-
-	for request_type in material_requests:
-		for company in material_requests[request_type]:
-			try:
-				items = material_requests[request_type][company]
-				if not items:
-					continue
-
-				mr = frappe.new_doc("Material Request")
-				mr.update({
-					"company": company,
-					"fiscal_year": current_fiscal_year,
-					"transaction_date": nowdate(),
-					"material_request_type": request_type
-				})
-
-				for d in items:
-					d = frappe._dict(d)
-					item = frappe.get_doc("Item", d.item_code)
-					mr.append("indent_details", {
-						"doctype": "Material Request Item",
-						"item_code": d.item_code,
-						"schedule_date": add_days(nowdate(),cint(item.lead_time_days)),
-						"uom":	item.stock_uom,
-						"warehouse": d.warehouse,
-						"item_name": item.item_name,
-						"description": item.description,
-						"item_group": item.item_group,
-						"qty": d.reorder_qty,
-						"brand": item.brand,
-					})
-
-				mr.insert()
-				mr.submit()
-				mr_list.append(mr)
-
-			except:
-				_log_exception()
-
-	if mr_list:
-		if getattr(frappe.local, "reorder_email_notify", None) is None:
-			frappe.local.reorder_email_notify = cint(frappe.db.get_value('Stock Settings', None,
-				'reorder_email_notify'))
-
-		if(frappe.local.reorder_email_notify):
-			send_email_notification(mr_list)
-
-	if exceptions_list:
-		notify_errors(exceptions_list)
-
-	return mr_list
-
-def send_email_notification(mr_list):
-	""" Notify user about auto creation of indent"""
-
-	email_list = frappe.db.sql_list("""select distinct r.parent
-		from tabUserRole r, tabUser p
-		where p.name = r.parent and p.enabled = 1 and p.docstatus < 2
-		and r.role in ('Purchase Manager','Material Manager')
-		and p.name not in ('Administrator', 'All', 'Guest')""")
-
-	msg="""<h3>Following Material Requests has been raised automatically \
-		based on item reorder level:</h3>"""
-	for mr in mr_list:
-		msg += "<p><b><u>" + mr.name + """</u></b></p><table class='table table-bordered'><tr>
-			<th>Item Code</th><th>Warehouse</th><th>Qty</th><th>UOM</th></tr>"""
-		for item in mr.get("indent_details"):
-			msg += "<tr><td>" + item.item_code + "</td><td>" + item.warehouse + "</td><td>" + \
-				cstr(item.qty) + "</td><td>" + cstr(item.uom) + "</td></tr>"
-		msg += "</table>"
-	frappe.sendmail(recipients=email_list, subject='Auto Material Request Generation Notification', msg = msg)
-
-def notify_errors(exceptions_list):
-	subject = "[Important] [ERPNext] Error(s) while creating Material Requests based on Re-order Levels"
-	content = """Dear System Manager,
-
-An error occured for certain Items while creating Material Requests based on Re-order level.
-
-Please rectify these issues:
----
-<pre>
-%s
-</pre>
----
-Regards,
-Administrator""" % ("\n\n".join(exceptions_list),)
-
-	from frappe.email import sendmail_to_system_managers
-	sendmail_to_system_managers(subject, content)