diff --git a/erpnext/regional/india/bank_remittance_txt.py b/erpnext/regional/india/bank_remittance_txt.py new file mode 100644 index 00000000000..7c4995e9f1f --- /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