Merge pull request #1230 from akhileshdarjee/hotfix

[fix] [minor] update item_name and description in item price
diff --git a/accounts/doctype/account/account.js b/accounts/doctype/account/account.js
index b6986cf..8837586 100644
--- a/accounts/doctype/account/account.js
+++ b/accounts/doctype/account/account.js
@@ -95,9 +95,10 @@
 			wn.route_options = {
 				"account": doc.name,
 				"from_date": sys_defaults.year_start_date,
-				"to_date": sys_defaults.year_end_date
+				"to_date": sys_defaults.year_end_date,
+				"company": doc.company
 			};
-			wn.set_route("general-ledger");
+			wn.set_route("query-report", "General Ledger");
 		}, "icon-table");
 	}
 }
diff --git a/accounts/doctype/journal_voucher/journal_voucher.js b/accounts/doctype/journal_voucher/journal_voucher.js
index a5cd06d..6b94ba1 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/accounts/doctype/journal_voucher/journal_voucher.js
@@ -120,8 +120,9 @@
 				"voucher_no": doc.name,
 				"from_date": doc.posting_date,
 				"to_date": doc.posting_date,
+				"company": doc.company
 			};
-			wn.set_route("general-ledger");
+			wn.set_route("query-report", "General Ledger");
 		}, "icon-table");
 	}
 }
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.js b/accounts/doctype/purchase_invoice/purchase_invoice.js
index fc530dd..0bdc70e 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -35,8 +35,9 @@
 					"voucher_no": doc.name,
 					"from_date": doc.posting_date,
 					"to_date": doc.posting_date,
+					"company": doc.company
 				};
-				wn.set_route("query-report/General Ledger");
+				wn.set_route("query-report", "General Ledger");
 			}, "icon-table");
 		}
 
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index 55f6dde..a390fb4 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -54,8 +54,9 @@
 					"voucher_no": doc.name,
 					"from_date": doc.posting_date,
 					"to_date": doc.posting_date,
+					"company": doc.company
 				};
-				wn.set_route("query-report/General Ledger");
+				wn.set_route("query-report", "General Ledger");
 			}, "icon-table");
 			
 			var percent_paid = cint(flt(doc.grand_total - doc.outstanding_amount) / flt(doc.grand_total) * 100);
diff --git a/accounts/page/accounts_browser/accounts_browser.js b/accounts/page/accounts_browser/accounts_browser.js
index d57073a..235e6ab 100644
--- a/accounts/page/accounts_browser/accounts_browser.js
+++ b/accounts/page/accounts_browser/accounts_browser.js
@@ -175,9 +175,10 @@
 		wn.route_options = {
 			"account": node.data('label'),
 			"from_date": sys_defaults.year_start_date,
-			"to_date": sys_defaults.year_end_date
+			"to_date": sys_defaults.year_end_date,
+			"company": me.company
 		};
-		wn.set_route("general-ledger");
+		wn.set_route("query-report", "General Ledger");
 	},
 	rename: function() {
 		var node = this.selected_node();
diff --git a/accounts/report/general_ledger/general_ledger.py b/accounts/report/general_ledger/general_ledger.py
index bf07e25..e76c0c4 100644
--- a/accounts/report/general_ledger/general_ledger.py
+++ b/accounts/report/general_ledger/general_ledger.py
@@ -8,7 +8,9 @@
 from accounts.utils import get_balance_on
 
 def execute(filters=None):
-	validate_filters(filters)
+	account_details = webnotes.conn.get_value("Account", filters["account"], 
+		["debit_or_credit", "group_or_ledger"], as_dict=True)
+	validate_filters(filters, account_details.group_or_ledger)
 	columns = get_columns()
 	data = []
 	if filters.get("group_by"):
@@ -19,12 +21,13 @@
 			data.append(get_total_row(data))
 
 	if filters.get("account"):
-		data = [get_opening_balance_row(filters)] + data + [get_closing_balance_row(filters)]
+		data = [get_opening_balance_row(filters, account_details.debit_or_credit)] + data + \
+			[get_closing_balance_row(filters, account_details.debit_or_credit)]
 
 	return columns, data
 	
-def validate_filters(filters):
-	if filters.get("account") and filters.get("group_by") == "Group by Account":
+def validate_filters(filters, group_or_ledger):
+	if group_or_ledger == "Ledger" 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":
@@ -35,13 +38,19 @@
 		"Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20", 
 		"Cost Center:Link/Cost Center:100", "Remarks::200"]
 		
