Merge branch '1310' of github.com:webnotes/erpnext into 1310
diff --git a/accounts/doctype/account/account.py b/accounts/doctype/account/account.py
index 37e165a..f525b32 100644
--- a/accounts/doctype/account/account.py
+++ b/accounts/doctype/account/account.py
@@ -193,41 +193,40 @@
 			
 		if self.check_gle_exists():
 			msgprint("""Account with existing transaction (Sales Invoice / Purchase Invoice / \
-				Journal Voucher) can not be trashed""", raise_exception=1)
+				Journal Voucher) can not be deleted""", raise_exception=1)
 		if self.check_if_child_exists():
-			msgprint("Child account exists for this account. You can not trash this account.",
+			msgprint("Child account exists for this account. You can not delete this account.",
 			 	raise_exception=1)
 
 	def on_trash(self): 
 		self.validate_trash()
 		self.update_nsm_model()
-
-	def on_rename(self, new, old, merge=False):
-		company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")		
-		parts = new.split(" - ")	
-
-		if parts[-1].lower() != company_abbr.lower():
-			parts.append(company_abbr)
 		
-		# rename account name
-		new_account_name = " - ".join(parts[:-1])
-		sql("update `tabAccount` set account_name = %s where name = %s", (new_account_name, old))
+	def before_rename(self, old, new, merge=False):
+		# Add company abbr if not provided
+		from setup.doctype.company.company import get_name_with_abbr
+		new_account = get_name_with_abbr(new, self.doc.company)
 		
+		# Validate properties before merging
 		if merge:
-			new_name = " - ".join(parts)
-			val = list(webnotes.conn.get_value("Account", new_name, 
+			val = list(webnotes.conn.get_value("Account", new_account, 
 				["group_or_ledger", "debit_or_credit", "is_pl_account"]))
 			
 			if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account]:
-				msgprint(_("""Merging is only possible if following \
+				webnotes.throw(_("""Merging is only possible if following \
 					properties are same in both records.
-					Group or Ledger, Debit or Credit, Is PL Account"""), raise_exception=1)
+					Group or Ledger, Debit or Credit, Is PL Account"""))
+					
+		return new_account
 
+	def after_rename(self, old, new, merge=False):
+		if not merge:
+			webnotes.conn.set_value("Account", new, "account_name", 
+				" - ".join(new.split(" - ")[:-1]))
+		else:
 			from webnotes.utils.nestedset import rebuild_tree
 			rebuild_tree("Account", "parent_account")
 
-		return " - ".join(parts)
-
 def get_master_name(doctype, txt, searchfield, start, page_len, filters):
 	conditions = (" and company='%s'"% filters["company"]) if doctype == "Warehouse" else ""
 		
diff --git a/accounts/doctype/cost_center/cost_center.py b/accounts/doctype/cost_center/cost_center.py
index 4b18aae..d89cef0 100644
--- a/accounts/doctype/cost_center/cost_center.py
+++ b/accounts/doctype/cost_center/cost_center.py
@@ -16,7 +16,7 @@
 	def autoname(self):
 		company_abbr = webnotes.conn.sql("select abbr from tabCompany where name=%s", 
 			self.doc.company)[0][0]
-		self.doc.name = self.doc.cost_center_name.strip() + ' - ' + company_abbr		
+		self.doc.name = self.doc.cost_center_name.strip() + ' - ' + company_abbr
 		
 	def validate_mandatory(self):
 		if not self.doc.group_or_ledger:
@@ -73,18 +73,20 @@
 		self.validate_mandatory()
 		self.validate_budget_details()
 		
-	def on_rename(self, new, old, merge=False):
-		company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")		
-		parts = new.split(" - ")	
-
-		if parts[-1].lower() != company_abbr.lower():
-			parts.append(company_abbr)
-
-		# rename account name
-		cost_center_name = " - ".join(parts[:-1])
-		webnotes.conn.sql("update `tabCost Center` set cost_center_name = %s where name = %s", \
-			(cost_center_name, old))
+	def before_rename(self, olddn, newdn, merge=False):
+		# Add company abbr if not provided
+		from setup.doctype.company.company import get_name_with_abbr
+		new_cost_center = get_name_with_abbr(newdn, self.doc.company)
+		
+		# Validate properties before merging
+		super(DocType, self).before_rename(olddn, new_cost_center, merge, "group_or_ledger")
+		
+		return new_cost_center
+		
+	def after_rename(self, olddn, newdn, merge=False):
+		if not merge:
+			webnotes.conn.set_value("Cost Center", newdn, "cost_center_name", 
+				" - ".join(newdn.split(" - ")[:-1]))
+		else:
+			super(DocType, self).after_rename(olddn, newdn, merge)
 			
-		super(DocType, self).on_rename(new, old, merge, "group_or_ledger")
-
-		return " - ".join(parts)	
diff --git a/buying/doctype/supplier/supplier.py b/buying/doctype/supplier/supplier.py
index 15e1d62..afad61a 100644
--- a/buying/doctype/supplier/supplier.py
+++ b/buying/doctype/supplier/supplier.py
@@ -149,29 +149,21 @@
 		self.delete_supplier_contact()
 		self.delete_supplier_account()
 		
-	def on_rename(self, new, old, merge=False):
+	def after_rename(self, old, new, merge=False):
 		#update supplier_name if not naming series
 		if webnotes.defaults.get_global_default('supp_master_name') == 'Supplier Name':
-			update_fields = [
-			('Supplier', 'name'),
-			('Address', 'supplier'),
-			('Contact', 'supplier'),
-			('Purchase Invoice', 'supplier'),
-			('Purchase Order', 'supplier'),
-			('Purchase Receipt', 'supplier'),
-			('Serial No', 'supplier')]
-			for rec in update_fields:
-				sql("update `tab%s` set supplier_name = %s where `%s` = %s" % \
-					(rec[0], '%s', rec[1], '%s'), (new, old))
+			webnotes.conn.set(self.doc, "supplier_name", new)
 				
 		for account in webnotes.conn.sql("""select name, account_name from 
 			tabAccount where master_name=%s and master_type='Supplier'""", old, as_dict=1):
 			if account.account_name != new:
-				webnotes.rename_doc("Account", account.name, new, merge=merge)
+				merge_account = True if merge and webnotes.conn.get_value("Account", 
+					{"master_name": new, "master_type": "Supplier"}) else False
+				webnotes.rename_doc("Account", account.name, new, merge=merge_account)
 
 		#update master_name in doctype account
 		webnotes.conn.sql("""update `tabAccount` set master_name = %s, 
