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: def __init__(self): self.years = [] self.documents = [] self.isSuccess = False self.resultMessage = "" # VIEW DOCUMENTS def View(self, request): year = request.args.get('year', '') stage = request.args.get('stage', '') dbconfig = DBConfig() connection = dbconfig.get_db_connection() if not connection: self.isSuccess = False return cursor = connection.cursor(dictionary=True) # --- FILTER QUERY --- query = "SELECT * FROM documents WHERE 1=1" params = [] if year != "": query += " AND year = %s" params.append(year) if stage != "": query += " AND stage = %s" params.append(stage) cursor.execute(query, params) self.documents = cursor.fetchall() # ---- GET YEARS FROM STORED PROCEDURE ---- cursor.callproc("GetYear") for result in cursor.stored_results(): year_rows = result.fetchall() break # only first result set self.years = [row['year'] for row in year_rows] cursor.close() connection.close() self.isSuccess = True # UPLOAD DOCUMENTS def Upload(self, request): """Log user actions with timestamp, user, action, and details.""" dbconfig = DBConfig() connection = dbconfig.get_db_connection() if connection: cursor = connection.cursor() files = request.files.getlist('documents') year = request.form['year'] stage = request.form['stage'] for file in files: if file is not FileHandler.ALLOWED_EXTENSIONS: continue filename = secure_filename(file.filename) filepath = os.path.join(FileHandler.UPLOAD_FOLDER, filename) extension = file.filename.rsplit('.', 1)[1] # Need to Check whetehr all three items are required file.save(filepath) # cursor.execute(""" # INSERT INTO documents (filename, filepath, filetype, year, stage) # VALUES (%s, %s, %s, %s, %s) # """, (filename, filepath, file.filename.rsplit('.', 1)[1], 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()