diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js
index d4b0969..07c8b66 100644
--- a/accounts/page/accounts_home/accounts_home.js
+++ b/accounts/page/accounts_home/accounts_home.js
@@ -253,6 +253,11 @@
 				doctype: "Purchase Invoice"
 			},
 			{
+				"label":wn._("Budget Variance Report"),
+				route: "query-report/Budget Variance Report",
+				doctype: "Cost Center"
+			},
+			{
 				"label":wn._("Purchase Invoice Trends"),
 				route: "query-report/Purchase Invoice Trends",
 				doctype: "Purchase Invoice"
diff --git a/accounts/report/budget_variance_report/__init__.py b/accounts/report/budget_variance_report/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/report/budget_variance_report/__init__.py
diff --git a/accounts/report/budget_variance_report/budget_variance_report.js b/accounts/report/budget_variance_report/budget_variance_report.js
new file mode 100644
index 0000000..a051605
--- /dev/null
+++ b/accounts/report/budget_variance_report/budget_variance_report.js
@@ -0,0 +1,25 @@
+wn.query_reports["Budget Variance Report"] = {
+	"filters": [
+		{
+			fieldname: "fiscal_year",
+			label: "Fiscal Year",
+			fieldtype: "Link",
+			options: "Fiscal Year",
+			default: sys_defaults.fiscal_year
+		},
+		{
+			fieldname: "period",
+			label: "Period",
+			fieldtype: "Select",
+			options: "Monthly\nQuarterly\nHalf-Yearly\nYearly",
+			default: "Monthly"
+		},
+		{
+			fieldname: "company",
+			label: "Company",
+			fieldtype: "Link",
+			options: "Company",
+			default: sys_defaults.company
+		},
+	]
+}
\ No newline at end of file
diff --git a/accounts/report/budget_variance_report/budget_variance_report.py b/accounts/report/budget_variance_report/budget_variance_report.py
new file mode 100644
index 0000000..99e303b
--- /dev/null
+++ b/accounts/report/budget_variance_report/budget_variance_report.py
@@ -0,0 +1,168 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+import calendar
+from webnotes import _, msgprint
+from webnotes.utils import flt
+import time
+
+def execute(filters=None):
+	if not filters: filters = {}
+	
+	columns = get_columns(filters)
+	period_month_ranges = get_period_month_ranges(filters)
+	cam_map = get_costcenter_account_month_map(filters)
+
+	data = []
+
+	for cost_center, cost_center_items in cam_map.items():
+		for account, monthwise_data in cost_center_items.items():
+			row = [cost_center, account]
+			totals = [0, 0, 0]
+			for relevant_months in period_month_ranges:
+				period_data = [0, 0, 0]
+				for month in relevant_months:
+					month_data = monthwise_data.get(month, {})
+					for i, fieldname in enumerate(["target", "actual", "variance"]):
+						value = flt(month_data.get(fieldname))
+						period_data[i] += value
+						totals[i] += value
+				period_data[2] = period_data[0] - period_data[1]
+				row += period_data
+			totals[2] = totals[0] - totals[1]
+			row += totals
+			data.append(row)
+
+	return columns, sorted(data, key=lambda x: (x[0], x[1]))
+	
+def get_columns(filters):
+	for fieldname in ["fiscal_year", "period", "company"]:
+		if not filters.get(fieldname):
+			label = (" ".join(fieldname.split("_"))).title()
+			msgprint(_("Please specify") + ": " + label,
+				raise_exception=True)
+
+	columns = ["Cost Center:Link/Cost Center:100", "Account:Link/Account:100"]
+
+	group_months = False if filters["period"] == "Monthly" else True
+
+	for from_date, to_date in get_period_date_ranges(filters):
+		for label in ["Target (%s)", "Actual (%s)", "Variance (%s)"]:
+			if group_months:
+				columns.append(label % (from_date.strftime("%b") + " - " + to_date.strftime("%b")))				
+			else:
+				columns.append(label % from_date.strftime("%b"))
+
+	return columns + ["Total Target::80", "Total Actual::80", "Total Variance::80"]
+
+def get_period_date_ranges(filters):
+	from dateutil.relativedelta import relativedelta
+
+	year_start_date, year_end_date = get_year_start_end_date(filters)
+
+	increment = {
+		"Monthly": 1,
+		"Quarterly": 3,
+		"Half-Yearly": 6,
+		"Yearly": 12
+	}.get(filters["period"])
+
+	period_date_ranges = []
+	for i in xrange(1, 13, increment): 
+		period_end_date = year_start_date + relativedelta(months=increment,
+			days=-1)
+		period_date_ranges.append([year_start_date, period_end_date])
+		year_start_date = period_end_date + relativedelta(days=1)
+
+	return period_date_ranges
+
+def get_period_month_ranges(filters):
+	from dateutil.relativedelta import relativedelta
+	period_month_ranges = []
+
+	for start_date, end_date in get_period_date_ranges(filters):
+		months_in_this_period = []
+		while start_date <= end_date:
+			months_in_this_period.append(start_date.strftime("%B"))
+			start_date += relativedelta(months=1)
+		period_month_ranges.append(months_in_this_period)
+
+	return period_month_ranges
+
+
+#Get cost center & target details
+def get_costcenter_target_details(filters):
+	return webnotes.conn.sql("""select cc.name, cc.distribution_id, 
+		cc.parent_cost_center, bd.account, bd.budget_allocated 
+		from `tabCost Center` cc, `tabBudget Detail` bd 
+		where bd.parent=cc.name and bd.fiscal_year=%s and 
+		cc.company_name=%s and ifnull(cc.distribution_id, '')!='' 
+		order by cc.name""" % ('%s', '%s'), 
+		(filters.get("fiscal_year"), filters.get("company")), as_dict=1)
+
+#Get target distribution details of accounts of cost center
+def get_target_distribution_details(filters):
+	target_details = {}
+
+	for d in webnotes.conn.sql("""select bdd.month, bdd.percentage_allocation \
+		from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd, \
+		`tabCost Center` cc where bdd.parent=bd.name and cc.distribution_id=bd.name and \
+		bd.fiscal_year=%s""" % ('%s'), (filters.get("fiscal_year")), as_dict=1):
+			target_details.setdefault(d.month, d)
+
+	return target_details
+
+#Get actual details from gl entry
+def get_actual_details(filters):
+	return webnotes.conn.sql("""select gl.account, gl.debit, gl.credit, 
+		gl.cost_center, MONTHNAME(gl.posting_date) as month_name 
+		from `tabGL Entry` gl, `tabBudget Detail` bd 
+		where gl.fiscal_year=%s and company=%s and	is_cancelled='No' 
+		and bd.account=gl.account""" % ('%s', '%s'), 
+		(filters.get("fiscal_year"), filters.get("company")), as_dict=1)
+
+def get_costcenter_account_month_map(filters):
+	costcenter_target_details = get_costcenter_target_details(filters)
+	tdd = get_target_distribution_details(filters)
+	actual_details = get_actual_details(filters)
+
+	cam_map = {}
+
+	for ccd in costcenter_target_details:
+		for month in tdd:
+			cam_map.setdefault(ccd.name, {}).setdefault(ccd.account, {})\
+			.setdefault(month, webnotes._dict({
+				"target": 0.0, "actual": 0.0, "variance": 0.0
+			}))
+
+			tav_dict = cam_map[ccd.name][ccd.account][month]
+			tav_dict.target = ccd.budget_allocated*(tdd[month]["percentage_allocation"]/100)
+
+			for ad in actual_details:
+				if ad.month_name == month and ad.account == ccd.account \
+					and ad.cost_center == ccd.name:
+						tav_dict.actual += ad.debit - ad.credit
+						
+	return cam_map
+
+def get_year_start_end_date(filters):
+	return webnotes.conn.sql("""select year_start_date, 
+		subdate(adddate(year_start_date, interval 1 year), interval 1 day) 
+			as year_end_date
+		from `tabFiscal Year`
+		where name=%s""", filters["fiscal_year"])[0]
\ No newline at end of file
diff --git a/accounts/report/budget_variance_report/budget_variance_report.txt b/accounts/report/budget_variance_report/budget_variance_report.txt
new file mode 100644
index 0000000..b89cb45
--- /dev/null
+++ b/accounts/report/budget_variance_report/budget_variance_report.txt
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-18 12:56:36", 
+  "docstatus": 0, 
+  "modified": "2013-06-18 12:56:36", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Cost Center", 
+  "report_name": "Budget Variance Report", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Budget Variance Report"
+ }
+]
\ No newline at end of file
diff --git a/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index ad9d795..f7afb3d 100644
--- a/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -23,7 +23,6 @@
 	columns = get_columns()
 	item_list = get_items(filters)
 	aii_account_map = get_aii_accounts()
