diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.py b/erpnext/stock/doctype/sales_bom/sales_bom.py
index bfb5cee..ae3378e 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.py
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.py
@@ -8,11 +8,11 @@
 # 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
 # GNU General Public License for more details.
 # 
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.	If not, see <http://www.gnu.org/licenses/>.
 
 # Please edit this list and import only required elements
 import webnotes
@@ -34,188 +34,160 @@
 
 
 class DocType:
-  def __init__(self,d,dl):
-    self.doc, self.doclist = d,dl
+	def __init__(self,d,dl):
+		self.doc, self.doclist = d,dl
 
-  def autoname(self):
-    self.doc.name = make_autoname(self.doc.new_item_code)
+	def autoname(self):
+		self.doc.name = make_autoname(self.doc.new_item_code)
 
-  
-  # Get Ref Rates
-  # --------------
-  def get_rates(self):
-    for d in getlist(self.doclist, "sales_bom_items"):
-      r = sql("select ref_rate from `tabItem Price` where price_list_name=%s and parent=%s and ref_currency = %s", (self.doc.price_list, d.item_code, self.doc.currency))
-      d.rate = r and flt(r[0][0]) or 0.00
-
-
-  # Get Item Details
-  # -----------------
-  def get_item_details(self, name):
-    det = sql("select description, stock_uom from `tabItem` where name = '%s' " % cstr(name))
-    rate = sql("select ref_rate from `tabItem Price` where price_list_name = %s and parent = %s and ref_currency = %s", (self.doc.price_list, name, self.doc.currency))
-    return {'description' : det and det[0][0] or '', 'uom': det and det[0][1] or '', 'rate': rate and flt(rate[0][0]) or 0.00}
-
-
-  def get_main_item(self):
-    is_main_item = []
-    for d in getlist(self.doclist,'sales_bom_items'):
-      if d.is_main_item == 'Yes':
-        is_main_item.append(d.item_code)
-      # Check that Sales Bom Item cannot be child of Sales Bom.
-      if sql("select name from `tabSales BOM` where name = '%s' " % d.item_code):
-        msgprint("Sales Bom Item " + d.item_code +" cannot be child item.")
-        raise Exception
-      # Check if is_main_item is modified once saved
-      if not self.doc.fields.get('__islocal') and d.is_main_item == "Yes" and cstr(d.item_code) != cstr(self.doc.name)[:-3] :
-        msgprint("Modifying the main item is not allowed.")
-        raise Exception
-    if len(is_main_item) > 1:
-      msgprint('Main item cannot be more than one.')
-      raise Exception , " Validation Error."
-    if len(is_main_item) == 0:
-      msgprint("At least one item should be main item.")
-      raise Exception , " Validation Error."
-    return is_main_item[0]
-
-
-  # Make Item
-  # ---------
-  def create_new_item(self):
-    i = Document("Item")
-    
-    i.item_code = self.doc.new_item_code
-    i.item_name = self.doc.new_item_name
-    i.name = i.item_code
-    i.is_sales_item = 'Yes'
-    i.is_stock_item = 'No'
-    i.save(1)
-
-# This function is deprecated as we will see only pricelist which is selected 
-#  def get_price_lists(self):
-#    return [i[0] for i in sql("select name from `tabPrice List` where docstatus != 2")]
-
-  # Update Rate
-  # -----------
-  
-  def update_ref_rate(self, i):
-    ref_rate,count, p, currency  =  0,0, self.doc.price_list, self.doc.currency
-    if not cstr(self.doc.price_list):
-      msgprint("Please enter Price List.")
-      raise Exception
-    if not cstr(self.doc.currency):
-      msgprint("Please enter Currency.")
-      raise Exception
-    for d in getlist(self.doclist, "sales_bom_items"):
-      item_rate = sql("select ref_rate,ref_currency from `tabItem Price` where price_list_name=%s and parent=%s", (p, d.item_code))      
-      if not item_rate:
-        msgprint("Item %s does not have a rate for Price List %s. Did not update rates for this Price List" % (d.item_code, p))
-        raise Exception
-      # if count == 0 : currency = cstr(item_rate[0][1])
-      if not cstr(currency) == cstr(item_rate[0][1]):
-        msgprint("Item %s currency %s does not match with other items currency i.e. %s " %(d.item_code,item_rate[0][1],currency))
-        raise Exception
-      count += 1
-      ref_rate += (flt(d.qty) * flt(item_rate[0][0]))
-      
-    pld = addchild(i,"ref_rate_details", "Item Price")
-    pld.price_list_name = p
-    pld.ref_rate = flt(ref_rate)
-    pld.ref_currency = currency
-    pld.save()
-
-      
-  # Update Items
-  # ------------
-  def update_item(self):
-    i = Document("Item", self.doc.new_item_code)
-    
-    # update fields
-    i.brand = self.doc.new_item_brand
-    i.stock_uom = self.doc.stock_uom 
-    i.item_group = self.doc.item_group
 	
