diff --git a/accounts/doctype/ledger_balance_export/ledger_balance_export.py b/accounts/doctype/ledger_balance_export/ledger_balance_export.py
index d6cfc7b..e9a9505 100755
--- a/accounts/doctype/ledger_balance_export/ledger_balance_export.py
+++ b/accounts/doctype/ledger_balance_export/ledger_balance_export.py
@@ -36,7 +36,7 @@
 		# result initiatlization
 		header = 'Ledger Balances Between ' + getdate(self.doc.from_date).strftime('%d-%m-%Y') + ' and ' + getdate(self.doc.to_date).strftime('%d-%m-%Y')
 		res = [[header], ['Account', 'Posting Date', 'Voucher Type', 'Voucher No', 'Debit', 'Credit', 'Remarks']]
-		glc = get_obj('GL Control')	
+		glc = get_obj('GL Control')
 
 		for d in getlist(self.doclist, 'ledger_details'):
 			# Fetch acc details
@@ -59,5 +59,5 @@
 			res.append(['', '', '', 'Total Debit/Credit', debit, credit])
 			res.append(['', '', '', 'Opening Balance', opening])
 			res.append(['', '', '', 'Closing Balance', closing])
-			
+
 		return res
diff --git a/accounts/doctype/loan/loan.js b/accounts/doctype/loan/loan.js
index 1851a84..5a45362 100644
--- a/accounts/doctype/loan/loan.js
+++ b/accounts/doctype/loan/loan.js
@@ -19,9 +19,9 @@
 	},
 	hide_show_buttons: function(doc) {
 		if(doc.docstatus==0) {
-			hide_field('Installment Reciept'); show_field('Generate');
+			hide_field('Installment Reciept'); unhide_field('Generate');
 		} else if (doc.docstatus==1) {
-			show_field('Installment Reciept');hide_field('Generate');
+			unhide_field('Installment Reciept');hide_field('Generate');
 		}
 	},
 	clear_installments: function(doc) {
diff --git a/patches/patch.py b/patches/patch.py
index 4a57219..1568469 100644
--- a/patches/patch.py
+++ b/patches/patch.py
@@ -1405,5 +1405,5 @@
 		# update name of questions page
 		sql("update tabPage set name='questions' where name='Questions'")
 		sql("update tabPage set name='question-view' where name='Question View'")
-	elif patch_no == 339
+	elif patch_no == 339:
 		reload_doc('production','doctype','bill_of_materials')
diff --git a/production/doctype/bill_of_materials/bill_of_materials.js b/production/doctype/bill_of_materials/bill_of_materials.js
index ede959f..d458d27 100644
--- a/production/doctype/bill_of_materials/bill_of_materials.js
+++ b/production/doctype/bill_of_materials/bill_of_materials.js
@@ -1,20 +1,22 @@
-$import(Production Tips Common)
+//$import(Production Tips Common)
 
 // ONLOAD
 cur_frm.cscript.onload = function(doc,cdt,cdn){
 
-   
+
 }
 
 // On REFRESH
 cur_frm.cscript.refresh = function(doc,cdt,cdn){
 
-   
+
 
   // Hide - Un Hide Buttons
   if (!doc.is_default && doc.__islocal!=1) unhide_field('Set as Default BOM');
   else hide_field('Set as Default BOM');
-  
+  if (doc.is_default && doc.__islocal!=1) unhide_field('Unset as Default BOM');
+  else hide_field('Unset as Default BOM');
+
   if(doc.__islocal!=1){
     set_field_permlevel('item',1);
   }
@@ -76,9 +78,20 @@
   if (check) {
     $c('runserverobj', args={'method':'set_as_default_bom', 'docs': compress_doclist([doc])}, function(r,rt) {
     refresh_field('is_default');
-    hide_field('Set as Default BOM');
+    hide_field('Set as Default BOM');unhide_field('Unset as Default BOM');
     refresh_field('Set as Default BOM');
-    });	
+    });
+  }
+}
+
+cur_frm.cscript['Unset as Default BOM'] = function(doc,cdt,cdn) {
+  var check = confirm("Do you Really want to Unset BOM " + doc.name + " as default for Item " + doc.item);
+  if (check) {
+    $c('runserverobj', args={'method':'unset_as_default_bom', 'docs': compress_doclist([doc])}, function(r,rt) {
+    refresh_field('is_default');
+    hide_field('Unset as Default BOM');unhide_field('Set as Default BOM');
+    refresh_field('Unset as Default BOM');
+    });
   }
 }
 
@@ -88,16 +101,23 @@
   if (check) {
     $c('runserverobj', args={'method':'activate_inactivate_bom', 'arg': 'Activate', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
       cur_frm.refresh();
-    });	
+    });
   }
 }
 
+cur_frm.cscript['Test Flat BOM'] = function(doc,cdt,cdn) {
+
+    $c('runserverobj', args={'method':'get_current_flat_bom_items', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+      cur_frm.refresh();
+    });
+}
+
 cur_frm.cscript['Inactivate BOM'] = function(doc,cdt,cdn) {
   var check = confirm("DO YOU REALLY WANT TO INACTIVATE BOM : " + doc.name);
 
   if (check) {
     $c('runserverobj', args={'method':'activate_inactivate_bom', 'arg': 'Inactivate', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
       cur_frm.refresh();
-    });	
+    });
   }
 }
\ No newline at end of file
diff --git a/production/doctype/bill_of_materials/bill_of_materials.py b/production/doctype/bill_of_materials/bill_of_materials.py
index cc686e5..d7d3db5 100644
--- a/production/doctype/bill_of_materials/bill_of_materials.py
+++ b/production/doctype/bill_of_materials/bill_of_materials.py
@@ -13,7 +13,7 @@
 get_value = webnotes.conn.get_value
 in_transaction = webnotes.conn.in_transaction
 convert_to_lists = webnotes.conn.convert_to_lists
-	
+
 # -----------------------------------------------------------------------------------------
 
 
@@ -21,14 +21,14 @@
   def __init__(self, doc, doclist=[]):
     self.doc = doc
     self.doclist = doclist
-    
+
   def autoname(self):
     last_name = sql("select max(name) from `tabBill Of Materials` where name like 'BOM/%s/%%'" % self.doc.item)
     if last_name:
       idx = cint(cstr(last_name[0][0]).split('/')[-1]) + 1
     else:
       idx = 1
