[bot] first bot
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 6e86d84..f44daf3 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -143,3 +143,7 @@
 get_translated_dict = {
 	("doctype", "Global Defaults"): "frappe.geo.country_info.get_translated_dict"
 }
+
+bot_parsers = [
+	'erpnext.utilities.bot.FindItemBot',
+]
\ No newline at end of file
diff --git a/erpnext/utilities/bot.py b/erpnext/utilities/bot.py
new file mode 100644
index 0000000..e1f3d00
--- /dev/null
+++ b/erpnext/utilities/bot.py
@@ -0,0 +1,36 @@
+# Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+
+from __future__ import unicode_literals
+
+from frappe.utils.bot import BotParser
+
+import frappe
+from frappe import _
+
+class FindItemBot(BotParser):
+	def get_reply(self):
+		if self.startswith('where is', 'find item', 'locate'):
+			item = '%{0}%'.format(self.strip_words(self.query, 'where is', 'find item', 'locate'))
+			items = frappe.db.sql('''select name from `tabItem` where item_code like %(txt)s
+				or item_name like %(txt)s or description like %(txt)s''', dict(txt=item))
+
+			if items:
+				out = []
+				warehouses = frappe.get_all("Warehouse")
+				for item in items:
+					found = False
+					for warehouse in warehouses:
+						qty = frappe.db.get_value("Bin", {'item_code': item[0], 'warehouse': warehouse.name}, 'actual_qty')
+						if qty:
+							out.append(_('{0} units of [{1}](#Form/Item/{1}) found in [{2}](#Form/Warehouse/{2})').format(qty,
+								item[0], warehouse.name))
+							found = True
+
+					if not found:
+						out.append(_('[{0}](#Form/Item/{0}) is out of stock').format(item[0]))
+
+				return "\n\n".join(out)
+
+			else:
+				return _("Did not find any item called {0}".format(item))
\ No newline at end of file