[report] item-wise consumption in buying module
diff --git a/buying/page/buying_home/buying_home.js b/buying/page/buying_home/buying_home.js
index 5c5668e..1f2c986 100644
--- a/buying/page/buying_home/buying_home.js
+++ b/buying/page/buying_home/buying_home.js
@@ -155,6 +155,11 @@
 				route: "query-report/Supplier Addresses and Contacts",
 				doctype: "Supplier"
 			},
+			{
+				"label":wn._("Item-Wise Consumption"),
+				route: "query-report/Item-wise Consumption",
+				doctype: "Stock Ledger Entry"
+			}
 		]
 	}
 ]
diff --git a/stock/report/item_wise_consumption/__init__.py b/stock/report/item_wise_consumption/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stock/report/item_wise_consumption/__init__.py
diff --git a/stock/report/item_wise_consumption/item_wise_consumption.js b/stock/report/item_wise_consumption/item_wise_consumption.js
new file mode 100644
index 0000000..c967842
--- /dev/null
+++ b/stock/report/item_wise_consumption/item_wise_consumption.js
@@ -0,0 +1,28 @@
+// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+// License: GNU General Public License v3. See license.txt
+
+wn.query_reports["Item-wise Consumption"] = {
+	"filters": [
+		{
+			"fieldname":"supplier",
+			"label": wn._("Supplier"),
+			"fieldtype": "Link",
+			"options": "Supplier",
+			"width": "80"
+		},
+		{
+			"fieldname":"from_date",
+			"label": wn._("From Date"),
+			"fieldtype": "Date",
+			"width": "80",
+			"default": wn.datetime.month_start()
+		},
+		{
+			"fieldname":"to_date",
+			"label": wn._("To Date"),
+			"fieldtype": "Date",
+			"width": "80",
+			"default": wn.datetime.month_end()
+		},
+	]
+}
\ No newline at end of file
diff --git a/stock/report/item_wise_consumption/item_wise_consumption.py b/stock/report/item_wise_consumption/item_wise_consumption.py
new file mode 100644
index 0000000..406fcae
--- /dev/null
+++ b/stock/report/item_wise_consumption/item_wise_consumption.py
@@ -0,0 +1,81 @@
+# 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 webnotes
+from webnotes.utils import flt
+
+def execute(filters=None):
+	columns = get_columns(filters)
+	consumed_details = get_consumed_details(filters)
+	supplier_details = get_suppliers_details(filters)
+	material_transfer_vouchers = get_material_transfer_vouchers()
+	data = []
+
+	for item_code, suppliers in supplier_details.items():
+		consumed_qty = consumed_amount = 0.0
+		if consumed_details.get(item_code):
+			for cd in consumed_details.get(item_code):
+				if cd.voucher_no not in material_transfer_vouchers:
+					consumed_qty += abs(flt(cd.actual_qty))
+					consumed_amount += abs(flt(cd.stock_value_difference))
+			if consumed_qty or consumed_amount:
+				row = [cd.item_code, cd.item_name, cd.description, cd.stock_uom, \
+					consumed_qty, consumed_amount, list(set(suppliers))]
+				data.append(row)
+
+	return columns, data
+
+def get_columns(filters):
+	"""return columns based on filters"""
+	
+	columns = ["Item:Link/Item:100"] + ["Item Name::150"] + ["Description::150"] + \
+	["UOM:Link/UOM:100"] + ["Consumed Qty:Float:130"] + ["Consumed Amount:Currency:130"] + \
+	["Supplier(s)::250"]
+
+	return columns
+
+def get_conditions(filters):
+	conditions = ""
+	values = []
+
+	if filters.get('from_date') and filters.get('to_date'):
+		conditions = "and sle.posting_date>=%s and sle.posting_date<=%s"
+		values = [filters.get('from_date'), filters.get('to_date')]
+
+	return conditions, values
+
+def get_consumed_details(filters):
+	conditions, values = get_conditions(filters)
+	consumed_details = {}
+
+	for d in webnotes.conn.sql("""select sle.item_code, i.item_name, i.description, 
+		i.stock_uom, sle.actual_qty, sle.stock_value_difference, sle.voucher_no 
+		from `tabStock Ledger Entry` sle, `tabItem` i 
+		where sle.item_code=i.name and sle.actual_qty < 0 %s""" % conditions, values, as_dict=1, debug=1):
+			consumed_details.setdefault(d.item_code, []).append(d)
+
+	return consumed_details
+
+def get_suppliers_details(filters):
+	item_supplier_map = {}
+	conditions = ""
+	values = []
+
+	if (filters.get('supplier')):
+		conditions = "and pr.supplier=%s"
+		values = [filters.get('supplier')]
+
+	for d in webnotes.conn.sql("""select pr.supplier, pri.item_code from 
+		`tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri 
+		where pr.name=pri.parent and pr.docstatus=1 and 
+		pri.item_code=(select name from `tabItem` where 
+			ifnull(is_stock_item, 'Yes')='Yes' and name=pri.item_code) %s""" % conditions, 
+			values, as_dict=1):
+			item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
+
+	return item_supplier_map
+
+def get_material_transfer_vouchers():
+	return webnotes.conn.sql_list("""select name from `tabStock Entry` where 
+		purpose='Material Transfer' and docstatus=1""")
\ No newline at end of file
diff --git a/stock/report/item_wise_consumption/item_wise_consumption.txt b/stock/report/item_wise_consumption/item_wise_consumption.txt
new file mode 100644
index 0000000..b4dd955
--- /dev/null
+++ b/stock/report/item_wise_consumption/item_wise_consumption.txt
@@ -0,0 +1,22 @@
+[
+ {
+  "creation": "2013-11-29 10:58:23", 
+  "docstatus": 0, 
+  "modified": "2013-11-29 12:26:49", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "add_total_row": 1, 
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Stock Ledger Entry", 
+  "report_name": "Item-wise Consumption", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Item-wise Consumption"
+ }
+]
\ No newline at end of file