-    # clear old rates
-    sql("delete from `tabItem Price` where parent=%s", i.name)
-    
-    # update rates
-    new_rates = {}
-    # pl_list = self.get_price_lists()
-    #for p in self.get_price_lists():
-    self.update_ref_rate(i)
-
-    # update description and item name
-    n1, n2 = [], []
-    for d in getlist(self.doclist, "sales_bom_items"):
-      n, desc = sql("select item_name, description from tabItem where name=%s", d.item_code)[0]
-      n1.append(n)
-      n2.append(desc)
-    
-    self.doc.new_item_name = (' ').join(n1)
-    self.doc.description = ("\n" + "\n").join(n2)
-
-    i.item_name = self.doc.new_item_name
-    i.description = self.doc.description
-
-    # set default as 'No' or 0 in Item Master  as per TIC/3456
-    i.is_sample_item = 'No'
-    i.is_asset_item = 'No'
-    i.is_purchase_item = 'No'
-    i.is_manufactured_item = 'No'
-    i.is_sub_contracted_item = 'No'
-    i.is_service_item = 'No'
-    i.inspection_required = 'No'
-    i.has_serial_no = 'No'
-    i.lead_time_days = flt(0)
-    i.save()
-    msgprint("Items updated successfully.")
+	# Get Ref Rates
+	# --------------
+	def get_rates(self):
+		for d in getlist(self.doclist, "sales_bom_items"):
+			r = sql("select ref_rate from `tabItem Price` where price_list_name=%s and parent=%s and ref_currency = %s", (self.doc.price_list, d.item_code, self.doc.currency))
+			d.rate = r and flt(r[0][0]) or 0.00
 
 
-  def validate(self):
-    # check for duplicate
-    self.check_duplicate()
-    item_code = self.get_main_item()
-    if not self.doc.new_item_code:
-      self.doc.new_item_code = make_autoname(item_code +'.###')
+	# Get Item Details
+	# -----------------
+	def get_item_details(self, name):
+		det = sql("select description, stock_uom from `tabItem` where name = '%s' " % cstr(name))
+		rate = sql("select ref_rate from `tabItem Price` where price_list_name = %s and parent = %s and ref_currency = %s", (self.doc.price_list, name, self.doc.currency))
+		return {'description' : det and det[0][0] or '', 'uom': det and det[0][1] or '', 'rate': rate and flt(rate[0][0]) or 0.00}
+
+
+	def get_main_item(self):
+		is_main_item = []
+		for d in getlist(self.doclist,'sales_bom_items'):
+			if d.is_main_item == 'Yes':
+				is_main_item.append(d.item_code)
+			# Check that Sales Bom Item cannot be child of Sales Bom.
+			if sql("select name from `tabSales BOM` where name = '%s' " % d.item_code):
+				msgprint("Sales Bom Item " + d.item_code +" cannot be child item.")
+				raise Exception
+			# Check if is_main_item is modified once saved
+			if not self.doc.fields.get('__islocal') and d.is_main_item == "Yes" and cstr(d.item_code) != cstr(self.doc.name)[:-3] :
+				msgprint("Modifying the main item is not allowed.")
+				raise Exception
+		if len(is_main_item) > 1:
+			msgprint('Main item cannot be more than one.')
+			raise Exception , " Validation Error."
+		if len(is_main_item) == 0:
+			msgprint("At least one item should be main item.")
+			raise Exception , " Validation Error."
+		return is_main_item[0]
+
+
+	# Make Item
+	# ---------
+	def create_new_item(self):
+		i = Document("Item")
+		
+		i.item_code = self.doc.new_item_code
+		i.item_name = self.doc.new_item_name
+		i.name = i.item_code
+		i.is_sales_item = 'Yes'
+		i.is_stock_item = 'No'
+		i.save(1)
+
+	# Update Rate	
+	def update_ref_rate(self, i):
+		ref_rate = 0
+		if self.doc.price_list:
+			if not cstr(self.doc.currency):
+				msgprint("Please enter Currency.")
+				raise Exception
+			for d in getlist(self.doclist, "sales_bom_items"):
+				item_rate = sql("select ref_rate,ref_currency from `tabItem Price` where price_list_name=%s and parent=%s", (self.doc.price_list, d.item_code))
+				ref_rate += flt(d.qty) * (item_rate and flt(item_rate[0][0]) or 0)
+
+			if ref_rate:
+				# clear old rates
+				sql("delete from `tabItem Price` where parent=%s and price_list_name = %s", (i.name, self.doc.price_list))
+				
+				pld = addchild(i,"ref_rate_details", "Item Price")
+				pld.price_list_name = self.doc.price_List
+				pld.ref_rate = flt(ref_rate)
+				pld.ref_currency = self.doc.currency
+				pld.save()
+
+	# Update Items
+	# ------------
+	def update_item(self):
+		i = Document("Item", self.doc.new_item_code)
+		
+		# update fields
+		i.brand = self.doc.new_item_brand
+		i.stock_uom = self.doc.stock_uom 
+		i.item_group = self.doc.item_group
+		
+		# update rates
+		new_rates = {}
+		self.update_ref_rate(i)
+
+		i.item_name = self.doc.new_item_name
+		i.description = self.doc.description
+
+		# set default as 'No' or 0 in Item Master	as per TIC/3456
+		i.is_sample_item = 'No'
+		i.is_asset_item = 'No'
+		i.is_purchase_item = 'No'
+		i.is_manufactured_item = 'No'
+		i.is_sub_contracted_item = 'No'
+		i.is_service_item = 'No'
+		i.inspection_required = 'No'
+		i.has_serial_no = 'No'
+		i.lead_time_days = flt(0)
+		i.save()
+		msgprint("Items updated successfully.")
+
+
+	def validate(self):
+		# check for duplicate
+		self.check_duplicate()
+		item_code = self.get_main_item()
+		if not self.doc.new_item_code:
+			self.doc.new_item_code = make_autoname(item_code +'.###')
 
  
-  def on_update(self):
-    # if no item code, create new item code
-    if not sql("select name from tabItem where name=%s", self.doc.new_item_code):
-      self.create_new_item()
-    self.update_item()
+	def on_update(self):
+		# if no item code, create new item code
+		if not sql("select name from tabItem where name=%s", self.doc.new_item_code):
+			self.create_new_item()
+		self.update_item()
 
 
-  def check_duplicate(self, finder=0):
-    il = getlist(self.doclist, "sales_bom_items")
-    if not il:
-      msgprint("Add atleast one item")
-      return
-    
-    # get all Sales BOM that have the first item  
-    sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s", il[0].item_code)
-    
-    # check all siblings
-    sub_items = [[d.item_code, flt(d.qty)] for d in il]
-    
-    for s in sbl:
-      if not cstr(s[0]) == cstr(self.doc.name) :
-        t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s", s[0])
-        t = [[d[0], flt(d[1])] for d in t]
-  
-        if self.has_same_items(sub_items, t):
-          msgprint("%s has the same Sales BOM details" % s[0])
-          raise Exception
-    if finder:
-      msgprint("There is no Sales BOM present with the following Combination.")
+	def check_duplicate(self, finder=0):
+		il = getlist(self.doclist, "sales_bom_items")
+		if not il:
+			msgprint("Add atleast one item")
+			return
+		
+		# get all Sales BOM that have the first item	
+		sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s", il[0].item_code)
+		
+		# check all siblings
+		sub_items = [[d.item_code, flt(d.qty)] for d in il]
+		
+		for s in sbl:
+			if not cstr(s[0]) == cstr(self.doc.name) :
+				t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s", s[0])
+				t = [[d[0], flt(d[1])] for d in t]
+	
+				if self.has_same_items(sub_items, t):
+					msgprint("%s has the same Sales BOM details" % s[0])
+					raise Exception
+		if finder:
+			msgprint("There is no Sales BOM present with the following Combination.")
 
 
-  def has_same_items(self, l1, l2):
-    if len(l1)!=len(l2): return 0
-    for l in l2:
-      if l not in l1:
-        return 0
-    for l in l1:
-      if l not in l2:
-        return 0
-    return 1
\ No newline at end of file
+	def has_same_items(self, l1, l2):
+		if len(l1)!=len(l2): return 0
+		for l in l2:
+			if l not in l1:
+				return 0
+		for l in l1:
+			if l not in l2:
+				return 0
+		return 1
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.txt b/erpnext/stock/doctype/sales_bom/sales_bom.txt
index 6eb726a..476a319 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.txt
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-03-27 14:36:36',
+		'creation': '2012-04-23 16:00:21',
 		'docstatus': 0,
