[fixes] test case for Payment request
diff --git a/erpnext/accounts/doctype/payment_gateway/payment_gateway.json b/erpnext/accounts/doctype/payment_gateway/payment_gateway.json
index ccee2bb..4f81632 100644
--- a/erpnext/accounts/doctype/payment_gateway/payment_gateway.json
+++ b/erpnext/accounts/doctype/payment_gateway/payment_gateway.json
@@ -13,6 +13,30 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "payment_gateway_details", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Payment Gateway Details", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "is_default", 
    "fieldtype": "Check", 
    "hidden": 0, 
@@ -81,6 +105,31 @@
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "currency", 
+   "fieldtype": "Read Only", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Currency", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "payment_account.account_currency", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
   }
  ], 
  "hide_heading": 0, 
@@ -92,7 +141,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-12-16 13:20:49.584949", 
+ "modified": "2015-12-22 19:07:36.491109", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment Gateway", 
diff --git a/erpnext/accounts/doctype/payment_gateway/payment_gateway.py b/erpnext/accounts/doctype/payment_gateway/payment_gateway.py
index a0b8944..f756a86 100644
--- a/erpnext/accounts/doctype/payment_gateway/payment_gateway.py
+++ b/erpnext/accounts/doctype/payment_gateway/payment_gateway.py
@@ -9,9 +9,13 @@
 class PaymentGateway(Document):
 	def validate(self):
 		self.update_default_payment_gateway()
+		self.set_as_default()
 	
 	def update_default_payment_gateway(self):
-		frappe.db.sql("""update `tabPayment Gateway` set is_default = 0
-			where is_default = 1 """)
+		if self.is_default:
+			frappe.db.sql("""update `tabPayment Gateway` set is_default = 0
+				where is_default = 1 """)
 		
-		
+	def set_as_default(self):
+		if not frappe.db.get_value("Payment Gateway", {"is_default": 1, "name": ("!=", self.name)}, "name"):
+			self.is_default = 1
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json
index 40d2fc9..13eeb8b 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.json
+++ b/erpnext/accounts/doctype/payment_request/payment_request.json
@@ -148,7 +148,7 @@
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
    "search_index": 0, 
