report formate changes all model
This commit is contained in:
@@ -71,16 +71,15 @@ class AOHandler:
|
|||||||
self.cursor.callproc('DeleteAOById', [id])
|
self.cursor.callproc('DeleteAOById', [id])
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
|
|
||||||
# CLOSE CONNECTION
|
|
||||||
def close(self):
|
|
||||||
self.cursor.close()
|
|
||||||
self.conn.close()
|
|
||||||
|
|
||||||
# report download by year
|
# report download by year
|
||||||
def ao_report_download(self, selected_year):
|
def ao_report_download(self, selected_year):
|
||||||
try:
|
try:
|
||||||
# Call stored proc to fetch year-wise records
|
# AY calculation (2020 -> AY 2020-2021)
|
||||||
|
ay_start = int(selected_year)
|
||||||
|
ay_end = ay_start + 1
|
||||||
|
assessment_year = f"AY {ay_start}-{ay_end}"
|
||||||
|
|
||||||
|
# Fetch AO records
|
||||||
self.cursor.callproc("GetAOByYear", [selected_year])
|
self.cursor.callproc("GetAOByYear", [selected_year])
|
||||||
|
|
||||||
rows = []
|
rows = []
|
||||||
@@ -90,30 +89,109 @@ class AOHandler:
|
|||||||
if not rows:
|
if not rows:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
df = pd.DataFrame(rows)
|
# Remove id column if exists
|
||||||
|
for row in rows:
|
||||||
|
row.pop("id", None)
|
||||||
|
|
||||||
# TRANSPOSE
|
# Mapping DB fields → readable Excel labels
|
||||||
df_transposed = df.transpose()
|
field_mapping = {
|
||||||
df_transposed.insert(0, 'Field', df_transposed.index)
|
"gross_total_income": "Gross Total Income",
|
||||||
|
"disallowance_14a": "Add: Disallowance u/s 14A",
|
||||||
# Rename columns: Record 1, 2, 3...
|
"disallowance_37": "Add: Disallowance u/s 37",
|
||||||
record_cols = {
|
"deduction_80ia_business": "Less: Deduction u/s 80IA - On Business Income",
|
||||||
i: f"Record {i}"
|
"deduction_80ia_misc": "On Misc Receipts",
|
||||||
for i in df_transposed.columns if isinstance(i, int)
|
"deduction_80ia_other": "On Other",
|
||||||
|
"deduction_sec37_disallowance": "On Sec 37 Disallowance",
|
||||||
|
"deduction_80g": "Less: Deduction u/s 80G",
|
||||||
|
"net_taxable_income": "Net Taxable Income",
|
||||||
|
"tax_30_percent": "Tax @ 30%",
|
||||||
|
"tax_book_profit_18_5": "Tax @ 18.5% on Book Profit",
|
||||||
|
"tax_payable": "Tax Payable",
|
||||||
|
"surcharge_12": "Surcharge @ 12%",
|
||||||
|
"edu_cess_3": "Education Cess @ 3%",
|
||||||
|
"total_tax_payable": "Total Tax Payable",
|
||||||
|
"mat_credit": "Less: MAT Credit Utilized",
|
||||||
|
"interest_234c": "Add: Interest u/s 234C",
|
||||||
|
"total_tax": "Total Tax",
|
||||||
|
"advance_tax": "Advance Tax",
|
||||||
|
"tds": "TDS",
|
||||||
|
"tcs": "TCS",
|
||||||
|
"sat": "SAT",
|
||||||
|
"tax_on_assessment": "Tax on Regular Assessment",
|
||||||
|
"refund": "Refund",
|
||||||
|
"Remarks": "Remarks"
|
||||||
}
|
}
|
||||||
df_transposed.rename(columns=record_cols, inplace=True)
|
|
||||||
df_transposed.reset_index(drop=True, inplace=True)
|
|
||||||
|
|
||||||
# Excel Output
|
# Vertical AO structure
|
||||||
|
data = []
|
||||||
|
for key, label in field_mapping.items():
|
||||||
|
value = rows[0].get(key, 0)
|
||||||
|
data.append([label, value])
|
||||||
|
|
||||||
|
df = pd.DataFrame(data, columns=["Particulars", "AO"])
|
||||||
|
|
||||||
|
# Excel output
|
||||||
output = io.BytesIO()
|
output = io.BytesIO()
|
||||||
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
||||||
df_transposed.to_excel(writer, index=False, sheet_name="AO_Vertical")
|
workbook = writer.book
|
||||||
worksheet = writer.sheets["AO_Vertical"]
|
worksheet = workbook.add_worksheet("AO Report")
|
||||||
worksheet.set_column(0, 0, 30)
|
writer.sheets["AO Report"] = worksheet
|
||||||
|
|
||||||
|
# Formats
|
||||||
|
title_fmt = workbook.add_format({
|
||||||
|
"bold": True,
|
||||||
|
"align": "center",
|
||||||
|
"font_size": 14
|
||||||
|
})
|
||||||
|
header_fmt = workbook.add_format({
|
||||||
|
"bold": True,
|
||||||
|
"border": 1,
|
||||||
|
"align": "center"
|
||||||
|
})
|
||||||
|
text_fmt = workbook.add_format({"border": 1})
|
||||||
|
num_fmt = workbook.add_format({
|
||||||
|
"border": 1,
|
||||||
|
"num_format": "#,##0.00"
|
||||||
|
})
|
||||||
|
|
||||||
|
# Company Name
|
||||||
|
worksheet.merge_range(
|
||||||
|
"A1:B1",
|
||||||
|
"Laxmi Civil Engineering Services Pvt Ltd",
|
||||||
|
title_fmt
|
||||||
|
)
|
||||||
|
|
||||||
|
# Assessment Year
|
||||||
|
worksheet.merge_range(
|
||||||
|
"A2:B2",
|
||||||
|
f"Assessment Year : {assessment_year}",
|
||||||
|
workbook.add_format({"bold": True, "align": "center"})
|
||||||
|
)
|
||||||
|
|
||||||
|
# Header
|
||||||
|
worksheet.write_row("A4", ["Particulars", "AO"], header_fmt)
|
||||||
|
|
||||||
|
# Data rows
|
||||||
|
row_no = 4
|
||||||
|
for _, row in df.iterrows():
|
||||||
|
worksheet.write(row_no, 0, row["Particulars"], text_fmt)
|
||||||
|
worksheet.write(row_no, 1, row["AO"], num_fmt)
|
||||||
|
row_no += 1
|
||||||
|
|
||||||
|
# Column width
|
||||||
|
worksheet.set_column("A:A", 45)
|
||||||
|
worksheet.set_column("B:B", 20)
|
||||||
|
|
||||||
output.seek(0)
|
output.seek(0)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
except mysql.connector.Error as e:
|
except mysql.connector.Error as e:
|
||||||
print("MySQL Error:", e)
|
print("MySQL Error →", e)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# CLOSE CONNECTION
|
||||||
|
def close(self):
|
||||||
|
self.cursor.close()
|
||||||
|
self.conn.close()
|
||||||
@@ -4,7 +4,6 @@ import pandas as pd
|
|||||||
import io
|
import io
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CITHandler:
|
class CITHandler:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -51,8 +50,6 @@ class CITHandler:
|
|||||||
self.cursor.callproc("InsertCIT", values)
|
self.cursor.callproc("InsertCIT", values)
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# UPDATE CIT RECORD
|
# UPDATE CIT RECORD
|
||||||
def update_cit(self, id, data):
|
def update_cit(self, id, data):
|
||||||
columns = [
|
columns = [
|
||||||
@@ -69,22 +66,19 @@ class CITHandler:
|
|||||||
self.cursor.callproc("UpdateCITById", values)
|
self.cursor.callproc("UpdateCITById", values)
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# DELETE CIT RECORD
|
# DELETE CIT RECORD
|
||||||
def delete_cit(self, id):
|
def delete_cit(self, id):
|
||||||
self.cursor.callproc("DeleteCITById", [id])
|
self.cursor.callproc("DeleteCITById", [id])
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
#
|
||||||
# CLOSE CONNECTION
|
|
||||||
def close(self):
|
|
||||||
self.cursor.close()
|
|
||||||
self.conn.close()
|
|
||||||
|
|
||||||
|
|
||||||
def cit_report_download(self, selected_year):
|
def cit_report_download(self, selected_year):
|
||||||
try:
|
try:
|
||||||
# Call stored procedure
|
# AY calculation (2020 -> AY 2020-2021)
|
||||||
|
ay_start = int(selected_year)
|
||||||
|
ay_end = ay_start + 1
|
||||||
|
assessment_year = f"AY {ay_start}-{ay_end}"
|
||||||
|
|
||||||
|
# Fetch CIT records
|
||||||
self.cursor.callproc("GetCITByYear", [selected_year])
|
self.cursor.callproc("GetCITByYear", [selected_year])
|
||||||
|
|
||||||
rows = []
|
rows = []
|
||||||
@@ -94,28 +88,108 @@ class CITHandler:
|
|||||||
if not rows:
|
if not rows:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
df = pd.DataFrame(rows)
|
# Remove id column if exists
|
||||||
|
for row in rows:
|
||||||
|
row.pop("id", None)
|
||||||
|
|
||||||
|
# Mapping DB fields → readable Excel labels
|
||||||
|
field_mapping = {
|
||||||
|
"gross_total_income": "Gross Total Income",
|
||||||
|
"disallowance_14a": "Add: Disallowance u/s 14A",
|
||||||
|
"disallowance_37": "Add: Disallowance u/s 37",
|
||||||
|
"deduction_80ia_business": "Less: Deduction u/s 80IA - On Business Income",
|
||||||
|
"deduction_80ia_misc": "On Misc Receipts",
|
||||||
|
"deduction_80ia_other": "On Other",
|
||||||
|
"deduction_sec37_disallowance": "On Sec 37 Disallowance",
|
||||||
|
"deduction_80g": "Less: Deduction u/s 80G",
|
||||||
|
"net_taxable_income": "Net Taxable Income",
|
||||||
|
"tax_30_percent": "Tax @ 30%",
|
||||||
|
"tax_book_profit_18_5": "Tax @ 18.5% on Book Profit",
|
||||||
|
"tax_payable": "Tax Payable",
|
||||||
|
"surcharge_12": "Surcharge @ 12%",
|
||||||
|
"edu_cess_3": "Education Cess @ 3%",
|
||||||
|
"total_tax_payable": "Total Tax Payable",
|
||||||
|
"mat_credit": "Less: MAT Credit Utilized",
|
||||||
|
"interest_234c": "Add: Interest u/s 234C",
|
||||||
|
"total_tax": "Total Tax",
|
||||||
|
"advance_tax": "Advance Tax",
|
||||||
|
"tds": "TDS",
|
||||||
|
"tcs": "TCS",
|
||||||
|
"sat": "SAT",
|
||||||
|
"tax_on_assessment": "Tax on Regular Assessment",
|
||||||
|
"refund": "Refund",
|
||||||
|
"Remarks": "Remarks"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vertical CIT structure (single record per year)
|
||||||
|
data = []
|
||||||
|
for key, label in field_mapping.items():
|
||||||
|
value = rows[0].get(key, 0)
|
||||||
|
data.append([label, value])
|
||||||
|
|
||||||
|
df = pd.DataFrame(data, columns=["Particulars", "CIT"])
|
||||||
|
|
||||||
# Excel output
|
# Excel output
|
||||||
output = io.BytesIO()
|
output = io.BytesIO()
|
||||||
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
||||||
|
workbook = writer.book
|
||||||
|
worksheet = workbook.add_worksheet("CIT Report")
|
||||||
|
writer.sheets["CIT Report"] = worksheet
|
||||||
|
|
||||||
for i, (_, row) in enumerate(df.iterrows(), start=1):
|
# Formats
|
||||||
# Convert row to vertical format
|
title_fmt = workbook.add_format({
|
||||||
vertical_df = pd.DataFrame(row).reset_index()
|
"bold": True,
|
||||||
vertical_df.columns = ['Field', 'Value']
|
"align": "center",
|
||||||
|
"font_size": 14
|
||||||
|
})
|
||||||
|
header_fmt = workbook.add_format({
|
||||||
|
"bold": True,
|
||||||
|
"border": 1,
|
||||||
|
"align": "center"
|
||||||
|
})
|
||||||
|
text_fmt = workbook.add_format({"border": 1})
|
||||||
|
num_fmt = workbook.add_format({
|
||||||
|
"border": 1,
|
||||||
|
"num_format": "#,##0.00"
|
||||||
|
})
|
||||||
|
|
||||||
start_row = (i - 1) * (len(vertical_df) + 3) # gap between blocks
|
# Company Name
|
||||||
vertical_df.to_excel(
|
worksheet.merge_range(
|
||||||
writer,
|
"A1:B1",
|
||||||
sheet_name='CIT_Report',
|
"Laxmi Civil Engineering Services Pvt Ltd",
|
||||||
index=False,
|
title_fmt
|
||||||
startrow=start_row
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Assessment Year
|
||||||
|
worksheet.merge_range(
|
||||||
|
"A2:B2",
|
||||||
|
f"Assessment Year : {assessment_year}",
|
||||||
|
workbook.add_format({"bold": True, "align": "center"})
|
||||||
|
)
|
||||||
|
|
||||||
|
# Header
|
||||||
|
worksheet.write_row("A4", ["Particulars", "CIT"], header_fmt)
|
||||||
|
|
||||||
|
# Data rows
|
||||||
|
row_no = 4
|
||||||
|
for _, row in df.iterrows():
|
||||||
|
worksheet.write(row_no, 0, row["Particulars"], text_fmt)
|
||||||
|
worksheet.write(row_no, 1, row["CIT"], num_fmt)
|
||||||
|
row_no += 1
|
||||||
|
|
||||||
|
# Column widths
|
||||||
|
worksheet.set_column("A:A", 45)
|
||||||
|
worksheet.set_column("B:B", 20)
|
||||||
|
|
||||||
output.seek(0)
|
output.seek(0)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
except mysql.connector.Error as e:
|
except mysql.connector.Error as e:
|
||||||
print("MySQL Error:", e)
|
print("MySQL Error →", e)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# CLOSE CONNECTION
|
||||||
|
def close(self):
|
||||||
|
self.cursor.close()
|
||||||
|
self.conn.close()
|
||||||
@@ -65,10 +65,14 @@ class ITATHandler:
|
|||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def itat_report_download(self, selected_year):
|
def itat_report_download(self, selected_year):
|
||||||
try:
|
try:
|
||||||
# Call stored procedure
|
# AY calculation (2020 -> AY 2020-2021)
|
||||||
|
ay_start = int(selected_year)
|
||||||
|
ay_end = ay_start + 1
|
||||||
|
assessment_year = f"AY {ay_start}-{ay_end}"
|
||||||
|
|
||||||
|
# Fetch ITAT data
|
||||||
self.cursor.callproc("GetITATByYear", [selected_year])
|
self.cursor.callproc("GetITATByYear", [selected_year])
|
||||||
rows = []
|
rows = []
|
||||||
for result in self.cursor.stored_results():
|
for result in self.cursor.stored_results():
|
||||||
@@ -77,20 +81,107 @@ class ITATHandler:
|
|||||||
if not rows:
|
if not rows:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
df = pd.DataFrame(rows)
|
# Remove id column if exists
|
||||||
|
for row in rows:
|
||||||
|
row.pop("id", None)
|
||||||
|
|
||||||
|
# Mapping DB fields → readable Excel labels
|
||||||
|
field_mapping = {
|
||||||
|
"gross_total_income": "Gross Total Income",
|
||||||
|
"disallowance_14a": "Add: Disallowance u/s 14A",
|
||||||
|
"disallowance_37": "Add: Disallowance u/s 37",
|
||||||
|
"deduction_80ia_business": "Less: Deduction u/s 80IA - On Business Income",
|
||||||
|
"deduction_80ia_misc": "On Misc Receipts",
|
||||||
|
"deduction_80ia_other": "On Other",
|
||||||
|
"deduction_sec37_disallowance": "On Sec 37 Disallowance",
|
||||||
|
"deduction_80g": "Less: Deduction u/s 80G",
|
||||||
|
"net_taxable_income": "Net Taxable Income",
|
||||||
|
"tax_30_percent": "Tax @ 30%",
|
||||||
|
"tax_book_profit_18_5": "Tax @ 18.5% on Book Profit",
|
||||||
|
"tax_payable": "Tax Payable",
|
||||||
|
"surcharge_12": "Surcharge @ 12%",
|
||||||
|
"edu_cess_3": "Education Cess @ 3%",
|
||||||
|
"total_tax_payable": "Total Tax Payable",
|
||||||
|
"mat_credit": "Less: MAT Credit Utilized",
|
||||||
|
"interest_234c": "Add: Interest u/s 234C",
|
||||||
|
"total_tax": "Total Tax",
|
||||||
|
"advance_tax": "Advance Tax",
|
||||||
|
"tds": "TDS",
|
||||||
|
"tcs": "TCS",
|
||||||
|
"sat": "SAT",
|
||||||
|
"tax_on_assessment": "Tax on Regular Assessment",
|
||||||
|
"refund": "Refund",
|
||||||
|
"Remarks": "Remarks"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vertical ITAT structure
|
||||||
|
data = []
|
||||||
|
for key, label in field_mapping.items():
|
||||||
|
value = rows[0].get(key, 0)
|
||||||
|
data.append([label, value])
|
||||||
|
|
||||||
|
df = pd.DataFrame(data, columns=["Particulars", "ITAT"])
|
||||||
|
|
||||||
# Excel output
|
# Excel output
|
||||||
output = io.BytesIO()
|
output = io.BytesIO()
|
||||||
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
||||||
df.T.to_excel(writer, header=False, sheet_name="ITAT_Report")
|
workbook = writer.book
|
||||||
|
worksheet = workbook.add_worksheet("ITAT Report")
|
||||||
|
writer.sheets["ITAT Report"] = worksheet
|
||||||
|
|
||||||
|
# Formats
|
||||||
|
title_fmt = workbook.add_format({
|
||||||
|
"bold": True,
|
||||||
|
"align": "center",
|
||||||
|
"font_size": 14
|
||||||
|
})
|
||||||
|
header_fmt = workbook.add_format({
|
||||||
|
"bold": True,
|
||||||
|
"border": 1,
|
||||||
|
"align": "center"
|
||||||
|
})
|
||||||
|
text_fmt = workbook.add_format({"border": 1})
|
||||||
|
num_fmt = workbook.add_format({
|
||||||
|
"border": 1,
|
||||||
|
"num_format": "#,##0.00"
|
||||||
|
})
|
||||||
|
|
||||||
|
# Company Name
|
||||||
|
worksheet.merge_range(
|
||||||
|
"A1:B1",
|
||||||
|
"Laxmi Civil Engineering Services Pvt Ltd",
|
||||||
|
title_fmt
|
||||||
|
)
|
||||||
|
|
||||||
|
# Assessment Year
|
||||||
|
worksheet.merge_range(
|
||||||
|
"A2:B2",
|
||||||
|
f"Assessment Year : {assessment_year}",
|
||||||
|
workbook.add_format({"bold": True, "align": "center"})
|
||||||
|
)
|
||||||
|
|
||||||
|
# Header
|
||||||
|
worksheet.write_row("A4", ["Particulars", "ITAT"], header_fmt)
|
||||||
|
|
||||||
|
# Data rows
|
||||||
|
row_no = 4
|
||||||
|
for _, row in df.iterrows():
|
||||||
|
worksheet.write(row_no, 0, row["Particulars"], text_fmt)
|
||||||
|
worksheet.write(row_no, 1, row["ITAT"], num_fmt)
|
||||||
|
row_no += 1
|
||||||
|
|
||||||
|
# Column widths
|
||||||
|
worksheet.set_column("A:A", 45)
|
||||||
|
worksheet.set_column("B:B", 20)
|
||||||
|
|
||||||
output.seek(0)
|
output.seek(0)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
except mysql.connector.Error as e:
|
except mysql.connector.Error as e:
|
||||||
print("MySQL Error:", e)
|
print("MySQL Error →", e)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
# CLOSE CONNECTION
|
# CLOSE CONNECTION
|
||||||
def close(self):
|
def close(self):
|
||||||
self.cursor.close()
|
self.cursor.close()
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class ITRHandler:
|
|||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
|
|
||||||
# report download by year
|
# # report download by year
|
||||||
def itr_report_download(self, selected_year):
|
def itr_report_download(self, selected_year):
|
||||||
try:
|
try:
|
||||||
# Call stored procedure
|
# Call stored procedure
|
||||||
@@ -93,27 +93,90 @@ class ITRHandler:
|
|||||||
|
|
||||||
if not rows:
|
if not rows:
|
||||||
return None
|
return None
|
||||||
|
for row in rows:
|
||||||
|
row.pop('id', None)
|
||||||
|
|
||||||
# Convert SQL rows to DataFrame
|
# Mapping DB fields → Excel labels (NO underscores)
|
||||||
df = pd.DataFrame(rows)
|
field_mapping = {
|
||||||
# Transpose
|
"gross_total_income": "Gross Total Income",
|
||||||
df_transposed = df.transpose()
|
"disallowance_14a": "Add: Disallowance u/s 14A",
|
||||||
df_transposed.insert(0, 'Field', df_transposed.index)
|
"disallowance_37": "Add: Disallowance u/s 37",
|
||||||
|
"deduction_80ia_business": "Less: Deduction u/s 80IA - On Business Income",
|
||||||
record_cols = {
|
"deduction_80ia_misc": "On Misc Receipts",
|
||||||
i: f"Record {i}"
|
"deduction_80ia_other": "On Other",
|
||||||
for i in df_transposed.columns if isinstance(i, int)
|
"deduction_sec37_disallowance": "On Sec 37 Disallowance",
|
||||||
|
"deduction_80g": "Less: Deduction u/s 80G",
|
||||||
|
"net_taxable_income": "Net Taxable Income",
|
||||||
|
"tax_30_percent": "Tax @ 30%",
|
||||||
|
"tax_book_profit_18_5": "Tax @ 18.5% on Book Profit",
|
||||||
|
"tax_payable": "Tax Payable",
|
||||||
|
"surcharge_12": "Surcharge @ 12%",
|
||||||
|
"edu_cess_3": "Education Cess @ 3%",
|
||||||
|
"total_tax_payable": "Total Tax Payable",
|
||||||
|
"mat_credit": "Less: MAT Credit Utilized",
|
||||||
|
"interest_234c": "Add: Interest u/s 234C",
|
||||||
|
"total_tax": "Total Tax",
|
||||||
|
"advance_tax": "Advance Tax",
|
||||||
|
"tds": "TDS",
|
||||||
|
"tcs": "TCS",
|
||||||
|
"sat": "SAT",
|
||||||
|
"tax_on_assessment": "Tax on Regular Assessment",
|
||||||
|
"refund": "Refund"
|
||||||
}
|
}
|
||||||
|
|
||||||
df_transposed.rename(columns=record_cols, inplace=True)
|
# Convert to vertical structure
|
||||||
df_transposed.reset_index(drop=True, inplace=True)
|
data = []
|
||||||
|
for key, label in field_mapping.items():
|
||||||
|
value = rows[0].get(key, 0)
|
||||||
|
data.append([label, value])
|
||||||
|
|
||||||
# Save to Excel in memory
|
df = pd.DataFrame(data, columns=["Particulars", "ITR"])
|
||||||
|
|
||||||
|
# Excel output
|
||||||
output = io.BytesIO()
|
output = io.BytesIO()
|
||||||
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
|
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
|
||||||
df_transposed.to_excel(writer, index=False, sheet_name='ITR_Vertical')
|
workbook = writer.book
|
||||||
worksheet = writer.sheets['ITR_Vertical']
|
worksheet = workbook.add_worksheet("ITR Report")
|
||||||
worksheet.set_column(0, 0, 30)
|
writer.sheets["ITR Report"] = worksheet
|
||||||
|
|
||||||
|
# Formats
|
||||||
|
title_fmt = workbook.add_format({
|
||||||
|
"bold": True, "align": "center", "valign": "vcenter",
|
||||||
|
"font_size": 14
|
||||||
|
})
|
||||||
|
header_fmt = workbook.add_format({
|
||||||
|
"bold": True, "border": 1, "align": "center"
|
||||||
|
})
|
||||||
|
cell_fmt = workbook.add_format({"border": 1})
|
||||||
|
num_fmt = workbook.add_format({"border": 1, "num_format": "#,##0.00"})
|
||||||
|
|
||||||
|
# Company name
|
||||||
|
worksheet.merge_range("A1:B1", "Laxmi Civil Engineering Services Pvt Ltd", title_fmt)
|
||||||
|
|
||||||
|
ay_start = int(selected_year)
|
||||||
|
ay_end = ay_start + 1
|
||||||
|
assessment_year = f"AY {ay_start}-{ay_end}"
|
||||||
|
|
||||||
|
# Assessment Year
|
||||||
|
worksheet.merge_range(
|
||||||
|
"A2:B2",
|
||||||
|
f"Assessment Year : {assessment_year}",
|
||||||
|
workbook.add_format({"align": "center", "bold": True})
|
||||||
|
)
|
||||||
|
|
||||||
|
# Headers
|
||||||
|
worksheet.write_row("A4", ["Particulars", "ITR"], header_fmt)
|
||||||
|
|
||||||
|
# Data rows
|
||||||
|
row_no = 4
|
||||||
|
for _, row in df.iterrows():
|
||||||
|
worksheet.write(row_no, 0, row["Particulars"], cell_fmt)
|
||||||
|
worksheet.write(row_no, 1, row["ITR"], num_fmt)
|
||||||
|
row_no += 1
|
||||||
|
|
||||||
|
# Column widths
|
||||||
|
worksheet.set_column("A:A", 45)
|
||||||
|
worksheet.set_column("B:B", 20)
|
||||||
|
|
||||||
output.seek(0)
|
output.seek(0)
|
||||||
return output
|
return output
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user