-    self.doc.name = 'BOM/' + self.doc.item + ('/%.3i' % idx) 
+    self.doc.name = 'BOM/' + self.doc.item + ('/%.3i' % idx)
 
   #----------- Client Trigger function ----------
   def get_item_detail(self, item_code):
@@ -53,15 +53,15 @@
       raise Exception
     if arg['item_code']:
       item = sql("select is_asset_item, is_purchase_item, docstatus, is_sub_contracted_item, description, stock_uom, default_bom from `tabItem` where item_code = %s", (arg['item_code']), as_dict = 1)
-      
+
       # Check for Asset Item
       if item and item[0]['is_asset_item'] == 'Yes':
         msgprint("Sorry!!! Item " + arg['item_code'] + " is an Asset of the company. Entered in BOM := " + cstr(self.doc.name))
         raise Exception
-        
+
       if item and item[0]['docstatus'] == 2:
         msgprint("Item %s does not exist in system" % cstr(args['item_code']))
- 
+
       ret_item = {
                  'description' : item and item[0]['description'] or '',
                  'stock_uom'   : item and item[0]['stock_uom'] or '',
@@ -78,15 +78,15 @@
     if arg['bom_no'] or not ret_item['bom_no'] =='':
       if arg['bom_no']:
         bom = sql("select name, dir_mat_as_per_mar,dir_mat_as_per_lpr,dir_mat_as_per_sr, operating_cost, quantity from `tabBill Of Materials` where is_active = 'Yes' and name = %s", (arg['bom_no']), as_dict=1)
-      else:      
-        # get recent direct material cost, operating_cost, cost from Default BOM of Item 
+      else:
+        # get recent direct material cost, operating_cost, cost from Default BOM of Item
         bom = sql("select name, dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr, operating_cost, quantity from `tabBill Of Materials` where is_active = 'Yes' and name = %s", (ret_item['bom_no']), as_dict=1)
-      
-      # get recent direct material cost, operating_cost, cost from Entered BOM of Item 
+
+      # get recent direct material cost, operating_cost, cost from Entered BOM of Item
       ret_item['bom_no'] = bom and bom[0]['name'] or ''
 
       if bom and bom[0]['name']:
-        ret_bom = { 
+        ret_bom = {
         'dir_mat_as_per_mar' : flt(bom[0]['dir_mat_as_per_mar']) / flt(bom[0]['quantity']) or 0.00,
         'dir_mat_as_per_lpr' : flt(bom[0]['dir_mat_as_per_lpr']) / flt(bom[0]['quantity']) or 0.00,
         'dir_mat_as_per_sr'  : flt(bom[0]['dir_mat_as_per_sr']) / flt(bom[0]['quantity']) or 0.00,
@@ -106,15 +106,15 @@
             'standard_rate'      : 0
             }
           ret_item.update(ret_bom_rates)
-    return ret_item
-  
+    return cstr(ret_item)
+
   def set_as_default_bom(self):
     # set Is Default as 1
     set(self.doc,'is_default', flt(1))
 
     # get previous default bom from Item Master
     prev_def_bom = sql("select default_bom from `tabItem` where name = %s", self.doc.item,as_dict = 1)
-    
+
     if prev_def_bom[0]['default_bom'] and prev_def_bom[0]['default_bom'] != self.doc.name:
       # update Is Default as 0 in Previous Default BOM
       msgprint(cstr(prev_def_bom[0]['default_bom']) + "is no longer Default BOM for item" + cstr(self.doc.item))
@@ -124,12 +124,20 @@
     sql("update `tabItem` set default_bom = '%s' where name = '%s'" % (self.doc.name,self.doc.item))
     msgprint(cstr(self.doc.name) + "has been set as Default BOM for Item "+cstr(self.doc.item))
 
+  def unset_as_default_bom(self):
+    # set Is Default as 1
+    set(self.doc,'is_default', flt(0))
+
+    # update current BOM as default bom in Item Master
+    sql("update `tabItem` set default_bom = null where name = '%s'" % (self.doc.item))
+    msgprint(cstr(self.doc.name) + "has been unset as Default BOM for Item "+cstr(self.doc.item))
+
   def check_active_parent_boms(self):
     act_pbom = sql("select distinct t1.parent from `tabBOM Material` t1, `tabBill Of Materials` t2 where t1.bom_no ='%s' and t2.name = t1.parent and t2.is_active = 'Yes' and t2.docstatus = 1 and t1.docstatus =1 " % self.doc.name )
     if act_pbom and act_pbom[0][0]:
       msgprint("Sorry cannot Inactivate as BOM %s is child of one or many other active parent BOMs" % self.doc.name)
       raise Exception
-      
+
   def activate_inactivate_bom(self, action):
     if cstr(action) == 'Activate':
       self.validate()
@@ -141,11 +149,11 @@
   #------ On Validation Of Document ----------
   def validate_main_item(self):
     item = sql("select is_manufactured_item, is_sub_contracted_item from `tabItem` where name = %s and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life >  now())", self.doc.item, as_dict = 1)
-    
+
     if not item:
       msgprint("Item %s do not exists in the system. Entered in BOM := %s" % (cstr(self.doc.item), cstr(self.doc.name)))
       raise Exception
-      
+
     elif not item[0]['is_manufactured_item'] == 'Yes' and not item[0]['is_sub_contracted_item'] == 'Yes':
       msgprint("Sorry cannot make Bill Of Materials for Item %s. As it is not a manufactured / sub-contracted item. Entered in BOM := %s " % (cstr(self.doc.item), cstr(self.doc.name)))
       raise Exception
@@ -156,7 +164,7 @@
     if not o.operation_no:
       msgprint("Please Enter Operation No at Row " + cstr(o.idx)+" in BOM := " +cstr(self.doc.name))
       raise Exception
-      
+
     if not o.workstation:
       msgprint("Please Enter Workstation for Operation No. " + cstr(o.operation_no) + " in BOM NO. " + self.doc.name)
       raise Exception
@@ -172,7 +180,7 @@
 
       # add operation in op list
     self.op.append(cstr(o.operation_no))
- 
+
   # Validate materials
   #-------------------------------------------------
 
@@ -196,7 +204,7 @@
     if not item:
       msgprint("Item %s is not present in Item Master." % m.item_code)
       raise Exception
-      
+
     if item[0]['is_manufactured_item'] == 'Yes' or item[0]['is_sub_contracted_item'] == 'Yes':
       bom = sql("select name, is_active, docstatus from `tabBill Of Materials` where item = %s", m.item_code, as_dict =1)
       if bom and bom[0]['name']:
@@ -209,17 +217,17 @@
             if cstr(m.bom_no) == cstr(b['name']):
               if b['is_active'] != 'Yes':
                 msgprint("BOM %s NOT ACTIVE BOM. Entered in BOM := %s at row no := %s" % (cstr(m.bom_no), cstr(self.doc.name), m.idx))
-                raise Exception  
-              
+                raise Exception
+
               #if flt(b['docstatus']) != 1:
               #  msgprint("BOM %s is NOT SUBMITTED."% cstr(m.bom_no))
               #  raise Exception
-              
+
               match = 1
           if not match:
             msgprint("Item %s does not belongs to Bill Of Material %s or Bill Of Material %s is NOT ACTIVE BOM. Entered in BOM := %s at row no := %s" % (cstr(m.item_code),cstr(m.bom_no), cstr(m.bom_no), self.doc.name, m.idx))
             raise Exception
-    
+
     if not item[0]['is_manufactured_item'] == 'Yes' and not item[0]['is_sub_contracted_item']== 'Yes':
       if m.bom_no:
         msgprint("As in Item Master of Item %s Is Manufactured Item / Is Sub-Contracted Item  is not 'Yes' hence there should be no BOM.In BOm := %s at row no := %s" % (m.item_code, cstr(self.doc.name), m.idx))
@@ -235,22 +243,23 @@
 
   # Calculate Cost
   #-----------------------------------------------
-    
+
   def calculate_cost(self, validate = 0):
     self.op, op_cost, dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr, count_mat = [], 0.0, 0.0,0.0,0.0, 0
     # --------  Calculate Cost Of BOM  -------------
     # --- calculate operating cost from BOM Operations ----
     for o in getlist(self.doclist, 'bom_operations'):
-      # --- Validation for enteries in BOM Operations ---- 
+      # --- Validation for enteries in BOM Operations ----
       if validate:
         self.validate_operations(o)
-        
+
       o.operating_cost = flt(flt(o.time_in_mins)/60) * flt(o.hour_rate)
       if validate != 1:
         o.save()
+        msgprint('Operation saved')
 
       op_cost = flt(op_cost) + flt(o.operating_cost)
-    
+
     # --- calculate operating cost and direct material cost from BOM Material ---
     for m in getlist(self.doclist, 'bom_materials'):
       # --- Validation for enteries in BOM Material --- '''
@@ -259,12 +268,12 @@
         self.validate_materials(m)
 
       if m.bom_no:
-        # add operating cost of child boms 
+        # add operating cost of child boms
         op_cost += flt(m.operating_cost)
-        
+
         # update dir_mat, op_cost, value from child bom
         self.update_childs_dir_op_value(m, child_bom_cost = 1)
-        
+
         # check for is_sub_contracted_item
         item = sql("select is_sub_contracted_item from `tabItem` where name = '%s'" % m.item_code, as_dict =1)
         if item and item[0]['is_sub_contracted_item'] == 'Yes':
@@ -275,13 +284,13 @@
           # calculate Direct Material
           dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr = self.calculate_dir_mat(m, dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr, has_bom = 1, is_sub_cont =1)
         else:
-          # update mar,lpr,sr as 0 
+          # update mar,lpr,sr as 0
           self.update_mar_lpr_sr( m, mar = 0, lpr = 0, sr = 0)
           # calculate amount
           self.calculate_amount( m, has_bom = 1, is_sub_cont = 0)
           # calculate Direct Material
           dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr = self.calculate_dir_mat(m, dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr, has_bom = 1, is_sub_cont =0)
-   
+
       else :
         # update dir_mat,op_cost, value as 0
         self.update_childs_dir_op_value(m, child_bom_cost = 0)
@@ -291,7 +300,7 @@
         self.calculate_amount(m, has_bom = 0, is_sub_cont = 0)
         # calculate Direct Material
         dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr = self.calculate_dir_mat(m, dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr, has_bom =0, is_sub_cont =0)
-        
+
       # update qty_consumed_per_unit
       m.qty_consumed_per_unit = flt(m.qty) / flt(self.doc.quantity)
       m.save()
@@ -314,12 +323,12 @@
   def update_childs_dir_op_value(self, m, child_bom_cost = 0):
     #msgprint("IN UPDATE CHILDS DIR OP VALUE")
     if child_bom_cost:
-      # get recent direct material cost, operating cost, cost from child bom 
+      # get recent direct material cost, operating cost, cost from child bom
       child_bom_cost = sql("select dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr, operating_cost, cost_as_per_mar, cost_as_per_lpr, cost_as_per_sr, quantity from `tabBill Of Materials` where  name = %s", m.bom_no, as_dict = 1)
-    
+
     # operating_cost
     m.operating_cost = child_bom_cost and flt(child_bom_cost[0]['operating_cost']) / flt(child_bom_cost[0]['quantity']) or 0.00
-    
+
     val_dir_dict = {'value_as_per_mar': 'cost_as_per_mar', 'dir_mat_as_per_mar': 'dir_mat_as_per_mar',
                     'value_as_per_lpr': 'cost_as_per_lpr', 'dir_mat_as_per_lpr': 'dir_mat_as_per_lpr',
                     'value_as_per_sr' : 'cost_as_per_sr' , 'dir_mat_as_per_sr' : 'dir_mat_as_per_sr'  }
@@ -353,7 +362,7 @@
       dir_mat_as_per_mar += flt(m.amount_as_per_mar)
       dir_mat_as_per_lpr += flt(m.amount_as_per_lpr)
       dir_mat_as_per_sr  += flt(m.amount_as_per_sr)
-    #msgprint(cstr(m.item_code))  
+    #msgprint(cstr(m.item_code))
     #msgprint("dir_mat_as_per_mar < ==> " + cstr(dir_mat_as_per_mar) + "***" + "dir_mat_as_per_lpr < ==> " + cstr(dir_mat_as_per_lpr) + "***" + "dir_mat_as_per_sr < ==> " + cstr(dir_mat_as_per_sr) + "***")
     return dir_mat_as_per_mar, dir_mat_as_per_lpr, dir_mat_as_per_sr
 
@@ -367,9 +376,9 @@
       while withdraw:
         if not fcfs_bal:
           break # nothing in store
-           
+
         batch = fcfs_bal[0]
-          
+
         if batch[0] < withdraw:
           # not enough in current batch, clear batch
           withdraw -= batch[0]
@@ -424,8 +433,8 @@
       #ma_rate = sql("select ifnull(sum(ma_rate), 0)/ ifnull(count(*),1) from `tabBin` where item_code = '%s' and ifnull(ma_rate, 0) > 0" % cstr(item_code))
       #ma_rate = flt(ma_rate and ma_rate[0][0]) or 0
       ma_rate = self.get_valuation_rate(item_code, qty)
-      
-    # get recent last purchase rate 
+
+    # get recent last purchase rate
     lpr_rate = lpr and flt(sql("select last_purchase_rate from `tabItem` where name = '%s'" % item_code)[0][0]) or 0.00
     # get recent standard rate
     sr_rate = sr and flt(sql("select standard_rate from `tabItem` where name = '%s'" % item_code)[0][0]) or 0.00
@@ -440,13 +449,14 @@
         raise Exception
       else:
         check_list.append(cstr(d.item_code))
-  
-  #----- Document on Save function------  
+
+  #----- Document on Save function------
   def validate(self):
+    #msgprint(len(getlist(self.doclist, 'bom_materials')))
     self.validate_main_item()
     self.validate_duplicate_items()
     self.calculate_cost(validate = 1)
-   
+
   def check_recursion(self):
     check_list = [['parent', 'bom_no', 'parent'], ['bom_no', 'parent', 'child']]
     for d in check_list:
@@ -466,10 +476,10 @@
       msgprint("Cannot change Item once the Bill Of Material is created.")
       raise Exception
     self.check_recursion()
-    
+
 
 # ********************************************** Submit *************************************************************
-  
+
   # Add Flat BOM Details
   # -----------------------
   def add_to_flat_bom_detail(self, is_submit = 0):
@@ -486,9 +496,11 @@
 
   #Get Child Flat BOM Items
   #----------------------------------------
-  def get_child_flat_bom_items(self, item, d):   
+  def get_child_flat_bom_items(self, item, d):
+
     child_flat_bom_items=[]
     if item and (item[0]['is_sub_contracted_item'] == 'Yes' or item[0]['is_pro_applicable'] == 'Yes'):
+
       child_flat_bom_items = sql("select item_code, description, qty_consumed_per_unit, stock_uom, moving_avg_rate, last_purchase_rate, standard_rate, '%s' as parent_bom, bom_mat_no, 'No' as is_pro_applicable from `tabFlat BOM Detail` where parent = '%s' and is_pro_applicable = 'No' and docstatus = 1" % ( d.bom_no, cstr(d.bom_no)))
       self.cur_flat_bom_items.append([d.item_code, d.description, flt(d.qty), d.stock_uom, flt(d.moving_avg_rate), flt(d.amount_as_per_mar), flt(d.last_purchase_rate), flt(d.amount_as_per_lpr), flt(d.standard_rate), flt(d.amount_as_per_sr), flt(d.qty_consumed_per_unit), (item[0]['is_sub_contracted_item'] == 'Yes') and d.parent or d.bom_no, d.name, (item[0]['is_sub_contracted_item'] == 'Yes') and 'No' or 'Yes'])
 
@@ -500,20 +512,22 @@
       raise Exception
     else:
       return child_flat_bom_items
-  
-  
+
+
   # Get Current Flat BOM Items
   # -----------------------------
   def get_current_flat_bom_items(self):
+
     self.cur_flat_bom_items = []
-    
+
     cfb_lbl = {'item_code': 0, 'description': 1, 'qty_consumed_per_unit': 2, 'stock_uom': 3, 'moving_avg_rate': 4, 'last_purchase_rate': 5, 'standard_rate': 6, 'parent_bom': 7, 'bom_mat_no': 8, 'is_pro_applicable': 9}
-    
-    for d in getlist(self.doclist, 'bom_materials'):  
+
+    for d in getlist(self.doclist, 'bom_materials'):
+
       if d.bom_no:
         item = sql("select is_sub_contracted_item, is_pro_applicable from `tabItem` where name = '%s'" % d.item_code, as_dict = 1)
         child_flat_bom_items = self.get_child_flat_bom_items(item,d)
-        
+
         for c in child_flat_bom_items:
           self.cur_flat_bom_items.append([c[cfb_lbl['item_code']], c[cfb_lbl['description']], flt(d.qty) * flt(c[cfb_lbl['qty_consumed_per_unit']]), c[cfb_lbl['stock_uom']], flt(c[cfb_lbl['moving_avg_rate']]), flt(d.qty) * flt(c[cfb_lbl['qty_consumed_per_unit']]) * flt(c[cfb_lbl['moving_avg_rate']]) ,flt(c[cfb_lbl['last_purchase_rate']]), flt(d.qty) * flt(c[cfb_lbl['qty_consumed_per_unit']]) * flt(c[cfb_lbl['last_purchase_rate']]), flt(c[cfb_lbl['standard_rate']]), flt(d.qty) * flt(c[cfb_lbl['qty_consumed_per_unit']]) * flt(c[cfb_lbl['standard_rate']]), flt(d.qty_consumed_per_unit) * flt(c[cfb_lbl['qty_consumed_per_unit']]), c[cfb_lbl['parent_bom']], c[cfb_lbl['bom_mat_no']], c[cfb_lbl['is_pro_applicable']]])
       else:
@@ -521,10 +535,10 @@
         self.cur_flat_bom_items.append([d.item_code, d.description, flt(d.qty), d.stock_uom, flt(d.moving_avg_rate), flt(d.amount_as_per_mar), flt(d.last_purchase_rate), flt(d.amount_as_per_lpr), flt(d.standard_rate), flt(d.amount_as_per_sr), flt(d.qty_consumed_per_unit), d.parent, d.name, 'No' ])
 
   # Update Flat BOM Engine
-  # ------------------------  
+  # ------------------------
   def update_flat_bom_engine(self, is_submit = 0):
     # following will be correct data
-    # get correct / updated flat bom data    
+    # get correct / updated flat bom data
     self.get_current_flat_bom_items()
     # insert to curr flat bom data
     self.add_to_flat_bom_detail(is_submit)
@@ -533,9 +547,9 @@
   # On Submit
   # -----------
   def on_submit(self):
-    self.update_flat_bom_engine()
+    self.update_flat_bom_engine(1)
 
-        
+
   def get_parent_bom_list(self, bom_no):
     p_bom = sql("select parent from `tabBOM Material` where bom_no = '%s'" % bom_no)
     return p_bom and [i[0] for i in p_bom] or []
diff --git a/production/doctype/bom_control/bom_control.py b/production/doctype/bom_control/bom_control.py
index 02b61e3..6b0987b 100644
--- a/production/doctype/bom_control/bom_control.py
+++ b/production/doctype/bom_control/bom_control.py
@@ -1,7 +1,7 @@
 # Please edit this list and import only required elements
 import webnotes
 
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
+from webnotes.utils import cint, flt
 from webnotes.model import db_exists
 from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
 from webnotes.model.doclist import getlist, copy_doclist
@@ -13,7 +13,7 @@
 get_value = webnotes.conn.get_value
 in_transaction = webnotes.conn.in_transaction
 convert_to_lists = webnotes.conn.convert_to_lists
-	
+
 # -----------------------------------------------------------------------------------------
 
 
@@ -32,7 +32,7 @@
     return '~~~'.join([r for r in item_group])
 
   def get_item_code(self,item_group):
-    # here Bill Of Materials docstatus = 1 and is_active ='yes' condition is not given because some bom is under construction 
+    # here Bill Of Materials docstatus = 1 and is_active ='yes' condition is not given because some bom is under construction
     # that is it is still in saved mode and they want see till where they have reach.
     ret = sql("select distinct t1.name from `tabItem` t1, `tabBill Of Materials` t2 where t2.item = t1.name and t1.item_group = '%s' " % (item_group))
     return '~~~'.join([r[0] for r in ret])
@@ -44,18 +44,20 @@
   def get_operations(self,bom_no):
     # reply = [ 'Operation',operation_no, opn_description,BOM NO     , workstation, hour_rate,  time_in_minutes,  Total Direct Material, Total Operating Cost, Cost]
     # reply = [ 0           ,  1         ,    2          ,3          , 4          ,  5        ,  6             ,         7            ,   8                 ,9                     , 10                  , 11  ]
-    
     ret = sql("select operation_no,opn_description,workstation,hour_rate,time_in_mins from `tabBOM Operation` where parent = %s", bom_no, as_dict = 1)
     cost = sql("select dir_mat_as_per_mar , operating_cost , cost_as_per_mar from `tabBill Of Materials` where name = %s", bom_no, as_dict = 1)
+
     # Validate the BOM ENTRIES
     #check = get_obj('Bill Of Materials', bom_no, with_children =1).validate()
     reply = []
-    for r in ret:
-      reply.append(['operation',cint(r['operation_no']), r['opn_description'] or '','%s'% bom_no,r['workstation'],flt(r['hour_rate']),flt(r['time_in_mins']),0,0,0])
-    reply[0][7]= flt(cost[0]['dir_mat_as_per_mar'])
-    reply[0][8]=flt(cost[0]['operating_cost']) 
-    reply[0][9]=flt(cost[0]['cost_as_per_mar'])
-    #msgprint(bom_no)
+
+    if ret:
+      for r in ret:
+        reply.append(['operation',cint(r['operation_no']), r['opn_description'] or '','%s'% bom_no,r['workstation'],flt(r['hour_rate']),flt(r['time_in_mins']),0,0,0])
+
+      reply[0][7]= flt(cost[0]['dir_mat_as_per_mar'])
+      reply[0][8]=flt(cost[0]['operating_cost'])
+      reply[0][9]=flt(cost[0]['cost_as_per_mar'])
     return reply
 
   def get_item_bom(self,data):
@@ -64,7 +66,7 @@
     data = eval(data)
     reply = []
     ret = sql("select item_code,description,bom_no,qty,scrap,stock_uom,value_as_per_mar,moving_avg_rate from `tabBOM Material` where parent = '%s' and operation_no = '%s'" % (data['bom_no'],data['op_no']), as_dict =1 )
-    
+
     for r in ret:
       item = sql("select is_manufactured_item, is_sub_contracted_item from `tabItem` where name = '%s'" % r['item_code'], as_dict=1)
       if not item[0]['is_manufactured_item'] == 'Yes' and not item[0]['is_sub_contracted_item'] =='Yes':
@@ -78,9 +80,8 @@
     return reply
 
 
-
-  #------------- Wrapper Code --------------  
-  # BOM TREE   
+  #------------- Wrapper Code --------------
+  # BOM TREE
   def calculate_cost( self, bom_no):
     main_bom_list = get_obj(dt = 'Production Control').traverse_bom_tree( bom_no = bom_no, qty = 1, calculate_cost = 1)
     main_bom_list.reverse()
@@ -89,13 +90,13 @@
       bom_obj.calculate_cost(validate = 0)
       bom_obj.doc.save()
     return 'calculated'
-      
+
 
   def get_bom_tree_list(self,args):
     arg = eval(args)
     i =[]
     for a in sql("select t1.name from `tabBill Of Materials` t1, `tabItem` t2 where t2.item_group like '%s' and t1.item like '%s'"%(arg['item_group'] +'%',arg['item_code'] + '%')):
       if a[0] not in i:
-        i.append(a[0]) 
+        i.append(a[0])
     return i
 #    return [s[0] for s in sql("select t1.name from `tabBill Of Materials` t1, `tabItem` t2 where t2.item_group like '%s'  and t1.item like '%s' " %(arg['item_group']+'%',arg['item_code'+'%'])]
\ No newline at end of file
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 4329980..bb2b456 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -13,7 +13,7 @@
 get_value = webnotes.conn.get_value
 in_transaction = webnotes.conn.in_transaction
 convert_to_lists = webnotes.conn.convert_to_lists
-	
+
 # -----------------------------------------------------------------------------------------
 
 from utilities.transaction_base import TransactionBase
@@ -38,20 +38,20 @@
 
   def get_default_schedule_date(self):
     get_obj(dt = 'Purchase Common').get_default_schedule_date(self)
-    
+
 #-----------------Validation For Fiscal Year------------------------
   def validate_fiscal_year(self):
     get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Transaction Date')
-   
-  
+
+
   # Get Item Details
   def get_item_details(self, arg = ''):
     return get_obj(dt='Purchase Common').get_item_details(self,arg)
-  
+
   # Get UOM Details
   def get_uom_details(self, arg = ''):
     return get_obj(dt='Purchase Common').get_uom_details(arg)
-  
+
   # GET TERMS & CONDITIONS
   # =====================================================================================
   def get_tc_details(self):
@@ -59,16 +59,16 @@
 
   # get available qty at warehouse
   def get_bin_details(self, arg = ''):
-    return get_obj(dt='Purchase Common').get_bin_details(arg)f
+    return get_obj(dt='Purchase Common').get_bin_details(arg)
 
   # Pull Purchase Order
   def get_po_details(self):
     self.validate_prev_docname()
     get_obj('DocType Mapper', 'Purchase Order-Purchase Receipt').dt_map('Purchase Order', 'Purchase Receipt', self.doc.purchase_order_no, self.doc, self.doclist, "[['Purchase Order','Purchase Receipt'],['PO Detail', 'Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]")
-  
+
   # validate if PO has been pulled twice
   def validate_prev_docname(self):
-    for d in getlist(self.doclist, 'purchase_receipt_details'): 
+    for d in getlist(self.doclist, 'purchase_receipt_details'):
       if self.doc.purchase_order_no and d.prevdoc_docname and self.doc.purchase_order_no == d.prevdoc_docname:
         msgprint(cstr(self.doc.purchase_order_no) + " Purchase Order details have already been pulled. ")
         raise Exception
@@ -79,15 +79,15 @@
   # validate accepted and rejected qty
   def validate_accepted_rejected_qty(self):
     for d in getlist(self.doclist, "purchase_receipt_details"):
-      
-      # If Reject Qty than Rejected warehouse is mandatory    
+
+      # If Reject Qty than Rejected warehouse is mandatory
       if flt(d.rejected_qty) and (not self.doc.rejected_warehouse):
         msgprint("Rejected Warehouse is necessary if there are rejections. See 'Receipt Items'")
         raise Exception
 
-      # Check Received Qty = Accepted Qty + Rejected Qty 
+      # Check Received Qty = Accepted Qty + Rejected Qty
       if ((flt(d.qty) + flt(d.rejected_qty)) != flt(d.received_qty)):
-        
+
         msgprint("Sum of Accepted Qty and Rejected Qty must be equal to Received quantity. Error for Item: " + cstr(d.item_code))
         raise Exception
 
@@ -99,8 +99,8 @@
       if flt(self.doc.net_total) and flt(d.qty):
         #d.valuation_rate = (flt(d.purchase_rate) + ((flt(d.amount) * (total_b_cost)) / (self.doc.net_total * flt(d.qty))) + (flt(d.rm_supp_cost) / flt(d.qty))) / flt(d.conversion_factor)
         d.valuation_rate = (flt(d.purchase_rate) + ((flt(d.amount) * (total_b_cost)) / (self.doc.net_total * flt(d.qty))) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
-  
-  # Check for Stopped status 
+
+  # Check for Stopped status
   def check_for_stopped_status(self, pc_obj):
     check_list =[]
     for d in getlist(self.doclist, 'purchase_receipt_details'):
@@ -117,8 +117,8 @@
          if not d.prevdoc_docname:
            msgprint("Purchse Order No. required against item %s"%d.item_code)
            raise Exception
-    
-   
+
+
   # validate
   def validate(self):
     self.po_required()
@@ -137,20 +137,20 @@
     self.check_for_stopped_status(pc_obj)
 
     # get total in words
-    dcc = TransactionBase().get_company_currency(self.doc.company)    
+    dcc = TransactionBase().get_company_currency(self.doc.company)
     self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total)
     self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import)
     # update valuation rate
     self.update_valuation_rate()
 
-  
+
   # On Update
-  # ----------------------------------------------------------------------------------------------------    
+  # ----------------------------------------------------------------------------------------------------
   def on_update(self):
     if self.doc.rejected_warehouse:
       for d in getlist(self.doclist,'purchase_receipt_details'):
         d.rejected_warehouse = self.doc.rejected_warehouse
-    
+
     self.update_rw_material_detail()
     get_obj('Stock Ledger').scrub_serial_nos(self)
 
@@ -166,23 +166,23 @@
       # Check if is_stock_item == 'Yes'
       if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
         ord_qty = 0
-        pr_qty = flt(d.qty) * flt(d.conversion_factor) 
-        
-        # Check If Prevdoc Doctype is Purchase Order  
+        pr_qty = flt(d.qty) * flt(d.conversion_factor)
+
+        # Check If Prevdoc Doctype is Purchase Order
         if cstr(d.prevdoc_doctype) == 'Purchase Order':
-          # get qty and pending_qty of prevdoc 
+          # get qty and pending_qty of prevdoc
           curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'PO Detail', 'Purchase Order - Purchase Receipt', self.doc.name)
           max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0
