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
|
2025-12-01 17:45:16 +05:30
|
|
|
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
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
from config import db_config
|
|
|
|
|
from AppCode.Config import DBConfig
|
2025-12-03 19:08:28 +05:30
|
|
|
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
|
2025-12-01 17:45:16 +05:30
|
|
|
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-12-03 19:08:28 +05:30
|
|
|
|
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'))
|
|
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
## 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')
|
|
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
# 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-12-01 17:45:16 +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'))
|
|
|
|
|
|
|
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
@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
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
if not record:
|
|
|
|
|
cit.close()
|
|
|
|
|
return "CIT record not found", 404
|
2025-12-01 12:04:07 +05:30
|
|
|
|
2025-12-01 17:45:16 +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
|
|
|
|
2025-12-01 17:45:16 +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():
|
2025-12-01 17:45:16 +05:30
|
|
|
itat = ITATHandler()
|
2025-09-18 11:33:28 +05:30
|
|
|
|
2025-11-30 16:24:49 +05:30
|
|
|
if request.method == 'POST':
|
2025-12-01 17:45:16 +05:30
|
|
|
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'))
|
|
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
itat.close()
|
|
|
|
|
return render_template('add_itat.html')
|
2025-11-30 16:24:49 +05:30
|
|
|
|
|
|
|
|
|
2025-12-03 19:08:28 +05:30
|
|
|
# report form
|
2025-09-18 11:33:28 +05:30
|
|
|
@app.route('/reports')
|
|
|
|
|
def reports():
|
|
|
|
|
return render_template("reports.html")
|
|
|
|
|
|
|
|
|
|
|
2025-12-02 00:36:46 +05:30
|
|
|
# Itr report download by year
|
2025-09-18 11:33:28 +05:30
|
|
|
@app.route('/itr_report', methods=['GET'])
|
|
|
|
|
def itr_report():
|
2025-12-01 17:45:16 +05:30
|
|
|
yearGetter = YearGet()
|
|
|
|
|
selected_year = request.args.get('year')
|
2025-09-18 11:33:28 +05:30
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
if selected_year:
|
|
|
|
|
itr = ITRHandler()
|
|
|
|
|
output = itr.itr_report_download(selected_year)
|
|
|
|
|
itr.close()
|
2025-09-18 11:33:28 +05:30
|
|
|
|
2025-12-01 17:45:16 +05:30
|
|
|
if output is None:
|
|
|
|
|
return "No records found for the selected year."
|
2025-09-18 11:33:28 +05:30
|
|
|
|
2025-12-01 17:45:16 +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
|
|
|
|
2025-12-01 17:45:16 +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
|
|
|
|
2025-12-02 00:36:46 +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()
|
2025-12-01 17:45:16 +05:30
|
|
|
|
2025-12-02 00:36:46 +05:30
|
|
|
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)
|
|
|
|
|
|
2025-12-03 19:08:28 +05:30
|
|
|
|
2025-12-02 00:36:46 +05:30
|
|
|
# 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)
|
|
|
|
|
|