-		'modified': '2012-03-27 14:45:51',
+		'modified': '2012-04-24 15:07:42',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -24,7 +24,7 @@
 		'section_style': u'Simple',
 		'server_code_error': u' ',
 		'show_in_menu': 0,
-		'version': 40
+		'version': 1
 	},
 
 	# These values are common for all DocField
@@ -55,30 +55,6 @@
 	# DocPerm
 	{
 		'amend': 0,
-		'cancel': 1,
-		'create': 1,
-		'doctype': u'DocPerm',
-		'permlevel': 0,
-		'role': u'Sales User',
-		'submit': 0,
-		'write': 1
-	},
-
-	# DocPerm
-	{
-		'amend': 0,
-		'cancel': 0,
-		'create': 0,
-		'doctype': u'DocPerm',
-		'permlevel': 1,
-		'role': u'Sales User',
-		'submit': 0,
-		'write': 0
-	},
-
-	# DocPerm
-	{
-		'amend': 0,
 		'cancel': 0,
 		'create': 0,
 		'doctype': u'DocPerm',
@@ -124,15 +100,28 @@
 		'write': 0
 	},
 
-	# DocField
+	# DocPerm
 	{
-		'doctype': u'DocField',
-		'fieldname': u'trash_reason',
-		'fieldtype': u'Small Text',
-		'label': u'Trash Reason',
-		'oldfieldname': u'trash_reason',
-		'oldfieldtype': u'Small Text',
-		'permlevel': 1
+		'amend': 0,
+		'cancel': 1,
+		'create': 1,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Sales User',
+		'submit': 0,
+		'write': 1
+	},
+
+	# DocPerm
+	{
+		'amend': 0,
+		'cancel': 0,
+		'create': 0,
+		'doctype': u'DocPerm',
+		'permlevel': 1,
+		'role': u'Sales User',
+		'submit': 0,
+		'write': 0
 	},
 
 	# DocField
