Merge pull request #5605 from saurabh6790/warehouse_tree_fix_1

while creating warehouse tree check for non company warehouse and is_group default value fix
diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py
index 71a22fd..0fa1756 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.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 @@
 
 			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 a32ec1f..86516ff 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 515d260..adef7ce 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -11,9 +11,12 @@
 	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 @@
 
 	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 @@
 		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 9069160..0134ca7 100644
--- a/erpnext/stock/doctype/warehouse/warehouse_tree.js
+++ b/erpnext/stock/doctype/warehouse/warehouse_tree.js
@@ -13,7 +13,7 @@
 	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) {