diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py index 71a22fd45e..0fa1756e3a 100644 --- a/erpnext/patches/v7_0/create_warehouse_nestedset.py +++ b/erpnext/patches/v7_0/create_warehouse_nestedset.py @@ -4,45 +4,69 @@ from frappe.utils import cint from frappe.utils.nestedset import rebuild_tree def execute(): + """ + Patch Reference: + 1. check whether warehouse is associated to company or not + 2. if warehouse is associated with company + a. create warehouse group for company + b. set warehouse group as parent to other warehouses and set is_group as 0 + 3. if warehouses is not associated with company + a. get distinct companies from stock ledger entries + b. if sle have only company, + i. set default company to all warehouse + ii. repeat 2.a and 2.b + c. if have multiple companies, + i. create group warehouse without company + ii. repeat 2.b + """ + frappe.reload_doc("stock", "doctype", "warehouse") - for company in frappe.get_all("Company", fields=["name", "abbr"]): - validate_parent_account_for_warehouse(company) - - if not frappe.db.get_value("Warehouse", "{0} - {1}".format(_("All Warehouses"), company.abbr)): - create_default_warehouse_group(company) - - set_parent_to_warehouse(company) - if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): - set_parent_to_warehouse_acount(company) + if check_is_warehouse_associated_with_company(): + for company in frappe.get_all("Company", fields=["name", "abbr"]): + make_warehouse_nestedset(company) + else: + sle_against_companies = frappe.db.sql_list("""select distinct company from `tabStock Ledger Entry`""") + company = frappe.defaults.get_defaults().company -def set_parent_to_warehouse(company): - frappe.db.sql(""" update tabWarehouse set parent_warehouse = %s - where (is_group = 0 or is_group is null or is_group = '') and company = %s - """,("{0} - {1}".format(_("All Warehouses"), company.abbr), company.name)) - - rebuild_tree("Warehouse", "parent_warehouse") + if len(sle_against_companies) == 1: + set_company_to_warehouse(company) + make_warehouse_nestedset(company) -def set_parent_to_warehouse_acount(company): - frappe.db.sql(""" update tabAccount set parent_account = %s - where is_group = 0 and account_type = "Warehouse" - and (warehouse is not null or warehouse != '') and company = %s - """,("{0} - {1}".format(_("All Warehouses"), company.abbr), company.name)) - - rebuild_tree("Account", "parent_account") + elif len(sle_against_companies) > 1: + make_warehouse_nestedset() -def create_default_warehouse_group(company): - frappe.get_doc({ - "doctype": "Warehouse", - "warehouse_name": _("All Warehouses"), - "is_group": 1, - "company": company.name, - "parent_warehouse": "" - }).insert(ignore_permissions=True) - -def validate_parent_account_for_warehouse(company): +def check_is_warehouse_associated_with_company(): + warehouse_associcated_with_company = False + + for warehouse in frappe.get_all("Warehouse", fields=["name", "company"]): + if warehouse.company: + warehouse_associcated_with_company = True + + return warehouse_associcated_with_company + +def make_warehouse_nestedset(company=None): + validate_parent_account_for_warehouse(company) + + if company: + warehouse_group = "{0} - {1}".format(_("All Warehouses"), company.abbr) + ignore_mandatory = False + else: + warehouse_group = _("All Warehouses") + ignore_mandatory = True + + if not frappe.db.get_value("Warehouse", warehouse_group): + create_default_warehouse_group(company, ignore_mandatory) + + set_parent_to_warehouse(warehouse_group, company) if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): + set_parent_to_warehouse_acount(company) +def validate_parent_account_for_warehouse(company=None): + if not company: + return + + if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): parent_account = frappe.db.sql("""select name from tabAccount where account_type='Stock' and company=%s and is_group=1 and (warehouse is null or warehouse = '')""", company.name) @@ -53,3 +77,35 @@ def validate_parent_account_for_warehouse(company): if current_parent_accounts_for_warehouse: frappe.db.set_value("Account", current_parent_accounts_for_warehouse[0][0], "account_type", "Stock") + +def create_default_warehouse_group(company=None, ignore_mandatory=False): + wh = frappe.get_doc({ + "doctype": "Warehouse", + "warehouse_name": _("All Warehouses"), + "is_group": 1, + "company": company.name if company else "", + "parent_warehouse": "" + }) + + if ignore_mandatory: + wh.flags.ignore_mandatory = ignore_mandatory + + wh.insert(ignore_permissions=True) + +def set_parent_to_warehouse(warehouse_group, company=None): + frappe.db.sql(""" update tabWarehouse set parent_warehouse = %s, is_group = 0 + where (is_group = 0 or is_group is null or is_group = '') and ifnull(company, '') = %s + """,(warehouse_group, company.name if company else "")) + + rebuild_tree("Warehouse", "parent_warehouse") + +def set_parent_to_warehouse_acount(company): + frappe.db.sql(""" update tabAccount set parent_account = %s + where is_group = 0 and account_type = "Warehouse" + and (warehouse is not null or warehouse != '') and company = %s + """,("{0} - {1}".format(_("All Warehouses"), company.abbr), company.name)) + + rebuild_tree("Account", "parent_account") + +def set_company_to_warehouse(company): + frappe.db.sql("update tabWahouse set company=%s", company) diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json index a32ec1f93e..86516ff3ee 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.json +++ b/erpnext/stock/doctype/warehouse/warehouse.json @@ -39,7 +39,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "default": "1", + "default": "0", "fieldname": "is_group", "fieldtype": "Check", "hidden": 0, @@ -588,8 +588,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-06-26 17:39:16.856800", - "modified_by": "s@s.com", + "modified": "2016-06-29 19:47:24.336215", + "modified_by": "Administrator", "module": "Stock", "name": "Warehouse", "owner": "Administrator", diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index 515d260337..adef7ce893 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -11,9 +11,12 @@ class Warehouse(NestedSet): nsm_parent_field = 'parent_warehouse' def autoname(self): - suffix = " - " + frappe.db.get_value("Company", self.company, "abbr") - if not self.warehouse_name.endswith(suffix): - self.name = self.warehouse_name + suffix + if self.company: + suffix = " - " + frappe.db.get_value("Company", self.company, "abbr") + if not self.warehouse_name.endswith(suffix): + self.name = self.warehouse_name + suffix + else: + self.name = self.warehouse_name def onload(self): '''load account name for General Ledger Report''' @@ -31,6 +34,7 @@ class Warehouse(NestedSet): def update_parent_account(self): if not getattr(self, "__islocal", None) \ + and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \ and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")): self.validate_parent_account() @@ -251,9 +255,10 @@ def get_children(): is_group as expandable from `tab{doctype}` where docstatus < 2 - and ifnull(`{parent_field}`,'') = %s and `company` = %s - order by name""".format(doctype=frappe.db.escape(doctype), parent_field=frappe.db.escape(parent_field)), - (parent, company), as_dict=1) + and ifnull(`{parent_field}`,'') = %s + and (`company` = %s or company is null or company = '') + order by name""".format(doctype=frappe.db.escape(doctype), + parent_field=frappe.db.escape(parent_field)), (parent, company), as_dict=1) # return warehouses for wh in warehouses: diff --git a/erpnext/stock/doctype/warehouse/warehouse_tree.js b/erpnext/stock/doctype/warehouse/warehouse_tree.js index 9069160b41..0134ca7712 100644 --- a/erpnext/stock/doctype/warehouse/warehouse_tree.js +++ b/erpnext/stock/doctype/warehouse/warehouse_tree.js @@ -13,7 +13,7 @@ frappe.treeview_settings['Warehouse'] = { fields:[ {fieldtype:'Data', fieldname: 'name_field', label:__('New Warehouse Name'), reqd:true}, - {fieldtype:'Check', fieldname:'is_group', label:__('Group Node'), + {fieldtype:'Check', fieldname:'is_group', label:__('Is Group'), description: __("Further nodes can be only created under 'Group' type nodes")} ], onrender: function(node) {