blob: 0733b7c419c78f7c665d80bed898f0ecb750ef7e [file] [log] [blame]
Anand Doshi885e0742015-03-03 14:55:30 +05301# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
Rushabh Mehtae67d1fb2013-08-05 14:59:54 +05302# License: GNU General Public License v3. See license.txt
Anand Doshi9d9aec12013-01-17 15:44:57 +05303
4from __future__ import unicode_literals
Rushabh Mehta793ba6b2014-02-14 15:47:51 +05305import frappe
Rushabh Mehtaa1516472014-04-30 19:38:28 +05306from frappe import _, throw
Anand Doshidffec8f2014-07-01 17:45:15 +05307from frappe.utils import flt
Chude Osiegbu7be3aa32016-09-05 23:35:00 +01008from frappe.utils import get_datetime, get_datetime_str
Anand Doshi9d9aec12013-01-17 15:44:57 +05309
10def get_company_currency(company):
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010011 currency = frappe.db.get_value("Company", company, "default_currency", cache=True)
12 if not currency:
13 currency = frappe.db.get_default("currency")
14 if not currency:
15 throw(_('Please specify Default Currency in Company Master and Global Defaults'))
Rushabh Mehta9f0d6252014-04-14 19:20:45 +053016
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010017 return currency
Anand Doshif8f0c0d2013-01-17 20:20:56 +053018
Anand Doshi61a2f682013-06-21 17:55:31 +053019def get_root_of(doctype):
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010020 """Get root element of a DocType with a tree structure"""
21 result = frappe.db.sql_list("""select name from `tab%s`
22 where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
23 (doctype, doctype))
24 return result[0] if result else None
Rushabh Mehta9f0d6252014-04-14 19:20:45 +053025
Anand Doshi61a2f682013-06-21 17:55:31 +053026def get_ancestors_of(doctype, name):
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010027 """Get ancestor elements of a DocType with a tree structure"""
28 lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"])
29 result = frappe.db.sql_list("""select name from `tab%s`
30 where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
31 return result or []
Anand Doshi61a2f682013-06-21 17:55:31 +053032
Rushabh Mehtaa1516472014-04-30 19:38:28 +053033def before_tests():
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010034 frappe.clear_cache()
35 # complete setup if missing
36 from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
37 if not frappe.get_list("Company"):
38 setup_complete({
39 "currency" :"USD",
40 "first_name" :"Test",
41 "last_name" :"User",
42 "company_name" :"Wind Power LLC",
43 "timezone" :"America/New_York",
44 "company_abbr" :"WP",
45 "industry" :"Manufacturing",
46 "country" :"United States",
47 "fy_start_date" :"2011-01-01",
48 "fy_end_date" :"2011-12-31",
49 "language" :"english",
50 "company_tagline" :"Testing",
51 "email" :"test@erpnext.com",
52 "password" :"test",
53 "chart_of_accounts" : "Standard",
54 "domain" : "Manufacturing",
55
56 })
Rushabh Mehtaa1516472014-04-30 19:38:28 +053057
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010058 frappe.db.sql("delete from `tabLeave Allocation`")
59 frappe.db.sql("delete from `tabLeave Application`")
60 frappe.db.sql("delete from `tabSalary Slip`")
61 frappe.db.sql("delete from `tabItem Price`")
Rushabh Mehta5bd39422015-08-03 15:09:48 +053062
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010063 frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 0)
Rushabh Mehta5bd39422015-08-03 15:09:48 +053064
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010065 frappe.db.commit()
Anand Doshidffec8f2014-07-01 17:45:15 +053066
Rushabh Mehta66fa1ff2015-05-07 12:25:33 +053067@frappe.whitelist()
Chude Osiegbu256ec172016-09-19 03:53:37 +010068def get_exchange_rate(translation_date, from_currency, to_currency):
69 if not (translation_date and from_currency and to_currency):
70 # manqala 19/09/2016: Should this be an empty return or should it throw and exception?
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010071 return
72
73 if from_currency == to_currency:
74 return 1
75
Chude Osiegbu7e74fb42016-09-19 00:59:25 +010076 # 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
Chude Osiegbu256ec172016-09-19 03:53:37 +010077 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")
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010078 if entries:
79 return flt(entries[0].exchange_rate)
Rushabh Mehta746fd902015-10-15 11:50:38 +053080
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010081 try:
82 cache = frappe.cache()
83 key = "currency_exchange_rate:{0}:{1}".format(from_currency, to_currency)
84 value = cache.get(key)
Rushabh Mehta9f436a72015-10-15 11:57:46 +053085
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010086 if not value:
87 import requests
88 response = requests.get("http://api.fixer.io/latest", params={
89 "base": from_currency,
90 "symbols": to_currency
91 })
92 # expire in 6 hours
93 response.raise_for_status()
94 value = response.json()["rates"][to_currency]
95 cache.setex(key, value, 6 * 60 * 60)
Anand Doshi70f57eb2015-11-27 14:37:40 +053096
Chude Osiegbu7be3aa32016-09-05 23:35:00 +010097 return flt(value)
98 except:
Chude Osiegbu256ec172016-09-19 03:53:37 +010099 frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}").format(from_currency, to_currency, translation_date))
Chude Osiegbu7be3aa32016-09-05 23:35:00 +0100100 return 0.0