blob: 45bf012be85a8fdfa047f4d40f7ce62aa57c4745 [file] [log] [blame]
Nabin Hait6d7b0ce2017-06-15 11:09:27 +05301import frappe
Nabin Haitd2c5b502018-10-08 18:19:53 +05302from frappe import _
Nabin Hait6d7b0ce2017-06-15 11:09:27 +05303
Anand Doshi7e0479b2012-04-05 18:27:56 +05304install_docs = [
Ankush Menat494bd9e2022-03-28 18:52:46 +05305 {"doctype": "Role", "role_name": "Stock Manager", "name": "Stock Manager"},
6 {"doctype": "Role", "role_name": "Item Manager", "name": "Item Manager"},
7 {"doctype": "Role", "role_name": "Stock User", "name": "Stock User"},
8 {"doctype": "Role", "role_name": "Quality Manager", "name": "Quality Manager"},
9 {"doctype": "Item Group", "item_group_name": "All Item Groups", "is_group": 1},
10 {
11 "doctype": "Item Group",
12 "item_group_name": "Default",
13 "parent_item_group": "All Item Groups",
14 "is_group": 0,
15 },
Anand Doshi7e0479b2012-04-05 18:27:56 +053016]
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053017
Ankush Menat494bd9e2022-03-28 18:52:46 +053018
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053019def get_warehouse_account_map(company=None):
Ankush Menat494bd9e2022-03-28 18:52:46 +053020 company_warehouse_account_map = company and frappe.flags.setdefault(
21 "warehouse_account_map", {}
22 ).get(company)
Saqib25846cc2020-03-31 15:31:15 +053023 warehouse_account_map = frappe.flags.warehouse_account_map
24
25 if not warehouse_account_map or not company_warehouse_account_map or frappe.flags.in_test:
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053026 warehouse_account = frappe._dict()
27
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053028 filters = {}
29 if company:
Ankush Menat494bd9e2022-03-28 18:52:46 +053030 filters["company"] = company
31 frappe.flags.setdefault("warehouse_account_map", {}).setdefault(company, {})
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053032
Ankush Menat494bd9e2022-03-28 18:52:46 +053033 for d in frappe.get_all(
34 "Warehouse",
35 fields=["name", "account", "parent_warehouse", "company", "is_group"],
36 filters=filters,
37 order_by="lft, rgt",
38 ):
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053039 if not d.account:
Nabin Haitedd320e2018-04-02 10:30:17 +053040 d.account = get_warehouse_account(d, warehouse_account)
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053041
42 if d.account:
Ankush Menat494bd9e2022-03-28 18:52:46 +053043 d.account_currency = frappe.db.get_value("Account", d.account, "account_currency", cache=True)
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053044 warehouse_account.setdefault(d.name, d)
Saqib25846cc2020-03-31 15:31:15 +053045 if company:
46 frappe.flags.warehouse_account_map[company] = warehouse_account
47 else:
48 frappe.flags.warehouse_account_map = warehouse_account
Rohit Waghchaurec603fd62021-02-26 17:34:53 +053049
Saqib25846cc2020-03-31 15:31:15 +053050 return frappe.flags.warehouse_account_map.get(company) or frappe.flags.warehouse_account_map
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053051
Ankush Menat494bd9e2022-03-28 18:52:46 +053052
Nabin Haitedd320e2018-04-02 10:30:17 +053053def get_warehouse_account(warehouse, warehouse_account=None):
54 account = warehouse.account
55 if not account and warehouse.parent_warehouse:
56 if warehouse_account:
Nabin Haitd2c5b502018-10-08 18:19:53 +053057 if warehouse_account.get(warehouse.parent_warehouse):
58 account = warehouse_account.get(warehouse.parent_warehouse).account
59 else:
60 from frappe.utils.nestedset import rebuild_tree
Ankush Menat494bd9e2022-03-28 18:52:46 +053061
Nabin Haitd2c5b502018-10-08 18:19:53 +053062 rebuild_tree("Warehouse", "parent_warehouse")
Nabin Haitedd320e2018-04-02 10:30:17 +053063 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053064 account = frappe.db.sql(
65 """
Nabin Haitedd320e2018-04-02 10:30:17 +053066 select
67 account from `tabWarehouse`
68 where
69 lft <= %s and rgt >= %s and company = %s
70 and account is not null and ifnull(account, '') !=''
Ankush Menat494bd9e2022-03-28 18:52:46 +053071 order by lft desc limit 1""",
72 (warehouse.lft, warehouse.rgt, warehouse.company),
73 as_list=1,
74 )
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053075
Nabin Haitedd320e2018-04-02 10:30:17 +053076 account = account[0][0] if account else None
77
Nabin Hait9409edd2018-08-16 13:58:44 +053078 if not account and warehouse.company:
Nabin Haitedd320e2018-04-02 10:30:17 +053079 account = get_company_default_inventory_account(warehouse.company)
80
Rohit Waghchaurec603fd62021-02-26 17:34:53 +053081 if not account and warehouse.company:
Ankush Menat494bd9e2022-03-28 18:52:46 +053082 account = frappe.db.get_value(
83 "Account", {"account_type": "Stock", "is_group": 0, "company": warehouse.company}, "name"
84 )
Rohit Waghchaurec603fd62021-02-26 17:34:53 +053085
Nabin Hait9b178bc2021-02-16 14:57:00 +053086 if not account and warehouse.company and not warehouse.is_group:
Ankush Menat494bd9e2022-03-28 18:52:46 +053087 frappe.throw(
88 _("Please set Account in Warehouse {0} or Default Inventory Account in Company {1}").format(
89 warehouse.name, warehouse.company
90 )
91 )
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053092 return account
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053093
Ankush Menat494bd9e2022-03-28 18:52:46 +053094
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053095def get_company_default_inventory_account(company):
Ankush Menat494bd9e2022-03-28 18:52:46 +053096 return frappe.get_cached_value("Company", company, "default_inventory_account")