diff --git a/erpnext/regional/india/bank_remittance_txt.py b/erpnext/regional/india/bank_remittance_txt.py
index 7ccfa98..178a366 100644
--- a/erpnext/regional/india/bank_remittance_txt.py
+++ b/erpnext/regional/india/bank_remittance_txt.py
@@ -13,145 +13,145 @@
 from frappe.core.doctype.file.file import download_file
 
 def create_bank_remittance_txt(name):
-    payment_order = frappe.get_doc("Payment Order", name)
+	payment_order = frappe.get_doc("Payment Order", name)
 
-    no_of_records = len(payment_order.get("references"))
-    total_amount = reduce(lambda x, y: x.get("amount") + y.get("amount"), payment_order.get("references"))
+	no_of_records = len(payment_order.get("references"))
+	total_amount = reduce(lambda x, y: x.get("amount") + y.get("amount"), payment_order.get("references"))
 
-    product_code, client_code = frappe.db.get_value("Company",
+	product_code, client_code = frappe.db.get_value("Company",
 		filters={'name' : payment_order.company},
 		fieldname=['product_code', 'client_code'])
 
 	header, file_name = get_header_row(payment_order, client_code)
 	batch = get_batch_row(payment_order, no_of_records, total_amount, product_code)
 
-    detail = []
-    for ref_doc in payment_order.get("references"):
-        detail += get_detail_row(ref_doc, format_date(payment_order.posting_date))
+	detail = []
+	for ref_doc in payment_order.get("references"):
+		detail += get_detail_row(ref_doc, format_date(payment_order.posting_date))
 
-    trailer = get_trailer_row(no_of_records, total_amount)
-    detail_records = "\n".join(detail)
+	trailer = get_trailer_row(no_of_records, total_amount)
+	detail_records = "\n".join(detail)
 
-    return "\n".join([header, batch , detail_records, trailer]), file_name
+	return "\n".join([header, batch , detail_records, trailer]), file_name
 
 @frappe.whitelist()
 def generate_report(name):
-    data, file_name = create_bank_remittance_txt(name)
+	data, file_name = create_bank_remittance_txt(name)
 
-    f = frappe.get_doc({
-        'doctype': 'File',
-        'file_name': file_name,
-        'content': data,
-        "attached_to_doctype": 'Payment Order',
-        "attached_to_name": name,
-        'is_private': True
-    })
-    f.save()
-    download_file(f.file_url)
+	f = frappe.get_doc({
+		'doctype': 'File',
+		'file_name': file_name,
+		'content': data,
+		"attached_to_doctype": 'Payment Order',
+		"attached_to_name": name,
+		'is_private': True
+	})
+	f.save()
+	download_file(f.file_url)
 
 def generate_file_name(name, date):
-    ''' generate file name with format (account_code)_mmdd_(payment_order_no) '''
-    return '_'+date.strftime("%m%d")+sanitize_data(name, '_')+'.txt'
+	''' generate file name with format (account_code)_mmdd_(payment_order_no) '''
+	return '_'+date.strftime("%m%d")+sanitize_data(name, '_')+'.txt'
 
 def get_header_row(doc, client_code):
-    ''' Returns header row and generated file name '''
-    file_name = generate_file_name(doc.name, doc.posting_date)
-    header = ["H"]
-    header.append(cstr(client_code)[:20])
-    header += [''] * 3
-    header.append(cstr(file_name)[:20])
-    return "~".join(header), file_name
+	''' Returns header row and generated file name '''
+	file_name = generate_file_name(doc.name, doc.posting_date)
+	header = ["H"]
+	header.append(cstr(client_code)[:20])
+	header += [''] * 3
+	header.append(cstr(file_name)[:20])
+	return "~".join(header), file_name
 
 def get_batch_row(doc, no_of_records, total_amount, product_code):
-    batch = ["B"]
-    batch.append(cstr(no_of_records)[:5]) # 5
-    batch.append(cstr(total_amount)[:17]) #amt 17.2
-    batch.append(sanitize_data(doc.name, '_')[:20])
-    batch.append(format_date(doc.posting_date))
-    batch.append(product_code[:20])
-    return "~".join(batch)
+	batch = ["B"]
+	batch.append(cstr(no_of_records)[:5]) # 5
+	batch.append(cstr(total_amount)[:17]) #amt 17.2
+	batch.append(sanitize_data(doc.name, '_')[:20])
+	batch.append(format_date(doc.posting_date))
+	batch.append(product_code[:20])
+	return "~".join(batch)
 
 def get_detail_row(ref_doc, payment_date):
-    payment_entry = frappe.get_cached_doc('Payment Entry', ref_doc.payment_entry)
-    supplier_bank_details = frappe.get_cached_doc('Bank Account', ref_doc.bank_account)
-    addr_link = frappe.db.get_value('Dynamic Link',
-        {
-        'link_doctype': 'Supplier',
-        'link_name': 'Sample Supplier',
-        'parenttype':'Address',
-        'parent': ('like', '%-Billing')
-        },'parent')
-    supplier_billing_address = frappe.get_cached_doc('Address', addr_link)
-    detail = OrderedDict(
-        record_identifier='D',
-        payment_ref_no=sanitize_data(ref_doc.payment_entry),
-        payment_type=cstr(payment_entry.mode_of_payment)[:10],
-        amount=str(ref_doc.amount)[:13],
-        payment_date=payment_date,
-        instrument_date=payment_date,
-        instrument_number='',
-        dr_account_no_client=str(payment_entry.bank_account_no)[:20],
-        dr_description='',
-        dr_ref_no='',
-        cr_ref_no='',
-        bank_code_indicator='M',
-        beneficiary_code='',
-        beneficiary_name=sanitize_data(payment_entry.party, ' ')[:160],
-        beneficiary_bank=sanitize_data(supplier_bank_details.bank, ' ')[:10],
-        beneficiary_branch_code=cstr(supplier_bank_details.branch_code),
-        beneficiary_acc_no=supplier_bank_details.bank_account_no,
-        location='',
-        print_location='',
-        beneficiary_address_1=cstr(supplier_billing_address.address_line1)[:50],
-        beneficiary_address_2=cstr(supplier_billing_address.address_line2)[:50],
-        beneficiary_address_3='',
-        beneficiary_address_4='',
-        beneficiary_address_5='',
-        beneficiary_city=supplier_billing_address.city,
-        beneficiary_zipcode=cstr(supplier_billing_address.pincode),
-        beneficiary_state=supplier_billing_address.state,
-        beneficiary_email=supplier_billing_address.email_id,
-        beneficiary_mobile=supplier_billing_address.phone,
-        payment_details_1='',
-        payment_details_2='',
-        payment_details_3='',
-        payment_details_4='',
-        delivery_mode=''
-    )
-    detail_record = ["~".join(list(detail.values()))]
-    detail_record += get_advice_rows(payment_entry)
-    return detail_record
+	payment_entry = frappe.get_cached_doc('Payment Entry', ref_doc.payment_entry)
+	supplier_bank_details = frappe.get_cached_doc('Bank Account', ref_doc.bank_account)
+	addr_link = frappe.db.get_value('Dynamic Link',
+		{
+		'link_doctype': 'Supplier',
+		'link_name': 'Sample Supplier',
+		'parenttype':'Address',
+		'parent': ('like', '%-Billing')
+		},'parent')
+	supplier_billing_address = frappe.get_cached_doc('Address', addr_link)
+	detail = OrderedDict(
+		record_identifier='D',
+		payment_ref_no=sanitize_data(ref_doc.payment_entry),
+		payment_type=cstr(payment_entry.mode_of_payment)[:10],
+		amount=str(ref_doc.amount)[:13],
+		payment_date=payment_date,
+		instrument_date=payment_date,
+		instrument_number='',
+		dr_account_no_client=str(payment_entry.bank_account_no)[:20],
+		dr_description='',
+		dr_ref_no='',
+		cr_ref_no='',
+		bank_code_indicator='M',
+		beneficiary_code='',
+		beneficiary_name=sanitize_data(payment_entry.party, ' ')[:160],
+		beneficiary_bank=sanitize_data(supplier_bank_details.bank, ' ')[:10],
+		beneficiary_branch_code=cstr(supplier_bank_details.branch_code),
+		beneficiary_acc_no=supplier_bank_details.bank_account_no,
+		location='',
+		print_location='',
+		beneficiary_address_1=cstr(supplier_billing_address.address_line1)[:50],
+		beneficiary_address_2=cstr(supplier_billing_address.address_line2)[:50],
+		beneficiary_address_3='',
+		beneficiary_address_4='',
+		beneficiary_address_5='',
+		beneficiary_city=supplier_billing_address.city,
+		beneficiary_zipcode=cstr(supplier_billing_address.pincode),
+		beneficiary_state=supplier_billing_address.state,
+		beneficiary_email=supplier_billing_address.email_id,
+		beneficiary_mobile=supplier_billing_address.phone,
+		payment_details_1='',
+		payment_details_2='',
+		payment_details_3='',
+		payment_details_4='',
+		delivery_mode=''
+	)
+	detail_record = ["~".join(list(detail.values()))]
+	detail_record += get_advice_rows(payment_entry)
+	return detail_record
 
 def get_advice_rows(payment_entry):
-    ''' Returns multiple advice rows for a single detail entry '''
-    payment_entry_date = payment_entry.posting_date.strftime("%b%y%d%m").upper()
-    mode_of_payment = payment_entry.mode_of_payment
-    advice_rows = []
-    for record in payment_entry.references:
-        advice = ['E']
-        advice.append(cstr(mode_of_payment))
-        advice.append(cstr(record.total_amount))
-        advice.append('')
-        advice.append(cstr(record.outstanding_amount))
-        advice.append(record.reference_name)
-        advice.append(format_date(record.due_date))
-        advice.append(payment_entry_date)
-        advice += ['']*3
-        advice_rows.append("~".join(advice))
-    return advice_rows
+	''' Returns multiple advice rows for a single detail entry '''
+	payment_entry_date = payment_entry.posting_date.strftime("%b%y%d%m").upper()
+	mode_of_payment = payment_entry.mode_of_payment
+	advice_rows = []
+	for record in payment_entry.references:
+		advice = ['E']
+		advice.append(cstr(mode_of_payment))
+		advice.append(cstr(record.total_amount))
+		advice.append('')
+		advice.append(cstr(record.outstanding_amount))
+		advice.append(record.reference_name)
+		advice.append(format_date(record.due_date))
+		advice.append(payment_entry_date)
+		advice += ['']*3
+		advice_rows.append("~".join(advice))
+	return advice_rows
 
 def get_trailer_row(no_of_records, total_amount):
-    ''' Returns trailer row '''
-    trailer = ["T"]
-    trailer.append(cstr(no_of_records)[:5]) # 5
-    trailer.append(cstr(total_amount)[:17]) # 17.2
-    return "~".join(trailer)
+	''' Returns trailer row '''
+	trailer = ["T"]
+	trailer.append(cstr(no_of_records)[:5]) # 5
+	trailer.append(cstr(total_amount)[:17]) # 17.2
+	return "~".join(trailer)
 
 def sanitize_data(val, replace_str=''):
-    ''' Remove all the non-alphanumeric characters from string '''
-    pattern = pattern = re.compile('[\W_]+')
-    return pattern.sub(replace_str, val)
+	''' Remove all the non-alphanumeric characters from string '''
+	pattern = pattern = re.compile('[\W_]+')
+	return pattern.sub(replace_str, val)
 
 def format_date(val):
-    ''' Convert a datetime object to DD/MM/YYYY format '''
-    return val.strftime("%d/%m/%Y")
\ No newline at end of file
+	''' Convert a datetime object to DD/MM/YYYY format '''
+	return val.strftime("%d/%m/%Y")
\ No newline at end of file
