2015-03-03 14:55:30 +05:30
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
2013-08-05 14:59:54 +05:30
# License: GNU General Public License v3. See license.txt
2013-01-17 15:44:57 +05:30
from __future__ import unicode_literals
2014-02-14 15:47:51 +05:30
import frappe
2017-03-31 12:44:29 +05:30
from frappe import _
2017-09-21 10:20:39 +01:00
from frappe . utils import flt , add_days
2016-12-09 12:14:47 +05:30
from frappe . utils import get_datetime_str , nowdate
2018-08-24 15:15:56 +05:30
from erpnext import get_default_company
2017-02-09 18:06:11 +05:30
2013-06-21 17:55:31 +05:30
def get_root_of ( doctype ) :
2016-12-08 14:43:11 +05:30
""" 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
2014-04-14 19:20:45 +05:30
2013-06-21 17:55:31 +05:30
def get_ancestors_of ( doctype , name ) :
2016-12-08 14:43:11 +05:30
""" 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 [ ]
2013-06-21 17:55:31 +05:30
2014-04-30 19:38:28 +05:30
def before_tests ( ) :
2016-12-08 14:43:11 +05:30
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 ( {
2021-07-02 23:32:33 +05:30
" currency " : " USD " ,
" full_name " : " Test User " ,
" company_name " : " Wind Power LLC " ,
" timezone " : " America/New_York " ,
" company_abbr " : " WP " ,
" industry " : " Manufacturing " ,
" country " : " United States " ,
" fy_start_date " : " 2021-01-01 " ,
" fy_end_date " : " 2021-12-31 " ,
" language " : " english " ,
" company_tagline " : " Testing " ,
" email " : " test@erpnext.com " ,
" password " : " test " ,
2017-11-16 17:48:59 +05:30
" chart_of_accounts " : " Standard " ,
2021-07-02 23:32:33 +05:30
" domains " : [ " Manufacturing " ] ,
2016-12-08 14:43:11 +05:30
} )
2014-04-30 19:38:28 +05:30
2016-12-08 14:43:11 +05:30
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` " )
2015-08-03 15:09:48 +05:30
2016-12-08 14:43:11 +05:30
frappe . db . set_value ( " Stock Settings " , None , " auto_insert_price_list_rate_if_missing " , 0 )
2017-07-26 16:29:22 +05:30
enable_all_roles_and_domains ( )
2015-08-03 15:09:48 +05:30
2016-12-08 14:43:11 +05:30
frappe . db . commit ( )
2014-07-01 17:45:15 +05:30
2015-05-07 12:25:33 +05:30
@frappe.whitelist ( )
2018-05-15 11:25:46 +05:30
def get_exchange_rate ( from_currency , to_currency , transaction_date = None , args = None ) :
2016-12-09 12:14:47 +05:30
if not ( from_currency and to_currency ) :
2016-12-08 14:43:11 +05:30
# manqala 19/09/2016: Should this be an empty return or should it throw and exception?
return
if from_currency == to_currency :
return 1
2017-02-09 18:06:11 +05:30
2017-09-21 10:20:39 +01:00
if not transaction_date :
transaction_date = nowdate ( )
currency_settings = frappe . get_doc ( " Accounts Settings " ) . as_dict ( )
allow_stale_rates = currency_settings . get ( " allow_stale " )
filters = [
[ " date " , " <= " , get_datetime_str ( transaction_date ) ] ,
[ " from_currency " , " = " , from_currency ] ,
[ " to_currency " , " = " , to_currency ]
]
2018-05-15 16:58:45 +05:30
2018-05-15 11:25:46 +05:30
if args == " for_buying " :
filters . append ( [ " for_buying " , " = " , " 1 " ] )
elif args == " for_selling " :
2018-05-15 16:58:45 +05:30
filters . append ( [ " for_selling " , " = " , " 1 " ] )
2017-09-21 10:20:39 +01:00
if not allow_stale_rates :
stale_days = currency_settings . get ( " stale_days " )
checkpoint_date = add_days ( transaction_date , - stale_days )
filters . append ( [ " date " , " > " , get_datetime_str ( checkpoint_date ) ] )
2016-12-08 15:36:23 +05:30
# cksgb 19/09/2016: get last entry in Currency Exchange with from_currency and to_currency.
2017-09-21 10:20:39 +01:00
entries = frappe . get_all (
" Currency Exchange " , fields = [ " exchange_rate " ] , filters = filters , order_by = " date desc " ,
limit = 1 )
2016-12-08 14:43:11 +05:30
if entries :
return flt ( entries [ 0 ] . exchange_rate )
2015-10-15 11:50:38 +05:30
2016-12-08 14:43:11 +05:30
try :
cache = frappe . cache ( )
2021-06-28 19:01:52 +05:30
key = " currency_exchange_rate_ {0} : {1} : {2} " . format ( transaction_date , from_currency , to_currency )
2016-12-08 14:43:11 +05:30
value = cache . get ( key )
2015-10-15 11:57:46 +05:30
2016-12-08 14:43:11 +05:30
if not value :
import requests
2021-06-28 19:01:52 +05:30
api_url = " https://api.exchangerate.host/convert "
2017-08-31 10:00:15 +01:00
response = requests . get ( api_url , params = {
2021-06-28 19:01:52 +05:30
" date " : transaction_date ,
" from " : from_currency ,
" to " : to_currency
2016-12-08 14:43:11 +05:30
} )
# expire in 6 hours
response . raise_for_status ( )
2021-06-28 19:01:52 +05:30
value = response . json ( ) [ " result " ]
2021-07-29 15:58:27 +05:30
cache . setex ( name = key , time = 21600 , value = flt ( value ) )
2016-12-08 14:43:11 +05:30
return flt ( value )
except :
2019-01-24 16:28:53 +05:30
frappe . log_error ( title = " Get Exchange Rate " )
2017-05-24 16:18:27 +05:30
frappe . msgprint ( _ ( " Unable to find exchange rate for {0} to {1} for key date {2} . Please create a Currency Exchange record manually " ) . format ( from_currency , to_currency , transaction_date ) )
2017-07-06 11:09:34 +05:30
return 0.0
2017-07-26 16:29:22 +05:30
def enable_all_roles_and_domains ( ) :
""" enable all roles and domain for testing """
# add all roles to users
2017-10-17 12:30:34 +05:30
domains = frappe . get_all ( " Domain " )
2017-07-26 16:29:22 +05:30
if not domains :
return
2017-10-17 12:30:34 +05:30
from frappe . desk . page . setup_wizard . setup_wizard import add_all_roles_to
frappe . get_single ( ' Domain Settings ' ) . set_active_domains ( \
[ d . name for d in domains ] )
add_all_roles_to ( ' Administrator ' )
2017-11-23 15:22:10 +05:30
def insert_record ( records ) :
for r in records :
doc = frappe . new_doc ( r . get ( " doctype " ) )
doc . update ( r )
try :
doc . insert ( ignore_permissions = True )
2018-01-30 13:47:18 +05:30
except frappe . DuplicateEntryError as e :
2017-11-23 15:22:10 +05:30
# pass DuplicateEntryError and continue
if e . args and e . args [ 0 ] == doc . doctype and e . args [ 1 ] == doc . name :
# make sure DuplicateEntryError is for the exact same doc and not a related doc
pass
else :
raise
2018-08-24 15:15:56 +05:30
def welcome_email ( ) :
2020-03-05 10:08:43 +05:30
site_name = get_default_company ( ) or " ERPNext "
2020-01-29 15:06:18 +05:30
title = _ ( " Welcome to {0} " ) . format ( site_name )
2019-03-05 16:44:02 -08:00
return title