-          
+
           if flt(qty) + flt(pr_qty) > flt(max_qty):
             curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor)
           else:
             curr_qty = flt(pr_qty)
-          
+
           ord_qty = -flt(curr_qty)
           # update order qty in bin
           bin = get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(ord_qty), 0, 0, d.item_code, self.doc.transaction_date)
-        
+
         # UPDATE actual qty to warehouse by pr_qty
         self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit)
         # UPDATE actual to rejected warehouse by rejected qty
@@ -205,8 +205,8 @@
       'posting_time'        : self.doc.posting_time,
       'voucher_type'        : 'Purchase Receipt',
       'voucher_no'          : self.doc.name,
-      'voucher_detail_no'   : d.name, 
-      'actual_qty'          : qty, 
+      'voucher_detail_no'   : d.name,
+      'actual_qty'          : qty,
       'stock_uom'           : d.stock_uom,
       'incoming_rate'       : in_value,
       'company'             : self.doc.company,
@@ -220,11 +220,11 @@
   def validate_inspection(self):
     for d in getlist(self.doclist, 'purchase_receipt_details'):     #Enter inspection date for all items that require inspection
       ins_reqd = sql("select inspection_required from `tabItem` where name = %s", (d.item_code), as_dict = 1)
-      ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No'        
+      ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No'
       if ins_reqd == 'Yes' and not d.qa_no:
         msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create QA Inspection Report")
 
