Files
IncomeTaxSystem/main.py

433 lines
12 KiB
Python
Raw Normal View History

2025-11-30 16:24:49 +05:30
from flask import Flask, render_template, request, redirect, url_for, send_from_directory, abort, flash,send_file
2025-09-18 11:33:28 +05:30
import os
import pandas as pd
import pymysql
import io
2025-09-18 11:33:28 +05:30
import mysql.connector
from werkzeug.utils import secure_filename
2025-12-01 12:04:07 +05:30
from config import db_config
from AppCode.Config import DBConfig
from AppCode.FileHandler import FileHandler
from AppCode.DocumentHandler import DocumentHandler
2025-11-30 16:24:49 +05:30
from AppCode.ITRHandler import ITRHandler
from AppCode.AOHandler import AOHandler
2025-12-01 12:04:07 +05:30
from AppCode.CITHandler import CITHandler
from AppCode.ITATHandler import ITATHandler
from AppCode.YearGet import YearGet
2025-11-30 16:24:49 +05:30
2025-09-18 11:33:28 +05:30
app = Flask(__name__)
2025-11-30 16:24:49 +05:30
app.secret_key="secret1234"
app.config['UPLOAD_FOLDER'] = FileHandler.UPLOAD_FOLDER
2025-09-18 11:33:28 +05:30
2025-11-30 20:38:41 +05:30
# welcome page
2025-09-18 11:33:28 +05:30
@app.route('/')
def welcome():
return render_template('welcome.html')
2025-11-30 20:38:41 +05:30
# Dashboard page
2025-09-18 11:33:28 +05:30
@app.route('/dashboard')
def index():
2025-11-30 20:38:41 +05:30
return render_template('index.html')
2025-09-18 11:33:28 +05:30
# Ensure folder exists
def allowed_file(filename):
2025-11-30 16:24:49 +05:30
return '.' in filename and filename.rsplit('.', 1)[1].lower() in FileHandler.ALLOWED_EXTENSIONS
2025-09-18 11:33:28 +05:30
2025-11-30 20:38:41 +05:30
# Upload File route
2025-09-18 11:33:28 +05:30
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
2025-11-30 16:24:49 +05:30
FileHandler.CHeckExistingOrCreateNewUploadFolder()
docHandler = DocumentHandler()
docHandler.Upload(request=request)
2025-09-18 11:33:28 +05:30
return redirect(url_for('view_documents'))
return render_template('upload.html')
2025-09-18 11:33:28 +05:30
# View all documents with filters
@app.route('/documents')
def view_documents():
2025-11-30 16:24:49 +05:30
docHandler = DocumentHandler()
docHandler.View(request=request)
return render_template('view_docs.html', documents=docHandler.documents, years=docHandler.years)
2025-09-18 11:33:28 +05:30
2025-11-30 16:24:49 +05:30
# Upload file documents
2025-09-18 11:33:28 +05:30
@app.route('/uploads/<filename>')
def uploaded_file(filename):
mode = request.args.get('mode', 'view')
filepath = os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(filename))
if not os.path.exists(filepath):
abort(404)
file_ext = filename.rsplit('.', 1)[-1].lower()
# --- View Mode ---
if mode == 'view':
if file_ext == 'pdf':
return send_file(filepath, mimetype='application/pdf')
elif file_ext in ['xls', 'xlsx']:
# Excel cannot be rendered in-browser by Flask; trigger download instead
return send_file(filepath, as_attachment=False, download_name=filename, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
else:
return abort(415) # Unsupported type for viewing
return send_file(filepath, as_attachment=True)
2025-11-30 20:38:41 +05:30
## ===============================================
## ITR (Income Tax Return) Routes
## ===============================================
## 1. READ/DISPLAY all ITR records
2025-11-30 16:24:49 +05:30
@app.route('/itr_records')
def display_itr():
itr = ITRHandler()
records = itr.get_all_itr()
itr.close()
return render_template('display_itr.html', records=records)
2025-11-30 20:38:41 +05:30
## 2. CREATE/ADD a new ITR record
2025-11-30 16:24:49 +05:30
@app.route('/itr/add', methods=['GET', 'POST'])
def add_itr():
if request.method == 'POST':
itr = ITRHandler()
itr.add_itr(request.form)
itr.close()
flash("ITR record added successfully!", "success")
return redirect(url_for('display_itr'))
return render_template('add_itr.html')
2025-11-30 20:38:41 +05:30
## 4. DELETE an ITR record
2025-09-18 11:33:28 +05:30
@app.route('/itr/delete/<int:id>', methods=['POST'])
def delete_itr(id):
2025-11-30 16:24:49 +05:30
itr = ITRHandler()
itr.delete_itr_by_id(id=id)
itr.close()
2025-09-18 11:33:28 +05:30
return redirect(url_for('display_itr'))
## 3. UPDATE an existing ITR record
@app.route('/itr/update/<int:id>', methods=['GET', 'POST'])
def update_itr(id):
itr = ITRHandler()
if request.method == 'POST':
data = {k: request.form.get(k, 0) for k in request.form}
print("itr data-->",data)
itr.update(id, data=data)
itr.close()
return redirect(url_for('display_itr'))
record = itr.get_itr_by_id(id)
itr.close()
return render_template('update_itr.html', record=record)
2025-09-18 11:33:28 +05:30
## ===============================================
## AO (Assessing Officer) Routes
## ===============================================
2025-11-30 20:38:41 +05:30
# 1. DISPLAY all AO records
2025-09-18 11:33:28 +05:30
@app.route('/ao_records')
def display_ao():
2025-11-30 16:24:49 +05:30
ao = AOHandler()
ao_records = ao.get_all_ao()
ao.close()
return render_template('display_ao.html', ao_records=ao_records)
2025-11-30 20:38:41 +05:30
# 2. ADD a new AO record
2025-09-18 11:33:28 +05:30
@app.route('/ao/add', methods=['GET', 'POST'])
def add_ao():
if request.method == 'POST':
2025-11-30 20:38:41 +05:30
ao = AOHandler()
ao.add_ao(request.form)
ao.close()
2025-11-30 16:24:49 +05:30
flash("AO record added successfully!", "success")
2025-09-18 11:33:28 +05:30
return redirect(url_for('display_ao'))
return render_template('add_ao.html')
# 3. UPDATE AO record
@app.route('/ao/update/<int:id>', methods=['GET', 'POST'])
def update_ao(id):
ao = AOHandler()
record = ao.get_ao_by_id(id)
if not record:
return "AO record not found", 404
if request.method == 'POST':
data = request.form.to_dict()
ao.update_ao(id, data)
ao.close()
flash("AO record updated successfully!", "success")
return redirect(url_for('display_ao'))
ao.close()
return render_template("update_ao.html", record=record)
2025-09-18 11:33:28 +05:30
2025-11-30 20:38:41 +05:30
# 4. DELETE AO record safely
@app.route('/ao/delete/<int:id>', methods=['POST'])
def delete_ao(id):
ao = AOHandler()
ao.delete_ao_by_id(id=id)
ao.close()
flash("AO deleted successfully!", "success")
return redirect(url_for('display_ao'))
2025-11-30 16:24:49 +05:30
2025-11-30 20:38:41 +05:30
2025-09-18 11:33:28 +05:30
## =======================================================
## CIT (Commissioner of Income Tax) Routes
## =======================================================
# DISPLAY all CIT records
@app.route('/cit_records')
def display_cit():
2025-12-01 12:04:07 +05:30
cit = CITHandler()
cit_records = cit.get_all_cit()
cit.close()
2025-11-30 16:24:49 +05:30
return render_template('display_cit.html', cit_records=cit_records)
2025-09-18 11:33:28 +05:30
@app.route('/cit/add', methods=['GET', 'POST'])
def add_cit():
if request.method == 'POST':
2025-12-01 12:04:07 +05:30
cit = CITHandler()
cit.add_cit(request.form)
cit.close()
flash("CIT record added successfully!", "success")
2025-09-18 11:33:28 +05:30
return redirect(url_for('display_cit'))
return render_template('add_cit.html')
2025-12-01 12:04:07 +05:30
@app.route('/cit/delete/<int:id>', methods=['POST'])
def delete_cit(id):
cit = CITHandler()
cit.delete_cit(id)
cit.close()
flash("CIT record deleted successfully!", "success")
return redirect(url_for('display_cit'))
@app.route('/cit/update/<int:id>', methods=['GET', 'POST'])
def update_cit(id):
cit = CITHandler()
record = cit.get_cit_by_id(id)
2025-12-01 12:04:07 +05:30
if not record:
cit.close()
return "CIT record not found", 404
2025-12-01 12:04:07 +05:30
if request.method == 'POST':
data = {k: request.form.get(k, 0) for k in request.form}
cit.update_cit(id, data)
cit.close()
return redirect(url_for('display_cit'))
2025-12-01 12:04:07 +05:30
cit.close()
return render_template('update_cit.html', record=record)
2025-12-01 12:04:07 +05:30
2025-09-18 11:33:28 +05:30
## =======================================================
## ITAT (Income Tax Appellate Tribunal) Routes
## =======================================================
# DISPLAY all ITAT records
@app.route('/itat_records')
def display_itat():
2025-12-01 12:04:07 +05:30
itat = ITATHandler()
records = itat.get_all_itat()
itat.close()
2025-09-18 11:33:28 +05:30
return render_template('display_itat.html', records=records)
2025-12-01 12:04:07 +05:30
@app.route('/itat/delete/<int:id>', methods=['POST'])
def delete_itat(id):
itat = ITATHandler()
itat.delete_itat_by_id(id)
itat.close()
flash("ITAT Record Deleted!", "success")
return redirect(url_for('display_itat'))
@app.route('/itat/update/<int:id>', methods=['GET', 'POST'])
def update_itat(id):
itat = ITATHandler()
record = itat.get_itat_by_id(id)
if not record:
flash("Record Not Found!", "danger")
return redirect(url_for('display_itat'))
if request.method == 'POST':
data = {
"year": request.form.get("year"),
"mat_tax_credit": request.form.get("mat_tax_credit"),
"surcharge": request.form.get("surcharge"),
"cess": request.form.get("cess"),
"total_credit": request.form.get("total_credit")
}
itat.update_itat(id, data)
itat.close()
flash("ITAT Record Updated!", "success")
return redirect(url_for('display_itat'))
itat.close()
return render_template('update_itat.html', record=record)
2025-09-18 11:33:28 +05:30
@app.route('/itat/add', methods=['GET', 'POST'])
def add_itat():
itat = ITATHandler()
2025-09-18 11:33:28 +05:30
2025-11-30 16:24:49 +05:30
if request.method == 'POST':
data = {k: request.form.get(k, 0) for k in request.form}
itat.add_itat(data)
itat.close()
2025-11-30 16:24:49 +05:30
flash("ITAT record added successfully!", "success")
return redirect(url_for('display_itat'))
itat.close()
return render_template('add_itat.html')
2025-11-30 16:24:49 +05:30
# report form
2025-09-18 11:33:28 +05:30
@app.route('/reports')
def reports():
return render_template("reports.html")
# Itr report download by year
2025-09-18 11:33:28 +05:30
@app.route('/itr_report', methods=['GET'])
def itr_report():
yearGetter = YearGet()
selected_year = request.args.get('year')
2025-09-18 11:33:28 +05:30
if selected_year:
itr = ITRHandler()
output = itr.itr_report_download(selected_year)
itr.close()
2025-09-18 11:33:28 +05:30
if output is None:
return "No records found for the selected year."
2025-09-18 11:33:28 +05:30
return send_file(
output,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
as_attachment=True,
download_name=f"ITR_Report_{selected_year}.xlsx"
)
2025-09-18 11:33:28 +05:30
else:
years = yearGetter.get_year_by_model("GetITRYears")
yearGetter.close()
return render_template("itr_reports.html", years=years)
2025-09-18 11:33:28 +05:30
# Ao report download by year
@app.route('/ao_report', methods=['GET'])
def ao_report():
yearGetter = YearGet()
selected_year = request.args.get('year')
if selected_year:
ao = AOHandler()
output = ao.ao_report_download(selected_year)
ao.close()
if output is None:
return "No records found for the selected year."
return send_file(
output,
mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
as_attachment=True,
download_name=f"AO_Report_{selected_year}.xlsx"
)
else:
years = yearGetter.get_year_by_model("GetAOYears")
yearGetter.close()
return render_template("ao_reports.html", years=years)
# Cit report download by year
@app.route('/cit_report', methods=['GET'])
def cit_report():
selected_year = request.args.get('year')
yearGetter = YearGet()
if selected_year:
cit = CITHandler()
output = cit.cit_report_download(selected_year)
cit.close()
if output is None:
return "No records found for the selected year."
return send_file(
output,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
as_attachment=True,
download_name=f"CIT_Report_{selected_year}_Vertical.xlsx"
)
else:
years = yearGetter.get_year_by_model("GetCITYears")
yearGetter.close()
return render_template("cit_reports.html", years=years)
# Itat report download by year
@app.route('/itat_report', methods=['GET'])
def itat_report():
selected_year = request.args.get('year')
yearGetter = YearGet()
if selected_year:
itat = ITATHandler()
output = itat.itat_report_download(selected_year)
itat.close()
if output is None:
return "No records found for the selected year."
return send_file(
output,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
as_attachment=True,
download_name=f"ITAT_Report_{selected_year}_Vertical.xlsx"
)
else:
# Use stored procedure for years
years = yearGetter.get_year_by_model("GetITATYears")
yearGetter.close()
return render_template("itat_reports.html", years=years)
2025-09-18 11:33:28 +05:30
2025-12-02 15:38:19 +05:30
@app.route('/summary_report', methods=['GET'])
def summary_report():
docHandler = DocumentHandler()
return docHandler.Summary_report(request=request)
2025-09-18 11:33:28 +05:30
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5003, debug=True)