-			master_type = 'Supplier' where master_name = %s""" , (new,old))
+			master_type = 'Supplier' where master_name = %s""" , (new, old))
 
 @webnotes.whitelist()
 def get_dashboard_info(supplier):
diff --git a/buying/utils.py b/buying/utils.py
index 385a8c7..85cb856 100644
--- a/buying/utils.py
+++ b/buying/utils.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import webnotes
 from webnotes import msgprint, _
-from webnotes.utils import getdate, flt, add_days
+from webnotes.utils import getdate, flt, add_days, cstr
 import json
 
 @webnotes.whitelist()
@@ -94,7 +94,6 @@
 			(args.buying_price_list, args.item_code), as_dict=1)
 		
 		if price_list_rate:
-			from utilities.transaction_base import validate_currency
 			validate_currency(args, item_bean.doc, meta)
 				
 			out.import_ref_rate = flt(price_list_rate[0].ref_rate) * \
@@ -132,7 +131,7 @@
 			_("Please select a sub-contracted item or do not sub-contract the transaction."), 
 			raise_exception=True)
 
-def get_last_purchase_details(item_code, doc_name, conversion_rate=1.0):
+def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
 	"""returns last purchase details in stock uom"""
 	# get last purchase order item details
 	last_purchase_order = webnotes.conn.sql("""\
@@ -143,7 +142,7 @@
 		where po.docstatus = 1 and po_item.item_code = %s and po.name != %s and 
 			po.name = po_item.parent
 		order by po.transaction_date desc, po.name desc
-		limit 1""", (item_code, doc_name), as_dict=1)
+		limit 1""", (item_code, cstr(doc_name)), as_dict=1)
 
 	# get last purchase receipt item details		
 	last_purchase_receipt = webnotes.conn.sql("""\