-  # Check for Stopped status 
+  # Check for Stopped status
   def check_for_stopped_status(self, pc_obj):
     check_list =[]
     for d in getlist(self.doclist, 'purchase_receipt_details'):
@@ -233,7 +233,7 @@
         pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
 
 
-  # on submit        
+  # on submit
   def on_submit(self):
     # Check for Approving Authority
     get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
@@ -241,19 +241,19 @@
     # Set status as Submitted
     set(self.doc,'status', 'Submitted')
     pc_obj = get_obj('Purchase Common')
-      
+
     # Update Previous Doc i.e. update pending_qty and Status accordingly
     pc_obj.update_prevdoc_detail(self, is_submit = 1)
-        
+
     # Update Serial Record
     get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1)
 
-    # Update Stock 
+    # Update Stock
     self.update_stock(is_submit = 1)
-    
-    # Update last purchase rate 
+
+    # Update last purchase rate
     pc_obj.update_last_purchase_rate(self, 1)
-  
+
     # on submit notification
     get_obj('Notification Control').notify_contact('Purchase Receipt', self.doc.doctype,self.doc.name, self.doc.email_id, self.doc.contact_person)
 
@@ -271,11 +271,11 @@
 
   def on_cancel(self):
     pc_obj = get_obj('Purchase Common')
