[fix] payment tool #2791
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js
index 0cb51d3..8ff9597 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.js
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js
@@ -5,7 +5,7 @@
 
 // Help content
 frappe.ui.form.on("Payment Tool", "onload", function(frm) {
-	frm.set_value("make_jv_help", '<i class="icon-hand-right"></i> '
+	frm.set_value("make_jv_help",
 		+ __("Note: If payment is not made against any reference, make Journal Entry manually."));
 
 	frm.set_query("party_type", function() {
@@ -36,7 +36,7 @@
 });
 
 frappe.ui.form.on("Payment Tool", "party", function(frm) {
-	if(!frm.doc.party_account && frm.doc.party_type && frm.doc.party) {
+	if(frm.doc.party_type && frm.doc.party) {
 		return frappe.call({
 			method: "erpnext.accounts.party.get_party_account",
 			args: {
@@ -46,7 +46,7 @@
 			},
 			callback: function(r) {
 				if(!r.exc && r.message) {
-					frappe.model.set_value("party_account", r.message);
+					frm.set_value("party_account", r.message);
 					erpnext.payment_tool.check_mandatory_to_set_button(frm);
 				}
 			}
@@ -62,12 +62,16 @@
 	erpnext.payment_tool.check_mandatory_to_set_button(frm);
 });
 
+frappe.ui.form.on("Payment Tool", "party", function(frm) {
+	erpnext.payment_tool.check_mandatory_to_set_button(frm);
+});
+
 // Fetch bank/cash account based on payment mode
 frappe.ui.form.on("Payment Tool", "payment_mode", function(frm) {
 	return  frappe.call({
 		method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
 		args: {
-				"mode_of_payment": frm.doc.mode_of_payment,
+				"mode_of_payment": frm.doc.payment_mode,
 				"company": frm.doc.company
 		},
 		callback: function(r, rt) {
@@ -81,7 +85,7 @@
 
 
 erpnext.payment_tool.check_mandatory_to_set_button = function(frm) {
-	if (frm.doc.company && frm.doc.party_type && frm.doc.party && frm.doc.received_or_paid) {
+	if (frm.doc.company && frm.doc.party_type && frm.doc.party && frm.doc.received_or_paid && frm.doc.party_account) {
 		frm.fields_dict.get_outstanding_vouchers.$input.addClass("btn-primary");
 	}
 }
@@ -108,16 +112,18 @@
 				frm.fields_dict.get_outstanding_vouchers.$input.removeClass("btn-primary");
 				frm.fields_dict.make_journal_entry.$input.addClass("btn-primary");
 
-				frappe.model.clear_table(frm.doc, "vouchers");
+				frm.clear_table("vouchers");
+
 				$.each(r.message, function(i, d) {
-					var invoice_detail = frappe.model.add_child(frm.doc, "Payment Tool Detail", "vouchers");
-					invoice_detail.against_voucher_type = d.voucher_type;
-					invoice_detail.against_voucher_no = d.voucher_no;
-					invoice_detail.total_amount = d.invoice_amount;
-					invoice_detail.outstanding_amount = d.outstanding_amount;
+					var c = frm.add_child("vouchers");
+					c.against_voucher_type = d.voucher_type;
+					c.against_voucher_no = d.voucher_no;
+					c.total_amount = d.invoice_amount;
+					c.outstanding_amount = d.outstanding_amount;
 				});
 			}
 			refresh_field("vouchers");
+			frm.layout.refresh_sections();
 			erpnext.payment_tool.set_total_payment_amount(frm);
 		}
 	});
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.json b/erpnext/accounts/doctype/payment_tool/payment_tool.json
index d8965eb..909f9c4 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.json
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.json
@@ -11,7 +11,7 @@
   {
    "fieldname": "sec_break1", 
    "fieldtype": "Section Break", 
-   "label": "", 
+   "label": "Find Invoices to Match", 
    "permlevel": 0
   }, 
   {
@@ -44,6 +44,43 @@
   }, 
   {
    "allow_on_submit": 0, 
+   "fieldname": "received_or_paid", 
+   "fieldtype": "Select", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Received Or Paid", 
+   "no_copy": 0, 
+   "options": "Received\nPaid", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "fieldname": "col_break1", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Column Break 1", 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
    "depends_on": "", 
    "fieldname": "party", 
    "fieldtype": "Dynamic Link", 
@@ -70,26 +107,8 @@
    "no_copy": 1, 
    "options": "Account", 
    "permlevel": 0, 
-   "read_only": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "fieldname": "received_or_paid", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Received Or Paid", 
-   "no_copy": 0, 
-   "options": "Received\nPaid", 
-   "permlevel": 0, 
-   "print_hide": 0, 
    "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0
+   "reqd": 1
   }, 
   {
    "allow_on_submit": 0, 
@@ -111,13 +130,14 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "fieldname": "col_break1", 
-   "fieldtype": "Column Break", 
+   "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && doc.party_account)", 
+   "fieldname": "sec_break3", 
+   "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Column Break 1", 
+   "label": "Set Matching Amounts", 
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 0, 
@@ -129,6 +149,33 @@
   }, 
   {
    "allow_on_submit": 0, 
+   "fieldname": "vouchers", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Against Vouchers", 
+   "no_copy": 0, 
+   "options": "Payment Tool Detail", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && doc.party_account)", 
+   "fieldname": "section_break_19", 
+   "fieldtype": "Section Break", 
+   "label": "Make Payment Entry", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "allow_on_submit": 0, 
    "fieldname": "payment_mode", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -166,22 +213,17 @@
    "set_only_once": 0
   }, 
   {
-   "allow_on_submit": 0, 
-   "fieldname": "reference_no", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Reference No", 
-   "no_copy": 0, 
+   "fieldname": "total_payment_amount", 
+   "fieldtype": "Currency", 
+   "label": "Total Payment Amount", 
    "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "data_22", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
    "allow_on_submit": 0, 
@@ -203,14 +245,13 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && (doc.customer || doc.supplier))", 
-   "fieldname": "sec_break3", 
-   "fieldtype": "Section Break", 
+   "fieldname": "reference_no", 
+   "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Against Voucher", 
+   "label": "Reference No", 
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 0, 
@@ -222,39 +263,6 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "fieldname": "vouchers", 
-   "fieldtype": "Table", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Against Vouchers", 
-   "no_copy": 0, 
-   "options": "Payment Tool Detail", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0
-  }, 
-  {
-   "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && (doc.customer || doc.supplier))", 
-   "fieldname": "section_break_19", 
-   "fieldtype": "Section Break", 
-   "permlevel": 0, 
-   "precision": ""
-  }, 
-  {
-   "fieldname": "total_payment_amount", 
-   "fieldtype": "Currency", 
-   "label": "Total Payment Amount", 
-   "permlevel": 0, 
-   "read_only": 1
-  }, 
-  {
-   "allow_on_submit": 0, 
    "fieldname": "make_journal_entry", 
    "fieldtype": "Button", 
    "hidden": 0, 
@@ -272,13 +280,7 @@
    "set_only_once": 0
   }, 
   {
-   "fieldname": "data_22", 
-   "fieldtype": "Column Break", 
-   "permlevel": 0, 
-   "precision": ""
-  }, 
-  {
-   "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && (doc.customer || doc.supplier))", 
+   "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && doc.party_account)", 
    "fieldname": "section_break_21", 
    "fieldtype": "Section Break", 
    "permlevel": 0, 
@@ -310,7 +312,7 @@
  "is_submittable": 0, 
  "issingle": 1, 
  "istable": 0, 
- "modified": "2015-02-20 05:09:19.812606", 
+ "modified": "2015-02-21 03:59:08.154966", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment Tool", 
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 0d9876a..79460db 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -128,22 +128,26 @@
 
 @frappe.whitelist()
 def get_party_account(company, party, party_type):
+	"""Returns the account for the given `party`.
+		Will first search in party (Customer / Supplier) record, if not found,
+		will search in group (Customer Group / Supplier Type),
+		finally will return default."""
 	if not company:
 		frappe.throw(_("Please select company first."))
 
 	if party:
-		party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Type"
-		party_details = frappe.db.sql("""select p.{0}, pa.account
-			from `tab{1}` p left join `tabParty Account` pa on pa.parent = p.name
-			where p.name = %s""".format(scrub(party_group_doctype), party_type), party)
-		if party_details:
-			party_group, account = party_details[0]
+		account = frappe.db.get_value("Party Account",
+			{"parenttype": party_type, "parent": party, "company": company}, "account")
 
 		if not account:
+			party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Type"
+			group = frappe.db.get_value(party_type, party, scrub(party_group_doctype))
 			account = frappe.db.get_value("Party Account",
-				{"parenttype": party_group_doctype, "parent": party_group, "company": company}, "account") or \
-				frappe.db.get_value("Company", company,
-					"default_receivable_account" if party_type=="Customer" else "default_payable_account")
+				{"parenttype": party_group_doctype, "parent": group, "company": company}, "account")
+
+		if not account:
+			default_account_name = "default_receivable_account" if party_type=="Customer" else "default_payable_account"
+			account = frappe.db.get_value("Company", company, default_account_name)
 
 		return account