feat: add logic to generate txt file
diff --git a/erpnext/regional/india/bank_remittance_txt.py b/erpnext/regional/india/bank_remittance_txt.py
new file mode 100644
index 0000000..7c4995e
--- /dev/null
+++ b/erpnext/regional/india/bank_remittance_txt.py
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+from frappe.utils import cint,cstr, today
+from functools import reduce
+import re
+import datetime
+from collections import OrderedDict
+
+def create_bank_remittance_txt(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"))
+
+    header = get_header_row(payment_order)
+    batch = get_batch_row(payment_order, no_of_records, total_amount)
+
+    detail = []
+    for ref_doc in payment_order.get("references"):
+        detail.append(get_detail_row(ref_doc, format_date(doc.posting_date))
+
+    trailer = get_trailer_row(no_of_records, total_amount)
+
+    detail_records = "\n".join(detail)
+
+    return "~".join([header, batch , detail_records, trailer])
+
+@frappe.whitelist()
+def generate_report_and_get_url(name):
+    data = create_bank_remittance_txt(name)
+    file_name = generate_file_name(name)
+    f = frappe.get_doc({
+        'doctype': 'File',
+        'file_name': file_name+'.txt',
+        'content': data,
+        'is_private': True
+    })
+    f.save()
+
+def generate_file_name(name):
+    ''' generate file name with format (account_code)_mmdd_(payment_order_no) '''
+    return name
+
+def get_header_row(doc):
+    client_code = "ELECTROLAB"
+    file_name = generate_file_name(doc.name)
+    header = ["H"]
+    header.append(cstr(client_code)[:20])
+    header += [''] * 3
+    header.append(cstr(file_name)[:20])
+    return "~".join(header)
+
+def get_batch_row(doc, no_of_records, total_amount):
+    product_code = "VENPAY"
+    batch = ["B"]
+    batch.append(cstr(no_of_records)[:5]) # 5
+    batch.append(cstr(total_amount)[:17]) #amt 17.2
+    batch.append(sanitize_to_alphanumeric(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_doc('Address', addr_link)
+    detail = OrderedDict(
+        record_identifier='D',
+        payment_ref_no=sanitize_to_alphanumeric(ref_doc.payment_entry),
+        payment_type=ref_doc.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_to_alphanumeric(payment_entry.party)[:160],
+        beneficiary_bank=sanitize_to_alphanumeric(supplier_bank_details.bank)[:10],
+        beneficiary_branch_ifsc_code=supplier_bank_details.branch_code,
+        beneficiary_acc_no=supplier_bank_details.bank_account_no,
+        location=supplier_billing_address.city,
+        print_location=supplier_billing_address.city,
+        beneficiary_address_1=supplier_billing_address.address_line1,
+        beneficiary_address_2=supplier_billing_address.address_line2,
+        beneficiary_address_3='',
+        beneficiary_address_4='',
+        beneficiary_address_5='',
+        beneficiary_city=supplier_billing_address.address_line1,
+        beneficiary_zipcode=supplier_billing_address.pincode,
+        beneficiary_state=supplier_billing_address.state,
+        beneficiary_email=supplier_billing_address.email_address,
+        beneficiary_mobile=supplier_billing_address.phone,
+        payment_details_1='',
+        payment_details_2='',
+        payment_details_3='',
+        payment_details_4='',
+        delivery_mode=''
+    )
+    return "~".join(list(detail.values()))
+
+def get_advice_row(doc):
+    advice = ['A']
+
+def get_trailer_row(no_of_records, total_amount):
+    trailer = ["T"]
+    trailer.append(cstr(no_of_records)[:5]) # 5
+    trailer.append(cstr(total_amount)[:17]) # 17.2
+    return "~".join(trailer)
+
+def sanitize_to_alphanumeric(val):
+    ''' Remove all the non-alphanumeric characters from string '''
+    pattern = pattern = re.compile('[\W_]+')
+    return pattern.sub(' ', 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