import functools import inspect import frappe __version__ = "15.0.0-dev" def get_default_company(user=None): """Get default company for user""" from frappe.defaults import get_user_default_as_list if not user: user = frappe.session.user companies = get_user_default_as_list(user, "company") if companies: default_company = companies[0] else: default_company = frappe.db.get_single_value("Global Defaults", "default_company") return default_company def get_default_currency(): """Returns the currency of the default company""" company = get_default_company() if company: return frappe.get_cached_value("Company", company, "default_currency") def get_default_cost_center(company): """Returns the default cost center of the company""" if not company: return None if not frappe.flags.company_cost_center: frappe.flags.company_cost_center = {} if not company in frappe.flags.company_cost_center: frappe.flags.company_cost_center[company] = frappe.get_cached_value( "Company", company, "cost_center" ) return frappe.flags.company_cost_center[company] def get_company_currency(company): """Returns the default company currency""" if not frappe.flags.company_currency: frappe.flags.company_currency = {} if not company in frappe.flags.company_currency: frappe.flags.company_currency[company] = frappe.db.get_value( "Company", company, "default_currency", cache=True ) return frappe.flags.company_currency[company] def set_perpetual_inventory(enable=1, company=None): if not company: company = "_Test Company" if frappe.flags.in_test else get_default_company() company = frappe.get_doc("Company", company) company.enable_perpetual_inventory = enable company.save() def encode_company_abbr(name, company=None, abbr=None): """Returns name encoded with company abbreviation""" company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr") parts = name.rsplit(" - ", 1) if parts[-1].lower() != company_abbr.lower(): parts.append(company_abbr) return " - ".join(parts) def is_perpetual_inventory_enabled(company): if not company: company = "_Test Company" if frappe.flags.in_test else get_default_company() if not hasattr(frappe.local, "enable_perpetual_inventory"): frappe.local.enable_perpetual_inventory = {} if not company in frappe.local.enable_perpetual_inventory: frappe.local.enable_perpetual_inventory[company] = ( frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0 ) return frappe.local.enable_perpetual_inventory[company] def get_default_finance_book(company=None): if not company: company = get_default_company() if not hasattr(frappe.local, "default_finance_book"): frappe.local.default_finance_book = {} if not company in frappe.local.default_finance_book: frappe.local.default_finance_book[company] = frappe.get_cached_value( "Company", company, "default_finance_book" ) return frappe.local.default_finance_book[company] def get_party_account_type(party_type): if not hasattr(frappe.local, "party_account_types"): frappe.local.party_account_types = {} if not party_type in frappe.local.party_account_types: frappe.local.party_account_types[party_type] = ( frappe.db.get_value("Party Type", party_type, "account_type") or "" ) return frappe.local.party_account_types[party_type] def get_region(company=None): """Return the default country based on flag, company or global settings You can also set global company flag in `frappe.flags.company` """ if not company: company = frappe.local.flags.company if company: return frappe.get_cached_value("Company", company, "country") return frappe.flags.country or frappe.get_system_settings("country") def allow_regional(fn): """Decorator to make a function regionally overridable Example: @erpnext.allow_regional def myfunction(): pass""" @functools.wraps(fn) def caller(*args, **kwargs): overrides = frappe.get_hooks("regional_overrides", {}).get(get_region()) function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}" if not overrides or function_path not in overrides: return fn(*args, **kwargs) # Priority given to last installed app return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs) return caller