diff --git a/accounts/doctype/bank_reconciliation/bank_reconciliation.py b/accounts/doctype/bank_reconciliation/bank_reconciliation.py
index 35db6fb..05c0432 100644
--- a/accounts/doctype/bank_reconciliation/bank_reconciliation.py
+++ b/accounts/doctype/bank_reconciliation/bank_reconciliation.py
@@ -42,7 +42,7 @@
 		self.doc.total_amount = 0.0
 
 		for d in dl:
-			nl = addchild(self.doc, 'entries', 'Bank Reconciliation Detail', 1, self.doclist)
+			nl = addchild(self.doc, 'entries', 'Bank Reconciliation Detail', self.doclist)
 			nl.posting_date = cstr(d[5])
 			nl.voucher_id = cstr(d[0])
 			nl.cheque_number = cstr(d[1])
diff --git a/accounts/doctype/budget_distribution/budget_distribution.py b/accounts/doctype/budget_distribution/budget_distribution.py
index 08103189..976fa84 100644
--- a/accounts/doctype/budget_distribution/budget_distribution.py
+++ b/accounts/doctype/budget_distribution/budget_distribution.py
@@ -31,7 +31,8 @@
 		'October','November','December']
     idx =1
     for m in month_list:
-      mnth = addchild(self.doc,'budget_distribution_details','Budget Distribution Detail',1,self.doclist)
+      mnth = addchild(self.doc, 'budget_distribution_details',
+        'Budget Distribution Detail', self.doclist)
       mnth.month = m or ''
       mnth.idx = idx
       idx += 1
diff --git a/accounts/doctype/gl_control/gl_control.py b/accounts/doctype/gl_control/gl_control.py
index e4896d3..44cab1e 100644
--- a/accounts/doctype/gl_control/gl_control.py
+++ b/accounts/doctype/gl_control/gl_control.py
@@ -223,7 +223,7 @@
 		obj.doclist = obj.doc.clear_table(obj.doclist,table_field_name)
 		# Create advance table
 		for d in jv_detail:
-			add = addchild(obj.doc, table_field_name, table_name, 1, obj.doclist)
+			add = addchild(obj.doc, table_field_name, table_name, obj.doclist)
 			add.journal_voucher = d[0]
 			add.jv_detail_no = d[3]
 			add.remarks = d[1]
@@ -286,7 +286,7 @@
 		webnotes.conn.sql("update `tabJournal Voucher Detail` set %s = '%s', %s = '%s' where name = '%s'" % (dr_or_cr, flt(allocate), doctype == "Purchase Invoice" and 'against_voucher' or 'against_invoice',cstr(against_document_no), jv_detail_no))
 
 		# new entry with balance amount
-		add = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', 1, jv_obj.doclist)
+		add = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', jv_obj.doclist)
 		add.account = account_head
 		add.cost_center = cstr(jvd[0][1])
 		add.balance = cstr(jvd[0][2])
@@ -353,7 +353,7 @@
 		if d['allocated_amt'] < d['unadjusted_amt']:
 			jvd = webnotes.conn.sql("select cost_center, balance, against_account, is_advance from `tabJournal Voucher Detail` where name = '%s'" % d['voucher_detail_no'])
 			# new entry with balance amount
-			ch = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', 1)
+			ch = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail')
 			ch.account = d['account']
 			ch.cost_center = cstr(jvd[0][0])
 			ch.balance = cstr(jvd[0][1])
diff --git a/accounts/doctype/journal_voucher/journal_voucher.py b/accounts/doctype/journal_voucher/journal_voucher.py
index 23c66a6..7c1dcfe 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/accounts/doctype/journal_voucher/journal_voucher.py
@@ -174,7 +174,7 @@
 					
 			# Set the diff in a new row
 			if flag == 0 and (flt(diff) != 0):
-				jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', 1, self.doclist)
+				jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
 				if diff>0:
 					jd.credit = flt(diff)
 				elif diff<0:
@@ -256,7 +256,7 @@
 		total = 0
 		for d in self.get_values():
 			total += flt(d[2])
-			jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', 1, self.doclist)
+			jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
 			jd.account = cstr(d[1])
 			if self.doc.write_off_based_on == 'Accounts Receivable':
 				jd.credit = flt(d[2])
@@ -265,7 +265,7 @@
 				jd.debit = flt(d[2])
 				jd.against_voucher = cstr(d[0])
 			jd.save(1)
-		jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', 1, self.doclist)
+		jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
 		if self.doc.write_off_based_on == 'Accounts Receivable':
 			jd.debit = total
 		elif self.doc.write_off_based_on == 'Accounts Payable':
diff --git a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
index 005b981..81b94a2 100644
--- a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
+++ b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
@@ -100,7 +100,7 @@
 	#--------------------------------------------------
 	def create_payment_table(self, gle):
 		for d in gle:
-			ch = addchild(self.doc, 'ir_payment_details', 'Payment to Invoice Matching Tool Detail', 1, self.doclist)
+			ch = addchild(self.doc, 'ir_payment_details', 'Payment to Invoice Matching Tool Detail', self.doclist)
 			ch.voucher_no = d.get('voucher_no')
 			ch.posting_date = d.get('posting_date')
 			ch.amt_due =  self.acc_type == 'debit' and flt(d.get('amt_due')) or -1*flt(d.get('amt_due'))
diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py
index a59061c..e8b725e 100644
--- a/buying/doctype/purchase_common/purchase_common.py
+++ b/buying/doctype/purchase_common/purchase_common.py
@@ -612,7 +612,8 @@
 		
 		idx = 0
 		for other in other_charge:
