Party balance
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
index ad83607..69269d0 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
@@ -77,15 +77,18 @@
 	},
 
 	setup_balance_formatter: function() {
-		var df = frappe.meta.get_docfield("Journal Voucher Detail", "balance", this.frm.doc.name);
-		df.formatter = function(value, df, options, doc) {
-			var currency = frappe.meta.get_field_currency(df, doc);
-			var dr_or_cr = value ? ('<label>' + (value > 0.0 ? __("Dr") : __("Cr")) + '</label>') : "";
-			return "<div style='text-align: right'>"
-				+ ((value==null || value==="") ? "" : format_currency(Math.abs(value), currency))
-				+ " " + dr_or_cr
-				+ "</div>";
-		}
+		var me = this;
+		$.each(["balance", "party_balance"], function(i, field) {
+			var df = frappe.meta.get_docfield("Journal Voucher Detail", field, me.frm.doc.name);
+			df.formatter = function(value, df, options, doc) {
+				var currency = frappe.meta.get_field_currency(df, doc);
+				var dr_or_cr = value ? ('<label>' + (value > 0.0 ? __("Dr") : __("Cr")) + '</label>') : "";
+				return "<div style='text-align: right'>"
+					+ ((value==null || value==="") ? "" : format_currency(Math.abs(value), currency))
+					+ " " + dr_or_cr
+					+ "</div>";
+			}
+		})
 	},
 
 	against_voucher: function(doc, cdt, cdn) {
@@ -259,19 +262,15 @@
 }
 
 frappe.ui.form.on("Journal Voucher Detail", "party", function(frm, cdt, cdn) {
-	var d = locals[cdt][cdn];
+	var d = frappe.get_doc(cdt, cdn);
 	if(!d.account && d.party_type && d.party) {
-		return frappe.call({
-			method: "erpnext.accounts.party.get_party_account",
+		return frm.call({
+			method: "erpnext.accounts.doctype.journal_voucher.journal_voucher.get_party_account_and_balance",
+			child: d,
 			args: {
 				company: frm.doc.company,
 				party_type: d.party_type,
 				party: d.party
-			},
-			callback: function(r) {
-				if(!r.exc && r.message) {
-					frappe.model.set_value(cdt, cdn, "account", r.message);
-				}
 			}
 		});
 	}
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index 4f8fa9a..ff8b2e1 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -7,6 +7,8 @@
 from frappe import msgprint, _, scrub
 from erpnext.setup.utils import get_company_currency
 from erpnext.controllers.accounts_controller import AccountsController
+from erpnext.accounts.utils import get_balance_on
+
 
 class JournalVoucher(AccountsController):
 	def __init__(self, arg1, arg2=None):
@@ -400,7 +402,6 @@
 
 @frappe.whitelist()
 def get_default_bank_cash_account(company, voucher_type):
-	from erpnext.accounts.utils import get_balance_on
 	account = frappe.db.get_value("Company", company,
 		voucher_type=="Bank Voucher" and "default_bank_account" or "default_cash_account")
 	if account:
@@ -421,6 +422,7 @@
 	jv.get("entries")[0].party_type = "Customer"
 	jv.get("entries")[0].party = si.customer
 	jv.get("entries")[0].balance = get_balance_on(si.debit_to)
+	jv.get("entries")[0].party_balance = get_balance_on(si.customer, "Customer")
 	jv.get("entries")[0].credit = si.outstanding_amount
 	jv.get("entries")[0].against_invoice = si.name
 
@@ -431,7 +433,6 @@
 
 @frappe.whitelist()
 def get_payment_entry_from_purchase_invoice(purchase_invoice):
-	from erpnext.accounts.utils import get_balance_on
 	pi = frappe.get_doc("Purchase Invoice", purchase_invoice)
 	jv = get_payment_entry(pi)
 	jv.remark = 'Payment against Purchase Invoice {0}. {1}'.format(pi.name, pi.remarks)
@@ -441,6 +442,7 @@
 	jv.get("entries")[0].party_type = "Supplier"
 	jv.get("entries")[0].party = pi.supplier
 	jv.get("entries")[0].balance = get_balance_on(pi.credit_to)
+	jv.get("entries")[0].party_balance = get_balance_on(pi.supplier, "Supplier")
 	jv.get("entries")[0].debit = pi.outstanding_amount
 	jv.get("entries")[0].against_voucher = pi.name
 
@@ -469,7 +471,6 @@
 @frappe.whitelist()
 def get_opening_accounts(company):
 	"""get all balance sheet accounts for opening entry"""
-	from erpnext.accounts.utils import get_balance_on
 	accounts = frappe.db.sql_list("""select name from tabAccount
 		where group_or_ledger='Ledger' and report_type='Balance Sheet' and company=%s""", company)
 
@@ -508,3 +509,17 @@
 		return {
 			"debit": flt(frappe.db.get_value("Purchase Invoice", args["docname"], "outstanding_amount"))
 		}
+
+@frappe.whitelist()
+def get_party_account_and_balance(company, party_type, party):
+	from erpnext.accounts.party import get_party_account
+	account = get_party_account(company, party, party_type)
+
+	account_balance = get_balance_on(account=account)
+	party_balance = get_balance_on(party_type=party_type, party=party)
+
+	return {
+		"account": account,
+		"balance": account_balance,
+		"party_balance": party_balance
+	}
diff --git a/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json b/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
index de15772..9834c2e 100644
--- a/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
+++ b/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
@@ -1,197 +1,207 @@
 {
- "autoname": "JVD.######",
- "creation": "2013-02-22 01:27:39",
- "docstatus": 0,
- "doctype": "DocType",
+ "autoname": "JVD.######", 
+ "creation": "2013-02-22 01:27:39", 
+ "docstatus": 0, 
+ "doctype": "DocType", 
  "fields": [
   {
-   "fieldname": "account",
-   "fieldtype": "Link",
-   "in_filter": 1,
-   "in_list_view": 1,
-   "label": "Account",
-   "oldfieldname": "account",
-   "oldfieldtype": "Link",
-   "options": "Account",
-   "permlevel": 0,
-   "print_width": "250px",
-   "reqd": 1,
-   "search_index": 1,
+   "fieldname": "account", 
+   "fieldtype": "Link", 
+   "in_filter": 1, 
+   "in_list_view": 1, 
+   "label": "Account", 
+   "oldfieldname": "account", 
+   "oldfieldtype": "Link", 
+   "options": "Account", 
+   "permlevel": 0, 
+   "print_width": "250px", 
+   "reqd": 1, 
+   "search_index": 1, 
    "width": "250px"
-  },
+  }, 
   {
-   "default": ":Company",
-   "description": "If Income or Expense",
-   "fieldname": "cost_center",
-   "fieldtype": "Link",
-   "in_filter": 1,
-   "in_list_view": 1,
-   "label": "Cost Center",
-   "oldfieldname": "cost_center",
-   "oldfieldtype": "Link",
-   "options": "Cost Center",
-   "permlevel": 0,
-   "print_hide": 1,
-   "print_width": "180px",
-   "search_index": 0,
-   "width": "180px"
-  },
-  {
-   "fieldname": "col_break1",
-   "fieldtype": "Column Break",
-   "permlevel": 0
-  },
-  {
-   "fieldname": "party_type",
-   "fieldtype": "Link",
-   "label": "Party Type",
-   "options": "DocType",
-   "permlevel": 0
-  },
-  {
-   "fieldname": "party",
-   "fieldtype": "Dynamic Link",
-   "label": "Party",
-   "options": "party_type",
-   "permlevel": 0
-  },
-  {
-   "fieldname": "balance",
-   "fieldtype": "Currency",
-   "in_list_view": 1,
-   "label": "Account Balance",
-   "no_copy": 1,
-   "oldfieldname": "balance",
-   "oldfieldtype": "Data",
-   "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "print_hide": 1,
+   "fieldname": "balance", 
+   "fieldtype": "Currency", 
+   "in_list_view": 1, 
+   "label": "Account Balance", 
+   "no_copy": 1, 
+   "oldfieldname": "balance", 
+   "oldfieldtype": "Data", 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0, 
+   "print_hide": 1, 
    "read_only": 1
-  },
+  }, 
   {
-   "fieldname": "sec_break1",
-   "fieldtype": "Section Break",
+   "default": ":Company", 
+   "description": "If Income or Expense", 
+   "fieldname": "cost_center", 
+   "fieldtype": "Link", 
+   "in_filter": 1, 
+   "in_list_view": 1, 
+   "label": "Cost Center", 
+   "oldfieldname": "cost_center", 
+   "oldfieldtype": "Link", 
+   "options": "Cost Center", 
+   "permlevel": 0, 
+   "print_hide": 1, 
+   "print_width": "180px", 
+   "search_index": 0, 
+   "width": "180px"
+  }, 
+  {
+   "fieldname": "col_break1", 
+   "fieldtype": "Column Break", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "debit",
-   "fieldtype": "Currency",
-   "in_list_view": 1,
-   "label": "Debit",
-   "oldfieldname": "debit",
-   "oldfieldtype": "Currency",
-   "options": "Company:company:default_currency",
+   "fieldname": "party_type", 
+   "fieldtype": "Link", 
+   "label": "Party Type", 
+   "options": "DocType", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "col_break2",
-   "fieldtype": "Column Break",
+   "fieldname": "party", 
+   "fieldtype": "Dynamic Link", 
+   "label": "Party", 
+   "options": "party_type", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "credit",
-   "fieldtype": "Currency",
-   "in_list_view": 1,
-   "label": "Credit",
-   "oldfieldname": "credit",
-   "oldfieldtype": "Currency",
-   "options": "Company:company:default_currency",
+   "fieldname": "party_balance", 
+   "fieldtype": "Currency", 
+   "label": "Party Balance", 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "sec_break1", 
+   "fieldtype": "Section Break", 
+   "label": "Amount", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "reference",
-   "fieldtype": "Section Break",
-   "label": "Reference",
+   "fieldname": "debit", 
+   "fieldtype": "Currency", 
+   "in_list_view": 1, 
+   "label": "Debit", 
+   "oldfieldname": "debit", 
+   "oldfieldtype": "Currency", 
+   "options": "Company:company:default_currency", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "against_invoice",
-   "fieldtype": "Link",
-   "in_filter": 1,
-   "label": "Against Sales Invoice",
-   "no_copy": 1,
-   "oldfieldname": "against_invoice",
-   "oldfieldtype": "Link",
-   "options": "Sales Invoice",
-   "permlevel": 0,
-   "print_hide": 0,
+   "fieldname": "col_break2", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0
+  }, 
+  {
+   "fieldname": "credit", 
+   "fieldtype": "Currency", 
+   "in_list_view": 1, 
+   "label": "Credit", 
+   "oldfieldname": "credit", 
+   "oldfieldtype": "Currency", 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0
+  }, 
+  {
+   "fieldname": "reference", 
+   "fieldtype": "Section Break", 
+   "label": "Reference", 
+   "permlevel": 0
+  }, 
+  {
+   "fieldname": "against_invoice", 
+   "fieldtype": "Link", 
+   "in_filter": 1, 
+   "label": "Against Sales Invoice", 
+   "no_copy": 1, 
+   "oldfieldname": "against_invoice", 
+   "oldfieldtype": "Link", 
+   "options": "Sales Invoice", 
+   "permlevel": 0, 
+   "print_hide": 0, 
    "search_index": 1
-  },
+  }, 
   {
-   "fieldname": "against_voucher",
-   "fieldtype": "Link",
-   "in_filter": 1,
-   "in_list_view": 1,
-   "label": "Against Purchase Invoice",
-   "no_copy": 1,
-   "oldfieldname": "against_voucher",
-   "oldfieldtype": "Link",
-   "options": "Purchase Invoice",
-   "permlevel": 0,
-   "print_hide": 0,
+   "fieldname": "against_voucher", 
+   "fieldtype": "Link", 
+   "in_filter": 1, 
+   "in_list_view": 1, 
+   "label": "Against Purchase Invoice", 
+   "no_copy": 1, 
+   "oldfieldname": "against_voucher", 
+   "oldfieldtype": "Link", 
+   "options": "Purchase Invoice", 
+   "permlevel": 0, 
+   "print_hide": 0, 
    "search_index": 1
-  },
+  }, 
   {
-   "fieldname": "against_jv",
-   "fieldtype": "Link",
-   "in_filter": 1,
-   "label": "Against Journal Voucher",
-   "no_copy": 1,
-   "oldfieldname": "against_jv",
-   "oldfieldtype": "Link",
-   "options": "Journal Voucher",
-   "permlevel": 0,
-   "print_hide": 0,
+   "fieldname": "against_jv", 
+   "fieldtype": "Link", 
+   "in_filter": 1, 
+   "label": "Against Journal Voucher", 
+   "no_copy": 1, 
+   "oldfieldname": "against_jv", 
+   "oldfieldtype": "Link", 
+   "options": "Journal Voucher", 
+   "permlevel": 0, 
+   "print_hide": 0, 
    "search_index": 1
-  },
+  }, 
   {
-   "fieldname": "col_break3",
-   "fieldtype": "Column Break",
+   "fieldname": "col_break3", 
+   "fieldtype": "Column Break", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "against_sales_order",
-   "fieldtype": "Link",
-   "label": "Against Sales Order",
-   "options": "Sales Order",
+   "fieldname": "against_sales_order", 
+   "fieldtype": "Link", 
+   "label": "Against Sales Order", 
+   "options": "Sales Order", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "against_purchase_order",
-   "fieldtype": "Link",
-   "label": "Against Purchase Order",
-   "options": "Purchase Order",
+   "fieldname": "against_purchase_order", 
+   "fieldtype": "Link", 
+   "label": "Against Purchase Order", 
+   "options": "Purchase Order", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "is_advance",
-   "fieldtype": "Select",
-   "label": "Is Advance",
-   "no_copy": 1,
-   "oldfieldname": "is_advance",
-   "oldfieldtype": "Select",
-   "options": "No\nYes",
-   "permlevel": 0,
+   "fieldname": "is_advance", 
+   "fieldtype": "Select", 
+   "label": "Is Advance", 
+   "no_copy": 1, 
+   "oldfieldname": "is_advance", 
+   "oldfieldtype": "Select", 
+   "options": "No\nYes", 
+   "permlevel": 0, 
    "print_hide": 1
-  },
+  }, 
   {
-   "fieldname": "against_account",
-   "fieldtype": "Text",
-   "hidden": 1,
-   "label": "Against Account",
-   "no_copy": 1,
-   "oldfieldname": "against_account",
-   "oldfieldtype": "Text",
-   "permlevel": 0,
+   "fieldname": "against_account", 
+   "fieldtype": "Text", 
+   "hidden": 1, 
+   "label": "Against Account", 
+   "no_copy": 1, 
+   "oldfieldname": "against_account", 
+   "oldfieldtype": "Text", 
+   "permlevel": 0, 
    "print_hide": 1
   }