@@ -154,7 +153,7 @@
 		where pr.docstatus = 1 and pr_item.item_code = %s and pr.name != %s and
 			pr.name = pr_item.parent
 		order by pr.posting_date desc, pr.posting_time desc, pr.name desc
-		limit 1""", (item_code, doc_name), as_dict=1)
+		limit 1""", (item_code, cstr(doc_name)), as_dict=1)
 
 	purchase_order_date = getdate(last_purchase_order and last_purchase_order[0].transaction_date \
 		or "1900-01-01")
diff --git a/selling/doctype/customer/customer.py b/selling/doctype/customer/customer.py
index 2b57da9..206e28d 100644
--- a/selling/doctype/customer/customer.py
+++ b/selling/doctype/customer/customer.py
@@ -4,7 +4,6 @@
 from __future__ import unicode_literals
 import webnotes
 
-from webnotes.utils import cstr
 from webnotes.model.doc import Document, make_autoname
 from webnotes import msgprint, _
 import webnotes.defaults
@@ -145,20 +144,21 @@
 		if self.doc.lead_name:
 			sql("update `tabLead` set status='Interested' where name=%s",self.doc.lead_name)
 			
-	def on_rename(self, new, old, merge=False):
+	def after_rename(self, old, new, merge=False):
 		#update customer_name if not naming series
 		if webnotes.defaults.get_global_default('cust_master_name') == 'Customer Name':
-			webnotes.conn.sql("""update `tabCustomer` set customer_name = %s where name = %s""", 
-				(new, old))
+			webnotes.conn.set(self.doc, "customer_name", new)
 		
 		for account in webnotes.conn.sql("""select name, account_name from 
 			tabAccount where master_name=%s and master_type='Customer'""", old, as_dict=1):
 			if account.account_name != new:
-				webnotes.rename_doc("Account", account.name, new, merge=merge)
+				merge_account = True if merge and webnotes.conn.get_value("Account", 
+					{"master_name": new, "master_type": "Customer"}) else False
+				webnotes.rename_doc("Account", account.name, new, merge=merge_account)
 
-		#update master_name in doctype account
+		#update master_name in account record
 		webnotes.conn.sql("""update `tabAccount` set master_name = %s, 
-			master_type = 'Customer' where master_name = %s""", (new,old))
+			master_type = 'Customer' where master_name = %s""", (new, old))
 
 @webnotes.whitelist()
 def get_dashboard_info(customer):
diff --git a/setup/doctype/company/company.py b/setup/doctype/company/company.py
index 7da2310..d3f4b22 100644
--- a/setup/doctype/company/company.py
+++ b/setup/doctype/company/company.py
@@ -303,18 +303,17 @@
 			where doctype='Global Defaults' and field='default_company' 
 			and value=%s""", self.doc.name)
 			
-	def on_rename(self,newdn,olddn, merge=False):
+	def before_rename(self, olddn, newdn, merge=False):
 		if merge:
-			msgprint(_("Sorry. Companies cannot be merged"), raise_exception=True)
-		
-		webnotes.conn.sql("""update `tabCompany` set company_name=%s
-			where name=%s""", (newdn, olddn))
-		
-		webnotes.conn.sql("""update `tabSingles` set value=%s
-			where doctype='Global Defaults' and field='default_company' 
-			and value=%s""", (newdn, olddn))
-		
-		webnotes.defaults.clear_default("company", value=olddn)
+			webnotes.throw(_("Sorry, companies cannot be merged"))
+	
+	def after_rename(self, olddn, newdn, merge=False):
+		webnotes.conn.set(self.doc, "company_name", newdn)
+
+		webnotes.conn.sql("""update `tabDefaultValue` set defvalue=%s 
+			where defkey='Company' and defvalue=%s""", (newdn, olddn))
+
+		webnotes.defaults.clear_cache()
 
 @webnotes.whitelist()
 def replace_abbr(company, old, new):
@@ -329,4 +328,13 @@
 		
 	for dt in ["Account", "Cost Center", "Warehouse"]:
 		_rename_record(dt)