-    
+
     self.check_for_stopped_status(pc_obj)
     # 1.Check if Payable Voucher has been submitted against current Purchase Order
     # pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail')
-    
+
     submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % self.doc.name)
     if submitted:
       msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
@@ -283,27 +283,27 @@
 
     # 2.Set Status as Cancelled
     set(self.doc,'status','Cancelled')
-    
-    # 3. Cancel Serial No   
+
+    # 3. Cancel Serial No
     get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 0, is_incoming = 1)
 
-    # 4.Update Bin  
+    # 4.Update Bin
     self.update_stock(is_submit = 0)
-    
-    # 5.Update Indents Pending Qty and accordingly it's Status 
+
+    # 5.Update Indents Pending Qty and accordingly it's Status
     pc_obj.update_prevdoc_detail(self, is_submit = 0)
 
-    # 6. Update last purchase rate 
+    # 6. Update last purchase rate
     pc_obj.update_last_purchase_rate(self, 0)
 
-        
+
 #----------- code for Sub-contracted Items -------------------
   #--------check for sub-contracted items and accordingly update PR raw material detail table--------
   def update_rw_material_detail(self):
-  
+
     for d in getlist(self.doclist,'purchase_receipt_details'):
       item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code))
-      
+
       if item_det[0][0] == 'Yes':
         if item_det[0][1] == 'Yes':
           if not self.doc.is_subcontracted:
