From 87d70279c637fd583d0e104b2046b457f4c85b5f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 8 Dec 2016 14:43:11 +0530 Subject: [PATCH] get exchange rate on change of date --- erpnext/public/js/controllers/transaction.js | 4 + erpnext/setup/utils.py | 156 ++++++++++--------- 2 files changed, 85 insertions(+), 75 deletions(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 18e16c2d0c..b82f142812 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -413,6 +413,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ transaction_date: function() { if (this.frm.doc.transaction_date) { this.frm.transaction_date = this.frm.doc.transaction_date; + frappe.ui.form.trigger(me.frm.doc.doctype, "currency"); } }, @@ -434,9 +435,12 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ callback: function(r, rt) { if(r.message) { me.frm.set_value("due_date", r.message); + frappe.ui.form.trigger(me.frm.doc.doctype, "currency"); } } }) + } else { + frappe.ui.form.trigger(me.frm.doc.doctype, "currency"); } } }, diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 0733b7c419..3adca5671e 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -6,95 +6,101 @@ 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(translation_date, from_currency, to_currency): - if not (translation_date and from_currency and to_currency): - # manqala 19/09/2016: Should this be an empty return or should it throw and exception? - return - - if from_currency == to_currency: - return 1 - - # cksgb 19/09/2016: get all entries in Currency Exchange with from_currency and to_currency. Order by date desc. Top one is the required exchange rate - entries = frappe.get_all("Currency Exchange", fields = ["*"], filters=[["date", "<=", get_datetime_str(translation_date)], ["from_currency", "=", from_currency], ["to_currency", "=", to_currency]], order_by="date desc") - if entries: - return flt(entries[0].exchange_rate) + if not (translation_date and from_currency and to_currency): + # manqala 19/09/2016: Should this be an empty return or should it throw and exception? + return + + if from_currency == to_currency: + return 1 + + # cksgb 19/09/2016: get all entries in Currency Exchange with from_currency and to_currency. Order by date desc. Top one is the required exchange rate + entries = frappe.get_all("Currency Exchange", fields = ["exchange_rate"], + filters=[ + ["date", "<=", get_datetime_str(translation_date)], + ["from_currency", "=", from_currency], + ["to_currency", "=", to_currency] + ], order_by="date desc", limit=1) + + if entries: + return flt(entries[0].exchange_rate) - 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} for key date {2}").format(from_currency, to_currency, translation_date)) - return 0.0 \ No newline at end of file + return flt(value) + except: + frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}").format(from_currency, to_currency, translation_date)) + return 0.0 \ No newline at end of file