-		webnotes.conn.commit()
\ No newline at end of file
+		webnotes.conn.commit()
+		
+def get_name_with_abbr(name, company):
+	company_abbr = webnotes.conn.get_value("Company", company, "abbr")		
+	parts = name.split(" - ")
+
+	if parts[-1].lower() != company_abbr.lower():
+		parts.append(company_abbr)
+			
+	return " - ".join(parts)
\ No newline at end of file
diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py
index aedb71c..ca03089 100644
--- a/stock/doctype/item/item.py
+++ b/stock/doctype/item/item.py
@@ -264,15 +264,45 @@
 		if self.doc.page_name:
 			from webnotes.webutils import clear_cache
 			clear_cache(self.doc.page_name)
+			
+	def before_rename(self, olddn, newdn, merge=False):
+		if merge:
+			# Validate properties before merging
+			field_list = ["stock_uom", "is_stock_item", "has_serial_no", "has_batch_no"]
+			new_properties = [cstr(d) for d in webnotes.conn.get_value("Item", newdn, field_list)]
+			if new_properties != [cstr(self.doc.fields[fld]) for fld in field_list]:
+				webnotes.throw(_("To merge, following properties must be same for both items")
+					+ ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list]))
 
-	def on_rename(self, newdn, olddn, merge=False):
-		webnotes.conn.sql("update tabItem set item_code = %s where name = %s", (newdn, olddn))
+			webnotes.conn.sql("delete from `tabBin` where item_code=%s", olddn)
+
+	def after_rename(self, olddn, newdn, merge):
+		webnotes.conn.set_value("Item", newdn, "item_code", newdn)
+		self.update_website_page_name()
+			
+		if merge:
+			self.set_last_purchase_rate(newdn)
+			self.recalculate_bin_qty(newdn)
+			
+	def update_website_page_name(self):
 		if self.doc.page_name:
+			self.update_website()
 			from webnotes.webutils import clear_cache
 			clear_cache(self.doc.page_name)
 			
-		if merge:
-			from stock.stock_ledger import update_entries_after
-			for wh in webnotes.conn.sql("""select warehouse from `tabBin` 
-				where item_code=%s""", newdn):
-					update_entries_after({"item_code": newdn, "warehouse": wh[0]})
+	def set_last_purchase_rate(self, newdn):
+		from buying.utils import get_last_purchase_details
+		last_purchase_rate = get_last_purchase_details(newdn).get("purchase_rate", 0)
+		webnotes.conn.set_value("Item", newdn, "last_purchase_rate", last_purchase_rate)
+			
+	def recalculate_bin_qty(self, newdn):
+		from utilities.repost_stock import repost_stock
+		webnotes.conn.auto_commit_on_many_writes = 1
+		webnotes.conn.set_default("allow_negative_stock", 1)
+		
+		for warehouse in webnotes.conn.sql("select name from `tabWarehouse`"):
+			repost_stock(newdn, warehouse[0])
+		
+		webnotes.conn.set_default("allow_negative_stock", 
+			webnotes.conn.get_value("Stock Settings", None, "allow_negative_stock"))
+		webnotes.conn.auto_commit_on_many_writes = 0
\ No newline at end of file
diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py
index 15edf8b..db32ca0 100644
--- a/stock/doctype/serial_no/serial_no.py
+++ b/stock/doctype/serial_no/serial_no.py
@@ -6,7 +6,7 @@
 
 from webnotes.utils import cint, getdate, cstr, flt, add_days
 import datetime
-from webnotes import msgprint, _, ValidationError
+from webnotes import _, ValidationError
 
 from controllers.stock_controller import StockController
 
@@ -158,11 +158,12 @@
 			webnotes.throw(_("Cannot delete Serial No in warehouse. \
 				First remove from warehouse, then delete.") + ": " + self.doc.name)
 	
-	def on_rename(self, new, old, merge=False):
-		"""rename serial_no text fields"""
+	def before_rename(self, old, new, merge=False):
 		if merge:
-			msgprint(_("Sorry. Serial Nos. cannot be merged"), raise_exception=True)
-		
+			webnotes.throw(_("Sorry, Serial Nos cannot be merged"))
+			
+	def after_rename(self, old, new, merge=False):
+		"""rename serial_no text fields"""
 		for dt in webnotes.conn.sql("""select parent from tabDocField 
 			where fieldname='serial_no' and fieldtype='Text'"""):
 			
