blob: c9c9c9c6df650b7844847d5feb46deb90a1bd3e9 [file] [log] [blame]
Sagar Vora776b56c2023-04-04 19:24:07 +05301import functools
Rushabh Mehta7231f292017-07-13 15:00:56 +05302import inspect
Chillar Anand915b3432021-09-02 16:44:59 +05303
Rushabh Mehta86a824c2016-04-15 16:44:44 +05304import frappe
Chillar Anand915b3432021-09-02 16:44:59 +05305
Ankush Menatfcbd25f2022-04-08 17:24:10 +05306__version__ = "14.0.0-dev"
7
Anand Doshi227b2382016-06-09 16:29:12 +05308
Rushabh Mehta86a824c2016-04-15 16:44:44 +05309def get_default_company(user=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053010 """Get default company for user"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053011 from frappe.defaults import get_user_default_as_list
12
13 if not user:
14 user = frappe.session.user
15
Ankush Menat494bd9e2022-03-28 18:52:46 +053016 companies = get_user_default_as_list(user, "company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053017 if companies:
18 default_company = companies[0]
19 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053020 default_company = frappe.db.get_single_value("Global Defaults", "default_company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053021
22 return default_company
23
tundebabzya1091412017-05-19 07:12:45 +010024
Rushabh Mehta86a824c2016-04-15 16:44:44 +053025def get_default_currency():
Ankush Menat494bd9e2022-03-28 18:52:46 +053026 """Returns the currency of the default company"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053027 company = get_default_company()
28 if company:
Ankush Menat494bd9e2022-03-28 18:52:46 +053029 return frappe.get_cached_value("Company", company, "default_currency")
30
Rushabh Mehta66958302017-01-16 16:57:53 +053031
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053032def get_default_cost_center(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053033 """Returns the default cost center of the company"""
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053034 if not company:
35 return None
36
37 if not frappe.flags.company_cost_center:
38 frappe.flags.company_cost_center = {}
39 if not company in frappe.flags.company_cost_center:
Ankush Menat494bd9e2022-03-28 18:52:46 +053040 frappe.flags.company_cost_center[company] = frappe.get_cached_value(
41 "Company", company, "cost_center"
42 )
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053043 return frappe.flags.company_cost_center[company]
tundebabzya1091412017-05-19 07:12:45 +010044
Ankush Menat494bd9e2022-03-28 18:52:46 +053045
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053046def get_company_currency(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053047 """Returns the default company currency"""
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053048 if not frappe.flags.company_currency:
49 frappe.flags.company_currency = {}
50 if not company in frappe.flags.company_currency:
Ankush Menat494bd9e2022-03-28 18:52:46 +053051 frappe.flags.company_currency[company] = frappe.db.get_value(
52 "Company", company, "default_currency", cache=True
53 )
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053054 return frappe.flags.company_currency[company]
55
Ankush Menat494bd9e2022-03-28 18:52:46 +053056
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053057def set_perpetual_inventory(enable=1, company=None):
58 if not company:
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053059 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010060
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053061 company = frappe.get_doc("Company", company)
62 company.enable_perpetual_inventory = enable
63 company.save()
tundebabzya1091412017-05-19 07:12:45 +010064
Ankush Menat494bd9e2022-03-28 18:52:46 +053065
Ankush Menatd7148ad2021-12-20 22:00:31 +053066def encode_company_abbr(name, company=None, abbr=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053067 """Returns name encoded with company abbreviation"""
68 company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr")
Rushabh Mehta66958302017-01-16 16:57:53 +053069 parts = name.rsplit(" - ", 1)
70
71 if parts[-1].lower() != company_abbr.lower():
72 parts.append(company_abbr)
73
tundebabzya1091412017-05-19 07:12:45 +010074 return " - ".join(parts)
75
Ankush Menat494bd9e2022-03-28 18:52:46 +053076
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053077def is_perpetual_inventory_enabled(company):
78 if not company:
79 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010080
Ankush Menat494bd9e2022-03-28 18:52:46 +053081 if not hasattr(frappe.local, "enable_perpetual_inventory"):
Rushabh Mehta777526e2017-06-20 12:14:32 +053082 frappe.local.enable_perpetual_inventory = {}
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053083
Rushabh Mehta777526e2017-06-20 12:14:32 +053084 if not company in frappe.local.enable_perpetual_inventory:
Ankush Menat494bd9e2022-03-28 18:52:46 +053085 frappe.local.enable_perpetual_inventory[company] = (
86 frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
87 )
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053088
Rushabh Mehta777526e2017-06-20 12:14:32 +053089 return frappe.local.enable_perpetual_inventory[company]
Rushabh Mehta7231f292017-07-13 15:00:56 +053090
Ankush Menat494bd9e2022-03-28 18:52:46 +053091
Rohit Waghchauref689d012018-05-17 23:29:37 +053092def get_default_finance_book(company=None):
93 if not company:
94 company = get_default_company()
95
Ankush Menat494bd9e2022-03-28 18:52:46 +053096 if not hasattr(frappe.local, "default_finance_book"):
Rohit Waghchauref689d012018-05-17 23:29:37 +053097 frappe.local.default_finance_book = {}
98
99 if not company in frappe.local.default_finance_book:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530100 frappe.local.default_finance_book[company] = frappe.get_cached_value(
101 "Company", company, "default_finance_book"
102 )
Rohit Waghchauref689d012018-05-17 23:29:37 +0530103
104 return frappe.local.default_finance_book[company]
105
Ankush Menat494bd9e2022-03-28 18:52:46 +0530106
rohitwaghchauree8358f32018-05-16 11:02:26 +0530107def get_party_account_type(party_type):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530108 if not hasattr(frappe.local, "party_account_types"):
rohitwaghchauree8358f32018-05-16 11:02:26 +0530109 frappe.local.party_account_types = {}
110
111 if not party_type in frappe.local.party_account_types:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530112 frappe.local.party_account_types[party_type] = (
113 frappe.db.get_value("Party Type", party_type, "account_type") or ""
114 )
rohitwaghchauree8358f32018-05-16 11:02:26 +0530115
116 return frappe.local.party_account_types[party_type]
117
Ankush Menat494bd9e2022-03-28 18:52:46 +0530118
Rushabh Mehta7231f292017-07-13 15:00:56 +0530119def get_region(company=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530120 """Return the default country based on flag, company or global settings
Rushabh Mehta7231f292017-07-13 15:00:56 +0530121
122 You can also set global company flag in `frappe.flags.company`
Ankush Menat494bd9e2022-03-28 18:52:46 +0530123 """
Sagar Vora2fa641f2023-04-04 17:50:31 +0530124
125 if not company:
126 company = frappe.local.flags.company
127
128 if company:
129 return frappe.get_cached_value("Company", company, "country")
130
131 return frappe.flags.country or frappe.get_system_settings("country")
Ankush Menat494bd9e2022-03-28 18:52:46 +0530132
Rushabh Mehta7231f292017-07-13 15:00:56 +0530133
Rushabh Mehta393becc2017-07-13 15:49:37 +0530134def allow_regional(fn):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530135 """Decorator to make a function regionally overridable
Rushabh Mehta393becc2017-07-13 15:49:37 +0530136
137 Example:
138 @erpnext.allow_regional
139 def myfunction():
Ankush Menat494bd9e2022-03-28 18:52:46 +0530140 pass"""
Sagar Vorab68a9962022-02-09 16:56:24 +0530141
Sagar Vora776b56c2023-04-04 19:24:07 +0530142 @functools.wraps(fn)
Rushabh Mehta7231f292017-07-13 15:00:56 +0530143 def caller(*args, **kwargs):
Sagar Vorab68a9962022-02-09 16:56:24 +0530144 overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
145 function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"
146
147 if not overrides or function_path not in overrides:
Rushabh Mehta7231f292017-07-13 15:00:56 +0530148 return fn(*args, **kwargs)
149
Sagar Vorab68a9962022-02-09 16:56:24 +0530150 # Priority given to last installed app
151 return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
152
Rushabh Mehta7231f292017-07-13 15:00:56 +0530153 return caller