XML_converter / payment.py
Ninad077's picture
Upload 12 files
1a150a4 verified
import pandas as pd
import os
header = '<ENVELOPE>\n<HEADER>\n<TALLYREQUEST>Import Data</TALLYREQUEST>\n</HEADER>\n<BODY>\n<IMPORTDATA>\n<REQUESTDESC>\n<REPORTNAME>Vouchers</REPORTNAME>\n</REQUESTDESC>\n</IMPORTDATA>\n<REQUESTDATA>\n'
footer = '</REQUESTDATA>\n</BODY>\n</ENVELOPE>\n'
def CSVtoXMLpayment(inputfile):
print(f"Processing file: {inputfile}")
if not inputfile.lower().endswith('.csv'):
print('Expected a CSV file')
return 0
outputfile = os.path.splitext(inputfile)[0] + '.xml'
try:
df = pd.read_csv(inputfile)
except FileNotFoundError:
print('CSV file not found')
return 0
except pd.errors.EmptyDataError:
print('CSV file is empty')
return 0
except pd.errors.ParserError:
print('Error parsing CSV file')
return 0
att = df.columns
rowop = ''
srop = ''
for j in range(len(df)):
rowop = ''
v_type = ''
p_name = ''
invoice_num = 'emp'
date = ''
for i in range(len(att)):
row_value = str(df[att[i]][j])
# Escape special XML characters
row_value = row_value.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace("'", '&apos;').replace('"', '&quot;')
if att[i].startswith('VOUCHERTYPENAME'):
v_type = row_value
rowop += f'<{att[i]}>{row_value}</{att[i]}>\n'
continue
if att[i].startswith('DebitLedger'):
p_name = row_value
if row_value == 'emp':
continue
if v_type == 'Receipt':
bank_name = row_value
rowop += f'<ALLLEDGERENTRIES.LIST>\n<LEDGERNAME>{row_value}</LEDGERNAME>\n'
continue
if att[i].startswith('AmountDebit'):
if v_type == 'Payment' and invoice_num == 'emp':
rowop += f'<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n</ALLLEDGERENTRIES.LIST>\n'
elif v_type == 'Payment' and invoice_num != 'emp':
rowop += f'<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n<BILLALLOCATIONS.LIST>\n<NAME>{invoice_num}</NAME>\n<BILLTYPE>New Ref</BILLTYPE>\n<AMOUNT>{row_value}</AMOUNT>\n</BILLALLOCATIONS.LIST>\n</ALLLEDGERENTRIES.LIST>\n'
elif v_type == 'Contra':
rowop += f'<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n</ALLLEDGERENTRIES.LIST>\n'
else:
rowop += f'<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n<BANKALLOCATIONS.LIST>\n<DATE>{date}</DATE>\n<INSTRUMENTDATE>{date}</INSTRUMENTDATE>\n<NAME>{p_name}</NAME>\n<TRANSACTIONTYPE>Cheque/DD</TRANSACTIONTYPE>\n<PAYMENTFAVOURING>{df[att[i+1]][j]}</PAYMENTFAVOURING>\n<PAYMENTMODE>Transacted</PAYMENTMODE>\n<BANKPARTYNAME>{df[att[i+1]][j]}</BANKPARTYNAME>\n<AMOUNT>{row_value}</AMOUNT>\n</BANKALLOCATIONS.LIST>\n</ALLLEDGERENTRIES.LIST>\n'
continue
if att[i].startswith('CreditLedger'):
if v_type == 'Payment':
bank_name = row_value
rowop += f'<ALLLEDGERENTRIES.LIST>\n<LEDGERNAME>{row_value}</LEDGERNAME>\n'
continue
if att[i].startswith('AmountCredit'):
if row_value == 'emp' and i == len(att) - 1:
rowop += f'</BANKENTRIES>\n</TALLYMESSAGE>\n'
continue
if v_type == 'Receipt' and invoice_num == 'emp':
rowop += f'<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n</ALLLEDGERENTRIES.LIST>\n</VOUCHER>\n</TALLYMESSAGE>\n'
elif v_type == 'Receipt' and invoice_num != 'emp':
rowop += f'<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n<BILLALLOCATIONS.LIST>\n<NAME>{invoice_num}</NAME>\n<BILLTYPE>New Ref</BILLTYPE>\n<AMOUNT>{row_value}</AMOUNT>\n</BILLALLOCATIONS.LIST>\n</ALLLEDGERENTRIES.LIST>\n</VOUCHER>\n</TALLYMESSAGE>\n'
elif v_type == 'Contra':
rowop += f'<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n</ALLLEDGERENTRIES.LIST>\n</VOUCHER>\n</TALLYMESSAGE>\n'
else:
rowop += f'<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>Yes</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n<BANKALLOCATIONS.LIST>\n<DATE>{date}</DATE>\n<INSTRUMENTDATE>{date}</INSTRUMENTDATE>\n<NAME>{p_name}</NAME>\n<TRANSACTIONTYPE>Cheque/DD</TRANSACTIONTYPE>\n<PAYMENTFAVOURING>{p_name}</PAYMENTFAVOURING>\n<PAYMENTMODE>Transacted</PAYMENTMODE>\n<BANKPARTYNAME>{p_name}</BANKPARTYNAME>\n<AMOUNT>{row_value}</AMOUNT>\n</BANKALLOCATIONS.LIST>\n</ALLLEDGERENTRIES.LIST>\n</VOUCHER>\n</TALLYMESSAGE>\n'
continue
if att[i].startswith('Invoice'):
invoice_num = row_value
if v_type != 'Contra' and invoice_num != 'emp':
rowop += f'<REFERENCE>{row_value}</REFERENCE>\n'
continue
if att[i].startswith('DATE'):
date = row_value
rowop += f'<{att[i]}>{row_value}</{att[i]}>\n'
continue
# Default case for other fields
rowop += f'<{att[i]}>{row_value}</{att[i]}>\n'
srop += f'<TALLYMESSAGE xmlns:UDF="TallyUDF">\n<VOUCHER VCHTYPE="{v_type}" ACTION="Create" OBJVIEW="Accounting Voucher View">\n<PARTYLEDGERNAME>{p_name}</PARTYLEDGERNAME>\n' + rowop
entireop = header + srop + footer
try:
with open(outputfile, 'w+') as f:
f.write(entireop)
print(f"XML file created successfully: {outputfile}")
except Exception as e:
print(f"Failed to write XML file: {e}")
return 0
return outputfile
# Call the function with the correct file path
CSVtoXMLpayment('/var/folders/m0/1znp8qrn26584wd5qf8g1gvm0000gp/T/tmp4wg037ba.csv')