- ],
- "idx": 1,
- "istable": 1,
- "modified": "2014-09-11 18:33:53.705093",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Journal Voucher Detail",
- "owner": "Administrator",
+ ], 
+ "idx": 1, 
+ "istable": 1, 
+ "modified": "2014-09-17 13:02:42.012069", 
+ "modified_by": "Administrator", 
+ "module": "Accounts", 
+ "name": "Journal Voucher Detail", 
+ "owner": "Administrator", 
  "permissions": []
-}
+}
\ No newline at end of file
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 7b40c3e..cf57a61 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -40,13 +40,15 @@
 		throw(_("{0} '{1}' not in Fiscal Year {2}").format(label, formatdate(date), fiscal_year))
 
 @frappe.whitelist()
-def get_balance_on(account=None, date=None):
+def get_balance_on(account=None, date=None, party_type=None, party=None):
 	if not account and frappe.form_dict.get("account"):
 		account = frappe.form_dict.get("account")
+	if not date and frappe.form_dict.get("date"):
 		date = frappe.form_dict.get("date")
-
-	acc = frappe.get_doc("Account", account)
-	acc.check_permission("read")
+	if not party_type and frappe.form_dict.get("party_type"):
+		party_type = frappe.form_dict.get("party_type")
+	if not party and frappe.form_dict.get("party"):
+		party = frappe.form_dict.get("party")
 
 	cond = []
 	if date:
