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/page/general_ledger/general_ledger.js b/accounts/page/general_ledger/general_ledger.js
index a462b70..dfba26c 100644
--- a/accounts/page/general_ledger/general_ledger.js
+++ b/accounts/page/general_ledger/general_ledger.js
@@ -63,11 +63,21 @@
 					open_btn: true,
 					doctype: "dataContext.voucher_type"
 				}},
+			{id: "against_voucher_type", name: "Against Voucher Type", 
+				field: "against_voucher_type", width: 120},
+			{id: "against_voucher", name: "Against Voucher", 
+				field: "against_voucher", width: 160,
+				link_formatter: {
+					filter_input: "against_voucher",
+					open_btn: true,
+					doctype: "dataContext.against_voucher_type"
+				}},
 			{id: "remarks", name: "Remarks", field: "remarks", width: 200,
 				formatter: this.text_formatter},
 				
 		];
 	},
+	
 	filters: [
 		{fieldtype:"Select", label: "Company", link:"Company", default_value: "Select Company...",
 			filter: function(val, item, opts) {
@@ -96,6 +106,7 @@
 			return dateutil.str_to_obj(val) >= dateutil.str_to_obj(item.posting_date);
 		}},
 		{fieldtype: "Check", label: "Group by Ledger"},
+		{fieldtype: "Check", label: "Group by Voucher"},
 		{fieldtype:"Button", label: "Refresh", icon:"icon-refresh icon-white", cssClass:"btn-info"},
 		{fieldtype:"Button", label: "Reset Filters"}
 	],
@@ -116,9 +127,14 @@
 			me.filter_inputs.group_by_ledger
 				.parent().toggle(!!(me.account_by_name[$(this).val()] 
 					&& me.account_by_name[$(this).val()].group_or_ledger==="Group"));
+					
+			me.filter_inputs.group_by_voucher
+				.parent().toggle(!!(me.account_by_name[$(this).val()] 
+					&& me.account_by_name[$(this).val()].group_or_ledger==="Ledger"));
 		});
 		
 		this.trigger_refresh_on_change(["group_by_ledger"]);
+		this.trigger_refresh_on_change(["group_by_voucher"]);
 	},
 	setup_account_filter: function(company_filter) {
 		var me = this;
@@ -139,12 +155,14 @@
 	init_filter_values: function() {
 		this._super();
 		this.filter_inputs.group_by_ledger.parent().toggle(false);
+		this.filter_inputs.group_by_voucher.parent().toggle(false);
 		this.filter_inputs.company.change();
 		this.filter_inputs.account.change();
 	},
 	apply_filters_from_route: function() {
 		this._super();
 		this.filter_inputs.group_by_ledger.parent().toggle(false);
+		this.filter_inputs.group_by_voucher.parent().toggle(false);
 		this.filter_inputs.company.change();
 		this.filter_inputs.account.change();
 	},
@@ -196,13 +214,21 @@
 				if(!grouped_ledgers[item.account]) {
 					grouped_ledgers[item.account] = {
 						entries: [],
+						entries_group_by_voucher: {},
 						opening: me.make_summary_row("Opening", item.account),
 						totals: me.make_summary_row("Totals", item.account),
 						closing: me.make_summary_row("Closing (Opening + Totals)",
 							item.account)
 					};
 				}
-
+				
+				if(!grouped_ledgers[item.account].entries_group_by_voucher[item.voucher_no]) {
+					grouped_ledgers[item.account].entries_group_by_voucher[item.voucher_no] = {
+						entries: [],
+						totals: me.make_summary_row("Totals", item.voucher_no)
+					}
+				}
+				
 				if(date < from_date || item.is_opening=="Yes") {
 					opening.debit += item.debit;
 					opening.credit += item.credit;
@@ -215,6 +241,11 @@
 
 					grouped_ledgers[item.account].totals.debit += item.debit;
 					grouped_ledgers[item.account].totals.credit += item.credit;
+					
+					grouped_ledgers[item.account].entries_group_by_voucher[item.voucher_no]
+						.totals.debit += item.debit;
+					grouped_ledgers[item.account].entries_group_by_voucher[item.voucher_no]
+						.totals.credit += item.credit;
 				}
 				if(item.account) {
 					item.against_account = me.voucher_accounts[item.voucher_type + ":"
@@ -224,6 +255,9 @@
 				if(me.apply_filters(item) && item.is_opening=="No") {
 					out.push(item);
 					grouped_ledgers[item.account].entries.push(item);
+					
+					grouped_ledgers[item.account].entries_group_by_voucher[item.voucher_no]
+						.entries.push(item);
 				}
 			}
 		});
