blob: e0f0c98e9c94fb932b8b59b963a0fddd7c049495 [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
Ankush Menatfcbd25f2022-04-08 17:24:10 +05305__version__ = "14.0.0-dev"
6
Anand Doshi227b2382016-06-09 16:29:12 +05307
Rushabh Mehta86a824c2016-04-15 16:44:44 +05308def get_default_company(user=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +05309 """Get default company for user"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053010 from frappe.defaults import get_user_default_as_list
11
12 if not user:
13 user = frappe.session.user
14
Ankush Menat494bd9e2022-03-28 18:52:46 +053015 companies = get_user_default_as_list(user, "company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053016 if companies:
17 default_company = companies[0]
18 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053019 default_company = frappe.db.get_single_value("Global Defaults", "default_company")
Rushabh Mehta86a824c2016-04-15 16:44:44 +053020
21 return default_company
22
tundebabzya1091412017-05-19 07:12:45 +010023
Rushabh Mehta86a824c2016-04-15 16:44:44 +053024def get_default_currency():
Ankush Menat494bd9e2022-03-28 18:52:46 +053025 """Returns the currency of the default company"""
Rushabh Mehta86a824c2016-04-15 16:44:44 +053026 company = get_default_company()
27 if company:
Ankush Menat494bd9e2022-03-28 18:52:46 +053028 return frappe.get_cached_value("Company", company, "default_currency")
29
Rushabh Mehta66958302017-01-16 16:57:53 +053030
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053031def get_default_cost_center(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053032 """Returns the default cost center of the company"""
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053033 if not company:
34 return None
35
36 if not frappe.flags.company_cost_center:
37 frappe.flags.company_cost_center = {}
38 if not company in frappe.flags.company_cost_center:
Ankush Menat494bd9e2022-03-28 18:52:46 +053039 frappe.flags.company_cost_center[company] = frappe.get_cached_value(
40 "Company", company, "cost_center"
41 )
rohitwaghchaure2e8232e2017-08-10 11:32:59 +053042 return frappe.flags.company_cost_center[company]
tundebabzya1091412017-05-19 07:12:45 +010043
Ankush Menat494bd9e2022-03-28 18:52:46 +053044
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053045def get_company_currency(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053046 """Returns the default company currency"""
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053047 if not frappe.flags.company_currency:
48 frappe.flags.company_currency = {}
49 if not company in frappe.flags.company_currency:
Ankush Menat494bd9e2022-03-28 18:52:46 +053050 frappe.flags.company_currency[company] = frappe.db.get_value(
51 "Company", company, "default_currency", cache=True
52 )
Rushabh Mehtacc8b2b22017-03-31 12:44:29 +053053 return frappe.flags.company_currency[company]
54
Ankush Menat494bd9e2022-03-28 18:52:46 +053055
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053056def set_perpetual_inventory(enable=1, company=None):
57 if not company:
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053058 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010059
Rohit Waghchaurea5f40942017-06-16 15:21:36 +053060 company = frappe.get_doc("Company", company)
61 company.enable_perpetual_inventory = enable
62 company.save()
tundebabzya1091412017-05-19 07:12:45 +010063
Ankush Menat494bd9e2022-03-28 18:52:46 +053064
Ankush Menatd7148ad2021-12-20 22:00:31 +053065def encode_company_abbr(name, company=None, abbr=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053066 """Returns name encoded with company abbreviation"""
67 company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr")
Rushabh Mehta66958302017-01-16 16:57:53 +053068 parts = name.rsplit(" - ", 1)
69
70 if parts[-1].lower() != company_abbr.lower():
71 parts.append(company_abbr)
72
tundebabzya1091412017-05-19 07:12:45 +010073 return " - ".join(parts)
74
Ankush Menat494bd9e2022-03-28 18:52:46 +053075
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053076def is_perpetual_inventory_enabled(company):
77 if not company:
78 company = "_Test Company" if frappe.flags.in_test else get_default_company()
tundebabzya1091412017-05-19 07:12:45 +010079
Ankush Menat494bd9e2022-03-28 18:52:46 +053080 if not hasattr(frappe.local, "enable_perpetual_inventory"):
Rushabh Mehta777526e2017-06-20 12:14:32 +053081 frappe.local.enable_perpetual_inventory = {}
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053082
Rushabh Mehta777526e2017-06-20 12:14:32 +053083 if not company in frappe.local.enable_perpetual_inventory:
Ankush Menat494bd9e2022-03-28 18:52:46 +053084 frappe.local.enable_perpetual_inventory[company] = (
85 frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
86 )
Rohit Waghchauree9ff1912017-06-19 12:54:59 +053087
Rushabh Mehta777526e2017-06-20 12:14:32 +053088 return frappe.local.enable_perpetual_inventory[company]
Rushabh Mehta7231f292017-07-13 15:00:56 +053089
Ankush Menat494bd9e2022-03-28 18:52:46 +053090
Rohit Waghchauref689d012018-05-17 23:29:37 +053091def get_default_finance_book(company=None):
92 if not company:
93 company = get_default_company()
94
Ankush Menat494bd9e2022-03-28 18:52:46 +053095 if not hasattr(frappe.local, "default_finance_book"):
Rohit Waghchauref689d012018-05-17 23:29:37 +053096 frappe.local.default_finance_book = {}
97
98 if not company in frappe.local.default_finance_book:
Ankush Menat494bd9e2022-03-28 18:52:46 +053099 frappe.local.default_finance_book[company] = frappe.get_cached_value(
100 "Company", company, "default_finance_book"
101 )
Rohit Waghchauref689d012018-05-17 23:29:37 +0530102
103 return frappe.local.default_finance_book[company]
104
Ankush Menat494bd9e2022-03-28 18:52:46 +0530105
rohitwaghchauree8358f32018-05-16 11:02:26 +0530106def get_party_account_type(party_type):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530107 if not hasattr(frappe.local, "party_account_types"):
rohitwaghchauree8358f32018-05-16 11:02:26 +0530108 frappe.local.party_account_types = {}
109
110 if not party_type in frappe.local.party_account_types:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530111 frappe.local.party_account_types[party_type] = (
112 frappe.db.get_value("Party Type", party_type, "account_type") or ""
113 )
rohitwaghchauree8358f32018-05-16 11:02:26 +0530114
115 return frappe.local.party_account_types[party_type]
116
Ankush Menat494bd9e2022-03-28 18:52:46 +0530117
Rushabh Mehta7231f292017-07-13 15:00:56 +0530118def get_region(company=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530119 """Return the default country based on flag, company or global settings
Rushabh Mehta7231f292017-07-13 15:00:56 +0530120
121 You can also set global company flag in `frappe.flags.company`
Ankush Menat494bd9e2022-03-28 18:52:46 +0530122 """
Rushabh Mehta7231f292017-07-13 15:00:56 +0530123 if company or frappe.flags.company:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530124 return frappe.get_cached_value("Company", company or frappe.flags.company, "country")
Rushabh Mehta7231f292017-07-13 15:00:56 +0530125 elif frappe.flags.country:
126 return frappe.flags.country
127 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +0530128 return frappe.get_system_settings("country")
129
Rushabh Mehta7231f292017-07-13 15:00:56 +0530130
Rushabh Mehta393becc2017-07-13 15:49:37 +0530131def allow_regional(fn):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530132 """Decorator to make a function regionally overridable
Rushabh Mehta393becc2017-07-13 15:49:37 +0530133
134 Example:
135 @erpnext.allow_regional
136 def myfunction():
Ankush Menat494bd9e2022-03-28 18:52:46 +0530137 pass"""
Sagar Vorab68a9962022-02-09 16:56:24 +0530138
Rushabh Mehta7231f292017-07-13 15:00:56 +0530139 def caller(*args, **kwargs):
Sagar Vorab68a9962022-02-09 16:56:24 +0530140 overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
141 function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"
142
143 if not overrides or function_path not in overrides:
Rushabh Mehta7231f292017-07-13 15:00:56 +0530144 return fn(*args, **kwargs)
145
Sagar Vorab68a9962022-02-09 16:56:24 +0530146 # Priority given to last installed app
147 return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
148
Rushabh Mehta7231f292017-07-13 15:00:56 +0530149 return caller