-def get_opening_balance_row(filters):
+def get_opening_balance_row(filters, debit_or_credit):
 	opening_balance = get_balance_on(filters["account"], add_days(filters["from_date"], -1))
-	return ["", "Opening Balance", opening_balance, 0.0, "", "", ""]
+	return get_balance_row(opening_balance, debit_or_credit, "Opening Balance")
 	
-def get_closing_balance_row(filters):
+def get_closing_balance_row(filters, debit_or_credit):
 	closing_balance = get_balance_on(filters["account"], filters["to_date"])
-	return ["", "Closing Balance", closing_balance, 0.0, "", "", ""]
+	return get_balance_row(closing_balance, debit_or_credit, "Closing Balance")
+	
+def get_balance_row(balance, debit_or_credit, balance_label):
+	if debit_or_credit == "Debit":
+		return ["", balance_label, balance, 0.0, "", "", ""]
+	else:
+		return ["", balance_label, 0.0, balance, "", "", ""]
 		
 def get_gl_entries(filters):
 	gl_entries = webnotes.conn.sql("""select 
@@ -63,7 +72,9 @@
 def get_conditions(filters):
 	conditions = []
 	if filters.get("account"):
-		conditions.append("account=%(account)s")
+		lft, rgt = webnotes.conn.get_value("Account", filters["account"], ["lft", "rgt"])
+		conditions.append("""account in (select name from tabAccount 
+			where lft>=%s and rgt<=%s and docstatus<2)""" % (lft, rgt))
 	if filters.get("voucher_no"):
 		conditions.append("voucher_no=%(voucher_no)s")
 	
diff --git a/accounts/utils.py b/accounts/utils.py
index caad793..8971c80 100644
--- a/accounts/utils.py
+++ b/accounts/utils.py
@@ -16,7 +16,7 @@
 
 
 def get_fiscal_year(date=None, fiscal_year=None, label="Date", verbose=1):
-	return get_fiscal_years(date, fiscal_year, label, verbose=1)[0]
+	return get_fiscal_years(date, fiscal_year, label, verbose)[0]
 	
 def get_fiscal_years(date=None, fiscal_year=None, label="Date", verbose=1):
 	# if year start date is 2012-04-01, year end date should be 2013-03-31 (hence subdate)
diff --git a/config.json b/config.json
index 23561d5..55c776a 100644
--- a/config.json
+++ b/config.json
@@ -1,6 +1,6 @@
 {
  "app_name": "ERPNext", 
- "app_version": "3.3.6", 
+ "app_version": "3.3.7", 
  "base_template": "app/portal/templates/base.html", 
  "modules": {
   "Accounts": {
@@ -74,5 +74,5 @@
    "type": "module"
   }
  }, 
- "requires_framework_version": "==3.3.1"
+ "requires_framework_version": "==3.3.2"
 }
\ No newline at end of file
diff --git a/public/js/account_tree_grid.js b/public/js/account_tree_grid.js
index 44bef57..1cd9aa6 100644
--- a/public/js/account_tree_grid.js
+++ b/public/js/account_tree_grid.js
@@ -26,9 +26,10 @@
 				show: true, 
 				parent_field: "parent_account", 
 				formatter: function(item) {
-					return repl('<a href="#general-ledger/account=%(enc_value)s">%(value)s</a>', {
+					return repl("<a \
+						onclick='wn.cur_grid_report.show_general_ledger(\"%(value)s\")'>\
+						%(value)s</a>", {
 							value: item.name,
-							enc_value: encodeURIComponent(item.name)
 						});
 				}
 			},
@@ -211,4 +212,14 @@
 			return;
 		}
 	},
+	
+	show_general_ledger: function(account) {
+		wn.route_options = {
+			account: account,
+			company: this.company,
+			from_date: this.from_date,
+			to_date: this.to_date
+		};
+		wn.set_route("query-report", "General Ledger");
+	}
 });
\ No newline at end of file
diff --git a/public/js/controllers/stock_controller.js b/public/js/controllers/stock_controller.js
index ee5c497..d2fb904 100644
--- a/public/js/controllers/stock_controller.js
+++ b/public/js/controllers/stock_controller.js
@@ -11,9 +11,10 @@
 				wn.route_options = {
 					voucher_no: me.frm.doc.name,
 					from_date: me.frm.doc.posting_date,
-					to_date: me.frm.doc.posting_date
+					to_date: me.frm.doc.posting_date,
+					company: me.frm.doc.company
 				};
-				wn.set_route('stock-ledger');
+				wn.set_route("query-report", "Stock Ledger");
 			}, "icon-bar-chart");
 		}
 		
@@ -24,11 +25,12 @@
 		if(this.frm.doc.docstatus===1 && cint(wn.defaults.get_default("auto_accounting_for_stock"))) { 
 			cur_frm.appframe.add_button(wn._('Accounting Ledger'), function() {
 				wn.route_options = {
-					"voucher_no": me.frm.doc.name,
-					"from_date": me.frm.doc.posting_date,
-					"to_date": me.frm.doc.posting_date,
+					voucher_no: me.frm.doc.name,
+					from_date: me.frm.doc.posting_date,
+					to_date: me.frm.doc.posting_date,
+					company: me.frm.doc.company
 				};
-				wn.set_route("general-ledger");
+				wn.set_route("query-report", "General Ledger");
 			}, "icon-table");
 		}
 	},
diff --git a/public/js/stock_analytics.js b/public/js/stock_analytics.js
index 832cac5..8b68d39 100644
--- a/public/js/stock_analytics.js
+++ b/public/js/stock_analytics.js
@@ -17,10 +17,10 @@
 				parent_field: "parent_item_group", 
 				formatter: function(item) {
 					if(!item.is_group) {
-						return repl('<a href="#stock-ledger/item_code=%(enc_value)s">%(value)s</a>',
-							{
+						return repl("<a \
+							onclick='wn.cur_grid_report.show_stock_ledger(\"%(value)s\")'>\
+							%(value)s</a>", {
 								value: item.name,
-								enc_value: encodeURIComponent(item.name)
 							});
 					} else {
 						return item.name;
@@ -183,5 +183,13 @@
 	},
 	get_plot_points: function(item, col, idx) {
 		return [[dateutil.user_to_obj(col.name).getTime(), item[col.field]]]
+	},
+	show_stock_ledger: function(item_code) {
+		wn.route_options = {
+			item_code: item_code,
+			from_date: this.from_date,
+			to_date: this.to_date
+		};
+		wn.set_route("query-report", "Stock Ledger");
 	}
 });
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index ba0e724..2e7e2a4 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -287,9 +287,15 @@
 				# validate quantity <= ref item's qty - qty already returned
 				ref_item = ref.doclist.getone({"item_code": item.item_code})
 				returnable_qty = ref_item.qty - flt(already_returned_item_qty.get(item.item_code))
-				self.validate_value("transfer_qty", "<=", returnable_qty, item,
-					raise_exception=StockOverReturnError)
-				
+				if not returnable_qty:
+					webnotes.throw("{item}: {item_code} {returned}".format(
+						item=_("Item"), item_code=item.item_code, 
+						returned=_("already returned though some other documents")))
+				elif item.transfer_qty > returnable_qty:
+					webnotes.throw("{item}: {item_code}, {returned}: {qty}".format(
+						item=_("Item"), item_code=item.item_code,
+						returned=_("Max Returnable Qty"), qty=returnable_qty))
+						
 	def get_already_returned_item_qty(self, ref_fieldname):
 		return dict(webnotes.conn.sql("""select item_code, sum(transfer_qty) as qty
 			from `tabStock Entry Detail` where parent in (
diff --git a/stock/report/stock_ledger/stock_ledger.py b/stock/report/stock_ledger/stock_ledger.py
index b2bc64f..94c8eed 100644
--- a/stock/report/stock_ledger/stock_ledger.py
+++ b/stock/report/stock_ledger/stock_ledger.py
@@ -62,6 +62,9 @@
 	
 def get_sle_conditions(filters):
 	conditions = []
+	if filters.get("item_code"):
+		conditions.append("""item_code in (select name from tabItem 
+			{item_conditions})""".format(item_conditions=get_item_conditions(filters)))
 	if filters.get("warehouse"):
 		conditions.append("warehouse=%(warehouse)s")
 	if filters.get("voucher_no"):