diff --git a/stock/doctype/warehouse/warehouse.js b/stock/doctype/warehouse/warehouse.js
index 2a58a38..f566bcf 100644
--- a/stock/doctype/warehouse/warehouse.js
+++ b/stock/doctype/warehouse/warehouse.js
@@ -5,18 +5,6 @@
 	cur_frm.toggle_display('warehouse_name', doc.__islocal);
 }
 
-cur_frm.cscript.merge = function(doc, cdt, cdn) {
-	if (!doc.merge_with) {
-		msgprint("Please enter the warehouse to which you want to merge?");
-		return;
-	}
-	var check = confirm("Are you sure you want to merge this warehouse into " 
-		+ doc.merge_with + "?");
-	if (check) {
-		return $c_obj(make_doclist(cdt, cdn), 'merge_warehouses', '', '');
-	}
-}
-
 cur_frm.set_query("create_account_under", function() {
 	return {
 		filters: {
@@ -25,4 +13,4 @@
 			'group_or_ledger': "Group"
 		}
 	}
-})
+})
\ No newline at end of file
diff --git a/stock/doctype/warehouse/warehouse.py b/stock/doctype/warehouse/warehouse.py
index cfa2782..ba36f31 100644
--- a/stock/doctype/warehouse/warehouse.py
+++ b/stock/doctype/warehouse/warehouse.py
@@ -58,38 +58,6 @@
 			else:
 				webnotes.throw(_("Please enter account group under which account \
 					for warehouse ") + self.doc.name +_(" will be created"))
-
-
-	def merge_warehouses(self):
-		webnotes.conn.auto_commit_on_many_writes = 1
-		
-		# get items which dealt with current warehouse
-		items = webnotes.conn.sql("select item_code from tabBin where warehouse=%s"	, self.doc.name)
-		# delete old bins
-		webnotes.conn.sql("delete from tabBin where warehouse=%s", self.doc.name)
-		
-		# replace link fields
-		from webnotes.model import rename_doc
-		link_fields = rename_doc.get_link_fields('Warehouse')
-		rename_doc.update_link_field_values(link_fields, self.doc.name, self.doc.merge_with)
-		
-		account_link_fields = rename_doc.get_link_fields('Account')
-		old_warehouse_account = webnotes.conn.get_value("Account", {"master_name": self.doc.name})
-		new_warehouse_account = webnotes.conn.get_value("Account", 
-			{"master_name": self.doc.merge_with})
-		rename_doc.update_link_field_values(account_link_fields, old_warehouse_account, 
-			new_warehouse_account)
-			
-		webnotes.conn.delete_doc("Account", old_warehouse_account)
-		
-		from utilities.repost_stock import repost
-		for item_code in items:
-			repost(item_code[0], self.doc.merge_with)
-			
-		webnotes.conn.auto_commit_on_many_writes = 0
-		
-		msgprint("Warehouse %s merged into %s. Now you can delete warehouse: %s" 
-			% (self.doc.name, self.doc.merge_with, self.doc.name))
 		
 	def on_trash(self):
 		# delete bin
@@ -103,24 +71,62 @@
 				sql("delete from `tabBin` where name = %s", d['name'])
 				
 		warehouse_account = webnotes.conn.get_value("Account", 
-			{"account_type": "Warehosue", "master_name": self.doc.name})
+			{"account_type": "Warehouse", "master_name": self.doc.name})
 		if warehouse_account:
 			webnotes.delete_doc("Account", warehouse_account)
 				
 		# delete cancelled sle
 		if sql("""select name from `tabStock Ledger Entry` where warehouse = %s""", self.doc.name):
