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