@@ -241,6 +275,11 @@
 					out = this.group_data_by_ledger(grouped_ledgers);
 			}
 			
+			if(this.account_by_name[this.account].group_or_ledger==="Ledger"
+				&& this.group_by_voucher) {
+					out = this.group_data_by_voucher(grouped_ledgers);
+			}
+			
 			opening = me.get_balance(me.account_by_name[me.account].debit_or_credit, opening)
 			closing = me.get_balance(me.account_by_name[me.account].debit_or_credit, closing)
 			
@@ -283,6 +322,28 @@
 		return [{id: "_blank_first", _no_format: true, debit: "", credit: ""}].concat(out);
 	},
 	
+	group_data_by_voucher: function(grouped_ledgers) {
+		var me = this;
+		var out = []
+		$.each(Object.keys(grouped_ledgers).sort(), function(i, account) {
+			if(grouped_ledgers[account].entries.length) {
+				$.each(Object.keys(grouped_ledgers[account].entries_group_by_voucher).sort(),
+				 	function(j, voucher) {
+						if(grouped_ledgers[account].entries_group_by_voucher[voucher]
+							.entries.length) {
+							out = out.concat(grouped_ledgers[account]
+								.entries_group_by_voucher[voucher].entries)
+								.concat([
+									grouped_ledgers[account].entries_group_by_voucher[voucher]
+									.totals, {id: "_blank" + j, _no_format: true, 
+									debit: "", credit: ""}]);
+						}
+				});
+			}
+		});
+		return [{id: "_blank_first", _no_format: true, debit: "", credit: ""}].concat(out);
+	},
+	
 	get_balance: function(debit_or_credit, balance) {
 		if(debit_or_credit == "Debit") {
 			balance.debit -= balance.credit; balance.credit = 0;
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/accounts/utils.py b/accounts/utils.py
index eb240e7..fa93cb0 100644
--- a/accounts/utils.py
+++ b/accounts/utils.py
@@ -26,17 +26,23 @@
 
 class FiscalYearError(webnotes.ValidationError): pass
 
-def get_fiscal_year(date, verbose=1):
-	return get_fiscal_years(date, verbose=1)[0]
+def get_fiscal_year(date=None, fiscal_year=None, verbose=1):
+	return get_fiscal_years(date, fiscal_year, verbose=1)[0]
 	
-def get_fiscal_years(date, verbose=1):
+def get_fiscal_years(date=None, fiscal_year=None, verbose=1):
 	# if year start date is 2012-04-01, year end date should be 2013-03-31 (hence subdate)
+	cond = ""
+	if fiscal_year:
+		cond = "name = '%s'" % fiscal_year
+	else:
+		cond = "'%s' >= year_start_date and '%s' < adddate(year_start_date, interval 1 year)" % \
+			(date, date)
 	fy = webnotes.conn.sql("""select name, year_start_date, 
 		subdate(adddate(year_start_date, interval 1 year), interval 1 day) 
 			as year_end_date
 		from `tabFiscal Year`
-		where %s >= year_start_date and %s < adddate(year_start_date, interval 1 year)
-		order by year_start_date desc""", (date, date))
+		where %s
+		order by year_start_date desc""" % cond)
 	
 	if not fy:
 		error_msg = """%s not in any Fiscal Year""" % formatdate(date)
diff --git a/buying/doctype/purchase_common/purchase_common.js b/buying/doctype/purchase_common/purchase_common.js
index dacee80..9e291f5 100644
--- a/buying/doctype/purchase_common/purchase_common.js
+++ b/buying/doctype/purchase_common/purchase_common.js
@@ -128,23 +128,27 @@
 	},
 	
 	currency: function() {
-		this.set_dynamic_labels();
+		if(this.frm.doc.currency === this.get_company_currency())
+			this.frm.set_value("conversion_rate", 1.0);
+		
+		this.price_list_currency();
 	},
 	
 	company: function() {
-		this.set_dynamic_labels();
+		if(this.frm.fields_dict.currency)
+			this.set_dynamic_labels();
 	},
 	
 	price_list_currency: function() {
 		this.frm.toggle_reqd("plc_conversion_rate",
 			!!(this.frm.doc.price_list_name && this.frm.doc.price_list_currency));
 		
-		this.set_dynamic_labels();
-				
 		if(this.frm.doc.price_list_currency === this.get_company_currency())
 			this.frm.set_value("plc_conversion_rate", 1.0);
 		else if(this.frm.doc.price_list_currency === this.frm.doc.currency)
 			this.frm.set_value("plc_conversion_rate", this.frm.doc.conversion_rate || 1.0);		
+		
+		this.set_dynamic_labels();
 	},
 	
 	set_dynamic_labels: function(doc, dt, dn) {
diff --git a/patches/september_2012/repost_stock.py b/patches/september_2012/repost_stock.py
index 9720701..deb2186 100644
--- a/patches/september_2012/repost_stock.py
+++ b/patches/september_2012/repost_stock.py
@@ -22,7 +22,7 @@
 	i=0
 	for d in res:
 	    try:
-	        update_entries_after({ "item_code": d[0], "warehouse": d[1]	})
+			update_entries_after({ "item_code": d[0], "warehouse": d[1]})
 	    except:
 	        pass
 	    i += 1
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..022d19e
--- /dev/null
+++ "b/selling/report/territory_target_variance_\050item_group_wise\051/territory_target_variance_\050item_group_wise\051.py"
@@ -0,0 +1,173 @@
+# 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
+from accounts.utils import get_fiscal_year
+
+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_fiscal_year(fiscal_year = filters["fiscal_year"])[1:]
+	
+
+	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""", 
+		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_fiscal_year(fiscal_year = filters["fiscal_year"])[1:]
+
+	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
+			}))
+
+			tav_dict = tim_map[td.name][td.item_group][month]
+
+			for ad in achieved_details:
+				if (filters["target_on"] == "Quantity"):
+					tav_dict.target = flt(td.target_qty) * (tdd[month]["percentage_allocation"]/100)
+					if ad.month_name == month and 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 = flt(td.target_amount) * \
+						(tdd[month]["percentage_allocation"]/100)
+					if ad.month_name == month and get_item_group(ad.item_code) == td.item_group \
+						and ad.territory == td.name:
+							tav_dict.achieved += ad.amount
+
+	return tim_map
+
+def get_item_group(item_name):
+	return webnotes.conn.get_value("Item", item_name, "item_group")
\ 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
diff --git a/startup/report_data_map.py b/startup/report_data_map.py
index 501db4f..ae3a53f 100644
--- a/startup/report_data_map.py
+++ b/startup/report_data_map.py
@@ -47,8 +47,9 @@
 		"order_by": "lft"
 	},
 	"GL Entry": {
-		"columns": ["name", "account", "posting_date", "cost_center", "debit", "credit", "is_opening",
-			"company", "voucher_type", "voucher_no", "remarks"],
+		"columns": ["name", "account", "posting_date", "cost_center", "debit", "credit", 
+			"is_opening", "company", "voucher_type", "voucher_no", "remarks",
+			"against_voucher_type", "against_voucher"],
 		"conditions": ["ifnull(is_cancelled, 'No')='No'"],
 		"order_by": "posting_date, account",
 		"links": {
diff --git a/stock/report/item_prices/item_prices.py b/stock/report/item_prices/item_prices.py
index 86ae085..3bdb746 100644
--- a/stock/report/item_prices/item_prices.py
+++ b/stock/report/item_prices/item_prices.py
@@ -100,8 +100,9 @@
 
 	val_rate_map = {}
 	
-	for d in webnotes.conn.sql("""select item_code, avg(valuation_rate) as val_rate
-		from tabBin group by item_code""", as_dict=1):
+	for d in webnotes.conn.sql("""select item_code, 
+		sum(actual_qty*valuation_rate)/sum(actual_qty) as val_rate
+		from tabBin where actual_qty > 0 group by item_code""", as_dict=1):
 			val_rate_map.setdefault(d.item_code, d.val_rate)
 
 	return val_rate_map
\ No newline at end of file
