Test Case Fixes
diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
index 8e45b3b..8be5f6d 100644
--- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
@@ -70,7 +70,7 @@
 		pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
-		pe.target_exchange_rate = 50		
+		pe.source_exchange_rate = 50		
 		pe.insert()
 		pe.submit()
 		
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py
index b355f35..f7d9586 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/payment_request.py
@@ -6,11 +6,11 @@
 import frappe
 from frappe import _
 from frappe.model.document import Document
-from frappe.utils import flt, get_url, nowdate, getdate
+from frappe.utils import flt, get_url, nowdate
 from erpnext.accounts.party import get_party_account
 from erpnext.accounts.utils import get_account_currency
 from erpnext.setup.utils import get_exchange_rate
-from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
+from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry, get_company_defaults
 
 class PaymentRequest(Document):		
 	def validate(self):
@@ -41,7 +41,6 @@
 	def on_submit(self):
 		send_mail = True
 		self.make_communication_entry()
-		
 		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
 		
 		if hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") == "Shopping Cart":
@@ -87,18 +86,22 @@
 		frappe.flags.ignore_account_permission = True
 		
 		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
-		
-		party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company)
-		party_account_currency = get_account_currency(party_account)
+
+		if self.reference_doctype == "Sales Invoice":
+			party_account = ref_doc.debit_to
+		elif self.reference_doctype == "Purchase Invoice":
+			party_account = ref_doc.credit_to
+		else:
+			party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company)
+			
+		party_account_currency = ref_doc.get("party_account_currency") or get_account_currency(party_account)
 		
 		bank_amount = self.grand_total
 		if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency:
-			party_amount = flt(flt(self.grand_total) * 
-				get_exchange_rate(self.currency, party_account_currency), 
-				ref_doc.precision("base_grand_total"))
+			party_amount = self.base_grand_total
 		else:
 			party_amount = self.grand_total
-			
+					
 		payment_entry = get_payment_entry(self.reference_doctype, self.reference_name, 
 			party_amount=party_amount, bank_account=self.payment_account, bank_amount=bank_amount)
 		
@@ -108,6 +111,14 @@
 			"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format(self.reference_doctype, 
 				self.reference_name, self.name)
 		})
+
+		company_details = get_company_defaults(ref_doc.company)
+		if payment_entry.difference_amount:
+			payment_entry.append("deductions", {
+				"account": company_details.exchange_gain_loss_account,
+				"cost_center": company_details.cost_center,
+				"amount": payment_entry.difference_amount
+			})
 		payment_entry.insert(ignore_permissions=True)
 		payment_entry.submit()
 
@@ -188,7 +199,6 @@
 	
 		if args.return_doc:
 			return pr
-		
 		if args.submit_doc:
 			pr.insert(ignore_permissions=True)
 			pr.submit()
diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py
index eb8e558..73c412f 100644
--- a/erpnext/accounts/doctype/payment_request/test_payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py
@@ -6,7 +6,7 @@
 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, get_gateway_details
+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
 from erpnext.setup.utils import get_exchange_rate
 # test_records = frappe.get_test_records('Payment Request')
@@ -62,27 +62,44 @@
 		self.assertEquals(pr.currency, "USD")
 
 	def test_payment_entry(self):
+		frappe.db.set_value("Company", "_Test Company", 
+			"exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC")
+		frappe.db.set_value("Company", "_Test Company", 
+			"write_off_account", "_Test Write Off - _TC")
+		frappe.db.set_value("Company", "_Test Company", 
+			"cost_center", "_Test Cost Center - _TC")
+		
 		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_as_paid()
+		pe = pr.set_as_paid()
 
 		so_inr = frappe.get_doc("Sales Order", so_inr.name)
 
-		self.assertEquals(so_inr.advance_paid, jv.total_debit)
-
-		conversion_rate = get_exchange_rate("USD", "INR")
+		self.assertEquals(so_inr.advance_paid, 1000)
 
 		si_usd = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=conversion_rate)
+			currency="USD", conversion_rate=50)
 
 		pr = make_payment_request(dt="Sales Invoice", dn=si_usd.name, recipient_id="saurabh@erpnext.com",
-			mute_email=1, return_doc=1, payment_gateway="_Test Gateway - USD")
+			mute_email=1, payment_gateway="_Test Gateway - USD", submit_doc=1)
+		
+		pe = pr.set_as_paid()
+		
+		expected_gle = dict((d[0], d) for d in [
+			["_Test Receivable USD - _TC", 0, 5000, si_usd.name],
+			[pr.payment_account, 6000.0, 0, None],
+			["_Test Exchange Gain/Loss - _TC", 0, 1000, None]
+		])
+		
+		gl_entries = frappe.db.sql("""select account, debit, credit, against_voucher
+			from `tabGL Entry` where voucher_type='Payment Entry' and voucher_no=%s
+			order by account asc""", pe.name, as_dict=1)
 
-		jv = pr.set_as_paid()
+		self.assertTrue(gl_entries)
 
-		payment_gateway_details = get_gateway_details({"payment_gateway": "_Test Gateway - USD"})
-				
-		self.assertEquals(jv.accounts[0].account, "_Test Receivable USD - _TC")
-		self.assertEquals(jv.accounts[1].account, payment_gateway_details.payment_account)
-		
\ No newline at end of file
+		for i, gle in enumerate(gl_entries):
+			self.assertEquals(expected_gle[gle.account][0], gle.account)
+			self.assertEquals(expected_gle[gle.account][1], gle.debit)
+			self.assertEquals(expected_gle[gle.account][2], gle.credit)
+			self.assertEquals(expected_gle[gle.account][3], gle.against_voucher)
diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py
index e155d8e..4af197e 100644
--- a/erpnext/accounts/general_ledger.py
+++ b/erpnext/accounts/general_ledger.py
@@ -168,8 +168,8 @@
 
 	if not gl_entries:
 		gl_entries = frappe.db.sql("""
-			select account, posting_date, party_type, party, 
-			voucher_type, voucher_no, against_voucher_type, against_voucher
+			select account, posting_date, party_type, party, cost_center, fiscal_year,
+			voucher_type, voucher_no, against_voucher_type, against_voucher, cost_center
 			from `tabGL Entry`
 			where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no), as_dict=True)
 
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 2b79219..2b67ceb 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -348,10 +348,12 @@
 		"""
 		
 		if self.doctype == "Sales Invoice":
+			party_type = "Customer"
 			party = self.customer
 			party_account = self.debit_to
 			dr_or_cr = "credit_in_account_currency"
 		else:
+			party_type = "Supplier"
 			party = self.supplier
 			party_account = self.credit_to
 			dr_or_cr = "debit_in_account_currency"
@@ -366,7 +368,7 @@
 					'against_voucher_type' : self.doctype,
 					'against_voucher'  : self.name,
 					'account' : party_account,
-					'party_type': 'Customer',
+					'party_type': party_type,
 					'party': party,
 					'is_advance' : 'Yes',
 					'dr_or_cr' : dr_or_cr,
@@ -683,10 +685,10 @@
 	party_account_field = "paid_from" if party_type == "Customer" else "paid_to"
 	payment_type = "Receive" if party_type == "Customer" else "Pay"
 	payment_entries_against_order, unallocated_payment_entries = [], []
-	
+
 	if order_list or against_all_orders:
 		if order_list:
-			reference_condition = " and t2.reference_name in ({1})"\
+			reference_condition = " and t2.reference_name in ({0})"\
 				.format(', '.join(['%s'] * len(order_list)))
 		else:
 			reference_condition = ""