Spaces:
Paused
Paused
| 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('&', '&').replace('<', '<').replace('>', '>').replace("'", ''').replace('"', '"') | |
| 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') | |