blob: e72e11a76118e5901bd4faee0854b3105db20516 [file] [log] [blame]
Rushabh Mehta7231f292017-07-13 15:00:56 +05301import inspect
Chillar Anand915b3432021-09-02 16:44:59 +05302
Rushabh Mehta86a824c2016-04-15 16:44:44 +05303import frappe
Chillar Anand915b3432021-09-02 16:44:59 +05304
Frappe PR Bote66aab72022-04-26 07:52:13 +00005<<<<<<< HEAD
Ankush Menatfcbd25f2022-04-08 17:24:10 +05306__version__ = "14.0.0-dev"
Frappe PR Bote66aab72022-04-26 07:52:13 +00007=======
8from erpnext.hooks import regional_overrides
9
Frappe PR Botb3964ee2022-05-03 08:51:32 +000010<<<<<<< HEAD
Frappe PR Bote66aab72022-04-26 07:52:13 +000011__version__ = "13.27.1"
12>>>>>>> 096dcf0e54 (chore(release): Bumped to Version 13.27.1)
Frappe PR Botb3964ee2022-05-03 08:51:32 +000013=======
14__version__ = "13.28.0"
15>>>>>>> 8cc2ea0ddb (chore(release): Bumped to Version 13.28.0)
Ankush Menatfcbd25f2022-04-08 17:24:10 +053016
Anand Doshi227b2382016-06-09 16:29:12 +053017
Rushabh Mehta86a824c2016-04-15 16:44:44 +053018def get_default_company(user=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053019 """Get default company for user"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053020 from frappe.defaults import get_user_default_as_list
21
22 if not user:
23 user = frappe.session.user
24
Ankush Menat494bd9e2022-03-28 18:52:46 +053025 companies = get_user_default_as_list(user, "company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053026 if companies:
27 default_company = companies[0]
28 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053029 default_company = frappe.db.get_single_value("Global Defaults", "default_company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053030
31 return default_company
32
tundebabzya1091412017-05-19 07:12:45 +010033
Rushabh Mehta86a824c2016-04-15 16:44:44 +053034def get_default_currency():
Ankush Menat494bd9e2022-03-28 18:52:46 +053035 """Returns the currency of the default company"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053036 company = get_default_company()
37 if company:
Ankush Menat494bd9e2022-03-28 18:52:46 +053038 return frappe.get_cached_value("Company", company, "default_currency")
39
Rushabh Mehta66958302017-01-16 16:57:53 +053040
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053041def get_default_cost_center(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053042 """Returns the default cost center of the company"""
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053043 if not company:
44 return None
45
46 if not frappe.flags.company_cost_center:
47 frappe.flags.company_cost_center = {}
48 if not company in frappe.flags.company_cost_center:
Ankush Menat494bd9e2022-03-28 18:52:46 +053049 frappe.flags.company_cost_center[company] = frappe.get_cached_value(
50 "Company", company, "cost_center"
51 )
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053052 return frappe.flags.company_cost_center[company]
tundebabzya1091412017-05-19 07:12:45 +010053
Ankush Menat494bd9e2022-03-28 18:52:46 +053054
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053055def get_company_currency(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053056 """Returns the default company currency"""
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053057 if not frappe.flags.company_currency:
58 frappe.flags.company_currency = {}
59 if not company in frappe.flags.company_currency:
Ankush Menat494bd9e2022-03-28 18:52:46 +053060 frappe.flags.company_currency[company] = frappe.db.get_value(
61 "Company", company, "default_currency", cache=True
62 )
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053063 return frappe.flags.company_currency[company]
64
Ankush Menat494bd9e2022-03-28 18:52:46 +053065
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053066def set_perpetual_inventory(enable=1, company=None):
67 if not company:
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053068 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010069
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053070 company = frappe.get_doc("Company", company)
71 company.enable_perpetual_inventory = enable
72 company.save()
tundebabzya1091412017-05-19 07:12:45 +010073
Ankush Menat494bd9e2022-03-28 18:52:46 +053074
Ankush Menatd7148ad2021-12-20 22:00:31 +053075def encode_company_abbr(name, company=None, abbr=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053076 """Returns name encoded with company abbreviation"""
77 company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr")
Rushabh Mehta66958302017-01-16 16:57:53 +053078 parts = name.rsplit(" - ", 1)
79
80 if parts[-1].lower() != company_abbr.lower():
81 parts.append(company_abbr)
82
tundebabzya1091412017-05-19 07:12:45 +010083 return " - ".join(parts)
84
Ankush Menat494bd9e2022-03-28 18:52:46 +053085
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053086def is_perpetual_inventory_enabled(company):
87 if not company:
88 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010089
Ankush Menat494bd9e2022-03-28 18:52:46 +053090 if not hasattr(frappe.local, "enable_perpetual_inventory"):
Rushabh Mehta777526e2017-06-20 12:14:32 +053091 frappe.local.enable_perpetual_inventory = {}
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053092
Rushabh Mehta777526e2017-06-20 12:14:32 +053093 if not company in frappe.local.enable_perpetual_inventory:
Ankush Menat494bd9e2022-03-28 18:52:46 +053094 frappe.local.enable_perpetual_inventory[company] = (
95 frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
96 )
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053097
Rushabh Mehta777526e2017-06-20 12:14:32 +053098 return frappe.local.enable_perpetual_inventory[company]
Rushabh Mehta7231f292017-07-13 15:00:56 +053099
Ankush Menat494bd9e2022-03-28 18:52:46 +0530100
Rohit Waghchauref689d012018-05-17 23:29:37 +0530101def get_default_finance_book(company=None):
102 if not company:
103 company = get_default_company()
104
Ankush Menat494bd9e2022-03-28 18:52:46 +0530105 if not hasattr(frappe.local, "default_finance_book"):
Rohit Waghchauref689d012018-05-17 23:29:37 +0530106 frappe.local.default_finance_book = {}
107
108 if not company in frappe.local.default_finance_book:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530109 frappe.local.default_finance_book[company] = frappe.get_cached_value(
110 "Company", company, "default_finance_book"
111 )
Rohit Waghchauref689d012018-05-17 23:29:37 +0530112
113 return frappe.local.default_finance_book[company]
114
Ankush Menat494bd9e2022-03-28 18:52:46 +0530115
rohitwaghchauree8358f32018-05-16 11:02:26 +0530116def get_party_account_type(party_type):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530117 if not hasattr(frappe.local, "party_account_types"):
rohitwaghchauree8358f32018-05-16 11:02:26 +0530118 frappe.local.party_account_types = {}
119
120 if not party_type in frappe.local.party_account_types:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530121 frappe.local.party_account_types[party_type] = (
122 frappe.db.get_value("Party Type", party_type, "account_type") or ""
123 )
rohitwaghchauree8358f32018-05-16 11:02:26 +0530124
125 return frappe.local.party_account_types[party_type]
126
Ankush Menat494bd9e2022-03-28 18:52:46 +0530127
Rushabh Mehta7231f292017-07-13 15:00:56 +0530128def get_region(company=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530129 """Return the default country based on flag, company or global settings
Rushabh Mehta7231f292017-07-13 15:00:56 +0530130
131 You can also set global company flag in `frappe.flags.company`
Ankush Menat494bd9e2022-03-28 18:52:46 +0530132 """
Rushabh Mehta7231f292017-07-13 15:00:56 +0530133 if company or frappe.flags.company:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530134 return frappe.get_cached_value("Company", company or frappe.flags.company, "country")
Rushabh Mehta7231f292017-07-13 15:00:56 +0530135 elif frappe.flags.country:
136 return frappe.flags.country
137 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530138 return frappe.get_system_settings("country")
139
Rushabh Mehta7231f292017-07-13 15:00:56 +0530140
Rushabh Mehta393becc2017-07-13 15:49:37 +0530141def allow_regional(fn):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530142 """Decorator to make a function regionally overridable
Rushabh Mehta393becc2017-07-13 15:49:37 +0530143
144 Example:
145 @erpnext.allow_regional
146 def myfunction():
Ankush Menat494bd9e2022-03-28 18:52:46 +0530147 pass"""
Sagar Vorab68a9962022-02-09 16:56:24 +0530148
Rushabh Mehta7231f292017-07-13 15:00:56 +0530149 def caller(*args, **kwargs):
Sagar Vorab68a9962022-02-09 16:56:24 +0530150 overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
151 function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"
152
153 if not overrides or function_path not in overrides:
Rushabh Mehta7231f292017-07-13 15:00:56 +0530154 return fn(*args, **kwargs)
155
Sagar Vorab68a9962022-02-09 16:56:24 +0530156 # Priority given to last installed app
157 return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
158
Rushabh Mehta7231f292017-07-13 15:00:56 +0530159 return caller