Payment against invoices where party not specified

Conflicts:
	erpnext/accounts/doctype/gl_entry/gl_entry.py
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index 43c4213..c459628 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import flt, fmt_money, getdate, formatdate, cstr
+from frappe.utils import flt, fmt_money, getdate, formatdate
 from frappe import _
 
 from frappe.model.document import Document
@@ -91,7 +91,7 @@
 
 		if self.cost_center and _get_cost_center_company() != self.company:
 			frappe.throw(_("Cost Center {0} does not belong to Company {1}").format(self.cost_center, self.company))
-			
+
 	def validate_party(self):
 		if self.party_type and self.party:
 			frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier')
@@ -124,12 +124,18 @@
 				frappe.throw(_("You are not authorized to add or update entries before {0}").format(formatdate(acc_frozen_upto)))
 
 def update_outstanding_amt(account, party_type, party, against_voucher_type, against_voucher, on_cancel=False):
+	if party_type and party:
+		party_condition = " and ifnull(party_type, '')='{0}' and ifnull(party, '')='{1}'"\
+			.format(frappe.db.escape(party_type), frappe.db.escape(party))
+	else:
+		party_condition = ""
+
 	# get final outstanding amt
 	bal = flt(frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
 		from `tabGL Entry`
 		where against_voucher_type=%s and against_voucher=%s
-		and account = %s and ifnull(party_type, '')=%s and ifnull(party, '')=%s""",
-		(against_voucher_type, against_voucher, account, party_type, party))[0][0] or 0.0)
+		and account = %s {0}""".format(party_condition),
+		(against_voucher_type, against_voucher, account))[0][0] or 0.0)
 
 	if against_voucher_type == 'Purchase Invoice':
 		bal = -bal
@@ -137,9 +143,8 @@
 		against_voucher_amount = flt(frappe.db.sql("""
 			select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
 			from `tabGL Entry` where voucher_type = 'Journal Entry' and voucher_no = %s
-			and account = %s and ifnull(party_type, '')=%s and ifnull(party, '')=%s
-			and ifnull(against_voucher, '') = ''""",
-			(against_voucher, account, cstr(party_type), cstr(party)))[0][0])
+			and account = %s and ifnull(against_voucher, '') = '' {0}"""
+			.format(party_condition), (against_voucher, account))[0][0])
 
 		if not against_voucher_amount:
 			frappe.throw(_("Against Journal Entry {0} is already adjusted against some other voucher")
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index ff1ace4..1e77422 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -59,7 +59,6 @@
 			// journal entry
 			if(jvd.reference_type==="Journal Entry") {
 				frappe.model.validate_missing(jvd, "account");
-
 				return {
 					query: "erpnext.accounts.doctype.journal_entry.journal_entry.get_against_jv",
 					filters: {
@@ -69,23 +68,32 @@
 				};
 			}
 
-			// against party
-
-			frappe.model.validate_missing(jvd, "party_type");
-			frappe.model.validate_missing(jvd, "party");
-
 			var out = {
 				filters: [
-					[jvd.reference_type, jvd.reference_type.indexOf("Sales")===0 ? "customer" : "supplier", "=", jvd.party],
-					[jvd.reference_type, "docstatus", "=", 1],
+					[jvd.reference_type, "docstatus", "=", 1]
 				]
 			};
 
 			if(in_list(["Sales Invoice", "Purchase Invoice"], jvd.reference_type)) {
 				out.filters.push([jvd.reference_type, "outstanding_amount", "!=", 0]);
+				
+				// account filter
+				frappe.model.validate_missing(jvd, "account");
+				
+				party_account_field = jvd.reference_type==="Sales Invoice" ? "debit_to": "credit_to";
+				out.filters.push([jvd.reference_type, party_account_field, "=", jvd.account]);
 			} else {
+				// party_type and party mandatory
+				frappe.model.validate_missing(jvd, "party_type");
+				frappe.model.validate_missing(jvd, "party");
+				
 				out.filters.push([jvd.reference_type, "per_billed", "<", 100]);
 			}
+			
+			if(jvd.party_type && jvd.party) {
+				out.filters.push([jvd.reference_type, 
+					(jvd.reference_type.indexOf("Sales")===0 ? "customer" : "supplier"), "=", jvd.party]);
+			}
 
 			return out;
 		});