import frappe from frappe import _ install_docs = [ {"doctype": "Role", "role_name": "Stock Manager", "name": "Stock Manager"}, {"doctype": "Role", "role_name": "Item Manager", "name": "Item Manager"}, {"doctype": "Role", "role_name": "Stock User", "name": "Stock User"}, {"doctype": "Role", "role_name": "Quality Manager", "name": "Quality Manager"}, {"doctype": "Item Group", "item_group_name": "All Item Groups", "is_group": 1}, { "doctype": "Item Group", "item_group_name": "Default", "parent_item_group": "All Item Groups", "is_group": 0, }, ] def get_warehouse_account_map(company=None): company_warehouse_account_map = company and frappe.flags.setdefault( "warehouse_account_map", {} ).get(company) warehouse_account_map = frappe.flags.warehouse_account_map if not warehouse_account_map or not company_warehouse_account_map or frappe.flags.in_test: warehouse_account = frappe._dict() filters = {} if company: filters["company"] = company frappe.flags.setdefault("warehouse_account_map", {}).setdefault(company, {}) for d in frappe.get_all( "Warehouse", fields=["name", "account", "parent_warehouse", "company", "is_group"], filters=filters, order_by="lft, rgt", ): if not d.account: d.account = get_warehouse_account(d, warehouse_account) if d.account: d.account_currency = frappe.db.get_value("Account", d.account, "account_currency", cache=True) warehouse_account.setdefault(d.name, d) if company: frappe.flags.warehouse_account_map[company] = warehouse_account else: frappe.flags.warehouse_account_map = warehouse_account return frappe.flags.warehouse_account_map.get(company) or frappe.flags.warehouse_account_map def get_warehouse_account(warehouse, warehouse_account=None): account = warehouse.account if not account and warehouse.parent_warehouse: if warehouse_account: if warehouse_account.get(warehouse.parent_warehouse): account = warehouse_account.get(warehouse.parent_warehouse).account else: from frappe.utils.nestedset import rebuild_tree rebuild_tree("Warehouse", "parent_warehouse") else: account = frappe.db.sql( """ select account from `tabWarehouse` where lft <= %s and rgt >= %s and company = %s and account is not null and ifnull(account, '') !='' order by lft desc limit 1""", (warehouse.lft, warehouse.rgt, warehouse.company), as_list=1, ) account = account[0][0] if account else None if not account and warehouse.company: account = get_company_default_inventory_account(warehouse.company) if not account and warehouse.company: account = frappe.db.get_value( "Account", {"account_type": "Stock", "is_group": 0, "company": warehouse.company}, "name" ) if not account and warehouse.company and not warehouse.is_group: frappe.throw( _("Please set Account in Warehouse {0} or Default Inventory Account in Company {1}").format( warehouse.name, warehouse.company ) ) return account def get_company_default_inventory_account(company): return frappe.get_cached_value("Company", company, "default_inventory_account")