You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

__init__.py 4.2 KiB

2 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import functools
  2. import inspect
  3. import frappe
  4. __version__ = "14.23.3"
  5. def get_default_company(user=None):
  6. """Get default company for user"""
  7. from frappe.defaults import get_user_default_as_list
  8. if not user:
  9. user = frappe.session.user
  10. companies = get_user_default_as_list(user, "company")
  11. if companies:
  12. default_company = companies[0]
  13. else:
  14. default_company = frappe.db.get_single_value("Global Defaults", "default_company")
  15. return default_company
  16. def get_default_currency():
  17. """Returns the currency of the default company"""
  18. company = get_default_company()
  19. if company:
  20. return frappe.get_cached_value("Company", company, "default_currency")
  21. def get_default_cost_center(company):
  22. """Returns the default cost center of the company"""
  23. if not company:
  24. return None
  25. if not frappe.flags.company_cost_center:
  26. frappe.flags.company_cost_center = {}
  27. if not company in frappe.flags.company_cost_center:
  28. frappe.flags.company_cost_center[company] = frappe.get_cached_value(
  29. "Company", company, "cost_center"
  30. )
  31. return frappe.flags.company_cost_center[company]
  32. def get_company_currency(company):
  33. """Returns the default company currency"""
  34. if not frappe.flags.company_currency:
  35. frappe.flags.company_currency = {}
  36. if not company in frappe.flags.company_currency:
  37. frappe.flags.company_currency[company] = frappe.db.get_value(
  38. "Company", company, "default_currency", cache=True
  39. )
  40. return frappe.flags.company_currency[company]
  41. def set_perpetual_inventory(enable=1, company=None):
  42. if not company:
  43. company = "_Test Company" if frappe.flags.in_test else get_default_company()
  44. company = frappe.get_doc("Company", company)
  45. company.enable_perpetual_inventory = enable
  46. company.save()
  47. def encode_company_abbr(name, company=None, abbr=None):
  48. """Returns name encoded with company abbreviation"""
  49. company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr")
  50. parts = name.rsplit(" - ", 1)
  51. if parts[-1].lower() != company_abbr.lower():
  52. parts.append(company_abbr)
  53. return " - ".join(parts)
  54. def is_perpetual_inventory_enabled(company):
  55. if not company:
  56. company = "_Test Company" if frappe.flags.in_test else get_default_company()
  57. if not hasattr(frappe.local, "enable_perpetual_inventory"):
  58. frappe.local.enable_perpetual_inventory = {}
  59. if not company in frappe.local.enable_perpetual_inventory:
  60. frappe.local.enable_perpetual_inventory[company] = (
  61. frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
  62. )
  63. return frappe.local.enable_perpetual_inventory[company]
  64. def get_default_finance_book(company=None):
  65. if not company:
  66. company = get_default_company()
  67. if not hasattr(frappe.local, "default_finance_book"):
  68. frappe.local.default_finance_book = {}
  69. if not company in frappe.local.default_finance_book:
  70. frappe.local.default_finance_book[company] = frappe.get_cached_value(
  71. "Company", company, "default_finance_book"
  72. )
  73. return frappe.local.default_finance_book[company]
  74. def get_party_account_type(party_type):
  75. if not hasattr(frappe.local, "party_account_types"):
  76. frappe.local.party_account_types = {}
  77. if not party_type in frappe.local.party_account_types:
  78. frappe.local.party_account_types[party_type] = (
  79. frappe.db.get_value("Party Type", party_type, "account_type") or ""
  80. )
  81. return frappe.local.party_account_types[party_type]
  82. def get_region(company=None):
  83. """Return the default country based on flag, company or global settings
  84. You can also set global company flag in `frappe.flags.company`
  85. """
  86. if not company:
  87. company = frappe.local.flags.company
  88. if company:
  89. return frappe.get_cached_value("Company", company, "country")
  90. return frappe.flags.country or frappe.get_system_settings("country")
  91. def allow_regional(fn):
  92. """Decorator to make a function regionally overridable
  93. Example:
  94. @erpnext.allow_regional
  95. def myfunction():
  96. pass"""
  97. @functools.wraps(fn)
  98. def caller(*args, **kwargs):
  99. overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
  100. function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"
  101. if not overrides or function_path not in overrides:
  102. return fn(*args, **kwargs)
  103. # Priority given to last installed app
  104. return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
  105. return caller