133 lines
4.7 KiB
Python
133 lines
4.7 KiB
Python
|
# -*- 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")
|