XML_converter / cn.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>All Masters</REPORTNAME>\n</REQUESTDESC>\n<REQUESTDATA>\n'
footer = '</REQUESTDATA>\n</IMPORTDATA>\n</BODY>\n</ENVELOPE>\n'
def CSVtoXMLcn(inputfile):
print(f"Processing file: {inputfile}")
if not inputfile.lower().endswith('.csv'):
print('Expected a CSV file')
return None
outputfile = os.path.splitext(inputfile)[0] + '.xml'
try:
df = pd.read_csv(inputfile)
except FileNotFoundError:
print('CSV file not found')
return None
except pd.errors.EmptyDataError:
print('CSV file is empty')
return None
except pd.errors.ParserError:
print('Error parsing CSV file')
return None
att = df.columns
rowop = ''
srop = ''
for j in range(len(df)):
rowop = ''
v_type = ''
cost_category = 'emp'
invoice_num = ''
line1 = line2 = line3 = line4 = ''
for i in range(len(att)):
row_value = str(df[att[i]][j]).replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace("'", '&apos;').replace('"', '&quot;')
if att[i].startswith('DATE'):
rowop += f'<{att[i]}>{row_value}</{att[i]}>\n<REFERENCEDATE>{row_value}</REFERENCEDATE>\n'
continue
if att[i].startswith('VOUCHERTYPENAME'):
v_type = row_value
rowop += f'<VOUCHERTYPENAME>{row_value}</VOUCHERTYPENAME>\n<VOUCHERTYPEORIGNAME>{row_value}</VOUCHERTYPEORIGNAME>\n<VCHENTRYMODE>Accounting Invoice</VCHENTRYMODE>\n'
continue
if att[i].startswith('VOUCHERNUMBER'):
rowop += f'<VOUCHERNUMBER>{row_value}</VOUCHERNUMBER>\n'
continue
if att[i].startswith('Reference'):
invoice_num = row_value
rowop += f'<REFERENCE>{row_value}</REFERENCE>\n'
continue
if att[i].startswith('Cost_Category'):
cost_category = row_value
continue
if att[i].startswith('NARRATION'):
rowop += f'<NARRATION>{row_value}</NARRATION>\n'
continue
if att[i].startswith('Buyer_Name'):
rowop += f'<BASICBUYERNAME>{row_value}</BASICBUYERNAME>\n<CONSIGNEEMAILINGNAME>{row_value}</CONSIGNEEMAILINGNAME>\n<PARTYNAME>{row_value}</PARTYNAME>\n<PARTYMAILINGNAME>{row_value}</PARTYMAILINGNAME>\n'
continue
if att[i].startswith('Pincode'):
if row_value != 'emp':
rowop += f'<PARTYPINCODE>{row_value}</PARTYPINCODE>\n<CONSIGNEEPINCODE>{row_value}</CONSIGNEEPINCODE>\n'
continue
if att[i].startswith('State_Name'):
if row_value != 'emp':
rowop += f'<STATENAME>{row_value}</STATENAME>\n<BILLTOPLACE>{row_value}</BILLTOPLACE>\n<CONSIGNEESTATENAME>{row_value}</CONSIGNEESTATENAME>\n'
continue
if att[i].startswith('Address_1'):
line1 = row_value if row_value != 'emp' else ''
continue
if att[i].startswith('Address_2'):
line2 = row_value if row_value != 'emp' else ''
continue
if att[i].startswith('Address_3'):
line3 = row_value if row_value != 'emp' else ''
continue
if att[i].startswith('Address_4'):
line4 = row_value if row_value != 'emp' else ''
if line1 or line2 or line3 or line4:
rowop += f'<ADDRESS.LIST TYPE="String">\n<ADDRESS>{line1}</ADDRESS>\n<ADDRESS>{line2}</ADDRESS>\n<ADDRESS>{line3}</ADDRESS>\n<ADDRESS>{line4}</ADDRESS>\n</ADDRESS.LIST>\n<BASICBUYERADDRESS.LIST TYPE="String">\n<BASICBUYERADDRESS>{line1}</BASICBUYERADDRESS>\n<BASICBUYERADDRESS>{line2}</BASICBUYERADDRESS>\n<BASICBUYERADDRESS>{line3}</BASICBUYERADDRESS>\n<BASICBUYERADDRESS>{line4}</BASICBUYERADDRESS>\n</BASICBUYERADDRESS.LIST>\n'
continue
if att[i].startswith('POS'):
rowop += f'<PLACEOFSUPPLY>{row_value}</PLACEOFSUPPLY>\n<SHIPTOPLACE>{row_value}</SHIPTOPLACE>\n'
continue
if att[i].startswith('Registration_Type'):
continue
if att[i].startswith('Company_GSTIN'):
if row_value != 'emp':
rowop += f'<PARTYGSTIN>{row_value}</PARTYGSTIN>\n<CONSIGNEEGSTIN>{row_value}</CONSIGNEEGSTIN>\n'
continue
if att[i].startswith('CreditLedger'):
if row_value != 'emp':
rowop += f'<PARTYLEDGERNAME>{row_value}</PARTYLEDGERNAME>\n<LEDGERENTRIES.LIST>\n<LEDGERNAME>{row_value}</LEDGERNAME>\n'
continue
if att[i].startswith('AmountCredit'):
if row_value != 'emp':
rowop += f'<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>\n<ISPARTYLEDGER>No</ISPARTYLEDGER>\n<AMOUNT>{row_value}</AMOUNT>\n<BILLALLOCATIONS.LIST>\n<NAME>{invoice_num}</NAME>\n<BILLTYPE>{invoice_num}</BILLTYPE>\n<AMOUNT>{row_value}</AMOUNT>\n</BILLALLOCATIONS.LIST>\n</LEDGERENTRIES.LIST>'
continue
# Handle other columns
l_name = att[i].replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace("'", '&apos;').replace('"', '&quot;')
if not l_name.startswith(("CGST", "IGST", "SGST")) and row_value != 'emp':
rowop += f"""
<LEDGERENTRIES.LIST>
<LEDGERNAME>{l_name}</LEDGERNAME>
<GSTCLASS/>
<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
<ISPARTYLEDGER>Yes</ISPARTYLEDGER>
<AMOUNT>{row_value}</AMOUNT>
<CATEGORYALLOCATIONS.LIST>
<CATEGORY>{cost_category}</CATEGORY>
<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
<COSTCENTREALLOCATIONS.LIST>
<NAME>{df[att[i+1]][j]}</NAME>
<AMOUNT>{row_value}</AMOUNT>
</COSTCENTREALLOCATIONS.LIST>
</CATEGORYALLOCATIONS.LIST>
</LEDGERENTRIES.LIST>
"""
elif row_value != 'emp':
rowop += f"""
<LEDGERENTRIES.LIST>
<LEDGERNAME>{l_name}</LEDGERNAME>
<GSTCLASS/>
<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
<ISPARTYLEDGER>Yes</ISPARTYLEDGER>
<AMOUNT>{row_value}</AMOUNT>
</LEDGERENTRIES.LIST>
"""
srop += f'<TALLYMESSAGE xmlns:UDF="TallyUDF">\n<VOUCHER VCHTYPE="{v_type}" ACTION="Create" OBJVIEW="Accounting Voucher View">\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 None
return outputfile
# Example usage
CSVtoXMLcn('/var/folders/m0/1znp8qrn26584wd5qf8g1gvm0000gp/T/tmpvwgopmwt.csv')