@@ -67,19 +69,27 @@
 			# hence, assuming balance as 0.0
 			return 0.0
 
-	# for pl accounts, get balance within a fiscal year
-	if acc.report_type == 'Profit and Loss':
-		cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
-			% year_start_date)
+	if account:
+		acc = frappe.get_doc("Account", account)
+		acc.check_permission("read")
 
-	# different filter for group and ledger - improved performance
-	if acc.group_or_ledger=="Group":
-		cond.append("""exists (
-			select * from `tabAccount` ac where ac.name = gle.account
-			and ac.lft >= %s and ac.rgt <= %s
-		)""" % (acc.lft, acc.rgt))
-	else:
-		cond.append("""gle.account = "%s" """ % (account.replace('"', '\\"'), ))
+		# for pl accounts, get balance within a fiscal year
+		if acc.report_type == 'Profit and Loss':
+			cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
+				% year_start_date)
+
+		# different filter for group and ledger - improved performance
+		if acc.group_or_ledger=="Group":
+			cond.append("""exists (
+				select * from `tabAccount` ac where ac.name = gle.account
+				and ac.lft >= %s and ac.rgt <= %s
+			)""" % (acc.lft, acc.rgt))
+		else:
+			cond.append("""gle.account = "%s" """ % (account.replace('"', '\\"'), ))
+
+	if party_type and party:
+		cond.append("""gle.party_type = "%s" and gle.party = "%s" """ %
+			(party_type.replace('"', '\\"'), party.replace('"', '\\"')))
 
 	bal = frappe.db.sql("""
 		SELECT sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))