[reports] general ledger: grid report to script report
diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js
index 69c7da1..db7a20c 100644
--- a/accounts/page/accounts_home/accounts_home.js
+++ b/accounts/page/accounts_home/accounts_home.js
@@ -157,7 +157,8 @@
 		items: [
 			{
 				"label":wn._("General Ledger"),
-				page: "general-ledger"
+				doctype: "GL Entry",
+				route: "query-report/General Ledger"
 			},
 			{
 				"label":wn._("Trial Balance"),
diff --git a/accounts/report/general_ledger/general_ledger.js b/accounts/report/general_ledger/general_ledger.js
index b0cd485..7985277 100644
--- a/accounts/report/general_ledger/general_ledger.js
+++ b/accounts/report/general_ledger/general_ledger.js
@@ -23,6 +23,12 @@
 			"fieldtype": "Data",
 		},
 		{
+			"fieldname":"group_by",
+			"label": wn._("Group by"),
+			"fieldtype": "Select",
+			"options": "\nGroup by Account\nGroup by Voucher"
+		},
+		{
 			"fieldtype": "Break",
 		},
 		{
@@ -40,12 +46,6 @@
 			"default": wn.datetime.get_today(),
 			"reqd": 1,
 			"width": "60px"
-		}, 
-		{
-			"fieldname":"group_by",
-			"label": wn._("Group by"),
-			"fieldtype": "Select",
-			"options": "\nAccount\nVoucher"
 		}
 	]
 }
\ No newline at end of file
diff --git a/accounts/report/general_ledger/general_ledger.py b/accounts/report/general_ledger/general_ledger.py
index 23c79d8..fcf8010 100644
--- a/accounts/report/general_ledger/general_ledger.py
+++ b/accounts/report/general_ledger/general_ledger.py
@@ -4,16 +4,28 @@
 from __future__ import unicode_literals
 import webnotes
 from webnotes.utils import flt
+from webnotes import _
 
 def execute(filters=None):
+	validate_filters(filters)
 	columns = get_columns()
+	
 	if filters.get("group_by"):
 		data = get_grouped_gle(filters)
 	else:
 		data = get_gl_entries(filters)
+		if data:
+			data.append(get_total_row(data))
 
 	return columns, data
 	
+def validate_filters(filters):
+	if filters.get("account") and filters.get("group_by") == "Group by Account":
+		webnotes.throw(_("Can not filter based on Account, if grouped by Account"))
+		
+	if filters.get("voucher_no") and filters.get("group_by") == "Group by Voucher":
+		webnotes.throw(_("Can not filter based on Voucher No, if grouped by Voucher"))
+	
 def get_columns():
 	return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Currency:100", 
 		"Credit:Currency:100", "Voucher Type::120", "Voucher No::160", 
