Payment Reconciliation based on party
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index 97484da..f886262 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -7,24 +7,32 @@
 
 	onload: function() {
 		var me = this
-		this.frm.set_query('party_account', function() {
-			if(!me.frm.doc.company) {
-				msgprint(__("Please select company first"));
+		this.frm.set_query('party_type', function() {
+			return {
+				filters: {
+					"name": ["in", ["Customer", "Supplier"]]
+				}
+			};
+		});
+
+		this.frm.set_query('receivable_payable_account', function() {
+			if(!me.frm.doc.company || !me.frm.doc.party_type) {
+				msgprint(__("Please select Company and Party Type first"));
 			} else {
 				return{
-					filters:[
-						['Account', 'company', '=', me.frm.doc.company],
-						['Account', 'group_or_ledger', '=', 'Ledger'],
-						['Account', 'master_type', 'in', ['Customer', 'Supplier']]
-					]
+					filters: {
+						"company": me.frm.doc.company,
+						"group_or_ledger": "Ledger",
+						"account_type": (me.frm.doc.party_type == "Customer" ? "Receivable" : "Payable")
+					}
 				};
 			}
-			
+
 		});
-		
+
 		this.frm.set_query('bank_cash_account', function() {
 			if(!me.frm.doc.company) {
-				msgprint(__("Please select company first"));
+				msgprint(__("Please select Company first"));
 			} else {
 				return{
 					filters:[
@@ -40,7 +48,26 @@
 			'<ul>' + __("If you are unable to match the exact amount, then amend your Journal Voucher and split rows such that payment amount match the invoice amount.") + '</ul>';
 		this.frm.set_value("reconcile_help", help_content);
 	},
-	
+
+	party: function() {
+		var me = this
+		if(!me.frm.doc.receivable_payable_account && me.frm.doc.party_type && me.frm.doc.party) {
+			return frappe.call({
+				method: "erpnext.accounts.party.get_party_account",
+				args: {
+					company: me.frm.doc.company,
+					party_type: me.frm.doc.party_type,
+					party: me.frm.doc.party
+				},
+				callback: function(r) {
+					if(!r.exc && r.message) {
+						me.frm.set_value("receivable_payable_account", r.message);
+					}
+				}
+			});
+		}
+	},
+
 	get_unreconciled_entries: function() {
 		var me = this;
 		return this.frm.call({
@@ -48,12 +75,12 @@
 			method: 'get_unreconciled_entries',
 			callback: function(r, rt) {
 				var invoices = [];
-				
+
 				$.each(me.frm.doc.payment_reconciliation_invoices || [], function(i, row) {
-						if (row.invoice_number && !inList(invoices, row.invoice_number)) 
+						if (row.invoice_number && !inList(invoices, row.invoice_number))
 							invoices.push(row.invoice_number);
 				});
-								
+
 				frappe.meta.get_docfield("Payment Reconciliation Payment", "invoice_number",
 					me.frm.doc.name).options = invoices.join("\n");
 
@@ -78,5 +105,3 @@
 });
 
 $.extend(cur_frm.cscript, new erpnext.accounts.PaymentReconciliationController({frm: cur_frm}));
-
-cur_frm.add_fetch('party_account', 'master_type', 'party_type')
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
index 51cb306..7adf9d5 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
@@ -15,26 +15,35 @@
    "reqd": 1
   }, 
   {
-   "depends_on": "", 
-   "fieldname": "party_account", 
+   "fieldname": "party_type", 
    "fieldtype": "Link", 
+   "hidden": 0, 
    "in_list_view": 0, 
-   "label": "Party Account", 
-   "options": "Account", 
+   "label": "Party Type", 
+   "options": "DocType", 
+   "permlevel": 0, 
+   "read_only": 0, 
+   "reqd": 1
+  }, 
+  {
+   "depends_on": "", 
+   "fieldname": "party", 
+   "fieldtype": "Dynamic Link", 
+   "in_list_view": 0, 
+   "label": "Party", 
+   "options": "party_type", 
    "permlevel": 0, 
    "reqd": 1, 
    "search_index": 0
   }, 
   {
-   "fieldname": "party_type", 
-   "fieldtype": "Select", 
-   "hidden": 1, 
-   "in_list_view": 1, 
-   "label": "Party Type", 
-   "options": "\nCustomer\nSupplier", 
+   "fieldname": "receivable_payable_account", 
+   "fieldtype": "Link", 
+   "label": "Receivable / Payable Account", 
+   "options": "Account", 
    "permlevel": 0, 
-   "read_only": 1, 
-   "reqd": 0
+   "precision": "", 
+   "reqd": 1
   }, 
   {
    "fieldname": "bank_cash_account", 
@@ -130,7 +139,7 @@
  "hide_toolbar": 1, 
  "icon": "icon-resize-horizontal", 
  "issingle": 1, 
- "modified": "2014-07-31 05:43:03.410832", 
+ "modified": "2014-09-12 12:18:15.956283", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment Reconciliation", 
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
index a5a56ae..7971beb 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
@@ -26,13 +26,14 @@
 
 		jv_entries = frappe.db.sql("""
 			select
-				t1.name as voucher_no, t1.posting_date, t1.remark, t2.account,
+				t1.name as voucher_no, t1.posting_date, t1.remark,
 				t2.name as voucher_detail_no, {dr_or_cr} as payment_amount, t2.is_advance
 			from
 				`tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
 			where
 				t1.name = t2.parent and t1.docstatus = 1 and t2.docstatus = 1
-				and t2.account = %(party_account)s and {dr_or_cr} > 0
+				and t2.party_type = %(party_type)s and t2.party = %(party)s
+				and t2.account = %(account)s and {dr_or_cr} > 0
 				and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')=''
 				and ifnull(t2.against_jv, '')='' {cond}
 				and (CASE
@@ -45,7 +46,9 @@
 				"cond": cond,
 				"bank_account_condition": bank_account_condition,
 			}), {
-				"party_account": self.party_account,
+				"party_type": self.party_type,
+				"party": self.party,
+				"account": self.receivable_payable_account,
 				"bank_cash_account": "%%%s%%" % self.bank_cash_account
 			}, as_dict=1)
 
@@ -75,12 +78,17 @@
 			from
 				`tabGL Entry`
 			where
-				account = %s and {dr_or_cr} > 0 {cond}
+				party_type = %(party_type)s and party = %(party)s
+				and account = %(account)s and {dr_or_cr} > 0 {cond}
 			group by voucher_type, voucher_no
 		""".format(**{
 			"cond": cond,
 			"dr_or_cr": dr_or_cr
-		}), (self.party_account), as_dict=True)
+		}), {
+			"party_type": self.party_type,
+			"party": self.party,
+			"account": self.receivable_payable_account,
+		}, as_dict=True)
 
 		for d in invoice_list:
 			payment_amount = frappe.db.sql("""
@@ -89,10 +97,17 @@
 				from
 					`tabGL Entry`
 				where
-					account = %s and {0} > 0
-					and against_voucher_type = %s and ifnull(against_voucher, '') = %s
-			""".format("credit" if self.party_type == "Customer" else "debit"),
-			(self.party_account, d.voucher_type, d.voucher_no))
+					party_type = %(party_type)s and party = %(party)s
+					and account = %(account)s and {0} > 0
+					and against_voucher_type = %(against_voucher_type)s
+					and ifnull(against_voucher, '') = %(against_voucher)s
+			""".format("credit" if self.party_type == "Customer" else "debit"), {
+				"party_type": self.party_type,
+				"party": self.party,
+				"account": self.receivable_payable_account,
+				"against_voucher_type": d.voucher_type,
+				"against_voucher": d.voucher_no
+			})
 
 			payment_amount = payment_amount[0][0] if payment_amount else 0
 
@@ -130,7 +145,9 @@
 					'voucher_detail_no' : e.voucher_detail_number,
 					'against_voucher_type' : e.invoice_type,
 					'against_voucher'  : e.invoice_number,
-					'account' : self.party_account,
+					'account' : self.receivable_payable_account,
+					'party_type': self.party_type,
+					'party': self.party,
 					'is_advance' : e.is_advance,
 					'dr_or_cr' : dr_or_cr,
 					'unadjusted_amt' : flt(e.amount),
@@ -144,7 +161,7 @@
 			self.get_unreconciled_entries()
 
 	def check_mandatory_to_fetch(self):
-		for fieldname in ["company", "party_account"]:
+		for fieldname in ["company", "party_type", "party", "receivable_payable_account"]:
 			if not self.get(fieldname):
 				frappe.throw(_("Please select {0} first").format(self.meta.get_label(fieldname)))
 
diff --git a/erpnext/accounts/doctype/payment_reconciliation_payment/payment_reconciliation_payment.json b/erpnext/accounts/doctype/payment_reconciliation_payment/payment_reconciliation_payment.json
index 73fd0f5..7538a09 100644
--- a/erpnext/accounts/doctype/payment_reconciliation_payment/payment_reconciliation_payment.json
+++ b/erpnext/accounts/doctype/payment_reconciliation_payment/payment_reconciliation_payment.json
@@ -95,7 +95,7 @@
   }
  ], 
  "istable": 1, 
- "modified": "2014-07-21 16:53:56.206169", 
+ "modified": "2014-09-12 13:05:57.839280", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment Reconciliation Payment",