Changes to allow exchange rates on a specific day to be stored in Currency Exchange and to be pulled by the necessary transactions based on the posting date.
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index eda2042..c340cac 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -5,95 +5,95 @@
 import frappe
 from frappe import _, throw
 from frappe.utils import flt
+from frappe.utils import get_datetime, get_datetime_str
 
 def get_company_currency(company):
-	currency = frappe.db.get_value("Company", company, "default_currency", cache=True)
-	if not currency:
-		currency = frappe.db.get_default("currency")
-	if not currency:
-		throw(_('Please specify Default Currency in Company Master and Global Defaults'))
+    currency = frappe.db.get_value("Company", company, "default_currency", cache=True)
+    if not currency:
+        currency = frappe.db.get_default("currency")
+    if not currency:
+        throw(_('Please specify Default Currency in Company Master and Global Defaults'))
 
-	return currency
+    return currency
 
 def get_root_of(doctype):
-	"""Get root element of a DocType with a tree structure"""
-	result = frappe.db.sql_list("""select name from `tab%s`
-		where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
-		(doctype, doctype))
-	return result[0] if result else None
+    """Get root element of a DocType with a tree structure"""
+    result = frappe.db.sql_list("""select name from `tab%s`
+        where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
+        (doctype, doctype))
+    return result[0] if result else None
 
 def get_ancestors_of(doctype, name):
-	"""Get ancestor elements of a DocType with a tree structure"""
-	lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"])
-	result = frappe.db.sql_list("""select name from `tab%s`
-		where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
-	return result or []
+    """Get ancestor elements of a DocType with a tree structure"""
+    lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"])
+    result = frappe.db.sql_list("""select name from `tab%s`
+        where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
+    return result or []
 
 def before_tests():
-	frappe.clear_cache()
-	# complete setup if missing
-	from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
-	if not frappe.get_list("Company"):
-		setup_complete({
-			"currency"			:"USD",
-			"first_name"		:"Test",
-			"last_name"			:"User",
-			"company_name"		:"Wind Power LLC",
-			"timezone"			:"America/New_York",
-			"company_abbr"		:"WP",
-			"industry"			:"Manufacturing",
-			"country"			:"United States",
-			"fy_start_date"		:"2011-01-01",
-			"fy_end_date"		:"2011-12-31",
-			"language"			:"english",
-			"company_tagline"	:"Testing",
-			"email"				:"test@erpnext.com",
-			"password"			:"test",
-			"chart_of_accounts" : "Standard",
-			"domain"			: "Manufacturing",
-			
-		})
+    frappe.clear_cache()
+    # complete setup if missing
+    from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
+    if not frappe.get_list("Company"):
+        setup_complete({
+            "currency"            :"USD",
+            "first_name"        :"Test",
+            "last_name"            :"User",
+            "company_name"        :"Wind Power LLC",
+            "timezone"            :"America/New_York",
+            "company_abbr"        :"WP",
+            "industry"            :"Manufacturing",
+            "country"            :"United States",
+            "fy_start_date"        :"2011-01-01",
+            "fy_end_date"        :"2011-12-31",
+            "language"            :"english",
+            "company_tagline"    :"Testing",
+            "email"                :"test@erpnext.com",
+            "password"            :"test",
+            "chart_of_accounts" : "Standard",
+            "domain"            : "Manufacturing",
+            
+        })
 
-	frappe.db.sql("delete from `tabLeave Allocation`")
-	frappe.db.sql("delete from `tabLeave Application`")
-	frappe.db.sql("delete from `tabSalary Slip`")
-	frappe.db.sql("delete from `tabItem Price`")
+    frappe.db.sql("delete from `tabLeave Allocation`")
+    frappe.db.sql("delete from `tabLeave Application`")
+    frappe.db.sql("delete from `tabSalary Slip`")
+    frappe.db.sql("delete from `tabItem Price`")
 
-	frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 0)
+    frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 0)
 
-	frappe.db.commit()
+    frappe.db.commit()
 
 @frappe.whitelist()
-def get_exchange_rate(from_currency, to_currency):
-	if not (from_currency and to_currency):
-		return
-	
-	if from_currency == to_currency:
-		return 1
-	
-	exchange = "%s-%s" % (from_currency, to_currency)
-	value = flt(frappe.db.get_value("Currency Exchange", exchange, "exchange_rate"))
+def get_exchange_rate(posting_date, from_currency, to_currency):
+    if not (posting_date and from_currency and to_currency):
+        return
+    
+    if from_currency == to_currency:
+        return 1
+    
+    #Get all entries in Currency Exchange with from_currency and to_currency
+    entries = frappe.get_all("Currency Exchange", fields = ["*"], filters=[["date", "<=", get_datetime_str(posting_date)], ["from_currency", "=", from_currency], ["to_currency", "=", to_currency]], order_by="date desc")
+    if entries:
+        return flt(entries[0].exchange_rate)
 
-	if not value:
-		try:
-			cache = frappe.cache()
-			key = "currency_exchange_rate:{0}:{1}".format(from_currency, to_currency)
-			value = cache.get(key)
+    try:
+        cache = frappe.cache()
+        key = "currency_exchange_rate:{0}:{1}".format(from_currency, to_currency)
+        value = cache.get(key)
 
-			if not value:
-				import requests
-				response = requests.get("http://api.fixer.io/latest", params={
-					"base": from_currency,
-					"symbols": to_currency
-				})
-				# expire in 6 hours
-				response.raise_for_status()
-				value = response.json()["rates"][to_currency]
-				cache.setex(key, value, 6 * 60 * 60)
+        if not value:
+            import requests
+            response = requests.get("http://api.fixer.io/latest", params={
+                "base": from_currency,
+                "symbols": to_currency
+            })
+            # expire in 6 hours
+            response.raise_for_status()
+            value = response.json()["rates"][to_currency]
+            cache.setex(key, value, 6 * 60 * 60)
 
-			return flt(value)
-		except:
-			frappe.msgprint(_("Unable to find exchange rate for {0} to {1}").format(from_currency, to_currency))
-			return 0.0
-	else:
-		return value
+        return flt(value)
+    except:
+        frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}").format(from_currency, to_currency, posting_date))
+        return 0.0
\ No newline at end of file