220 lines
7.3 KiB
Python
220 lines
7.3 KiB
Python
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()
|
|
|