-	webnotes.errprint(aii_account_map)
 	data = []
 	for d in item_list:
 		expense_head = d.expense_head or aii_account_map.get(d.company)
diff --git a/selling/page/selling_home/selling_home.js b/selling/page/selling_home/selling_home.js
index ff8cff8..87e12db 100644
--- a/selling/page/selling_home/selling_home.js
+++ b/selling/page/selling_home/selling_home.js
@@ -159,11 +159,21 @@
 			},
 			{
 				"label":wn._("Sales Person-wise Transaction Summary"),
-				route: "query-report/Sales Person-wise Transaction Summary",
+				route: "query-report/Sales Person-wise Transaction Summary"
 			},
 			{
 				"label":wn._("Item-wise Sales History"),
-				route: "query-report/Item-wise Sales History",
+				route: "query-report/Item-wise Sales History"
+			},
+			{
+				"label":wn._("Territory Target Variance (Item Group-Wise)"),
+				route: "query-report/Territory Target Variance (Item Group-Wise)",
+				doctype: "Sales Order"
+			},
+			{
+				"label":wn._("Sales Person Target Variance (Item Group-Wise)"),
+				route: "query-report/Sales Person Target Variance (Item Group-Wise)",
+				doctype: "Sales Order"
 			},
 			{
 				"label":wn._("Customers Not Buying Since Long Time"),
@@ -180,7 +190,6 @@
 				route: "query-report/Sales Order Trends",
 				doctype: "Sales Order"
 			},