@@ -312,7 +312,7 @@
           if self.doc.is_subcontracted == 'Yes':
             if not self.doc.supplier_warehouse:
               msgprint("Please Enter Supplier Warehouse for subcontracted Items")
-              raise Exception         
+              raise Exception
             self.add_bom(d)
           else:
             self.doc.clear_table(self.doclist,'pr_raw_material_details',1)
@@ -322,7 +322,7 @@
             msgprint("Please Enter Supplier Warehouse for subcontracted Items")
             raise Exception
           self.add_bom(d)
-        
+
       self.delete_irrelevant_raw_material()
       #---------------calculate amt in  PR Raw Material Detail-------------
       self.calculate_amount(d)
@@ -338,7 +338,7 @@
       #-------------- add child function--------------------
       chgd_rqd_qty = []
       for i in bom_det:
-        
+
         if i and not sql("select name from `tabPR Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
 
           rm_child = addchild(self.doc, 'pr_raw_material_details', 'PR Raw Material Detail', 1, self.doclist)
@@ -347,7 +347,7 @@
           rm_child.bom_detail_no = i and i[6] or ''
           rm_child.main_item_code = i and i[0] or ''
           rm_child.rm_item_code = i and i[1] or ''
-          rm_child.description = i and i[7] or ''          
+          rm_child.description = i and i[7] or ''
           rm_child.stock_uom = i and i[5] or ''
           rm_child.rate = i and flt(i[3]) or flt(i[4])
           rm_child.conversion_factor = d.conversion_factor
@@ -363,7 +363,7 @@
               chgd_rqd_qty.append(cstr(i[1]))
               pr_rmd.main_item_code = i[0]
               pr_rmd.rm_item_code = i[1]
-              pr_rmd.description = i[7]              
+              pr_rmd.description = i[7]
               pr_rmd.stock_uom = i[5]
               pr_rmd.required_qty = flt(act_qty)
               pr_rmd.consumed_qty = flt(act_qty)
@@ -372,20 +372,20 @@
               pr_rmd.save()
       if chgd_rqd_qty:
         msgprint("Please check consumed quantity for Raw Material Item Code: '%s'in Raw materials Detail Table" % ((len(chgd_rqd_qty) > 1 and ','.join(chgd_rqd_qty[:-1]) +' and ' + cstr(chgd_rqd_qty[-1:][0]) ) or cstr(chgd_rqd_qty[0])))
-              
+
 
   # Delete irrelevant raw material from PR Raw material details
-  #--------------------------------------------------------------  
+  #--------------------------------------------------------------
   def delete_irrelevant_raw_material(self):
     for d in getlist(self.doclist,'pr_raw_material_details'):
       if not sql("select name from `tabPurchase Receipt Detail` where name = '%s' and parent = '%s' and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)):
         d.parent = 'old_par:'+self.doc.name
         d.save()
-    
+
   def calculate_amount(self, d):
     amt = 0
     for i in getlist(self.doclist,'pr_raw_material_details'):
-      
+
       if(i.reference_name == d.name):
         #if i.consumed_qty == 0:
          # msgprint("consumed qty cannot be 0. Please Enter consumed qty ")
@@ -394,7 +394,7 @@
         amt += i.amount
     d.rm_supp_cost = amt
     d.save()
-    
+
 
   # --------------- Back Flush function called on submit and on cancel from update stock
   def bk_flush_supp_wh(self, is_submit):
@@ -402,7 +402,7 @@
       #--------- -ve quantity is passed as raw material qty has to be decreased when PR is submitted and it has to be increased when PR is cancelled
       consumed_qty = - flt(d.consumed_qty)
       self.make_sl_entry(d, self.doc.supplier_warehouse, flt(consumed_qty), 0, is_submit)
-      
+
 
   # get current_stock
   # ----------------
@@ -411,13 +411,13 @@
       if self.doc.supplier_warehouse:
         bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.doc.supplier_warehouse), as_dict = 1)
         d.current_stock = bin and flt(bin[0]['actual_qty']) or 0