@@ -27,24 +39,41 @@
 			and posting_date between %(from_date)s and %(to_date)s
 			{conditions}
 		order by posting_date, account"""\
-		.format(conditions=get_conditions(filters)), filters)
+		.format(conditions=get_conditions(filters)), filters, as_list=1)
 			
 def get_conditions(filters):
-	return " and account=%(account)s" if filters.get("account") else ""
+	conditions = []
+	if filters.get("account"):
+		conditions.append("account=%(account)s")
+	if filters.get("voucher_no"):
+		conditions.append("voucher_no=%(voucher_no)s")
 	
+	return "and {}".format(" and ".join(conditions)) if conditions else ""
+		
 def get_grouped_gle(filters):
 	gle_map = {}
 	gle = get_gl_entries(filters)
 	for d in gle:
-		gle_map.setdefault(d[1 if filters["group_by"]=="Account" else 5], []).append(d)
+		gle_map.setdefault(d[1 if filters["group_by"]=="Group by Account" else 5], []).append(d)
 		
 	data = []
 	for entries in gle_map.values():
-		total_debit = total_credit = 0.0
+		subtotal_debit = subtotal_credit = 0.0
 		for entry in entries:
 			data.append(entry)
-			total_debit += flt(entry[2])
-			total_credit += flt(entry[3])
-			
-		data.append(["", "Total", total_debit, total_credit, "", "", ""])
-	return data
\ No newline at end of file
+			subtotal_debit += flt(entry[2])
+			subtotal_credit += flt(entry[3])
+		
+		data.append(["", "Total", subtotal_debit, subtotal_credit, "", "", ""])
+	
+	if data:
+		data.append(get_total_row(gle))
+	return data
+	
+def get_total_row(gle):
+	total_debit = total_credit = 0.0
+	for d in gle:
+		total_debit += flt(d[2])
+		total_credit += flt(d[3])
+		
+	return ["", "Total Debit/Credit", total_debit, total_credit, "", "", ""]
\ No newline at end of file
diff --git a/stock/report/stock_ageing/stock_ageing.py b/stock/report/stock_ageing/stock_ageing.py
index fa05205..defe724 100644
--- a/stock/report/stock_ageing/stock_ageing.py
+++ b/stock/report/stock_ageing/stock_ageing.py
@@ -20,8 +20,8 @@
 		earliest_age = date_diff(to_date, fifo_queue[0][1])
 		latest_age = date_diff(to_date, fifo_queue[-1][1])
 		
-		data.append([item, details.item_name, details.description, details.brand, 
-			average_age, earliest_age, latest_age, details.stock_uom])
+		data.append([item, details.item_name, details.description, details.item_group, 
+			details.brand, average_age, earliest_age, latest_age, details.stock_uom])
 		
 	return columns, data
 	
@@ -36,8 +36,8 @@
 	
 def get_columns():
 	return ["Item Code:Link/Item:100", "Item Name::100", "Description::200", 
-		"Brand:Link/Brand:100", "Average Age:Float:100", "Earliest:Int:80", 
-		"Latest:Int:80", "UOM:Link/UOM:100"]
+		"Item Group:Link/Item Group:100", "Brand:Link/Brand:100", "Average Age:Float:100", 
+		"Earliest:Int:80", "Latest:Int:80", "UOM:Link/UOM:100"]
 		
 def get_fifo_queue(filters):
 	item_details = {}
@@ -64,7 +64,8 @@
 	
 def get_stock_ledger_entries(filters):
 	return webnotes.conn.sql("""select 
-			item.name, item.item_name, brand, description, item.stock_uom, actual_qty, posting_date
+			item.name, item.item_name, item_group, brand, description, item.stock_uom, 
+			actual_qty, posting_date
 		from `tabStock Ledger Entry` sle,
 			(select name, item_name, description, stock_uom, brand
 				from `tabItem` {item_conditions}) item
diff --git a/stock/report/stock_projected_qty/stock_projected_qty.py b/stock/report/stock_projected_qty/stock_projected_qty.py
index 232c744..11d5195 100644
--- a/stock/report/stock_projected_qty/stock_projected_qty.py
+++ b/stock/report/stock_projected_qty/stock_projected_qty.py
@@ -8,13 +8,14 @@
 	columns = get_columns()
 		
 	data = webnotes.conn.sql("""select 
-			item.name, item.item_name, description, brand, warehouse, item.stock_uom, 
+			item.name, item.item_name, description, item_group, brand, warehouse, item.stock_uom, 
 			actual_qty, planned_qty, indented_qty, ordered_qty, reserved_qty, 
 			projected_qty, item.re_order_level, item.re_order_qty
 		from `tabBin` bin, 
 			(select name, company from tabWarehouse 
 				where company=%(company)s {warehouse_conditions}) wh,
-			(select name, item_name, description, stock_uom, brand, re_order_level, re_order_qty
+			(select name, item_name, description, stock_uom, item_group, 
+				brand, re_order_level, re_order_qty 
 				from `tabItem` {item_conditions}) item
 		where item_code = item.name and warehouse = wh.name
 		order by item.name, wh.name"""\