-
 		]
 	}
 ]
diff --git "a/selling/report/sales_person_target_variance_\050item_group_wise\051/__init__.py" "b/selling/report/sales_person_target_variance_\050item_group_wise\051/__init__.py"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/selling/report/sales_person_target_variance_\050item_group_wise\051/__init__.py"
diff --git "a/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.js" "b/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.js"
new file mode 100644
index 0000000..09f0d55
--- /dev/null
+++ "b/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.js"
@@ -0,0 +1,25 @@
+wn.query_reports["Sales Person Target Variance (Item Group-Wise)"] = {
+	"filters": [
+		{
+			fieldname: "fiscal_year",
+			label: "Fiscal Year",
+			fieldtype: "Link",
+			options: "Fiscal Year",
+			default: sys_defaults.fiscal_year
+		},
+		{
+			fieldname: "period",
+			label: "Period",
+			fieldtype: "Select",
+			options: "Monthly\nQuarterly\nHalf-Yearly\nYearly",
+			default: "Monthly"
+		},
+		{
+			fieldname: "target_on",
+			label: "Target On",
+			fieldtype: "Select",
+			options: "Quantity\nAmount",
+			default: "Quantity"
+		},
+	]
+}
\ No newline at end of file
diff --git "a/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.py" "b/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.py"
new file mode 100644
index 0000000..8f5931d
--- /dev/null
+++ "b/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.py"
@@ -0,0 +1,183 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+import calendar
+from webnotes import _, msgprint
+from webnotes.utils import flt
+import time
+
+def execute(filters=None):
+	if not filters: filters = {}
+	
+	columns = get_columns(filters)
+	period_month_ranges = get_period_month_ranges(filters)
+	sim_map = get_salesperson_item_month_map(filters)
+
+	data = []
+
+	for salesperson, salesperson_items in sim_map.items():
+		for item_group, monthwise_data in salesperson_items.items():
+			row = [salesperson, item_group]
+			totals = [0, 0, 0]
+			for relevant_months in period_month_ranges:
+				period_data = [0, 0, 0]
+				for month in relevant_months:
+					month_data = monthwise_data.get(month, {})
+					for i, fieldname in enumerate(["target", "achieved", "variance"]):
+						value = flt(month_data.get(fieldname))
+						period_data[i] += value
+						totals[i] += value
+				period_data[2] = period_data[0] - period_data[1]
+				row += period_data
+			totals[2] = totals[0] - totals[1]
+			row += totals
+			data.append(row)
+
+	return columns, sorted(data, key=lambda x: (x[0], x[1]))
+	
+def get_columns(filters):
+	for fieldname in ["fiscal_year", "period", "target_on"]:
+		if not filters.get(fieldname):
+			label = (" ".join(fieldname.split("_"))).title()
+			msgprint(_("Please specify") + ": " + label,
+				raise_exception=True)
+
+	columns = ["Sales Person:Link/Sales Person:80", "Item Group:Link/Item Group:80"]
+
+	group_months = False if filters["period"] == "Monthly" else True
+
+	for from_date, to_date in get_period_date_ranges(filters):
+		for label in ["Target (%s)", "Achieved (%s)", "Variance (%s)"]:
+			if group_months:
+				columns.append(label % (from_date.strftime("%b") + " - " + to_date.strftime("%b")))				
+			else:
+				columns.append(label % from_date.strftime("%b"))
+
+	return columns + ["Total Target::80", "Total Achieved::80", "Total Variance::80"]
+
+def get_period_date_ranges(filters):
+	from dateutil.relativedelta import relativedelta
+
+	year_start_date, year_end_date = get_year_start_end_date(filters)
+
+	increment = {
+		"Monthly": 1,
+		"Quarterly": 3,
+		"Half-Yearly": 6,
+		"Yearly": 12
+	}.get(filters["period"])
+
+	period_date_ranges = []
+	for i in xrange(1, 13, increment): 
+		period_end_date = year_start_date + relativedelta(months=increment,
+			days=-1)
+		period_date_ranges.append([year_start_date, period_end_date])
+		year_start_date = period_end_date + relativedelta(days=1)
+
+	return period_date_ranges
+
+def get_period_month_ranges(filters):
+	from dateutil.relativedelta import relativedelta
+	period_month_ranges = []
+
+	for start_date, end_date in get_period_date_ranges(filters):
+		months_in_this_period = []
+		while start_date <= end_date:
+			months_in_this_period.append(start_date.strftime("%B"))
+			start_date += relativedelta(months=1)
+		period_month_ranges.append(months_in_this_period)
+
+	return period_month_ranges
+
+
+#Get sales person & item group details
+def get_salesperson_details(filters):
+	return webnotes.conn.sql("""select sp.name, td.item_group, td.target_qty, 
+		td.target_amount, sp.distribution_id 
+		from `tabSales Person` sp, `tabTarget Detail` td 
+		where td.parent=sp.name and td.fiscal_year=%s and 
+		ifnull(sp.distribution_id, '')!='' order by sp.name""" %
+		('%s'), (filters.get("fiscal_year")), as_dict=1)
+
+#Get target distribution details of item group
+def get_target_distribution_details(filters):
+	target_details = {}
+	
+	for d in webnotes.conn.sql("""select bdd.month, bdd.percentage_allocation \
+		from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd, \
+		`tabTerritory` t where bdd.parent=bd.name and t.distribution_id=bd.name and \
+		bd.fiscal_year=%s  """ % ('%s'), (filters.get("fiscal_year")), as_dict=1):
+			target_details.setdefault(d.month, d)
+
+	return target_details
+
+#Get achieved details from sales order
+def get_achieved_details(filters):
+	start_date, end_date = get_year_start_end_date(filters)
+	
+	return webnotes.conn.sql("""select soi.item_code, soi.qty, soi.amount, so.transaction_date, 
+		st.sales_person, MONTHNAME(so.transaction_date) as month_name 
+		from `tabSales Order Item` soi, `tabSales Order` so, `tabSales Team` st 
+		where soi.parent=so.name and so.docstatus=1 and 
+		st.parent=so.name and so.transaction_date>=%s and 
+		so.transaction_date<=%s""" % ('%s', '%s'), 
+		(start_date, end_date), as_dict=1)
+
+def get_salesperson_item_month_map(filters):
+	salesperson_details = get_salesperson_details(filters)
+	tdd = get_target_distribution_details(filters)
+	achieved_details = get_achieved_details(filters)
+
+	sim_map = {}
+
+	for sd in salesperson_details:
+		for month in tdd:
+			sim_map.setdefault(sd.name, {}).setdefault(sd.item_group, {})\
+			.setdefault(month, webnotes._dict({
+				"target": 0.0, "achieved": 0.0, "variance": 0.0
+			}))
+
+			tav_dict = sim_map[sd.name][sd.item_group][month]
+
+			for ad in achieved_details:
+				if (filters["target_on"] == "Quantity"):
+					tav_dict.target = sd.target_qty*(tdd[month]["percentage_allocation"]/100)
+					if ad.month_name == month and ''.join(get_item_group(ad.item_code)) == sd.item_group \
+						and ad.sales_person == sd.name:
+							tav_dict.achieved += ad.qty
+
+				if (filters["target_on"] == "Amount"):
+					tav_dict.target = sd.target_amount*(tdd[month]["percentage_allocation"]/100)
+					if ad.month_name == month and ''.join(get_item_group(ad.item_code)) == sd.item_group \
+						and ad.sales_person == sd.name:
+							tav_dict.achieved += ad.amount
+
+	return sim_map
+
+def get_year_start_end_date(filters):
+	return webnotes.conn.sql("""select year_start_date, 
+		subdate(adddate(year_start_date, interval 1 year), interval 1 day) 
+			as year_end_date
+		from `tabFiscal Year`
+		where name=%s""", filters["fiscal_year"])[0]
+
+def get_item_group(item_name):
+	"""Get Item Group of an item"""
+
+	return webnotes.conn.sql_list("select item_group from `tabItem` where name=%s""" %
+		('%s'), (item_name))
\ No newline at end of file
diff --git "a/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.txt" "b/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.txt"
new file mode 100644
index 0000000..955cdec
--- /dev/null
+++ "b/selling/report/sales_person_target_variance_\050item_group_wise\051/sales_person_target_variance_\050item_group_wise\051.txt"
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-18 12:09:40", 
+  "docstatus": 0, 
+  "modified": "2013-06-18 12:09:40", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Sales Order", 
+  "report_name": "Sales Person Target Variance (Item Group-Wise)", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Sales Person Target Variance (Item Group-Wise)"
+ }
+]
\ No newline at end of file
diff --git "a/selling/report/territory_target_variance_\050item_group_wise\051/__init__.py" "b/selling/report/territory_target_variance_\050item_group_wise\051/__init__.py"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/selling/report/territory_target_variance_\050item_group_wise\051/__init__.py"
diff --git "a/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.js" "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.js"
new file mode 100644
index 0000000..58718a4
--- /dev/null
+++ "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.js"
@@ -0,0 +1,25 @@
+wn.query_reports["Territory Target Variance (Item Group-Wise)"] = {
+	"filters": [
+		{
+			fieldname: "fiscal_year",
+			label: "Fiscal Year",
+			fieldtype: "Link",
+			options: "Fiscal Year",
+			default: sys_defaults.fiscal_year
+		},
+		{
+			fieldname: "period",
+			label: "Period",
+			fieldtype: "Select",
+			options: "Monthly\nQuarterly\nHalf-Yearly\nYearly",
+			default: "Monthly"
+		},
+		{
+			fieldname: "target_on",
+			label: "Target On",
+			fieldtype: "Select",
+			options: "Quantity\nAmount",
+			default: "Quantity"
+		},
+	]
+}
\ No newline at end of file
diff --git "a/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.py" "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.py"
new file mode 100644
index 0000000..079f8e8
--- /dev/null
+++ "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.py"
@@ -0,0 +1,182 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+import calendar
+from webnotes import _, msgprint
+from webnotes.utils import flt
+import time
+
+def execute(filters=None):
+	if not filters: filters = {}
+	
+	columns = get_columns(filters)
+	period_month_ranges = get_period_month_ranges(filters)
+	tim_map = get_territory_item_month_map(filters)
+
+	data = []
+
+	for territory, territory_items in tim_map.items():
+		for item_group, monthwise_data in territory_items.items():
+			row = [territory, item_group]
+			totals = [0, 0, 0]
+			for relevant_months in period_month_ranges:
+				period_data = [0, 0, 0]
+				for month in relevant_months:
+					month_data = monthwise_data.get(month, {})
+					for i, fieldname in enumerate(["target", "achieved", "variance"]):
+						value = flt(month_data.get(fieldname))
+						period_data[i] += value
+						totals[i] += value
+				period_data[2] = period_data[0] - period_data[1]
+				row += period_data
+			totals[2] = totals[0] - totals[1]
+			row += totals
+			data.append(row)
+
+	return columns, sorted(data, key=lambda x: (x[0], x[1]))
+	
+def get_columns(filters):
+	for fieldname in ["fiscal_year", "period", "target_on"]:
+		if not filters.get(fieldname):
+			label = (" ".join(fieldname.split("_"))).title()
+			msgprint(_("Please specify") + ": " + label,
+				raise_exception=True)
+
+	columns = ["Territory:Link/Territory:80", "Item Group:Link/Item Group:80"]
+
+	group_months = False if filters["period"] == "Monthly" else True
+
+	for from_date, to_date in get_period_date_ranges(filters):
+		for label in ["Target (%s)", "Achieved (%s)", "Variance (%s)"]:
+			if group_months:
+				columns.append(label % (from_date.strftime("%b") + " - " + to_date.strftime("%b")))				
+			else:
+				columns.append(label % from_date.strftime("%b"))
+
+	return columns + ["Total Target::80", "Total Achieved::80", "Total Variance::80"]
+
+def get_period_date_ranges(filters):
+	from dateutil.relativedelta import relativedelta
+
+	year_start_date, year_end_date = get_year_start_end_date(filters)
+
+	increment = {
+		"Monthly": 1,
+		"Quarterly": 3,
+		"Half-Yearly": 6,
+		"Yearly": 12
+	}.get(filters["period"])
+
+	period_date_ranges = []
+	for i in xrange(1, 13, increment): 
+		period_end_date = year_start_date + relativedelta(months=increment,
+			days=-1)
+		period_date_ranges.append([year_start_date, period_end_date])
+		year_start_date = period_end_date + relativedelta(days=1)
+
+	return period_date_ranges
+
+def get_period_month_ranges(filters):
+	from dateutil.relativedelta import relativedelta
+	period_month_ranges = []
+
+	for start_date, end_date in get_period_date_ranges(filters):
+		months_in_this_period = []
+		while start_date <= end_date:
+			months_in_this_period.append(start_date.strftime("%B"))
+			start_date += relativedelta(months=1)
+		period_month_ranges.append(months_in_this_period)
+
+	return period_month_ranges
+
+
+#Get territory & item group details
+def get_territory_details(filters):
+	return webnotes.conn.sql("""select t.name, td.item_group, td.target_qty, 
+		td.target_amount, t.distribution_id 
+		from `tabTerritory` t, `tabTarget Detail` td 
+		where td.parent=t.name and td.fiscal_year=%s and 
+		ifnull(t.distribution_id, '')!='' order by t.name""" %
+		('%s'), (filters.get("fiscal_year")), as_dict=1)
+
+#Get target distribution details of item group
+def get_target_distribution_details(filters):
+	target_details = {}
+
+	for d in webnotes.conn.sql("""select bdd.month, bdd.percentage_allocation \
+		from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd, \
+		`tabTerritory` t where bdd.parent=bd.name and t.distribution_id=bd.name and \
+		bd.fiscal_year=%s""" % ('%s'), (filters.get("fiscal_year")), as_dict=1):
+			target_details.setdefault(d.month, d)
+
+	return target_details
+
+#Get achieved details from sales order
+def get_achieved_details(filters):
+	start_date, end_date = get_year_start_end_date(filters)
+
+	return webnotes.conn.sql("""select soi.item_code, soi.qty, soi.amount, so.transaction_date, 
+		so.territory, MONTHNAME(so.transaction_date) as month_name 
+		from `tabSales Order Item` soi, `tabSales Order` so 
+		where soi.parent=so.name and so.docstatus=1 and so.transaction_date>=%s and 
+		so.transaction_date<=%s""" % ('%s', '%s'), 
+		(start_date, end_date), as_dict=1)
+
+def get_territory_item_month_map(filters):
+	territory_details = get_territory_details(filters)
+	tdd = get_target_distribution_details(filters)
+	achieved_details = get_achieved_details(filters)
+
+	tim_map = {}
+
+	for td in territory_details:
+		for month in tdd:
+			tim_map.setdefault(td.name, {}).setdefault(td.item_group, {})\
+			.setdefault(month, webnotes._dict({
+				"target": 0.0, "achieved": 0.0, "variance": 0.0
+			}))
+
+			tav_dict = tim_map[td.name][td.item_group][month]
+
+			for ad in achieved_details:
+				if (filters["target_on"] == "Quantity"):
+					tav_dict.target = td.target_qty*(tdd[month]["percentage_allocation"]/100)
+					if ad.month_name == month and ''.join(get_item_group(ad.item_code)) == td.item_group \
+						and ad.territory == td.name:
+							tav_dict.achieved += ad.qty
+
+				if (filters["target_on"] == "Amount"):
+					tav_dict.target = td.target_amount*(tdd[month]["percentage_allocation"]/100)
+					if ad.month_name == month and ''.join(get_item_group(ad.item_code)) == td.item_group \
+						and ad.territory == td.name:
+							tav_dict.achieved += ad.amount
+
+	return tim_map
+
+def get_year_start_end_date(filters):
+	return webnotes.conn.sql("""select year_start_date, 
+		subdate(adddate(year_start_date, interval 1 year), interval 1 day) 
+			as year_end_date
+		from `tabFiscal Year`
+		where name=%s""", filters["fiscal_year"])[0]
+
+def get_item_group(item_name):
+	"""Get Item Group of an item"""
+
+	return webnotes.conn.sql_list("select item_group from `tabItem` where name=%s""" %
+		('%s'), (item_name))
\ No newline at end of file
diff --git "a/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.txt" "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.txt"
new file mode 100644
index 0000000..7fff64a
--- /dev/null
+++ "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.txt"
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-07 15:13:13", 
+  "docstatus": 0, 
+  "modified": "2013-06-07 15:13:13", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Sales Order", 
+  "report_name": "Territory Target Variance (Item Group-Wise)", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Territory Target Variance (Item Group-Wise)"
+ }
+]
\ No newline at end of file
