blob: 2200e6cd1df080123c27787e87817a3634b71447 [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
Rushabh Mehta793ba6b2014-02-14 15:47:51 +05304import frappe
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +05305from frappe import _
Chillar Anand915b3432021-09-02 16:44:59 +05306from frappe.utils import add_days, flt, get_datetime_str, nowdate
Ankush Menat51873da2022-03-22 11:13:15 +05307from frappe.utils.data import now_datetime
Ankush Menat457d6162022-01-21 21:40:47 +05308from frappe.utils.nestedset import get_ancestors_of, get_root_of # noqa
Chillar Anand915b3432021-09-02 16:44:59 +05309
Neil Trini Lasrado771fbb82018-08-24 15:15:56 +053010from erpnext import get_default_company
Rushabh Mehtacf99dc02017-02-09 18:06:11 +053011
Chillar Anand915b3432021-09-02 16:44:59 +053012
Rushabh Mehtaa1516472014-04-30 19:38:28 +053013def before_tests():
Nabin Hait87d70272016-12-08 14:43:11 +053014 frappe.clear_cache()
15 # complete setup if missing
16 from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
Ankush Menat9daea6f2022-03-25 22:59:20 +053017
18 if not frappe.db.a_row_exists("Company"):
19 current_year = now_datetime().year
Ankush Menat494bd9e2022-03-28 18:52:46 +053020 setup_complete(
21 {
22 "currency": "USD",
23 "full_name": "Test User",
24 "company_name": "Wind Power LLC",
25 "timezone": "America/New_York",
26 "company_abbr": "WP",
27 "industry": "Manufacturing",
28 "country": "United States",
29 "fy_start_date": f"{current_year}-01-01",
30 "fy_end_date": f"{current_year}-12-31",
31 "language": "english",
32 "company_tagline": "Testing",
33 "email": "test@erpnext.com",
34 "password": "test",
35 "chart_of_accounts": "Standard",
36 "domains": ["Manufacturing"],
37 }
38 )
Ankush Menat9daea6f2022-03-25 22:59:20 +053039 _enable_all_domains()
Rushabh Mehtaa1516472014-04-30 19:38:28 +053040
Nabin Hait87d70272016-12-08 14:43:11 +053041 frappe.db.sql("delete from `tabLeave Allocation`")
42 frappe.db.sql("delete from `tabLeave Application`")
43 frappe.db.sql("delete from `tabSalary Slip`")
44 frappe.db.sql("delete from `tabItem Price`")
Rushabh Mehta5bd39422015-08-03 15:09:48 +053045
Ankush Menat9daea6f2022-03-25 22:59:20 +053046 _enable_all_roles_for_admin()
47
Ankush Menata8375232021-12-05 22:07:14 +053048 set_defaults_for_tests()
Rushabh Mehta5bd39422015-08-03 15:09:48 +053049
Nabin Hait87d70272016-12-08 14:43:11 +053050 frappe.db.commit()
Anand Doshidffec8f2014-07-01 17:45:15 +053051
Ankush Menat494bd9e2022-03-28 18:52:46 +053052
Rushabh Mehta66fa1ff2015-05-07 12:25:33 +053053@frappe.whitelist()
Shreya0db85062018-05-15 11:25:46 +053054def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=None):
Nabin Haitad4f1c72016-12-09 12:14:47 +053055 if not (from_currency and to_currency):
Nabin Hait87d70272016-12-08 14:43:11 +053056 # manqala 19/09/2016: Should this be an empty return or should it throw and exception?
57 return
Nabin Hait87d70272016-12-08 14:43:11 +053058 if from_currency == to_currency:
59 return 1
Rushabh Mehtacf99dc02017-02-09 18:06:11 +053060
tundebabzyab5b0302017-09-21 10:20:39 +010061 if not transaction_date:
62 transaction_date = nowdate()
tundebabzyab5b0302017-09-21 10:20:39 +010063 currency_settings = frappe.get_doc("Accounts Settings").as_dict()
64 allow_stale_rates = currency_settings.get("allow_stale")
65
66 filters = [
67 ["date", "<=", get_datetime_str(transaction_date)],
68 ["from_currency", "=", from_currency],
Ankush Menat494bd9e2022-03-28 18:52:46 +053069 ["to_currency", "=", to_currency],
tundebabzyab5b0302017-09-21 10:20:39 +010070 ]
Shreyab547cdd2018-05-15 16:58:45 +053071
Shreya0db85062018-05-15 11:25:46 +053072 if args == "for_buying":
73 filters.append(["for_buying", "=", "1"])
74 elif args == "for_selling":
Shreyab547cdd2018-05-15 16:58:45 +053075 filters.append(["for_selling", "=", "1"])
76
tundebabzyab5b0302017-09-21 10:20:39 +010077 if not allow_stale_rates:
78 stale_days = currency_settings.get("stale_days")
79 checkpoint_date = add_days(transaction_date, -stale_days)
80 filters.append(["date", ">", get_datetime_str(checkpoint_date)])
81
Nabin Hait288a18e2016-12-08 15:36:23 +053082 # cksgb 19/09/2016: get last entry in Currency Exchange with from_currency and to_currency.
tundebabzyab5b0302017-09-21 10:20:39 +010083 entries = frappe.get_all(
Ankush Menat494bd9e2022-03-28 18:52:46 +053084 "Currency Exchange", fields=["exchange_rate"], filters=filters, order_by="date desc", limit=1
85 )
Nabin Hait87d70272016-12-08 14:43:11 +053086 if entries:
87 return flt(entries[0].exchange_rate)
Rushabh Mehta746fd902015-10-15 11:50:38 +053088
Nabin Hait87d70272016-12-08 14:43:11 +053089 try:
90 cache = frappe.cache()
Dany Roberte9bc2f32021-06-28 19:01:52 +053091 key = "currency_exchange_rate_{0}:{1}:{2}".format(transaction_date, from_currency, to_currency)
Nabin Hait87d70272016-12-08 14:43:11 +053092 value = cache.get(key)
Rushabh Mehta9f436a72015-10-15 11:57:46 +053093
Nabin Hait87d70272016-12-08 14:43:11 +053094 if not value:
95 import requests
Ankush Menat494bd9e2022-03-28 18:52:46 +053096
97 settings = frappe.get_cached_doc("Currency Exchange Settings")
rtdany10a86d9c92021-09-03 19:21:06 +053098 req_params = {
rtdany10e0938632021-09-03 15:03:47 +053099 "transaction_date": transaction_date,
100 "from_currency": from_currency,
Ankush Menat494bd9e2022-03-28 18:52:46 +0530101 "to_currency": to_currency,
rtdany10e0938632021-09-03 15:03:47 +0530102 }
103 params = {}
104 for row in settings.req_params:
rtdany10227466c2021-09-04 14:04:56 +0530105 params[row.key] = format_ces_api(row.value, req_params)
rtdany10a86d9c92021-09-03 19:21:06 +0530106 response = requests.get(format_ces_api(settings.api_endpoint, req_params), params=params)
Nabin Hait87d70272016-12-08 14:43:11 +0530107 # expire in 6 hours
108 response.raise_for_status()
rtdany10e0938632021-09-03 15:03:47 +0530109 value = response.json()
110 for res_key in settings.result_key:
rtdany10a86d9c92021-09-03 19:21:06 +0530111 value = value[format_ces_api(str(res_key.key), req_params)]
Dany Robert909995a2021-07-29 15:58:27 +0530112 cache.setex(name=key, time=21600, value=flt(value))
Nabin Hait87d70272016-12-08 14:43:11 +0530113 return flt(value)
Ankush Menat694ae812021-09-01 14:40:56 +0530114 except Exception:
Faris Ansaribadf1c42019-01-24 16:28:53 +0530115 frappe.log_error(title="Get Exchange Rate")
Ankush Menat494bd9e2022-03-28 18:52:46 +0530116 frappe.msgprint(
117 _(
118 "Unable to find exchange rate for {0} to {1} for key date {2}. Please create a Currency Exchange record manually"
119 ).format(from_currency, to_currency, transaction_date)
120 )
Makarand Bauskarddd48452017-07-06 11:09:34 +0530121 return 0.0
Makarand Bauskard0109a62017-07-26 16:29:22 +0530122
Ankush Menat494bd9e2022-03-28 18:52:46 +0530123
Dany Robert1f8be842021-11-04 05:12:09 +0000124def format_ces_api(data, param):
rtdany10a86d9c92021-09-03 19:21:06 +0530125 return data.format(
Dany Robert1f8be842021-11-04 05:12:09 +0000126 transaction_date=param.get("transaction_date"),
127 to_currency=param.get("to_currency"),
Ankush Menat494bd9e2022-03-28 18:52:46 +0530128 from_currency=param.get("from_currency"),
rtdany10a86d9c92021-09-03 19:21:06 +0530129 )
130
Ankush Menat494bd9e2022-03-28 18:52:46 +0530131
Makarand Bauskard0109a62017-07-26 16:29:22 +0530132def enable_all_roles_and_domains():
Ankush Menat494bd9e2022-03-28 18:52:46 +0530133 """enable all roles and domain for testing"""
Ankush Menat9daea6f2022-03-25 22:59:20 +0530134 _enable_all_domains()
135 _enable_all_roles_for_admin()
136
137
138def _enable_all_domains():
139 domains = frappe.get_all("Domain", pluck="name")
Makarand Bauskard0109a62017-07-26 16:29:22 +0530140 if not domains:
141 return
Ankush Menat494bd9e2022-03-28 18:52:46 +0530142 frappe.get_single("Domain Settings").set_active_domains(domains)
Makarand Bauskard0109a62017-07-26 16:29:22 +0530143
Ankush Menat9daea6f2022-03-25 22:59:20 +0530144
145def _enable_all_roles_for_admin():
Rushabh Mehtabc4e2cd2017-10-17 12:30:34 +0530146 from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
Ankush Menat9daea6f2022-03-25 22:59:20 +0530147
148 all_roles = set(frappe.db.get_values("Role", pluck="name"))
Ankush Menat494bd9e2022-03-28 18:52:46 +0530149 admin_roles = set(
150 frappe.db.get_values("Has Role", {"parent": "Administrator"}, fieldname="role", pluck="role")
151 )
Ankush Menat9daea6f2022-03-25 22:59:20 +0530152
153 if all_roles.difference(admin_roles):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530154 add_all_roles_to("Administrator")
Ankush Menat9daea6f2022-03-25 22:59:20 +0530155
Manas Solanki966f1412017-11-23 15:22:10 +0530156
Ankush Menata8375232021-12-05 22:07:14 +0530157def set_defaults_for_tests():
Ankush Menat9daea6f2022-03-25 22:59:20 +0530158 defaults = {
159 "customer_group": get_root_of("Customer Group"),
160 "territory": get_root_of("Territory"),
161 }
162 frappe.db.set_single_value("Selling Settings", defaults)
163 for key, value in defaults.items():
Ankush Menat494bd9e2022-03-28 18:52:46 +0530164 frappe.db.set_default(key, value)
Ankush Menat51873da2022-03-22 11:13:15 +0530165 frappe.db.set_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing", 0)
166
Manas Solanki966f1412017-11-23 15:22:10 +0530167
168def insert_record(records):
Ankush Menate401ad32022-03-26 12:53:39 +0530169 from frappe.desk.page.setup_wizard.setup_wizard import make_records
170
171 make_records(records)
Neil Trini Lasrado771fbb82018-08-24 15:15:56 +0530172
Ankush Menat494bd9e2022-03-28 18:52:46 +0530173
Neil Trini Lasrado771fbb82018-08-24 15:15:56 +0530174def welcome_email():
Chinmay D. Pai612e58d2020-03-05 10:08:43 +0530175 site_name = get_default_company() or "ERPNext"
Suraj Shetty48e9bc32020-01-29 15:06:18 +0530176 title = _("Welcome to {0}").format(site_name)
bcornwellmottb2638762019-03-05 16:44:02 -0800177 return title