blob: 932e190c9b77ce4666961d2eb4a4b4f08a1b7de4 [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
Deepesh Garg617deda2022-04-08 13:38:27 +05305__version__ = '14.0.0-dev'
Anand Doshi227b2382016-06-09 16:29:12 +05306
Rushabh Mehta86a824c2016-04-15 16:44:44 +05307def get_default_company(user=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +05308 """Get default company for user"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +05309 from frappe.defaults import get_user_default_as_list
10
11 if not user:
12 user = frappe.session.user
13
Ankush Menat494bd9e2022-03-28 18:52:46 +053014 companies = get_user_default_as_list(user, "company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053015 if companies:
16 default_company = companies[0]
17 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053018 default_company = frappe.db.get_single_value("Global Defaults", "default_company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053019
20 return default_company
21
tundebabzya1091412017-05-19 07:12:45 +010022
Rushabh Mehta86a824c2016-04-15 16:44:44 +053023def get_default_currency():
Ankush Menat494bd9e2022-03-28 18:52:46 +053024 """Returns the currency of the default company"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053025 company = get_default_company()
26 if company:
Ankush Menat494bd9e2022-03-28 18:52:46 +053027 return frappe.get_cached_value("Company", company, "default_currency")
28
Rushabh Mehta66958302017-01-16 16:57:53 +053029
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053030def get_default_cost_center(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053031 """Returns the default cost center of the company"""
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053032 if not company:
33 return None
34
35 if not frappe.flags.company_cost_center:
36 frappe.flags.company_cost_center = {}
37 if not company in frappe.flags.company_cost_center:
Ankush Menat494bd9e2022-03-28 18:52:46 +053038 frappe.flags.company_cost_center[company] = frappe.get_cached_value(
39 "Company", company, "cost_center"
40 )
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053041 return frappe.flags.company_cost_center[company]
tundebabzya1091412017-05-19 07:12:45 +010042
Ankush Menat494bd9e2022-03-28 18:52:46 +053043
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053044def get_company_currency(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053045 """Returns the default company currency"""
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053046 if not frappe.flags.company_currency:
47 frappe.flags.company_currency = {}
48 if not company in frappe.flags.company_currency:
Ankush Menat494bd9e2022-03-28 18:52:46 +053049 frappe.flags.company_currency[company] = frappe.db.get_value(
50 "Company", company, "default_currency", cache=True
51 )
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053052 return frappe.flags.company_currency[company]
53
Ankush Menat494bd9e2022-03-28 18:52:46 +053054
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053055def set_perpetual_inventory(enable=1, company=None):
56 if not company:
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053057 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010058
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053059 company = frappe.get_doc("Company", company)
60 company.enable_perpetual_inventory = enable
61 company.save()
tundebabzya1091412017-05-19 07:12:45 +010062
Ankush Menat494bd9e2022-03-28 18:52:46 +053063
Ankush Menatd7148ad2021-12-20 22:00:31 +053064def encode_company_abbr(name, company=None, abbr=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053065 """Returns name encoded with company abbreviation"""
66 company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr")
Rushabh Mehta66958302017-01-16 16:57:53 +053067 parts = name.rsplit(" - ", 1)
68
69 if parts[-1].lower() != company_abbr.lower():
70 parts.append(company_abbr)
71
tundebabzya1091412017-05-19 07:12:45 +010072 return " - ".join(parts)
73
Ankush Menat494bd9e2022-03-28 18:52:46 +053074
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053075def is_perpetual_inventory_enabled(company):
76 if not company:
77 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010078
Ankush Menat494bd9e2022-03-28 18:52:46 +053079 if not hasattr(frappe.local, "enable_perpetual_inventory"):
Rushabh Mehta777526e2017-06-20 12:14:32 +053080 frappe.local.enable_perpetual_inventory = {}
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053081
Rushabh Mehta777526e2017-06-20 12:14:32 +053082 if not company in frappe.local.enable_perpetual_inventory:
Ankush Menat494bd9e2022-03-28 18:52:46 +053083 frappe.local.enable_perpetual_inventory[company] = (
84 frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
85 )
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053086
Rushabh Mehta777526e2017-06-20 12:14:32 +053087 return frappe.local.enable_perpetual_inventory[company]
Rushabh Mehta7231f292017-07-13 15:00:56 +053088
Ankush Menat494bd9e2022-03-28 18:52:46 +053089
Rohit Waghchauref689d012018-05-17 23:29:37 +053090def get_default_finance_book(company=None):
91 if not company:
92 company = get_default_company()
93
Ankush Menat494bd9e2022-03-28 18:52:46 +053094 if not hasattr(frappe.local, "default_finance_book"):
Rohit Waghchauref689d012018-05-17 23:29:37 +053095 frappe.local.default_finance_book = {}
96
97 if not company in frappe.local.default_finance_book:
Ankush Menat494bd9e2022-03-28 18:52:46 +053098 frappe.local.default_finance_book[company] = frappe.get_cached_value(
99 "Company", company, "default_finance_book"
100 )
Rohit Waghchauref689d012018-05-17 23:29:37 +0530101
102 return frappe.local.default_finance_book[company]
103
Ankush Menat494bd9e2022-03-28 18:52:46 +0530104
rohitwaghchauree8358f32018-05-16 11:02:26 +0530105def get_party_account_type(party_type):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530106 if not hasattr(frappe.local, "party_account_types"):
rohitwaghchauree8358f32018-05-16 11:02:26 +0530107 frappe.local.party_account_types = {}
108
109 if not party_type in frappe.local.party_account_types:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530110 frappe.local.party_account_types[party_type] = (
111 frappe.db.get_value("Party Type", party_type, "account_type") or ""
112 )
rohitwaghchauree8358f32018-05-16 11:02:26 +0530113
114 return frappe.local.party_account_types[party_type]
115
Ankush Menat494bd9e2022-03-28 18:52:46 +0530116
Rushabh Mehta7231f292017-07-13 15:00:56 +0530117def get_region(company=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530118 """Return the default country based on flag, company or global settings
Rushabh Mehta7231f292017-07-13 15:00:56 +0530119
120 You can also set global company flag in `frappe.flags.company`
Ankush Menat494bd9e2022-03-28 18:52:46 +0530121 """
Rushabh Mehta7231f292017-07-13 15:00:56 +0530122 if company or frappe.flags.company:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530123 return frappe.get_cached_value("Company", company or frappe.flags.company, "country")
Rushabh Mehta7231f292017-07-13 15:00:56 +0530124 elif frappe.flags.country:
125 return frappe.flags.country
126 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530127 return frappe.get_system_settings("country")
128
Rushabh Mehta7231f292017-07-13 15:00:56 +0530129
Rushabh Mehta393becc2017-07-13 15:49:37 +0530130def allow_regional(fn):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530131 """Decorator to make a function regionally overridable
Rushabh Mehta393becc2017-07-13 15:49:37 +0530132
133 Example:
134 @erpnext.allow_regional
135 def myfunction():
Ankush Menat494bd9e2022-03-28 18:52:46 +0530136 pass"""
Sagar Vorab68a9962022-02-09 16:56:24 +0530137
Rushabh Mehta7231f292017-07-13 15:00:56 +0530138 def caller(*args, **kwargs):
Sagar Vorab68a9962022-02-09 16:56:24 +0530139 overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
140 function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"
141
142 if not overrides or function_path not in overrides:
Rushabh Mehta7231f292017-07-13 15:00:56 +0530143 return fn(*args, **kwargs)
144
Sagar Vorab68a9962022-02-09 16:56:24 +0530145 # Priority given to last installed app
146 return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
147
Rushabh Mehta7231f292017-07-13 15:00:56 +0530148 return caller