-			msgprint("""Warehosue can not be deleted as stock ledger entry 
+			msgprint("""Warehouse can not be deleted as stock ledger entry 
 				exists for this warehouse.""", raise_exception=1)
-		else:
-			sql("delete from `tabStock Ledger Entry` where warehouse = %s", self.doc.name)
-
-	def on_rename(self, newdn, olddn, merge=False):
-		account = webnotes.conn.get_value("Account", {"account_type": "Warehouse", 
-			"master_name": olddn})
-		webnotes.conn.set_value("Account", account, "master_name", newdn)
 			
+	def before_rename(self, olddn, newdn, merge=False):
+		# Add company abbr if not provided
+		from setup.doctype.company.company import get_name_with_abbr
+		new_warehouse = get_name_with_abbr(newdn, self.doc.company)
+
 		if merge:
-			from stock.stock_ledger import update_entries_after
-			for item_code in webnotes.conn.sql("""select item_code from `tabBin` 
-				where warehouse=%s""", newdn):
-					update_entries_after({"item_code": item_code, "warehouse": newdn})
+			if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"):
+				webnotes.throw(_("Both Warehouse must belong to same Company"))
+				
+			webnotes.conn.sql("delete from `tabBin` where warehouse=%s", olddn)
+			
+		self.rename_account(olddn, new_warehouse, merge)
+
+		return new_warehouse
+
+	def after_rename(self, olddn, newdn, merge=False):
+		if merge:
+			self.recalculate_bin_qty(newdn)
+			
+	def recalculate_bin_qty(self, newdn):
+		from utilities.repost_stock import repost_stock
+		webnotes.conn.auto_commit_on_many_writes = 1
+		webnotes.conn.set_default("allow_negative_stock", 1)
+		
+		for item in webnotes.conn.sql("""select distinct item_code from (
+			select name as item_code from `tabItem` where ifnull(is_stock_item, 'Yes')='Yes'
+			union 
+			select distinct item_code from tabBin) a"""):
+				repost_stock(item[0], newdn)
+			
+		webnotes.conn.set_default("allow_negative_stock", 
+			webnotes.conn.get_value("Stock Settings", None, "allow_negative_stock"))
+		webnotes.conn.auto_commit_on_many_writes = 0
+			
+	def rename_account(self, olddn, newdn, merge):
+		old_account = webnotes.conn.get_value("Account", 
+			{"account_type": "Warehouse", "master_name": olddn})
+		if old_account:
+			new_account = None
+			if not merge:
+				if old_account == olddn:
+					new_account = webnotes.rename_doc("Account", olddn, newdn)
+			else:
+				existing_new_account = webnotes.conn.get_value("Account", 
+					{"account_type": "Warehouse", "master_name": newdn})
+				new_account = webnotes.rename_doc("Account", old_account, 
+					existing_new_account or newdn, merge=True if existing_new_account else False)
+
+			if new_account:
+				webnotes.conn.set_value("Account", new_account, "master_name", newdn)
\ No newline at end of file
diff --git a/stock/doctype/warehouse/warehouse.txt b/stock/doctype/warehouse/warehouse.txt
index 76ddac7..8c75247 100644
--- a/stock/doctype/warehouse/warehouse.txt
+++ b/stock/doctype/warehouse/warehouse.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-07 18:50:32", 
   "docstatus": 0, 
-  "modified": "2013-09-16 10:45:49", 
+  "modified": "2013-11-19 12:12:33", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -20,7 +20,8 @@
   "name": "__common__", 
   "parent": "Warehouse", 
   "parentfield": "fields", 
-  "parenttype": "DocType"
+  "parenttype": "DocType", 
+  "permlevel": 0
  }, 
  {
   "doctype": "DocPerm", 
@@ -42,7 +43,6 @@
   "fieldtype": "Section Break", 
   "label": "Warehouse Detail", 
   "oldfieldtype": "Section Break", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -52,7 +52,6 @@
   "label": "Warehouse Name", 
   "oldfieldname": "warehouse_name", 
   "oldfieldtype": "Data", 
-  "permlevel": 0, 
   "read_only": 0, 
   "reqd": 1
  }, 
@@ -65,7 +64,6 @@
   "oldfieldname": "company", 
   "oldfieldtype": "Link", 
   "options": "Company", 
-  "permlevel": 0, 
   "read_only": 0, 
   "reqd": 1, 
   "search_index": 1
@@ -77,14 +75,12 @@
   "fieldname": "create_account_under", 
   "fieldtype": "Link", 
   "label": "Create Account Under", 
-  "options": "Account", 
-  "permlevel": 0
+  "options": "Account"
  }, 
  {
   "doctype": "DocField", 
   "fieldname": "column_break_4", 
   "fieldtype": "Section Break", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -94,7 +90,6 @@
   "fieldtype": "Table", 
   "label": "Warehouse Users", 
   "options": "Warehouse User", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -103,7 +98,6 @@
   "fieldname": "warehouse_contact_info", 
   "fieldtype": "Section Break", 
   "label": "Warehouse Contact Info", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -114,7 +108,6 @@
   "label": "Email Id", 
   "oldfieldname": "email_id", 
   "oldfieldtype": "Data", 
-  "permlevel": 0, 
   "print_hide": 0, 
   "read_only": 0
  }, 
@@ -126,7 +119,6 @@
   "oldfieldname": "phone_no", 
   "oldfieldtype": "Int", 
   "options": "Phone", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -137,7 +129,6 @@
   "oldfieldname": "mobile_no", 
   "oldfieldtype": "Int", 
   "options": "Phone", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -145,7 +136,6 @@
   "fieldname": "column_break0", 
   "fieldtype": "Column Break", 
   "oldfieldtype": "Column Break", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -155,7 +145,6 @@
   "label": "Address Line 1", 
   "oldfieldname": "address_line_1", 
   "oldfieldtype": "Data", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -165,7 +154,6 @@
   "label": "Address Line 2", 
   "oldfieldname": "address_line_2", 
   "oldfieldtype": "Data", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -176,7 +164,6 @@
   "label": "City", 
   "oldfieldname": "city", 
   "oldfieldtype": "Data", 
-  "permlevel": 0, 
   "read_only": 0, 
   "reqd": 0
  }, 
@@ -188,7 +175,6 @@
   "oldfieldname": "state", 
   "oldfieldtype": "Select", 
   "options": "Suggest", 
-  "permlevel": 0, 
   "read_only": 0
  }, 
  {
@@ -198,33 +184,6 @@
   "label": "PIN", 
   "oldfieldname": "pin", 
   "oldfieldtype": "Int", 
-  "permlevel": 0, 
-  "read_only": 0
- }, 
- {
-  "description": "This feature is for merging duplicate warehouses. It will replace all the links of this warehouse by \"Merge Into\" warehouse. After merging you can delete this warehouse, as stock level for this warehouse will be zero.", 
-  "doctype": "DocField", 
-  "fieldname": "merge_warehouses_section", 
-  "fieldtype": "Section Break", 
-  "label": "Merge Warehouses", 
-  "permlevel": 2, 
-  "read_only": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "merge_with", 
-  "fieldtype": "Link", 
-  "label": "Merge Into", 
-  "options": "Warehouse", 
-  "permlevel": 2, 
-  "read_only": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "merge", 
-  "fieldtype": "Button", 
-  "label": "Merge", 
-  "permlevel": 2, 
   "read_only": 0
  }, 
  {
diff --git a/utilities/repost_stock.py b/utilities/repost_stock.py
index 536df81..a3a5d28 100644
--- a/utilities/repost_stock.py
+++ b/utilities/repost_stock.py
@@ -7,18 +7,24 @@
 from webnotes.utils import flt
 
 
-def repost():
+def repost(allow_negative_stock=False):
 	"""
 	Repost everything!
 	"""
 	webnotes.conn.auto_commit_on_many_writes = 1
 	
+	if allow_negative_stock:
+		webnotes.conn.set_default("allow_negative_stock", 1)
+	
 	for d in webnotes.conn.sql("""select distinct item_code, warehouse from 
 		(select item_code, warehouse from tabBin
 		union
 		select item_code, warehouse from `tabStock Ledger Entry`) a"""):
-			repost_stock(d[0], d[1])
-		
+			repost_stock(d[0], d[1], allow_negative_stock)
+			
+	if allow_negative_stock:
+		webnotes.conn.set_default("allow_negative_stock", 
+			webnotes.conn.get_value("Stock Settings", None, "allow_negative_stock"))
 	webnotes.conn.auto_commit_on_many_writes = 0
 
 def repost_stock(item_code, warehouse):
@@ -38,7 +44,7 @@
 		update_entries_after({ "item_code": item_code, "warehouse": warehouse })
 	except:
 		pass
-
+	
 def get_reserved_qty(item_code, warehouse):
 	reserved_qty = webnotes.conn.sql("""
 		select