-        
-        
-        
+
+
+
 
 # OTHER CHARGES TRIGGER FUNCTIONS
 # ====================================================================================
-  
+
   # *********** Get Tax rate if account type is TAX ********************
   def get_rate(self,arg):
     return get_obj('Purchase Common').get_rate(arg,self)
diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py
index e67afa6..5188e08 100644
--- a/stock/doctype/stock_ledger/stock_ledger.py
+++ b/stock/doctype/stock_ledger/stock_ledger.py
@@ -13,7 +13,7 @@
 get_value = webnotes.conn.get_value
 in_transaction = webnotes.conn.in_transaction
 convert_to_lists = webnotes.conn.convert_to_lists
-	
+
 # -----------------------------------------------------------------------------------------
 
 def get_sr_no_list(sr_nos, qty = 0):
@@ -55,15 +55,17 @@
 				serial_nos = self.get_sr_no_list(d.serial_no)
 				for s in serial_nos:
 					s = s.strip()
-					sr_war =	sql("select warehouse from `tabSerial No` where name = '%s'" % (s))
+					sr_war = sql("select warehouse,name from `tabSerial No` where name = '%s'" % (s))
 					if not sr_war:
+						msgprint("Serial No %s does not exists",s, raise_exception = 1)
+					elif not sr_war[0][0]:
 						msgprint("Please set a warehouse in the Serial No <b>%s</b>" % s, raise_exception = 1)