-			d =	addchild(obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges', 1, obj.doclist)
+			d =	addchild(obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges', 
+				obj.doclist)
 			d.category = other['category']
 			d.add_deduct_tax = other['add_deduct_tax']
 			d.charge_type = other['charge_type']
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index 7182306..812f59c 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -314,7 +314,7 @@
 			for i in bom_det:
 				if i and not sql("select name from `tabPurchase Order Item Supplied` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
 
-					rm_child = addchild(self.doc, 'po_raw_material_details', 'Purchase Order Item Supplied', 1, self.doclist)
+					rm_child = addchild(self.doc, 'po_raw_material_details', 'Purchase Order Item Supplied', self.doclist)
 
 					rm_child.reference_name = d.name
 					rm_child.bom_detail_no = i and i[6] or ''
diff --git a/buying/doctype/quality_inspection/quality_inspection.py b/buying/doctype/quality_inspection/quality_inspection.py
index 981bf43..415524f 100644
--- a/buying/doctype/quality_inspection/quality_inspection.py
+++ b/buying/doctype/quality_inspection/quality_inspection.py
@@ -41,7 +41,7 @@
 		specification = sql("select specification, value from `tabItem Quality Inspection Parameter` \
 			where parent = '%s' order by idx" % (self.doc.item_code))
 		for d in specification:
-			child = addchild(self.doc, 'qa_specification_details', 'Quality Inspection Reading', 1, self.doclist)
+			child = addchild(self.doc, 'qa_specification_details', 'Quality Inspection Reading', self.doclist)
 			child.specification = d[0]
 			child.value = d[1]
 			child.status = 'Accepted'
diff --git a/controllers/tax_controller.py b/controllers/tax_controller.py
index 009ab31..617c4cc 100644
--- a/controllers/tax_controller.py
+++ b/controllers/tax_controller.py
@@ -19,7 +19,7 @@
 import webnotes.model
 from webnotes import _, msgprint
 from webnotes.utils import cint, flt
-from webnotes.model.utils import round_doc
+from webnotes.model.utils import round_floats_in_doc
 import json
 
 from controllers.transaction_controller import TransactionController
@@ -83,7 +83,7 @@
 				self.precision.item[base_field])
 		
 		for item in self.item_doclist:
-			round_doc(item, self.precision.item)
+			round_floats_in_doc(item, self.precision.item)
 			
 			if item.fields.get(self.fmap.discount) == 100:
 				if not item.fields.get(self.fmap.print_ref_rate):
@@ -126,7 +126,7 @@
 			self.validate_included_tax(tax)
 			
 			# round relevant values
-			round_doc(tax, self.precision.tax)
+			round_floats_in_doc(tax, self.precision.tax)
 			
 	def calculate_net_total(self):
 		self.doc.net_total = 0
diff --git a/hr/doctype/holiday_list/holiday_list.py b/hr/doctype/holiday_list/holiday_list.py
index 63b1af4..43f9916 100644
--- a/hr/doctype/holiday_list/holiday_list.py
+++ b/hr/doctype/holiday_list/holiday_list.py
@@ -99,7 +99,7 @@
     yr_start_date, yr_end_date = self.get_fy_start_end_dates()
     date_list = self.get_weekly_off_date_list(yr_start_date, yr_end_date)
     for d in date_list:
-      ch = addchild(self.doc, 'holiday_list_details', 'Holiday', 1, self.doclist)
+      ch = addchild(self.doc, 'holiday_list_details', 'Holiday', self.doclist)
       ch.description = self.doc.weekly_off
       ch.holiday_date = d
 
diff --git a/hr/doctype/salary_structure/salary_structure.py b/hr/doctype/salary_structure/salary_structure.py
index d07be6e..f310b7b 100644
--- a/hr/doctype/salary_structure/salary_structure.py
+++ b/hr/doctype/salary_structure/salary_structure.py
@@ -70,7 +70,7 @@
   def make_table(self, doct_name, tab_fname, tab_name):
     list1 = sql("select name from `tab%s` where docstatus != 2" % doct_name)
     for li in list1:
-      child = addchild(self.doc, tab_fname, tab_name, 1, self.doclist)
+      child = addchild(self.doc, tab_fname, tab_name, self.doclist)
       if(tab_fname == 'earning_details'):
         child.e_type = cstr(li[0])
         child.modified_value = 0
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index d874d3c..bc80bfe 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -357,7 +357,8 @@
 		"Add items to Flat BOM table"
 		self.doclist = self.doc.clear_table(self.doclist, 'flat_bom_details', 1)
 		for d in self.cur_exploded_items:
-			ch = addchild(self.doc, 'flat_bom_details', 'BOM Explosion Item', 1, self.doclist)
+			ch = addchild(self.doc, 'flat_bom_details', 'BOM Explosion Item', 
+				self.doclist)
 			for i in d.keys():
 				ch.fields[i] = d[i]
 			ch.docstatus = self.doc.docstatus
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 51cb3a7..adc8091 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -101,7 +101,7 @@
 		for r in open_so:
 			if cstr(r['name']) not in so_list:
 				pp_so = addchild(self.doc, 'pp_so_details', 
-					'Production Plan Sales Order', 1, self.doclist)
+					'Production Plan Sales Order', self.doclist)
 				pp_so.sales_order = r['name']
 				pp_so.sales_order_date = cstr(r['transaction_date'])
 				pp_so.customer = cstr(r['customer'])
@@ -150,7 +150,7 @@
 		for p in items:
 			item_details = sql("""select description, stock_uom, default_bom 
 				from tabItem where name=%s""", p['item_code'])
-			pi = addchild(self.doc, 'pp_details', 'Production Plan Item', 1, self.doclist)
+			pi = addchild(self.doc, 'pp_details', 'Production Plan Item', self.doclist)
 			pi.sales_order				= p['parent']
 			pi.item_code				= p['item_code']
 			pi.description				= item_details and item_details[0][0] or ''
diff --git a/patches/april_2012/update_appraisal_permission.py b/patches/april_2012/update_appraisal_permission.py
index 5afcdbb..68002ba 100644
--- a/patches/april_2012/update_appraisal_permission.py
+++ b/patches/april_2012/update_appraisal_permission.py
@@ -7,7 +7,7 @@
 	webnotes.conn.sql("delete from `tabDocPerm` where role = 'All' and permlevel = 0 and parent in ('Appraisal', 'Ticket', 'Project')")
 
 	appr = get_obj('DocType', 'Appraisal', with_children=1)
