blob: 575aa0fa5d0c516fda6c868b7780d279ef658e07 [file] [log] [blame]
Anand Doshi486f9df2012-07-19 13:40:31 +05301from __future__ import unicode_literals
Chillar Anand915b3432021-09-02 16:44:59 +05302
Nabin Hait6d7b0ce2017-06-15 11:09:27 +05303import frappe
Nabin Haitd2c5b502018-10-08 18:19:53 +05304from frappe import _
Nabin Hait6d7b0ce2017-06-15 11:09:27 +05305
Anand Doshi7e0479b2012-04-05 18:27:56 +05306install_docs = [
Rushabh Mehta94157332015-07-13 15:06:12 +05307 {"doctype":"Role", "role_name":"Stock Manager", "name":"Stock Manager"},
8 {"doctype":"Role", "role_name":"Item Manager", "name":"Item Manager"},
9 {"doctype":"Role", "role_name":"Stock User", "name":"Stock User"},
Anand Doshi24e18562012-04-17 11:45:35 +053010 {"doctype":"Role", "role_name":"Quality Manager", "name":"Quality Manager"},
Saurabh6bc7b892016-07-14 14:03:19 +053011 {"doctype":"Item Group", "item_group_name":"All Item Groups", "is_group": 1},
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053012 {"doctype":"Item Group", "item_group_name":"Default",
Saurabh6bc7b892016-07-14 14:03:19 +053013 "parent_item_group":"All Item Groups", "is_group": 0},
Anand Doshi7e0479b2012-04-05 18:27:56 +053014]
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053015
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053016def get_warehouse_account_map(company=None):
Saqib25846cc2020-03-31 15:31:15 +053017 company_warehouse_account_map = company and frappe.flags.setdefault('warehouse_account_map', {}).get(company)
18 warehouse_account_map = frappe.flags.warehouse_account_map
19
20 if not warehouse_account_map or not company_warehouse_account_map or frappe.flags.in_test:
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053021 warehouse_account = frappe._dict()
22
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053023 filters = {}
24 if company:
25 filters['company'] = company
Saqib25846cc2020-03-31 15:31:15 +053026 frappe.flags.setdefault('warehouse_account_map', {}).setdefault(company, {})
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053027
Nabin Haitedd320e2018-04-02 10:30:17 +053028 for d in frappe.get_all('Warehouse',
Anurag Mishraa11e7382019-10-31 15:55:03 +053029 fields = ["name", "account", "parent_warehouse", "company", "is_group"],
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053030 filters = filters,
Nabin Haitedd320e2018-04-02 10:30:17 +053031 order_by="lft, rgt"):
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053032 if not d.account:
Nabin Haitedd320e2018-04-02 10:30:17 +053033 d.account = get_warehouse_account(d, warehouse_account)
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053034
35 if d.account:
Nabin Haitedd320e2018-04-02 10:30:17 +053036 d.account_currency = frappe.db.get_value('Account', d.account, 'account_currency', cache=True)
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053037 warehouse_account.setdefault(d.name, d)
Saqib25846cc2020-03-31 15:31:15 +053038 if company:
39 frappe.flags.warehouse_account_map[company] = warehouse_account
40 else:
41 frappe.flags.warehouse_account_map = warehouse_account
Rohit Waghchaurec603fd62021-02-26 17:34:53 +053042
Saqib25846cc2020-03-31 15:31:15 +053043 return frappe.flags.warehouse_account_map.get(company) or frappe.flags.warehouse_account_map
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053044
Nabin Haitedd320e2018-04-02 10:30:17 +053045def get_warehouse_account(warehouse, warehouse_account=None):
46 account = warehouse.account
47 if not account and warehouse.parent_warehouse:
48 if warehouse_account:
Nabin Haitd2c5b502018-10-08 18:19:53 +053049 if warehouse_account.get(warehouse.parent_warehouse):
50 account = warehouse_account.get(warehouse.parent_warehouse).account
51 else:
52 from frappe.utils.nestedset import rebuild_tree
53 rebuild_tree("Warehouse", "parent_warehouse")
Nabin Haitedd320e2018-04-02 10:30:17 +053054 else:
55 account = frappe.db.sql("""
56 select
57 account from `tabWarehouse`
58 where
59 lft <= %s and rgt >= %s and company = %s
60 and account is not null and ifnull(account, '') !=''
61 order by lft desc limit 1""", (warehouse.lft, warehouse.rgt, warehouse.company), as_list=1)
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053062
Nabin Haitedd320e2018-04-02 10:30:17 +053063 account = account[0][0] if account else None
64
Nabin Hait9409edd2018-08-16 13:58:44 +053065 if not account and warehouse.company:
Nabin Haitedd320e2018-04-02 10:30:17 +053066 account = get_company_default_inventory_account(warehouse.company)
67
Rohit Waghchaurec603fd62021-02-26 17:34:53 +053068 if not account and warehouse.company:
69 account = frappe.db.get_value('Account',
70 {'account_type': 'Stock', 'is_group': 0, 'company': warehouse.company}, 'name')
71
Nabin Hait9b178bc2021-02-16 14:57:00 +053072 if not account and warehouse.company and not warehouse.is_group:
Nabin Haitd2c5b502018-10-08 18:19:53 +053073 frappe.throw(_("Please set Account in Warehouse {0} or Default Inventory Account in Company {1}")
Nabin Hait5d117162018-10-19 18:03:13 +053074 .format(warehouse.name, warehouse.company))
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053075 return account
Rohit Waghchaure6b33c9b2019-03-08 11:13:35 +053076
Nabin Hait6d7b0ce2017-06-15 11:09:27 +053077def get_company_default_inventory_account(company):
Nabin Haitd826bee2021-02-18 14:14:21 +053078 return frappe.get_cached_value('Company', company, 'default_inventory_account')