From 3cf258ba0d19ee707b1862a7f69b7f7ed4f01dd7 Mon Sep 17 00:00:00 2001 From: pjpatil12 Date: Tue, 2 Dec 2025 15:38:19 +0530 Subject: [PATCH] summary report download code commit. --- AppCode/DocumentHandler.py | 134 ++++++++++- AppCode/FileHandler.py | 3 +- AppCode/YearGet.py | 13 +- .../DocumentHandler.cpython-313.pyc | Bin 3624 -> 8932 bytes .../__pycache__/FileHandler.cpython-313.pyc | Bin 936 -> 936 bytes .../__pycache__/ITATHandler.cpython-313.pyc | Bin 4694 -> 4694 bytes AppCode/__pycache__/YearGet.cpython-313.pyc | Bin 1826 -> 1878 bytes main.py | 209 +++++++++--------- 8 files changed, 249 insertions(+), 110 deletions(-) diff --git a/AppCode/DocumentHandler.py b/AppCode/DocumentHandler.py index 189857c..e59d6b4 100644 --- a/AppCode/DocumentHandler.py +++ b/AppCode/DocumentHandler.py @@ -2,6 +2,12 @@ import os from AppCode.Config import DBConfig from AppCode.FileHandler import FileHandler from werkzeug.utils import secure_filename +from flask import Flask, render_template, request, redirect, url_for, send_from_directory, abort, flash,send_file +import mysql.connector +import pandas as pd +import io +from AppCode.YearGet import YearGet + class DocumentHandler: @@ -85,15 +91,129 @@ class DocumentHandler: # """, (filename, filepath, file.filename.rsplit('.', 1)[1], year, stage)) - cursor.callproc('InsertDocument', [ - filename, - filepath, - extension, - year, - stage - ]) + cursor.callproc('InsertDocument', [ filename, filepath, extension, year, stage ]) connection.commit() cursor.close() connection.close() # return redirect(url_for('view_documents')) + + + # Summary report + def Summary_report(self, request): + + dbconfig = DBConfig() + connection = dbconfig.get_db_connection() + + year = request.args.get('year') + + # if not year get all year in list. + if not year: + yearGetter = YearGet() + allYears = yearGetter.get_year_by_model("AllYearsInAllModel") + yearGetter.close() + + return render_template( + 'summary_reports.html', + years=allYears, + message="Please select a year to download." + ) + + # for excel + try: + stages = { + "ITR": "itr", + "AO": "ao", + "CIT": "cit", + "ITAT": "itat", + } + # stages = ['itr', 'ao', 'cit', 'itat'] + stage_data = {} + + for stage_name, table_name in stages.items(): + cursor = connection.cursor(dictionary=True) + + cursor.callproc("sp_get_stage_data", [table_name, year]) + + for result in cursor.stored_results(): + rows = result.fetchall() + + df = pd.DataFrame(rows) if rows else pd.DataFrame() + stage_data[stage_name] = df + + cursor.close() + + + def safe_get(df, col): + return df[col].values[0] if col in df.columns and not df.empty else "-" + + particulars = [ + "Gross Total Income", "Add: Disallowance u/s 14A", "Add: Disallowance u/s 37", "GTI as per", + "Less: Deduction u/s 80IA", "Less: Deduction u/s 80G", "Net Taxable Income", "Tax @ 30%", + "Tax @ 18.5% on Book Profit", "Surcharge @ 12%", "Education Cess @ 3%", "Total Tax Payable", + "Less: MAT Credit", "Net Tax", "Add: Interest u/s 234C", "Total Tax", + "Advance Tax", "TDS", "TCS", "SAT", "Tax on Regular Assessment", "Refund" + ] + + columns = [ + 'gross_total_income', 'disallowance_14a', 'disallowance_37', 'gti', + 'deduction_80ia', 'deduction_80g', 'net_taxable_income', 'tax_30', + 'book_profit_tax', 'surcharge_12', 'education_cess', 'total_tax', + 'mat_credit', 'net_tax', 'interest_234c', 'total_tax_payable', + 'advance_tax', 'tds', 'tcs', 'sat', 'tax_regular', 'refund' + ] + + data = { + "Particulars": particulars, + "ITR": [safe_get(stage_data['ITR'], col) for col in columns], + "AO": [safe_get(stage_data['AO'], col) for col in columns], + "CIT": [safe_get(stage_data['CIT'], col) for col in columns], + "ITAT": [safe_get(stage_data['ITAT'], col) for col in columns], + } + + df = pd.DataFrame(data) + + # Export to Excel + output = io.BytesIO() + with pd.ExcelWriter(output, engine='xlsxwriter') as writer: + df.to_excel(writer, index=False, sheet_name=f'AY {year}') + workbook = writer.book + worksheet = writer.sheets[f'AY {year}'] + + header = workbook.add_format({ + 'bold': True, + 'align': 'center', + 'valign': 'middle', + 'bg_color': '#007bff', + 'font_color': 'white', + 'border': 1 + }) + + cell = workbook.add_format({ + 'border': 1, + 'align': 'center', + 'valign': 'middle' + }) + + # Apply formatting + for col_num, col_name in enumerate(df.columns): + worksheet.write(0, col_num, col_name, header) + max_len = max(df[col_name].astype(str).map(len).max(), len(col_name)) + 2 + worksheet.set_column(col_num, col_num, max_len) + + for row in range(1, len(df) + 1): + for col in range(len(df.columns)): + worksheet.write(row, col, df.iloc[row - 1, col], cell) + + output.seek(0) + + return send_file( + output, + download_name=f"Summary_Report_{year}.xlsx", + as_attachment=True, + mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + ) + + finally: + connection.close() + diff --git a/AppCode/FileHandler.py b/AppCode/FileHandler.py index 77a1b72..82ee9b5 100644 --- a/AppCode/FileHandler.py +++ b/AppCode/FileHandler.py @@ -9,4 +9,5 @@ class FileHandler: def CHeckExistingOrCreateNewUploadFolder(): #Wheteher path exists os.makedirs(FileHandler.UPLOAD_FOLDER, exist_ok=True) - return \ No newline at end of file + return + \ No newline at end of file diff --git a/AppCode/YearGet.py b/AppCode/YearGet.py index 5b79701..19c998b 100644 --- a/AppCode/YearGet.py +++ b/AppCode/YearGet.py @@ -7,22 +7,33 @@ class YearGet: self.conn = DBConfig.get_db_connection() self.cursor = self.conn.cursor(dictionary=True) + # get year fetch in perticular Model name. def get_year_by_model(self, proc_name): try: self.cursor.callproc(proc_name) years = [] - for result in self.cursor.stored_results(): rows = result.fetchall() years = [row["year"] for row in rows] + print("-- years get --",years) return years except mysql.connector.Error as e: print("MySQL Error:", e) return [] + # def get_all_year_in_all_model(self): + # self.cursor.callproc("AllYearsInAllModel") + # years = [] + # for result in self.cursor.stored_results(): + # rows = result.fetchall() + # years = [row["year"] for row in rows] + # return years + + + def close(self): self.cursor.close() self.conn.close() diff --git a/AppCode/__pycache__/DocumentHandler.cpython-313.pyc b/AppCode/__pycache__/DocumentHandler.cpython-313.pyc index 9f94aa43cdb809a3f2421504b70339c8c50f5754..915c4e3b74da15a5e13e6a4888e0a5e9ef5b0135 100644 GIT binary patch literal 8932 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 diff --git a/AppCode/__pycache__/FileHandler.cpython-313.pyc b/AppCode/__pycache__/FileHandler.cpython-313.pyc index 841cee0bc79bc401b686f33e8a83d3d4582be9bd..dbeaa16a768df574bec3864eb4ed9a656d9a82af 100644 GIT binary patch delta 22 ccmZ3%zJi_iGcPX}0}#|L*2@gq$UB=E07B*k=>Px# delta 22 ccmZ3%zJi_iGcPX}0}!Nt*UI$S$UB=E07QKT8~^|S diff --git a/AppCode/__pycache__/ITATHandler.cpython-313.pyc b/AppCode/__pycache__/ITATHandler.cpython-313.pyc index bd47b5eff1aadeddf0dda4ea43ad7deca976973d..c15ba24d79d8d3b5ef5f82a5a6cc6c5fbeb4b52f 100644 GIT binary patch delta 19 Zcmcbna!rNnGcPX}0}w2Jwvo$62mn4}1-JkJ delta 19 Zcmcbna!rNnGcPX}0}!Yl-^k@71OPhI1sebW diff --git a/AppCode/__pycache__/YearGet.cpython-313.pyc b/AppCode/__pycache__/YearGet.cpython-313.pyc index ed4f2c3e734aadd68ae9f76e4033784b65e7d00d..20db5344a0cfa52fcd04daa6cee4d44d19320bde 100644 GIT binary patch delta 301 zcmZ3)ca4wlGcPX}0}w2jt(RHIvXM`fi6?=Pfnh3x978BW5X0m`R<+5gOtVa)IYFvG zAebqX$&?AgR$vHaQeh}&QUKyS)-(o1hG?*9AlV=upk`r4zRCK`(%cB$%#%ZzwIx~n zZn0FRCKgrk>*^|i7{vlK@$AW=EQ*Xb zCYQ5VN`K*C;1#+cq`biO3Xj$eVTlf(pP$$nWUYRD;hKDa#ZcRv;h+GYqY>LdIbla2 z+lUoJn#(!qG9MDi0F^@#yU6bS+y006O6Mo|C& delta 253 zcmcb{w}_ALGcPX}0}zCj=w{ww+Q_HM#O}e!z%Z3TZgLK*_T*HiSu&waDh$O;3P7C4 zn#Q2W5X}M700Kc=lM7jeCmS&fi?A~!N-!|wu|@Mkq!<{2nI`8lYjZIB-D0UsO)Q$c zk=c6kXJ&EsTdV~|nRz9XxmfbpKvow|m|VxA$oOFL0v1bw4;&04k{v!jKd~~%TK)LK zG5HINp|&=|K>zQEIXf k+dei9K31`>3X`v~nK6n_=4H3xm0*