Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 1 | import inspect |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 2 | |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 3 | import frappe |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 4 | |
Frappe PR Bot | e66aab7 | 2022-04-26 07:52:13 +0000 | [diff] [blame] | 5 | <<<<<<< HEAD |
Ankush Menat | fcbd25f | 2022-04-08 17:24:10 +0530 | [diff] [blame] | 6 | __version__ = "14.0.0-dev" |
Frappe PR Bot | e66aab7 | 2022-04-26 07:52:13 +0000 | [diff] [blame] | 7 | ======= |
| 8 | from erpnext.hooks import regional_overrides |
| 9 | |
Frappe PR Bot | b3964ee | 2022-05-03 08:51:32 +0000 | [diff] [blame^] | 10 | <<<<<<< HEAD |
Frappe PR Bot | e66aab7 | 2022-04-26 07:52:13 +0000 | [diff] [blame] | 11 | __version__ = "13.27.1" |
| 12 | >>>>>>> 096dcf0e54 (chore(release): Bumped to Version 13.27.1) |
Frappe PR Bot | b3964ee | 2022-05-03 08:51:32 +0000 | [diff] [blame^] | 13 | ======= |
| 14 | __version__ = "13.28.0" |
| 15 | >>>>>>> 8cc2ea0ddb (chore(release): Bumped to Version 13.28.0) |
Ankush Menat | fcbd25f | 2022-04-08 17:24:10 +0530 | [diff] [blame] | 16 | |
Anand Doshi | 227b238 | 2016-06-09 16:29:12 +0530 | [diff] [blame] | 17 | |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 18 | def get_default_company(user=None): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 19 | """Get default company for user""" |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 20 | from frappe.defaults import get_user_default_as_list |
| 21 | |
| 22 | if not user: |
| 23 | user = frappe.session.user |
| 24 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 25 | companies = get_user_default_as_list(user, "company") |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 26 | if companies: |
| 27 | default_company = companies[0] |
| 28 | else: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 29 | default_company = frappe.db.get_single_value("Global Defaults", "default_company") |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 30 | |
| 31 | return default_company |
| 32 | |
tundebabzy | a109141 | 2017-05-19 07:12:45 +0100 | [diff] [blame] | 33 | |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 34 | def get_default_currency(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 35 | """Returns the currency of the default company""" |
Rushabh Mehta | 86a824c | 2016-04-15 16:44:44 +0530 | [diff] [blame] | 36 | company = get_default_company() |
| 37 | if company: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 38 | return frappe.get_cached_value("Company", company, "default_currency") |
| 39 | |
Rushabh Mehta | 6695830 | 2017-01-16 16:57:53 +0530 | [diff] [blame] | 40 | |
rohitwaghchaure | 2e8232e | 2017-08-10 11:32:59 +0530 | [diff] [blame] | 41 | def get_default_cost_center(company): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 42 | """Returns the default cost center of the company""" |
rohitwaghchaure | 2e8232e | 2017-08-10 11:32:59 +0530 | [diff] [blame] | 43 | 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 Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 49 | frappe.flags.company_cost_center[company] = frappe.get_cached_value( |
| 50 | "Company", company, "cost_center" |
| 51 | ) |
rohitwaghchaure | 2e8232e | 2017-08-10 11:32:59 +0530 | [diff] [blame] | 52 | return frappe.flags.company_cost_center[company] |
tundebabzy | a109141 | 2017-05-19 07:12:45 +0100 | [diff] [blame] | 53 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 54 | |
Rushabh Mehta | cc8b2b2 | 2017-03-31 12:44:29 +0530 | [diff] [blame] | 55 | def get_company_currency(company): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 56 | """Returns the default company currency""" |
Rushabh Mehta | cc8b2b2 | 2017-03-31 12:44:29 +0530 | [diff] [blame] | 57 | if not frappe.flags.company_currency: |
| 58 | frappe.flags.company_currency = {} |
| 59 | if not company in frappe.flags.company_currency: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 60 | frappe.flags.company_currency[company] = frappe.db.get_value( |
| 61 | "Company", company, "default_currency", cache=True |
| 62 | ) |
Rushabh Mehta | cc8b2b2 | 2017-03-31 12:44:29 +0530 | [diff] [blame] | 63 | return frappe.flags.company_currency[company] |
| 64 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 65 | |
Rohit Waghchaure | a5f4094 | 2017-06-16 15:21:36 +0530 | [diff] [blame] | 66 | def set_perpetual_inventory(enable=1, company=None): |
| 67 | if not company: |
Rohit Waghchaure | e9ff191 | 2017-06-19 12:54:59 +0530 | [diff] [blame] | 68 | company = "_Test Company" if frappe.flags.in_test else get_default_company() |
tundebabzy | a109141 | 2017-05-19 07:12:45 +0100 | [diff] [blame] | 69 | |
Rohit Waghchaure | a5f4094 | 2017-06-16 15:21:36 +0530 | [diff] [blame] | 70 | company = frappe.get_doc("Company", company) |
| 71 | company.enable_perpetual_inventory = enable |
| 72 | company.save() |
tundebabzy | a109141 | 2017-05-19 07:12:45 +0100 | [diff] [blame] | 73 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 74 | |
Ankush Menat | d7148ad | 2021-12-20 22:00:31 +0530 | [diff] [blame] | 75 | def encode_company_abbr(name, company=None, abbr=None): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 76 | """Returns name encoded with company abbreviation""" |
| 77 | company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr") |
Rushabh Mehta | 6695830 | 2017-01-16 16:57:53 +0530 | [diff] [blame] | 78 | parts = name.rsplit(" - ", 1) |
| 79 | |
| 80 | if parts[-1].lower() != company_abbr.lower(): |
| 81 | parts.append(company_abbr) |
| 82 | |
tundebabzy | a109141 | 2017-05-19 07:12:45 +0100 | [diff] [blame] | 83 | return " - ".join(parts) |
| 84 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 85 | |
Rohit Waghchaure | e9ff191 | 2017-06-19 12:54:59 +0530 | [diff] [blame] | 86 | def is_perpetual_inventory_enabled(company): |
| 87 | if not company: |
| 88 | company = "_Test Company" if frappe.flags.in_test else get_default_company() |
tundebabzy | a109141 | 2017-05-19 07:12:45 +0100 | [diff] [blame] | 89 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 90 | if not hasattr(frappe.local, "enable_perpetual_inventory"): |
Rushabh Mehta | 777526e | 2017-06-20 12:14:32 +0530 | [diff] [blame] | 91 | frappe.local.enable_perpetual_inventory = {} |
Rohit Waghchaure | e9ff191 | 2017-06-19 12:54:59 +0530 | [diff] [blame] | 92 | |
Rushabh Mehta | 777526e | 2017-06-20 12:14:32 +0530 | [diff] [blame] | 93 | if not company in frappe.local.enable_perpetual_inventory: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 94 | frappe.local.enable_perpetual_inventory[company] = ( |
| 95 | frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0 |
| 96 | ) |
Rohit Waghchaure | e9ff191 | 2017-06-19 12:54:59 +0530 | [diff] [blame] | 97 | |
Rushabh Mehta | 777526e | 2017-06-20 12:14:32 +0530 | [diff] [blame] | 98 | return frappe.local.enable_perpetual_inventory[company] |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 99 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 100 | |
Rohit Waghchaure | f689d01 | 2018-05-17 23:29:37 +0530 | [diff] [blame] | 101 | def get_default_finance_book(company=None): |
| 102 | if not company: |
| 103 | company = get_default_company() |
| 104 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 105 | if not hasattr(frappe.local, "default_finance_book"): |
Rohit Waghchaure | f689d01 | 2018-05-17 23:29:37 +0530 | [diff] [blame] | 106 | frappe.local.default_finance_book = {} |
| 107 | |
| 108 | if not company in frappe.local.default_finance_book: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 109 | frappe.local.default_finance_book[company] = frappe.get_cached_value( |
| 110 | "Company", company, "default_finance_book" |
| 111 | ) |
Rohit Waghchaure | f689d01 | 2018-05-17 23:29:37 +0530 | [diff] [blame] | 112 | |
| 113 | return frappe.local.default_finance_book[company] |
| 114 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 115 | |
rohitwaghchaure | e8358f3 | 2018-05-16 11:02:26 +0530 | [diff] [blame] | 116 | def get_party_account_type(party_type): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 117 | if not hasattr(frappe.local, "party_account_types"): |
rohitwaghchaure | e8358f3 | 2018-05-16 11:02:26 +0530 | [diff] [blame] | 118 | frappe.local.party_account_types = {} |
| 119 | |
| 120 | if not party_type in frappe.local.party_account_types: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 121 | frappe.local.party_account_types[party_type] = ( |
| 122 | frappe.db.get_value("Party Type", party_type, "account_type") or "" |
| 123 | ) |
rohitwaghchaure | e8358f3 | 2018-05-16 11:02:26 +0530 | [diff] [blame] | 124 | |
| 125 | return frappe.local.party_account_types[party_type] |
| 126 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 127 | |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 128 | def get_region(company=None): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 129 | """Return the default country based on flag, company or global settings |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 130 | |
| 131 | You can also set global company flag in `frappe.flags.company` |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 132 | """ |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 133 | if company or frappe.flags.company: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 134 | return frappe.get_cached_value("Company", company or frappe.flags.company, "country") |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 135 | elif frappe.flags.country: |
| 136 | return frappe.flags.country |
| 137 | else: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 138 | return frappe.get_system_settings("country") |
| 139 | |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 140 | |
Rushabh Mehta | 393becc | 2017-07-13 15:49:37 +0530 | [diff] [blame] | 141 | def allow_regional(fn): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 142 | """Decorator to make a function regionally overridable |
Rushabh Mehta | 393becc | 2017-07-13 15:49:37 +0530 | [diff] [blame] | 143 | |
| 144 | Example: |
| 145 | @erpnext.allow_regional |
| 146 | def myfunction(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 147 | pass""" |
Sagar Vora | b68a996 | 2022-02-09 16:56:24 +0530 | [diff] [blame] | 148 | |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 149 | def caller(*args, **kwargs): |
Sagar Vora | b68a996 | 2022-02-09 16:56:24 +0530 | [diff] [blame] | 150 | 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 Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 154 | return fn(*args, **kwargs) |
| 155 | |
Sagar Vora | b68a996 | 2022-02-09 16:56:24 +0530 | [diff] [blame] | 156 | # Priority given to last installed app |
| 157 | return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs) |
| 158 | |
Rushabh Mehta | 7231f29 | 2017-07-13 15:00:56 +0530 | [diff] [blame] | 159 | return caller |