-	ch = addchild(appr.doc, 'permissions', 'DocPerm', 0)
+	ch = addchild(appr.doc, 'permissions', 'DocPerm')
 	ch.permlevel = 0
 	ch.role = 'Employee'
 	ch.read = 1
diff --git a/patches/april_2012/update_role_in_address.py b/patches/april_2012/update_role_in_address.py
index 3a65c30..788aa7b 100644
--- a/patches/april_2012/update_role_in_address.py
+++ b/patches/april_2012/update_role_in_address.py
@@ -11,7 +11,7 @@
 
 	addr = get_obj('DocType', 'Address', with_children=1)
 	for d in role1+role2:
-		ch = addchild(addr.doc, 'permissions', 'DocPerm', 0)
+		ch = addchild(addr.doc, 'permissions', 'DocPerm')
 		ch.role = d
 		ch.read = 1
 		ch.write = 1
diff --git a/selling/doctype/opportunity/opportunity.py b/selling/doctype/opportunity/opportunity.py
index 82a6e8e..369fab7 100644
--- a/selling/doctype/opportunity/opportunity.py
+++ b/selling/doctype/opportunity/opportunity.py
@@ -123,7 +123,7 @@
 			user_lst.append(chk[0][0])
 		
 		for d in user_lst:
-			ch = addchild(ev, 'event_individuals', 'Event User', 0)
+			ch = addchild(ev, 'event_individuals', 'Event User')
 			ch.person = d
 			ch.save(1)
 
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index 0e75544..3b452f1 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -19,7 +19,7 @@
 
 from webnotes.utils import cstr, load_json
 from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild
+from webnotes.model.doc import Document
 from webnotes.model.wrapper import getlist, copy_doclist
 from webnotes.model.code import get_obj
 from webnotes import msgprint
diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py
index e672abf..03280e2 100644
--- a/selling/doctype/sales_common/sales_common.py
+++ b/selling/doctype/sales_common/sales_common.py
@@ -75,7 +75,7 @@
 			obj.doclist = obj.doc.clear_table(obj.doclist,'sales_team')
 			idx = 0
 			for d in webnotes.conn.sql("select sales_person, allocated_percentage, allocated_amount, incentives from `tabSales Team` where parent = '%s'" % obj.doc.customer):
-				ch = addchild(obj.doc, 'sales_team', 'Sales Team', 1, obj.doclist)
+				ch = addchild(obj.doc, 'sales_team', 'Sales Team', obj.doclist)
 				ch.sales_person = d and cstr(d[0]) or ''
 				ch.allocated_percentage = d and flt(d[1]) or 0
 				ch.allocated_amount = d and flt(d[2]) or 0
@@ -265,8 +265,8 @@
 				for field in default_fields:
 					if field in other: del other[field]
 
-				d = addchild(obj.doc, 'other_charges', 'Sales Taxes and Charges', 1,
-						obj.doclist)
+				d = addchild(obj.doc, 'other_charges', 'Sales Taxes and Charges',
+					obj.doclist)
 				d.fields.update(other)
 				d.rate = flt(d.rate)
 				d.tax_amount = flt(d.tax_rate)
@@ -481,7 +481,8 @@
 				break
 
 		if not exists:
-			pi = addchild(obj.doc, 'packing_details', 'Delivery Note Packing Item', 1, obj.doclist)
+			pi = addchild(obj.doc, 'packing_details', 'Delivery Note Packing Item', 
+				obj.doclist)
 
 		pi.parent_item = line.item_code
 		pi.item_code = packing_item_code
diff --git a/setup/doctype/setup_control/setup_control.py b/setup/doctype/setup_control/setup_control.py
index fb0b694..3c073da 100644
--- a/setup/doctype/setup_control/setup_control.py
+++ b/setup/doctype/setup_control/setup_control.py
@@ -239,13 +239,13 @@
 	def add_roles(self, pr):
 		roles_list = ['Accounts Manager', 'Accounts User', 'Blogger', 'HR Manager', 'HR User', 'Maintenance User', 'Maintenance Manager', 'Material Manager', 'Material User', 'Material Master Manager', 'Manufacturing Manager', 'Manufacturing User', 'Projects User', 'Purchase Manager', 'Purchase User', 'Purchase Master Manager', 'Quality Manager', 'Sales Manager', 'Sales User', 'Sales Master Manager', 'Support Manager', 'Support Team', 'System Manager', 'Website Manager']
 		for r in roles_list:
-			d = addchild(pr, 'userroles', 'UserRole', 1)
+			d = addchild(pr, 'userroles', 'UserRole')
 			d.role = r
 			d.save(1)
 
 		# Add roles to Administrator profile
 		pr = Document('Profile','Administrator')
 		for r in roles_list:
-			d = addchild(pr,'userroles', 'UserRole', 1)
+			d = addchild(pr,'userroles', 'UserRole')
 			d.role = r
 			d.save(1)