@@ -156,7 +156,7 @@
    "unique": 0
   }, 
   {
-   "allow_on_submit": 1, 
+   "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
    "default": "", 
@@ -232,7 +232,31 @@
    "unique": 0
   }, 
   {
-   "allow_on_submit": 1, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "mute_email", 
+   "fieldtype": "Check", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Mute Email", 
+   "length": 0, 
+   "no_copy": 1, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 1, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
    "fieldname": "email_to", 
@@ -435,7 +459,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-12-21 10:57:48.107213", 
+ "modified": "2015-12-22 20:18:08.853333", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment Request", 
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py
index 83c947d..bac19ec 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/payment_request.py
@@ -11,7 +11,6 @@
 from erpnext.accounts.party import get_party_account
 from erpnext.accounts.utils import get_account_currency, get_balance_on
 from itertools import chain
-from paypal_integration.express_checkout import set_express_checkout
 
 class PaymentRequest(Document):		
 	def validate(self):
@@ -23,8 +22,10 @@
 			frappe.throw(_("Payment Request already exist"))
 		
 	def on_submit(self):
-		self.send_payment_request()
-		self.send_email()
+		if not self.mute_email:
+			self.send_payment_request()
+			self.send_email()
+			
 		self.make_communication_entry()
 	
 	def on_cancel(self):
@@ -37,7 +38,8 @@
 		pass
 	
 	def send_payment_request(self):
-		if self.payment_gateway == "PayPal":	
+		if self.payment_gateway == "PayPal":
+			from paypal_integration.express_checkout import set_express_checkout
 			self.payment_url = set_express_checkout(self.amount, self.currency, {"doctype": self.doctype, 
 				"docname": self.name})
 		
@@ -48,7 +50,7 @@
 		if frappe.session.user == "Guest":
 			frappe.set_user("Administrator")
 			
-		self.create_journal_voucher_entry()
+		return self.create_journal_voucher_entry()
 	
 	def create_journal_voucher_entry(self):
 		"""create voucher entry"""
@@ -99,6 +101,8 @@
 		#set status as paid for Payment Request
 		frappe.db.set_value(self.doctype, self.name, "status", "Paid")
 		
+		return jv
+		
 	def send_email(self):
 		"""send email with payment link"""
 		frappe.sendmail(recipients=self.email_to, sender=None, subject=self.subject,
@@ -128,24 +132,31 @@
 		comm.insert(ignore_permissions=True)
 
 @frappe.whitelist()
-def make_payment_request(dt, dn, recipient_id=None):
+def make_payment_request(**args):
 	"""Make payment request"""
-	ref_doc = get_reference_doc_details(dt, dn)
-	payment_gateway, payment_account = get_gateway_details()
+	args = frappe._dict(args)
+	ref_doc = get_reference_doc_details(args.dt, args.dn)
+	payment_gateway, payment_account = get_gateway_details(args)
 	
 	pr = frappe.new_doc("Payment Request")
 	pr.update({
 		"payment_gateway": payment_gateway,
 		"payment_account": payment_account,
 		"currency": ref_doc.currency,
-		"amount": get_amount(ref_doc, dt),
-		"email_to": recipient_id,
-		"subject": "Payment Request for %s"%dn,
+		"amount": get_amount(ref_doc, args.dt),
+		"mute_email": args.mute_email or 0,
+		"email_to": args.recipient_id or "",
+		"subject": "Payment Request for %s"%args.dn,
 		"message": frappe.get_doc("Accounts Settings").message,
-		"reference_doctype": dt,
-		"reference_name": dn
+		"reference_doctype": args.dt,
+		"reference_name": args.dn
 	})
 	
+	if args.submit_doc:
+		pr.insert(ignore_permissions=True)
+		pr.submit()
+		return pr
+	
 	return pr.as_dict()
 
 def get_reference_doc_details(dt, dn):
@@ -171,8 +182,11 @@
 	else:
 		frappe.throw(_("Payment Entry is already created"))
 		
-def get_gateway_details():
+def get_gateway_details(args):
 	"""return gateway and payment account of default payment gateway"""
+	if args.payemnt_gateway:
+		frappe.db.get_value("Payment Gateway", args.payemnt_gateway, ["gateway", "payment_account"])
+		
 	return frappe.db.get_value("Payment Gateway", {"is_default": 1}, ["gateway", "payment_account"])
 
 @frappe.whitelist()
diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py
index 1f8cadf..bfc54f9 100644
--- a/erpnext/accounts/doctype/payment_request/test_payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py
@@ -5,8 +5,67 @@
 
 import frappe
 import unittest
-
+from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
+from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
+from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 # test_records = frappe.get_test_records('Payment Request')
 
+test_dependencies = ["Currency Exchange", "Journal Entry", "Contact", "Address"]
+
+payment_method = [
+	{
+		"doctype": "Payment Gateway",
+		"is_default": 1,
+		"gateway": "_Test Gateway INR",
+		"payment_account": "_Test Bank - _TC",
+		"currency": "INR"
+	},
+	{
+		"doctype": "Payment Gateway",
+		"gateway": "_Test Gateway USD",
+		"payment_account": "_Test Bank - _TC",
+		"currency": "USD"
+	}
+]
+
 class TestPaymentRequest(unittest.TestCase):
-	pass
+	def setUp(self):
+		for gateway in payment_method:
+			if not frappe.db.get_value("Payment Gateway", gateway["gateway"], "name"):
+				frappe.get_doc(gateway).insert(ignore_permissions=True)
+			
+	def test_payment_request_linkings(self):
+		SO_INR = make_sales_order(currency="INR")
+		pr = make_payment_request(dt="Sales Order", dn=SO_INR.name, recipient_id="saurabh@erpnext.com")
+		
+		self.assertEquals(pr.reference_doctype, "Sales Order")
+		self.assertEquals(pr.reference_name, SO_INR.name)
+		self.assertEquals(pr.currency, "INR")
+		
+		SI_USD = create_sales_invoice(currency="USD", conversion_rate=50)
+		pr = make_payment_request(dt="Sales Invoice", dn=SI_USD.name, recipient_id="saurabh@erpnext.com")
+
+		self.assertEquals(pr.reference_doctype, "Sales Invoice")
+		self.assertEquals(pr.reference_name, SI_USD.name)
+		self.assertEquals(pr.currency, "USD")
+	
+	def test_payment_entry(self):
+		SO_INR = make_sales_order(currency="INR")
+		pr = make_payment_request(dt="Sales Order", dn=SO_INR.name, recipient_id="saurabh@erpnext.com", 
+			mute_email=1, submit_doc=1)	 
+		jv = pr.set_paid()
+		
+		SO_INR = frappe.get_doc("Sales Order", SO_INR.name)
+		
+		self.assertEquals(SO_INR.advance_paid, jv.total_debit)
+		
+		SI_USD = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
+			currency="USD", conversion_rate=50)
+
+		pr = make_payment_request(dt="Sales Invoice", dn=SI_USD.name, recipient_id="saurabh@erpnext.com",
+			mute_email=1, submit_doc=1, payemnt_gateway="_Test Gateway USD")
+		jv = pr.set_paid()
+
+		self.assertEquals(jv.accounts[0].account, "_Test Receivable USD - _TC")
+		self.assertEquals(jv.accounts[0].account_currency, "USD")
+		self.assertEquals(jv.accounts[1].account, pr.payment_account)