@@ -145,7 +134,7 @@
 		'oldfieldname': u'new_item_code',
 		'oldfieldtype': u'Data',
 		'permlevel': 1,
-		'reqd': 0
+		'reqd': 1
 	},
 
 	# DocField
@@ -156,7 +145,8 @@
 		'label': u'New Item Name',
 		'oldfieldname': u'new_item_name',
 		'oldfieldtype': u'Data',
-		'permlevel': 0
+		'permlevel': 0,
+		'reqd': 1
 	},
 
 	# DocField
@@ -167,7 +157,7 @@
 		'label': u'New Item Brand',
 		'oldfieldname': u'new_item_brand',
 		'oldfieldtype': u'Data',
-		'permlevel': 1
+		'permlevel': 0
 	},
 
 	# DocField
@@ -178,7 +168,8 @@
 		'label': u'New Description',
 		'oldfieldname': u'description',
 		'oldfieldtype': u'Text',
-		'permlevel': 1,
+		'permlevel': 0,
+		'reqd': 1,
 		'width': u'300px'
 	},
 
@@ -191,7 +182,8 @@
 		'oldfieldname': u'item_group',
 		'oldfieldtype': u'Link',
 		'options': u'Item Group',
-		'permlevel': 0
+		'permlevel': 0,
+		'reqd': 1
 	},
 
 	# DocField
@@ -267,7 +259,7 @@
 		'fieldtype': u'Date',
 		'label': u'Amendment Date',
 		'no_copy': 1,
-		'permlevel': 0,
+		'permlevel': 1,
 		'print_hide': 1
 	},
 
@@ -281,5 +273,16 @@
 		'options': u'Sales Invoice',
 		'permlevel': 1,
 		'print_hide': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'trash_reason',
+		'fieldtype': u'Small Text',
+		'label': u'Trash Reason',
+		'oldfieldname': u'trash_reason',
+		'oldfieldtype': u'Small Text',
+		'permlevel': 1
 	}
 ]
\ No newline at end of file
