plaid: Convert currencies on sync

Previously it was possible to have an account that transacted in multiple
currencies, and that account would be impossible to sync. By converting
currency while importing transactions we can import the transactions
anyway, at the cost of some minor accuracy in our amounts.

Change-Id: Id5b54d34a19b76d03a47d7c5a43d04bbe8f956db
Reviewed-on: https://git.clicks.codes/c/Clicks/Forks/ERPNext/+/661
Reviewed-by: Samuel Shuert <coded@clicks.codes>
Tested-by: Skyler Grey <minion@clicks.codes>
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
index edfab47..44a606d 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
@@ -11,6 +11,7 @@
 from plaid.errors import ItemError
 
 from erpnext.erpnext_integrations.doctype.plaid_settings.plaid_connector import PlaidConnector
+from erpnext.setup.utils import get_exchange_rate
 
 
 class PlaidSettings(Document):
@@ -259,14 +260,6 @@
 
 	bank_account = frappe.db.get_value("Bank Account", dict(integration_id=transaction["account_id"]))
 
-	amount = float(transaction["amount"])
-	if amount >= 0.0:
-		deposit = 0.0
-		withdrawal = amount
-	else:
-		deposit = abs(amount)
-		withdrawal = 0.0
-
 	tags = []
 	if transaction["category"]:
 		try:
@@ -279,14 +272,32 @@
 		"Bank Transaction", dict(transaction_id=transaction["transaction_id"])
 	) and not sbool(transaction["pending"]):
 		try:
+			amount = float(transaction["amount"])
+			transaction_date = getdate(transaction["date"])
+			transaction_currency = transaction["iso_currency_code"]
+
+			account = frappe.get_cached_value("Bank Account", bank_account, "account")
+			account_currency = frappe.get_cached_value("Account", account, "account_currency")
+
+			if amount >= 0.0:
+				exchange_rate = get_exchange_rate(transaction_currency, account_currency, transaction_date, args="for_buying")
+				home_amount = amount * exchange_rate
+				deposit = 0.0
+				withdrawal = home_amount
+			else:
+				exchange_rate = get_exchange_rate(transaction_currency, account_currency, transaction_date, args="for_selling")
+				home_amount = amount * exchange_rate
+				deposit = abs(home_amount)
+				withdrawal = 0.0
+
 			new_transaction = frappe.get_doc(
 				{
 					"doctype": "Bank Transaction",
-					"date": getdate(transaction["date"]),
+					"date": transaction_date,
 					"bank_account": bank_account,
 					"deposit": deposit,
 					"withdrawal": withdrawal,
-					"currency": transaction["iso_currency_code"],
+					"currency": account_currency,
 					"transaction_id": transaction["transaction_id"],
 					"transaction_type": (
 						transaction["transaction_code"] or transaction["payment_meta"]["payment_method"]