\ No newline at end of file
diff --git a/stock/doctype/bin/bin.py b/stock/doctype/bin/bin.py
index 5e3e74a..d472e5f 100644
--- a/stock/doctype/bin/bin.py
+++ b/stock/doctype/bin/bin.py
@@ -350,7 +350,7 @@
 			reaches re-order level when %s %s was created""" % (doc_type,doc_name)
 		indent.save(1)
 		indent_obj = get_obj('Purchase Request',indent.name,with_children=1)
-		indent_details_child = addchild(indent_obj.doc,'indent_details','Purchase Request Item',0)
+		indent_details_child = addchild(indent_obj.doc,'indent_details','Purchase Request Item')
 		indent_details_child.item_code = self.doc.item_code
 		indent_details_child.uom = self.doc.stock_uom
 		indent_details_child.warehouse = self.doc.warehouse
diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py
index a9f7ee7..e68ef7f 100644
--- a/stock/doctype/item/item.py
+++ b/stock/doctype/item/item.py
@@ -70,7 +70,8 @@
 				raise Exception
 
 		if not cstr(self.doc.stock_uom) in check_list :
-			child = addchild( self.doc, 'uom_conversion_details', 'UOM Conversion Detail', 1, self.doclist)
+			child = addchild( self.doc, 'uom_conversion_details', 
+				'UOM Conversion Detail', self.doclist)
 			child.uom = self.doc.stock_uom
 			child.conversion_factor = 1
 			child.save()
diff --git a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index 4e8015d..d5abb84 100644
--- a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -51,7 +51,8 @@
 			msgprint("Please enter date of shorter duration as there are too many purchase receipt, hence it cannot be loaded.", raise_exception=1)
 			
 		for i in pr:
-			ch = addchild(self.doc, 'lc_pr_details', 'Landed Cost Purchase Receipt', 1, self.doclist)
+			ch = addchild(self.doc, 'lc_pr_details', 'Landed Cost Purchase Receipt', 
+				self.doclist)
 			ch.purchase_receipt = i and i['name'] or ''
 			ch.save()
 
@@ -62,7 +63,8 @@
 		idx = 0
 		landed_cost = sql("select account_head, description from `tabLanded Cost Master Detail` where parent=%s", (self.doc.landed_cost), as_dict = 1)
 		for cost in landed_cost:
-			lct = addchild(self.doc, 'landed_cost_details', 'Landed Cost Item', 1, self.doclist)
+			lct = addchild(self.doc, 'landed_cost_details', 'Landed Cost Item', 
+				self.doclist)
 			lct.account_head = cost['account_head']
 			lct.description = cost['description']
 
@@ -100,7 +102,7 @@
 				
 				pr_oc_row = sql("select name from `tabPurchase Taxes and Charges` where parent = %s and category = 'Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s",(pr, lc.account_head))
 				if not pr_oc_row:	# add if not exists
-					ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges', 1)
+					ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges')
 					ch.category = 'Valuation'
 					ch.add_deduct_tax = 'Add'
 					ch.charge_type = 'Actual'
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 4683abb..e5e1fe1 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -390,7 +390,7 @@
 
 				if i and not sql("select name from `tabPurchase Receipt Item Supplied` 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', 'Purchase Receipt Item Supplied', 1, self.doclist)
+					rm_child = addchild(self.doc, 'pr_raw_material_details', 'Purchase Receipt Item Supplied', self.doclist)
 
 					rm_child.reference_name = d.name
 					rm_child.bom_detail_no = i and i[6] or ''
diff --git a/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py b/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py
index 92fa63e..92b0cb1 100644
--- a/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py
+++ b/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.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/>.
 
 from __future__ import unicode_literals
 import webnotes
@@ -26,45 +26,46 @@
 	
 
 class DocType :
-  def __init__(self, doc, doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
 
-  # Pull Item Details
-  # ---------------------------
-  def pull_item_details(self):
-    if self.doc.return_type == 'Sales Return':
-      if self.doc.delivery_note_no:
-        det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.uom, t2.export_rate * t3.conversion_rate, t3.customer, t3.customer_name, t3.customer_address, t2.serial_no, t2.batch_no from `tabDelivery Note Packing Item` t1, `tabDelivery Note Item` t2, `tabDelivery Note` t3 where t1.parent = t3.name and t2.parent = t3.name and t1.parent_detail_docname = t2.name and t3.name = '%s' and t3.docstatus = 1" % self.doc.delivery_note_no)
-      elif self.doc.sales_invoice_no:
-        det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.stock_uom, t1.export_rate * t2.conversion_rate, t2.customer, t2.customer_name, t2.customer_address, t1.serial_no from `tabSales Invoice Item` t1, `tabSales Invoice` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.sales_invoice_no)
-    elif self.doc.return_type == 'Purchase Return' and self.doc.purchase_receipt_no:
-      det = sql("select t1.name, t1.item_code, t1.description, t1.received_qty, t1.uom, t1.purchase_rate, t2.supplier, t2.supplier_name, t2.supplier_address, t1.serial_no, t1.batch_no from `tabPurchase Receipt Item` t1, `tabPurchase Receipt` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.purchase_receipt_no)
+	# Pull Item Details
+	# ---------------------------
+	def pull_item_details(self):
+		if self.doc.return_type == 'Sales Return':
+			if self.doc.delivery_note_no:
+				det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.uom, t2.export_rate * t3.conversion_rate, t3.customer, t3.customer_name, t3.customer_address, t2.serial_no, t2.batch_no from `tabDelivery Note Packing Item` t1, `tabDelivery Note Item` t2, `tabDelivery Note` t3 where t1.parent = t3.name and t2.parent = t3.name and t1.parent_detail_docname = t2.name and t3.name = '%s' and t3.docstatus = 1" % self.doc.delivery_note_no)
+			elif self.doc.sales_invoice_no:
+				det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.stock_uom, t1.export_rate * t2.conversion_rate, t2.customer, t2.customer_name, t2.customer_address, t1.serial_no from `tabSales Invoice Item` t1, `tabSales Invoice` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.sales_invoice_no)
+		elif self.doc.return_type == 'Purchase Return' and self.doc.purchase_receipt_no:
+			det = sql("select t1.name, t1.item_code, t1.description, t1.received_qty, t1.uom, t1.purchase_rate, t2.supplier, t2.supplier_name, t2.supplier_address, t1.serial_no, t1.batch_no from `tabPurchase Receipt Item` t1, `tabPurchase Receipt` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.purchase_receipt_no)
 
-    self.doc.cust_supp = det and det[0][6] or ''
-    self.doc.cust_supp_name = det and det[0][7] or ''
-    self.doc.cust_supp_address = det and det[0][8] or ''
-    self.create_item_table(det)
-    self.doc.save()
- 
-  # Create Item Table
-  # -----------------------------
-  def create_item_table(self, det):
-    self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
-    for i in det:
-      ch = addchild(self.doc, 'return_details', 'Sales and Purchase Return Item', 1, self.doclist)
-      ch.detail_name = i and i[0] or ''
-      ch.item_code = i and i[1] or ''
-      ch.description = i and i[2] or ''
-      ch.qty = i and flt(i[3]) or 0
-      ch.uom = i and i[4] or ''
-      ch.rate = i and flt(i[5]) or 0
-      ch.serial_no = i and i[9] or ''
-      ch.batch_no = (len(i) == 11) and i[10] or ''
-      ch.save()
+		self.doc.cust_supp = det and det[0][6] or ''
+		self.doc.cust_supp_name = det and det[0][7] or ''
+		self.doc.cust_supp_address = det and det[0][8] or ''
+		self.create_item_table(det)
+		self.doc.save()
+		
+	# Create Item Table
+	# -----------------------------
+	def create_item_table(self, det):
+		self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
+		for i in det:
+			ch = addchild(self.doc, 'return_details', 'Sales and Purchase Return Item', 
+				self.doclist)
+			ch.detail_name = i and i[0] or ''
+			ch.item_code = i and i[1] or ''
+			ch.description = i and i[2] or ''
+			ch.qty = i and flt(i[3]) or 0
+			ch.uom = i and i[4] or ''
+			ch.rate = i and flt(i[5]) or 0
+			ch.serial_no = i and i[9] or ''
+			ch.batch_no = (len(i) == 11) and i[10] or ''
+			ch.save()
 
-  # Clear return table
-  # --------------------------------
-  def clear_return_table(self):
-    self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
-    self.doc.save()
+	# Clear return table
+	# --------------------------------
+	def clear_return_table(self):
+		self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
+		self.doc.save()
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 1e4f300..dae2d10 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -467,7 +467,8 @@
 
 	def add_to_stock_entry_detail(self, source_wh, target_wh, item_dict, bom_no=None):
 		for d in item_dict:
-			se_child = addchild(self.doc, 'mtn_details', 'Stock Entry Detail', 0, self.doclist)
+			se_child = addchild(self.doc, 'mtn_details', 'Stock Entry Detail', 
+				self.doclist)
 			se_child.s_warehouse = source_wh
 			se_child.t_warehouse = target_wh
 			se_child.item_code = cstr(d)
diff --git a/support/doctype/maintenance_schedule/maintenance_schedule.py b/support/doctype/maintenance_schedule/maintenance_schedule.py
index b703e56..6560c83 100644
--- a/support/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/support/doctype/maintenance_schedule/maintenance_schedule.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/>.
 
 from __future__ import unicode_literals
 import webnotes
@@ -30,313 +30,314 @@
 from utilities.transaction_base import TransactionBase
 
 class DocType(TransactionBase):
-  def __init__(self, doc, doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
-  
-  # pull sales order details
-  #--------------------------
-  def pull_sales_order_detail(self):
-    self.doclist = self.doc.clear_table(self.doclist, 'item_maintenance_detail')
-    self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
-    self.doclist = get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule').dt_map('Sales Order', 'Maintenance Schedule', self.doc.sales_order_no, self.doc, self.doclist, "[['Sales Order', 'Maintenance Schedule'],['Sales Order Item', 'Maintenance Schedule Item']]")
-  
-  #pull item details 
-  #-------------------
-  def get_item_details(self, item_code):
-    item = sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1)
-    ret = {
-      'item_name': item and item[0]['item_name'] or '',
-      'description' : item and item[0]['description'] or ''
-    }
-    return ret
-    
-  # generate maintenance schedule
-  #-------------------------------------
-  def generate_schedule(self):
-    import datetime
-    self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
-    count = 0
-    sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      self.validate_maintenance_detail()
-      s_list =[]	
-      s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
-      for i in range(d.no_of_visits):        
-        child = addchild(self.doc,'maintenance_schedule_detail','Maintenance Schedule Detail',1,self.doclist)
-        child.item_code = d.item_code
-        child.item_name = d.item_name
-        child.scheduled_date = s_list[i].strftime('%Y-%m-%d')
-        if d.serial_no:
-          child.serial_no = d.serial_no
-        child.idx = count
-        count = count+1
-        child.incharge_name = d.incharge_name
-        child.save(1)
-        
-    self.on_update()
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+	
+	# pull sales order details
+	#--------------------------
+	def pull_sales_order_detail(self):
+		self.doclist = self.doc.clear_table(self.doclist, 'item_maintenance_detail')
+		self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
+		self.doclist = get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule').dt_map('Sales Order', 'Maintenance Schedule', self.doc.sales_order_no, self.doc, self.doclist, "[['Sales Order', 'Maintenance Schedule'],['Sales Order Item', 'Maintenance Schedule Item']]")
+	
+	#pull item details 
+	#-------------------
+	def get_item_details(self, item_code):
+		item = sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1)
+		ret = {
+			'item_name': item and item[0]['item_name'] or '',
+			'description' : item and item[0]['description'] or ''
+		}
+		return ret
+		
+	# generate maintenance schedule
+	#-------------------------------------
+	def generate_schedule(self):
+		import datetime
+		self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
+		count = 0
+		sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			self.validate_maintenance_detail()
+			s_list =[]	
+			s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
+			for i in range(d.no_of_visits):				
+				child = addchild(self.doc, 'maintenance_schedule_detail',
+					'Maintenance Schedule Detail', self.doclist)
+				child.item_code = d.item_code
+				child.item_name = d.item_name
+				child.scheduled_date = s_list[i].strftime('%Y-%m-%d')
+				if d.serial_no:
+					child.serial_no = d.serial_no
+				child.idx = count
+				count = count+1
+				child.incharge_name = d.incharge_name
+				child.save(1)
+				
+		self.on_update()
 
 
 
-  def on_submit(self):
-    if not getlist(self.doclist, 'maintenance_schedule_detail'):
-      msgprint("Please click on 'Generate Schedule' to get schedule")
-      raise Exception
-    self.check_serial_no_added()
-    self.validate_serial_no_warranty()
-    self.validate_schedule()
+	def on_submit(self):
+		if not getlist(self.doclist, 'maintenance_schedule_detail'):
+			msgprint("Please click on 'Generate Schedule' to get schedule")
+			raise Exception
+		self.check_serial_no_added()
+		self.validate_serial_no_warranty()
+		self.validate_schedule()
 
-    email_map ={}
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.serial_no:
-        self.update_amc_date(d.serial_no, d.end_date)
+		email_map ={}
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.serial_no:
+				self.update_amc_date(d.serial_no, d.end_date)
 
-      if d.incharge_name not in email_map:
-      	e = sql("select email_id, name from `tabSales Person` where name='%s' " %(d.incharge_name),as_dict=1)[0]
-        email_map[d.incharge_name] = (e['email_id'])
+			if d.incharge_name not in email_map:
+				e = sql("select email_id, name from `tabSales Person` where name='%s' " %(d.incharge_name),as_dict=1)[0]
+				email_map[d.incharge_name] = (e['email_id'])
 
-      scheduled_date =sql("select scheduled_date from `tabMaintenance Schedule Detail` \
-        where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
-        d.item_code, self.doc.name), as_dict=1)
+			scheduled_date =sql("select scheduled_date from `tabMaintenance Schedule Detail` \
+				where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
+				d.item_code, self.doc.name), as_dict=1)
 
-      for key in scheduled_date:
-        if email_map[d.incharge_name]:
-          self.add_calender_event(key["scheduled_date"],email_map[d.incharge_name],d.item_code)     
-    webnotes.conn.set(self.doc, 'status', 'Submitted')    
-    
+			for key in scheduled_date:
+				if email_map[d.incharge_name]:
+					self.add_calender_event(key["scheduled_date"],email_map[d.incharge_name],d.item_code)		 
+		webnotes.conn.set(self.doc, 'status', 'Submitted')		
+		
 
-  def add_calender_event(self,scheduled_date,incharge_email,item_code):
-    """ Add calendar event for Maintenece Schedule in calendar of Allocated person"""
-    event = Document('Event')
-    event.owner = incharge_email
-    event.description = "Reference:%s, Item Code:%s and Customer: %s" %(self.doc.name, item_code, self.doc.customer)
-    event.event_date = scheduled_date
-    event.event_hour =  '10:00'
-    event.event_type = 'Private'
-    event.ref_type = 'Maintenance Schedule'
-    event.ref_name = self.doc.name
-    event.save(1)
+	def add_calender_event(self,scheduled_date,incharge_email,item_code):
+		""" Add calendar event for Maintenece Schedule in calendar of Allocated person"""
+		event = Document('Event')
+		event.owner = incharge_email
+		event.description = "Reference:%s, Item Code:%s and Customer: %s" %(self.doc.name, item_code, self.doc.customer)
+		event.event_date = scheduled_date
+		event.event_hour =	'10:00'
+		event.event_type = 'Private'
+		event.ref_type = 'Maintenance Schedule'
+		event.ref_name = self.doc.name
+		event.save(1)
 
 
-  #get schedule dates
-  #----------------------
-  def create_schedule_list(self, start_date, end_date, no_of_visit):
-    schedule_list = []    
-    start_date1 = start_date
-    date_diff = (getdate(end_date) - getdate(start_date)).days
-    add_by = date_diff/no_of_visit
-    #schedule_list.append(start_date1)
-    while(getdate(start_date1) < getdate(end_date)):
-      start_date1 = add_days(start_date1, add_by)
-      if len(schedule_list) < no_of_visit:
-        schedule_list.append(getdate(start_date1))
-    return schedule_list
-  
-  #validate date range and periodicity selected
-  #-------------------------------------------------
-  def validate_period(self, arg):
-    arg1 = eval(arg)
-    if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
-      msgprint("Start date should be less than end date ")
-      raise Exception
-    
-    period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
-    
-    if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
-      msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
-      raise Exception
-    elif arg1['periodicity']=='Monthly' and period<30:
-      msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
-      raise Exception
-    elif arg1['periodicity']=='Weekly' and period<7:
-      msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
-      raise Exception
-  
+	#get schedule dates
+	#----------------------
+	def create_schedule_list(self, start_date, end_date, no_of_visit):
+		schedule_list = []		
+		start_date1 = start_date
+		date_diff = (getdate(end_date) - getdate(start_date)).days
+		add_by = date_diff/no_of_visit
+		#schedule_list.append(start_date1)
+		while(getdate(start_date1) < getdate(end_date)):
+			start_date1 = add_days(start_date1, add_by)
+			if len(schedule_list) < no_of_visit:
+				schedule_list.append(getdate(start_date1))
+		return schedule_list
+	
+	#validate date range and periodicity selected
+	#-------------------------------------------------
+	def validate_period(self, arg):
+		arg1 = eval(arg)
+		if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
+			msgprint("Start date should be less than end date ")
+			raise Exception
+		
+		period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
+		
+		if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
+			msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
+			raise Exception
+		elif arg1['periodicity']=='Monthly' and period<30:
+			msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
+			raise Exception
+		elif arg1['periodicity']=='Weekly' and period<7:
+			msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
+			raise Exception
+	
 
 
-  #get count on the basis of periodicity selected
-  #----------------------------------------------------
-  def get_no_of_visits(self, arg):
-    arg1 = eval(arg)
-    start_date = arg1['start_date']
-    
-    self.validate_period(arg)
-    period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
-    
-    count =0
-    if arg1['periodicity'] == 'Weekly':
-      count = period/7
-    elif arg1['periodicity'] == 'Monthly':
-      count = period/30
-    elif arg1['periodicity'] == 'Quarterly':
-      count = period/91   
-    elif arg1['periodicity'] == 'Half Yearly':
-      count = period/182
-    elif arg1['periodicity'] == 'Yearly':
-      count = period/365
-    
-    ret = {'no_of_visits':count}
-    return ret
-  
+	#get count on the basis of periodicity selected
+	#----------------------------------------------------
+	def get_no_of_visits(self, arg):
+		arg1 = eval(arg)
+		start_date = arg1['start_date']
+		
+		self.validate_period(arg)
+		period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
+		
+		count =0
+		if arg1['periodicity'] == 'Weekly':
+			count = period/7
+		elif arg1['periodicity'] == 'Monthly':
+			count = period/30
+		elif arg1['periodicity'] == 'Quarterly':
+			count = period/91	 
+		elif arg1['periodicity'] == 'Half Yearly':
+			count = period/182
+		elif arg1['periodicity'] == 'Yearly':
+			count = period/365
+		
+		ret = {'no_of_visits':count}
+		return ret
+	
 
 
-  def validate_maintenance_detail(self):
-    if not getlist(self.doclist, 'item_maintenance_detail'):
-      msgprint("Please enter Maintaince Details first")
-      raise Exception
-    
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if not d.item_code:
-        msgprint("Please select item code")
-        raise Exception
-      elif not d.start_date or not d.end_date:
-        msgprint("Please select Start Date and End Date for item "+d.item_code)
-        raise Exception
-      elif not d.no_of_visits:
-        msgprint("Please mention no of visits required")
-        raise Exception
-      elif not d.incharge_name:
-        msgprint("Please select Incharge Person's name")
-        raise Exception
-      
-      if getdate(d.start_date) >= getdate(d.end_date):
-        msgprint("Start date should be less than end date for item "+d.item_code)
-        raise Exception
-  
-  #check if maintenance schedule already created against same sales order
-  #-----------------------------------------------------------------------------------
-  def validate_sales_order(self):
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.prevdoc_docname:
-        chk = sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", d.prevdoc_docname)
-        if chk:
-          msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
-          raise Exception
-  
-  # Validate values with reference document
-  #----------------------------------------
-  def validate_reference_value(self):
-    get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule', with_children = 1).validate_reference_value(self, self.doc.name)
-  
-  def validate_serial_no(self):
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      cur_s_no=[]      
-      if d.serial_no:
-        cur_serial_no = d.serial_no.replace(' ', '')
-        cur_s_no = cur_serial_no.split(',')
-        
-        for x in cur_s_no:
-          chk = sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x))
-          chk1 = chk and chk[0][0] or ''
-          status = chk and chk[0][1] or ''
-          
-          if not chk1:
-            msgprint("Serial no "+x+" does not exist in system.")
-            raise Exception
-          else:
-            if status=='In Store' or status=='Note in Use' or status=='Scrapped':
-              msgprint("Serial no "+x+" is '"+status+"'")
-              raise Exception
-  
-  def validate(self):
-    self.validate_maintenance_detail()
-    self.validate_sales_order()
-    if self.doc.sales_order_no:
-      self.validate_reference_value()
-    self.validate_serial_no()
-    self.validate_start_date()
-  
-  # validate that maintenance start date can not be before serial no delivery date
-  #-------------------------------------------------------------------------------------------
-  def validate_start_date(self):
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.serial_no:
-        cur_serial_no = d.serial_no.replace(' ', '')
-        cur_s_no = cur_serial_no.split(',')
-        
-        for x in cur_s_no:
-          dt = sql("select delivery_date from `tabSerial No` where name = %s", x)
-          dt = dt and dt[0][0] or ''
-          
-          if dt:
-            if dt > getdate(d.start_date):
-              msgprint("Maintenance start date can not be before delivery date "+dt.strftime('%Y-%m-%d')+" for serial no "+x)
-              raise Exception
-  
-  #update amc expiry date in serial no
-  #------------------------------------------
-  def update_amc_date(self,serial_no,amc_end_date):
-    #get current list of serial no
-    cur_serial_no = serial_no.replace(' ', '')
-    cur_s_no = cur_serial_no.split(',')
-    
-    for x in cur_s_no:
-      sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x))
-  
-  def on_update(self):
-    webnotes.conn.set(self.doc, 'status', 'Draft')
-  
-  #validate that new maintenance start date does not clash with existing mntc end date
-  #-------------------------------------------------------------------------------------------------
-  def validate_serial_no_warranty(self):
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.serial_no:
-        dt = sql("select warranty_expiry_date, amc_expiry_date from `tabSerial No` where name = %s", d.serial_no, as_dict=1)
-        
-        if dt[0]['warranty_expiry_date']:
-          if dt[0]['warranty_expiry_date'] >= getdate(d.start_date):
-            msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under warranty till "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d')+". You can schedule AMC start date after "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d'))
-            raise Exception
-        if dt[0]['amc_expiry_date']:
-          if dt[0]['amc_expiry_date'] >= getdate(d.start_date):
-            msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under AMC till "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d')+". You can schedule new AMC start date after "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d'))
-            raise Exception
-  
-  #validate if schedule generated for all items
-  #-------------------------------------------------
-  def validate_schedule(self):
-    item_lst1 =[]
-    item_lst2 =[]
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.item_code not in item_lst1:
-        item_lst1.append(d.item_code)
-    
-    for m in getlist(self.doclist, 'maintenance_schedule_detail'):
-      if m.item_code not in item_lst2:
-        item_lst2.append(m.item_code)
-    
-    if len(item_lst1) != len(item_lst2):
-      msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
-      raise Exception
-    else:
-      for x in item_lst1:
-        if x not in item_lst2:
-          msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
-          raise Exception
-  
-  #check if serial no present in item maintenance table
-  #-----------------------------------------------------------
-  def check_serial_no_added(self):
-    serial_present =[]
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.serial_no:
-        serial_present.append(d.item_code)
-    
-    for m in getlist(self.doclist, 'maintenance_schedule_detail'):
-      if serial_present:
-        if m.item_code in serial_present and not m.serial_no:
-          msgprint("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
-          raise Exception
-  
-  
-  
-  def on_cancel(self):
-    for d in getlist(self.doclist, 'item_maintenance_detail'):
-      if d.serial_no:
-        self.update_amc_date(d.serial_no, '')
-    webnotes.conn.set(self.doc, 'status', 'Cancelled')
-    sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
-  def on_trash(self):
-    sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
-    
+	def validate_maintenance_detail(self):
+		if not getlist(self.doclist, 'item_maintenance_detail'):
+			msgprint("Please enter Maintaince Details first")
+			raise Exception
+		
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if not d.item_code:
+				msgprint("Please select item code")
+				raise Exception
+			elif not d.start_date or not d.end_date:
+				msgprint("Please select Start Date and End Date for item "+d.item_code)
+				raise Exception
+			elif not d.no_of_visits:
+				msgprint("Please mention no of visits required")
+				raise Exception
+			elif not d.incharge_name:
+				msgprint("Please select Incharge Person's name")
+				raise Exception
+			
+			if getdate(d.start_date) >= getdate(d.end_date):
+				msgprint("Start date should be less than end date for item "+d.item_code)
+				raise Exception
+	
+	#check if maintenance schedule already created against same sales order
+	#-----------------------------------------------------------------------------------
+	def validate_sales_order(self):
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.prevdoc_docname:
+				chk = sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", d.prevdoc_docname)
+				if chk:
+					msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
+					raise Exception
+	
+	# Validate values with reference document
+	#----------------------------------------
+	def validate_reference_value(self):
+		get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule', with_children = 1).validate_reference_value(self, self.doc.name)
+	
+	def validate_serial_no(self):
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			cur_s_no=[]			
+			if d.serial_no:
+				cur_serial_no = d.serial_no.replace(' ', '')
+				cur_s_no = cur_serial_no.split(',')
+				
+				for x in cur_s_no:
+					chk = sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x))
+					chk1 = chk and chk[0][0] or ''
+					status = chk and chk[0][1] or ''
+					
+					if not chk1:
+						msgprint("Serial no "+x+" does not exist in system.")
+						raise Exception
+					else:
+						if status=='In Store' or status=='Note in Use' or status=='Scrapped':
+							msgprint("Serial no "+x+" is '"+status+"'")
+							raise Exception
+	
+	def validate(self):
+		self.validate_maintenance_detail()
+		self.validate_sales_order()
+		if self.doc.sales_order_no:
+			self.validate_reference_value()
+		self.validate_serial_no()
+		self.validate_start_date()
+	
+	# validate that maintenance start date can not be before serial no delivery date
+	#-------------------------------------------------------------------------------------------
+	def validate_start_date(self):
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.serial_no:
+				cur_serial_no = d.serial_no.replace(' ', '')
+				cur_s_no = cur_serial_no.split(',')
+				
+				for x in cur_s_no:
+					dt = sql("select delivery_date from `tabSerial No` where name = %s", x)
+					dt = dt and dt[0][0] or ''
+					
+					if dt:
+						if dt > getdate(d.start_date):
+							msgprint("Maintenance start date can not be before delivery date "+dt.strftime('%Y-%m-%d')+" for serial no "+x)
+							raise Exception
+	
+	#update amc expiry date in serial no
+	#------------------------------------------
+	def update_amc_date(self,serial_no,amc_end_date):
+		#get current list of serial no
+		cur_serial_no = serial_no.replace(' ', '')
+		cur_s_no = cur_serial_no.split(',')
+		
+		for x in cur_s_no:
+			sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x))
+	
+	def on_update(self):
+		webnotes.conn.set(self.doc, 'status', 'Draft')
+	
+	#validate that new maintenance start date does not clash with existing mntc end date
+	#-------------------------------------------------------------------------------------------------
+	def validate_serial_no_warranty(self):
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.serial_no:
+				dt = sql("select warranty_expiry_date, amc_expiry_date from `tabSerial No` where name = %s", d.serial_no, as_dict=1)
+				
+				if dt[0]['warranty_expiry_date']:
+					if dt[0]['warranty_expiry_date'] >= getdate(d.start_date):
+						msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under warranty till "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d')+". You can schedule AMC start date after "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d'))
+						raise Exception
+				if dt[0]['amc_expiry_date']:
+					if dt[0]['amc_expiry_date'] >= getdate(d.start_date):
+						msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under AMC till "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d')+". You can schedule new AMC start date after "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d'))
+						raise Exception
+	
+	#validate if schedule generated for all items
+	#-------------------------------------------------
+	def validate_schedule(self):
+		item_lst1 =[]
+		item_lst2 =[]
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.item_code not in item_lst1:
+				item_lst1.append(d.item_code)
+		
+		for m in getlist(self.doclist, 'maintenance_schedule_detail'):
+			if m.item_code not in item_lst2:
+				item_lst2.append(m.item_code)
+		
+		if len(item_lst1) != len(item_lst2):
+			msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
+			raise Exception
+		else:
+			for x in item_lst1:
+				if x not in item_lst2:
+					msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
+					raise Exception
+	
+	#check if serial no present in item maintenance table
+	#-----------------------------------------------------------
+	def check_serial_no_added(self):
+		serial_present =[]
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.serial_no:
+				serial_present.append(d.item_code)
+		
+		for m in getlist(self.doclist, 'maintenance_schedule_detail'):
+			if serial_present:
+				if m.item_code in serial_present and not m.serial_no:
+					msgprint("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
+					raise Exception
+	
+	
+	
+	def on_cancel(self):
+		for d in getlist(self.doclist, 'item_maintenance_detail'):
+			if d.serial_no:
+				self.update_amc_date(d.serial_no, '')
+		webnotes.conn.set(self.doc, 'status', 'Cancelled')
+		sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
+	def on_trash(self):
+		sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
+		
 
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index 3f47237..4234597 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -220,7 +220,7 @@
 		self.doclist = self.doc.clear_table(self.doclist,'sales_team')
 		idx = 0
 		for d in webnotes.conn.sql("select sales_person, allocated_percentage, allocated_amount, incentives from `tabSales Team` where parent = '%s'" % name):
-			ch = addchild(self.doc, 'sales_team', 'Sales Team', 1, self.doclist)
+			ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
 			ch.sales_person = d and cstr(d[0]) or ''
 			ch.allocated_percentage = d and flt(d[1]) or 0
 			ch.allocated_amount = d and flt(d[2]) or 0
