diff --git a/erpnext/regional/india/bank_remittance_txt.py b/erpnext/regional/india/bank_remittance_txt.py
index 423e239..289de32 100644
--- a/erpnext/regional/india/bank_remittance_txt.py
+++ b/erpnext/regional/india/bank_remittance_txt.py
@@ -6,13 +6,13 @@
 import frappe
 from frappe.model.document import Document
 from frappe.utils import cint,cstr, today
+from frappe import _
 import re
 import datetime
 from collections import OrderedDict
-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_cached_doc("Payment Order", name)
 
 	no_of_records = len(payment_order.get("references"))
 	total_amount = sum(entry.get("amount") for entry in payment_order.get("references"))
@@ -60,18 +60,19 @@
 	''' Returns header row and generated file name '''
 	file_name = generate_file_name(doc.name, doc.company_bank_account, doc.posting_date)
 	header = ["H"]
-	header.append(cstr(client_code)[:20])
+	header.append(validate_field_size(client_code, "Client Code", 20))
 	header += [''] * 3
-	header.append(cstr(file_name)[:20])
+	header.append(validate_field_size(file_name, "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])
-	batch.append(cstr(format(total_amount, '0.2f'))[:17])
+	batch.append(validate_field_size(no_of_records, "No Of Records", 5))
+	batch.append(validate_amount(format(total_amount, '0.2f'), 17))
 	batch.append(sanitize_data(doc.name, '_')[:20])
 	batch.append(format_date(doc.posting_date))
-	batch.append(product_code[:20])
+	batch.append(validate_field_size(product_code,"Product Code", 20))
+	print(batch)
 	return "~".join(batch)
 
 def get_detail_row(ref_doc, payment_entry, company_email):
@@ -96,32 +97,32 @@
 		record_identifier='D',
 		payment_ref_no=sanitize_data(ref_doc.payment_entry),
 		payment_type=cstr(payment_entry.mode_of_payment)[:10],
-		amount=str(format(ref_doc.amount, '.2f'))[:13],
+		amount=str(validate_amount(format(ref_doc.amount, '.2f'),13)),
 		payment_date=payment_date,
 		instrument_date=payment_date,
 		instrument_number='',
-		dr_account_no_client=str(company_bank_acc_no)[:20],
+		dr_account_no_client=str(validate_field_size(company_bank_acc_no, "Company Bank Account", 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,
+		beneficiary_name=sanitize_data(validate_information(payment_entry, "party", 160), ' '),
+		beneficiary_bank=sanitize_data(validate_information(supplier_bank_details, "bank", 10)),
+		beneficiary_branch_code=cstr(validate_information(supplier_bank_details, "branch_code", 11)),
+		beneficiary_acc_no=validate_information(supplier_bank_details, "bank_account_no", 20),
 		location='',
 		print_location='',
-		beneficiary_address_1=sanitize_data(cstr(supplier_billing_address.address_line1), ' ')[:50],
-		beneficiary_address_2=sanitize_data(cstr(supplier_billing_address.address_line2), ' ')[:50],
+		beneficiary_address_1=validate_field_size(sanitize_data(cstr(supplier_billing_address.address_line1), ' '), " Beneficiary Address 1", 50),
+		beneficiary_address_2=validate_field_size(sanitize_data(cstr(supplier_billing_address.address_line2), ' '), " Beneficiary Address 2", 50),
 		beneficiary_address_3='',
 		beneficiary_address_4='',
 		beneficiary_address_5='',
-		beneficiary_city=supplier_billing_address.city[:20],
-		beneficiary_zipcode=cstr(supplier_billing_address.pincode)[:6],
-		beneficiary_state=supplier_billing_address.state[:20],
+		beneficiary_city=validate_field_size(cstr(supplier_billing_address.city), "Beneficiary City", 20),
+		beneficiary_zipcode=validate_field_size(cstr(supplier_billing_address.pincode), "Pin Code", 6),
+		beneficiary_state=validate_field_size(cstr(supplier_billing_address.state), "Beneficiary State", 20),
 		beneficiary_email=cstr(email)[:255],
-		beneficiary_mobile=cstr(supplier_billing_address.phone),
+		beneficiary_mobile=validate_field_size(cstr(supplier_billing_address.phone), "Beneficiary Mobile", 10),
 		payment_details_1='',
 		payment_details_2='',
 		payment_details_3='',
@@ -153,15 +154,38 @@
 def get_trailer_row(no_of_records, total_amount):
 	''' Returns trailer row '''
 	trailer = ["T"]
-	trailer.append(cstr(no_of_records)[:5])
-	trailer.append(cstr(format(total_amount, '.2f'))[:17])
+	trailer.append(validate_field_size(no_of_records, "No of Records", 5))
+	trailer.append(validate_amount(format(total_amount, "0.2f"), 17))
 	return "~".join(trailer)
 
 def sanitize_data(val, replace_str=''):
 	''' Remove all the non-alphanumeric characters from string '''
-	pattern = pattern = re.compile('[\W_]+')
+	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
+	return val.strftime("%d/%m/%Y")
+
+def validate_amount(val, max_int_size):
+	''' Validate amount to be within the allowed limits  '''
+	int_size = len(str(val).split('.')[0])
+
+	if int_size > max_int_size:
+		frappe.throw(_("Amount for a single transaction is more than maximum allowed amount, create a separate payment order by splitting the transactions"))
+
+	return val
+
+def validate_information(obj, attr, max_size):
+	''' Checks if the information is not set in the system and is within the size '''
+	if hasattr(obj, attr):
+		return validate_field_size(getattr(obj, attr), frappe.unscrub(attr), max_size)
+
+	else:
+		frappe.throw(_("%s is mandatory for generating remittance payments, set the field and try again" % attr))
+
+def validate_field_size(val, label, max_size):
+	''' check the size of the val '''
+	if len(cstr(val)) > max_size:
+		frappe.throw("%s field is limited to size %d" % (label, max_size))
+	return cstr(val)
\ No newline at end of file