-					if sr_war[0][0] != d.warehouse:
+					elif sr_war[0][0] != d.warehouse:
 						msgprint("Serial No : %s for Item : %s doesn't exists in Warehouse : %s" % (s, d.item_code, d.warehouse), raise_exception = 1)
-					
+
 
 	# ------------------------------------
-	# check whether serial no is required	
+	# check whether serial no is required
 	# ------------------------------------
 	def validate_serial_no(self, obj, fname):
 		for d in getlist(obj.doclist, fname):
@@ -76,9 +78,9 @@
 					msgprint("If serial no required, please select 'Yes' in 'Has Serial No' in Item :" + d.item_code + ', otherwise please remove serial no', raise_exception=1)
 			elif ar_required == 'Yes' and not d.serial_no:
 				msgprint("Serial no is mandatory for item: "+ d.item_code, raise_exception = 1)
-			
 
-	
+
+
 	# -------------------
 	# get serial no list
 	# -------------------
@@ -90,27 +92,27 @@
 	# ---------------------
 	def set_pur_serial_no_values(self, obj, serial_no, d, s, new_rec):
 		item_details = sql("select item_group, warranty_period from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now()) " %(d.item_code), as_dict=1)
-		s.purchase_document_type =	 obj.doc.doctype
-		s.purchase_document_no	 =	 obj.doc.name
-		s.purchase_date					=	 obj.doc.posting_date
-		s.purchase_time					=	 obj.doc.posting_time
-		s.purchase_rate					=	 d.purchase_rate or d.incoming_rate
-		s.item_code						=	 d.item_code
-		s.brand							=	 d.brand
-		s.description					=	 d.description
-		s.item_group					=	 item_details and item_details[0]['item_group'] or ''
-		s.warranty_period				=	 item_details and item_details[0]['warranty_period'] or 0
-		s.supplier						=	 obj.doc.supplier
-		s.supplier_name					=	 obj.doc.supplier_name
-		s.supplier_address			 	=	 obj.doc.supplier_address
-		s.warehouse						=	 d.warehouse or d.t_warehouse
-		s.docstatus						=	 0
-		s.status						=	 'In Store'
-		s.modified						=	 nowdate()
-		s.modified_by					=	 session['user']
-		s.serial_no						=	 serial_no
-		s.fiscal_year					=	 obj.doc.fiscal_year
-		s.company						=	 obj.doc.company
+		s.purchase_document_type=	 obj.doc.doctype
+		s.purchase_document_no	=	 obj.doc.name
+		s.purchase_date		=	 obj.doc.posting_date
+		s.purchase_time		=	 obj.doc.posting_time
+		s.purchase_rate		=	 d.purchase_rate or d.incoming_rate
+		s.item_code		=	 d.item_code
+		s.brand			=	 d.brand
+		s.description		=	 d.description
+		s.item_group		=	 item_details and item_details[0]['item_group'] or ''
+		s.warranty_period	=	 item_details and item_details[0]['warranty_period'] or 0
+		s.supplier		=	 obj.doc.supplier
+		s.supplier_name		=	 obj.doc.supplier_name
+		s.supplier_address	=	 obj.doc.supplier_address
+		s.warehouse		=	 d.warehouse or d.t_warehouse
+		s.docstatus		=	 0
+		s.status		=	 'In Store'
+		s.modified		=	 nowdate()
+		s.modified_by		=	 session['user']
+		s.serial_no		=	 serial_no
+		s.fiscal_year		=	 obj.doc.fiscal_year
+		s.company		=	 obj.doc.company
 		s.save(new_rec)
 
 
@@ -227,7 +229,7 @@
 		sle = Document(doctype = 'Stock Ledger Entry')
 		for k in args.keys():
 			# adds warehouse_type
-			if k == 'warehouse': 
+			if k == 'warehouse':
 				sle.fields['warehouse_type'] = get_value('Warehouse' , args[k], 'warehouse_type')
 			sle.fields[k] = args[k]
 		sle_obj = get_obj(doc=sle)
@@ -235,7 +237,7 @@
 		sle_obj.validate()
 		sle.save(new = 1)
 		return sle.name
-		
+
 	def repost(self):
 		"""
 		Repost everything!
