optimize and add new service of get report and download report.

This commit is contained in:
2026-04-03 12:10:47 +05:30
parent 0b72adef7d
commit 73cd97f3c8
27 changed files with 1416 additions and 1292 deletions

View File

@@ -7,12 +7,12 @@ from model.Block import Block
from model.Utilities import HtmlHelper
block_bp = Blueprint('block', __name__)
block = Block()
# --- Add Block page -------
@block_bp.route('/add_block', methods=['GET', 'POST'])
@login_required
def add_block():
block = Block()
# block = Block()
if request.method == 'POST':
block.AddBlock(request)
@@ -62,7 +62,7 @@ def get_districts(state_id):
@login_required
def check_block():
block = Block()
# block = Block()
return block.CheckBlock(request)
@@ -70,8 +70,8 @@ def check_block():
@login_required
def edit_block(block_id):
block = Block()
# block = Block()
if request.method == 'POST':
block.EditBlock(request, block_id)
block.resultMessage
@@ -90,7 +90,10 @@ def edit_block(block_id):
for rs in cursor.stored_results():
states = rs.fetchall()
cursor.callproc("GetAllDistrictsData")
# cursor.callproc("GetAllDistrictsData")
# for rs in cursor.stored_results():
# districts = rs.fetchall()
cursor.callproc("GetAllDistricts")
for rs in cursor.stored_results():
districts = rs.fetchall()
@@ -111,7 +114,7 @@ def edit_block(block_id):
@login_required
def delete_block(block_id):
block = Block()
# block = Block()
block.DeleteBlock(request, block_id)
return redirect(url_for('block.add_block'))

View File

@@ -5,12 +5,13 @@ from model.District import District
from model.State import State
district_bp = Blueprint('district', __name__)
district = District()
# ------- District page --------
@district_bp.route('/add_district', methods=['GET', 'POST'])
@login_required
def add_district():
district = District()
# district = District()
if request.method == 'POST':
district.AddDistrict(request=request)
@@ -32,7 +33,7 @@ def add_district():
@login_required
def check_district():
district = District()
# district = District()
return district.CheckDistrict(request=request)
@@ -41,7 +42,7 @@ def check_district():
@login_required
def delete_district(district_id):
district = District()
# district = District()
district.DeleteDistrict(request=request, district_id=district_id)
@@ -56,7 +57,7 @@ def delete_district(district_id):
@login_required
def edit_district(district_id):
district = District()
# district = District()
state = State()
if request.method == 'POST':

View File

@@ -59,21 +59,21 @@ def show_table(filename):
try:
cursor = connection.cursor(dictionary=True)
cursor.callproc('GetStateByName', [file_info['State']])
cursor.callproc('CheckStateExists', [file_info['State']])
for result in cursor.stored_results():
state_data = result.fetchone()
if not state_data:
errors.append(f"State '{file_info['State']}' is not valid. Please add it.")
if state_data:
cursor.callproc('GetDistrictByNameAndStates', [file_info['District'], state_data['State_ID']])
cursor.callproc('GetDistrictByNameAndState', [file_info['District'], state_data['State_Id']]) # Change GetDistrictByNameAndStates to GetDistrictByNameAndState
for result in cursor.stored_results():
district_data = result.fetchone()
if not district_data:
errors.append(f"District '{file_info['District']}' is not valid under state '{file_info['State']}'.")
if district_data:
cursor.callproc('GetBlockByNameAndDistricts', [file_info['Block'], district_data['District_ID']])
cursor.callproc('GetBlockByNameAndDistrict', [file_info['Block'], district_data['District_id']]) #Change District_ID to District_id and GetBlockByNameAndDistricts to GetBlockByNameAndDistrict
for result in cursor.stored_results():
block_data = result.fetchone()
if not block_data:
@@ -84,7 +84,9 @@ def show_table(filename):
subcontractor_data = result.fetchone()
if not subcontractor_data:
cursor.callproc('InsertSubcontractor', [file_info['Subcontractor']])
# cursor.callproc('InsertSubcontractor', [file_info['Subcontractor']])
# connection.commit()
cursor.callproc('SaveContractor', [file_info.get('Subcontractor'),None,None,None,None,None,None,None,None])
connection.commit()
cursor.callproc('GetSubcontractorByName', [file_info['Subcontractor']])
for result in cursor.stored_results():
@@ -152,17 +154,19 @@ def show_table(filename):
)
# save Excel data
# save Excel data
@excel_bp.route('/save_data', methods=['POST'])
def save_data():
# Extract form data
subcontractor_id = request.form.get("subcontractor_data")
state_id = request.form.get("state_data")
district_id = request.form.get("district_data")
block_id = request.form.get("block_data")
variables = request.form.getlist('variables[]')
hold_columns = request.form.get("hold_columns")
hold_counter = request.form.get("hold_counter")
if not data:
return jsonify({"error": "No data provided to save"}), 400
if data:
connection = config.get_db_connection()
cursor = connection.cursor()
@@ -172,7 +176,7 @@ def save_data():
"PMC_No": entry.get("PMC_No"),
"Invoice_Details": entry.get("Invoice_Details", ''),
"Work_Type": 'none',
"In oice_Date": entry.get("Invoice_Date").strftime('%Y-%m-%d') if entry.get(
"Invoice_Date": entry.get("Invoice_Date").strftime('%Y-%m-%d') if entry.get(
"Invoice_Date") else None,
"Invoice_No": entry.get("Invoice_No", ''),
"Basic_Amount": entry.get("Basic_Amount", 0.00),
@@ -227,6 +231,7 @@ def save_data():
else:
work_type = " ".join(words[:work_pos + 1])
if Invoice_Details and 'village' in Invoice_Details.lower() and 'work' in Invoice_Details.lower():
# print("village_name ::", village_name, "|| work_type ::", work_type)
if block_id and village_name:
village_id = None
cursor.callproc("GetVillageId", (block_id, village_name))
@@ -239,7 +244,12 @@ def save_data():
for result in cursor.stored_results():
result = result.fetchone()
village_id = result[0] if result else None
# print("village_id :", village_id)
# print("block_id :", block_id)
# print("invoice :", PMC_No, village_id, work_type, Invoice_Details, Invoice_Date, Invoice_No,
# Basic_Amount, Debit_Amount, After_Debit_Amount, Amount, GST_Amount, TDS_Amount,
# SD_Amount, On_Commission, Hydro_Testing, GST_SD_Amount, Final_Amount)
args = (
PMC_No, village_id, work_type, Invoice_Details, Invoice_Date, Invoice_No,
Basic_Amount, Debit_Amount, After_Debit_Amount, Amount, GST_Amount, TDS_Amount,
@@ -247,24 +257,39 @@ def save_data():
subcontractor_id, 0
)
# print("All invoice Details ",args)
# add subcontarctor id in invoice table
results = cursor.callproc('SaveInvoice', args)
invoice_id = results[-1]
cursor.callproc("SavePayment",( PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount,Total_Amount, UTR,invoice_id))
print("**************************************************************")
print(invoice_id)
print("**************************************************************")
cursor.callproc(
"SavePayment",
(
PMC_No,
Invoice_No, # required
Payment_Amount,
TDS_Payment_Amount,
Total_Amount,
UTR,
invoice_id # last
)
)
# print("invoice id from the excel ", invoice_id)
if isinstance(hold_columns, str):
hold_columns = ast.literal_eval(hold_columns)
if isinstance(hold_columns, list) and all(isinstance(hold, dict) for hold in hold_columns):
for hold in hold_columns:
hold_column_name = hold.get('column_name')
hold_type_id = hold.get('hold_type_id')
# print(f"Processing hold: {hold}")
hold_column_name = hold.get('column_name') # Get column name
hold_type_id = hold.get('hold_type_id') # Get hold_type_id
if hold_column_name:
hold_amount = entry.get(
hold_column_name)
hold_column_name) # Get the value for that specific hold column
if hold_amount is not None:
# print(f"Processing hold type: {hold_column_name}, Hold Amount: {hold_amount}")
hold_join_data = {
"Contractor_Id": subcontractor_id,
"Invoice_Id": invoice_id,
@@ -281,9 +306,10 @@ def save_data():
print(f"Invalid hold entry: {hold}")
else:
print("Hold columns data is not a valid list of dictionaries.")
#-------------------------Credit Note--------------------------------------------------
#---------------------------------------------Credit Note---------------------------------------------------------------------------
elif any(keyword in Invoice_Details.lower() for keyword in ['credit note','logging report']):
# print("Credit note found:", PMC_No, Invoice_No, Basic_Amount, Debit_Amount, Final_Amount,
# After_Debit_Amount, GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR, Invoice_No)
cursor.callproc(
'AddCreditNoteFromExcel',
[
@@ -292,7 +318,7 @@ def save_data():
subcontractor_id, Invoice_No
]
)
#--------------------------Hold Amount-------------------------------------------------
#-----------------------------------------------Hold Amount----------------------------------------------------------------------
# Step 1: Normalize Invoice_Details: lowercase, trim, remove extra spaces
normalized_details = re.sub(r'\s+', ' ', Invoice_Details.strip()).lower()
# Step 2: Define lowercase keywords
@@ -308,13 +334,13 @@ def save_data():
]
# Step 3: Matching condition
if any(kw in normalized_details for kw in keywords):
# print(" Match found. Inserting hold release for:", Invoice_Details)
# print(" Match found. Inserting hold release for:", Invoice_Details)
cursor.callproc(
'AddHoldReleaseFromExcel',
[PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Final_Amount, UTR, subcontractor_id]
)
connection.commit()
# print(" Hold release inserted for:", PMC_No, Invoice_Details)
# print(" Hold release inserted for:", PMC_No, Invoice_Details)
#------------------------------------------------------------------------------------------------------------------
elif Invoice_Details and any(
keyword in Invoice_Details.lower() for keyword in ['gst', 'release', 'gst release note']):
@@ -324,33 +350,51 @@ def save_data():
[PMC_No, Invoice_No, Basic_Amount, Final_Amount, Total_Amount, UTR, subcontractor_id]
)
# --------------------------------------
# If no village/work detected, only PMC/Payment
if not (Invoice_Details and 'village' in Invoice_Details.lower() and 'work' in Invoice_Details.lower()):
# --------------------------------------
# If no village/work detected, only PMC/Payment
if not (Invoice_Details and 'village' in Invoice_Details.lower() and 'work' in Invoice_Details.lower()):
# if not (Invoice_Details and 'village' in Invoice_Details.lower() and 'work' in Invoice_Details.lower() and 'gst' in Invoice_Details.lower() and 'gst release note' in Invoice_Details.lower() and 'release' in Invoice_Details.lower()):
# ---------- Only PMC / Payment rows ----------
if PMC_No and not Invoice_No and UTR :
# print("No village/work, using PMC only :", PMC_No)
# check invoice exists
# cursor.execute(
# "SELECT invoice_id FROM invoice WHERE PMC_No=%s ORDER BY invoice_id DESC LIMIT 1",
# (PMC_No,)
# )
# row = cursor.fetchone()
# invoice_id = row[0] if row else None
# # insert invoice if not exists
# if not invoice_id:
print(" extra payment :", PMC_No,Total_Amount,UTR, subcontractor_id)
cursor.execute(
"""
INSERT INTO invoice (PMC_No,Contractor_Id) VALUES (%s, %s);
""",
(PMC_No, subcontractor_id)
)
connection.commit()
cursor.execute(
"SELECT invoice_id FROM invoice WHERE PMC_No=%s AND Contractor_Id =%s ORDER BY invoice_id DESC LIMIT 1",
(PMC_No, subcontractor_id)
)
row = cursor.fetchone()
invoice_id = row[0] if row else None
# cursor.execute(
# """
# INSERT INTO invoice (PMC_No,Contractor_Id) VALUES (%s, %s);
# """,
# (PMC_No, subcontractor_id)
# )
# connection.commit()
# cursor.execute(
# "SELECT invoice_id FROM invoice WHERE PMC_No=%s AND Contractor_Id =%s ORDER BY invoice_id DESC LIMIT 1",
# (PMC_No, subcontractor_id)
# )
# row = cursor.fetchone()
cursor.callproc("insertExtrapaymet",(PMC_No, subcontractor_id))
for result in cursor.stored_results():
row = result.fetchone()
invoice_id = row[0] if row else None
# insert payment
cursor.callproc(
"SavePayment",
(
PMC_No,
Invoice_No,
Invoice_No, # required
Payment_Amount,
TDS_Payment_Amount,
Total_Amount,
@@ -358,7 +402,40 @@ def save_data():
invoice_id
)
)
# if PMC_No and Total_Amount and UTR:
# print("Payment :", PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR )
# Add inoice id in payment table
# cursor.callproc("SavePayment",(PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR, invoice_id))
# if not village_id:
# village_id = None
# cursor.callproc('InsertOrUpdateInPayment', (
# PMC_No,
# village_id,
# work_type,
# Invoice_Details,
# Invoice_Date,
# Invoice_No,
# Basic_Amount,
# Debit_Amount,
# After_Debit_Amount,
# Amount,
# GST_Amount,
# TDS_Amount,
# SD_Amount,
# On_Commission,
# Hydro_Testing,
# 0,
# GST_SD_Amount,
# Final_Amount,
# Payment_Amount,
# TDS_Payment_Amount,
# Total_Amount,
# UTR,f
# subcontractor_id
# ))
connection.commit()
return jsonify({"success": "Data saved successfully!"}), 200
except Exception as e:
@@ -368,3 +445,4 @@ def save_data():
cursor.close()
connection.close()
return render_template('index.html')
# ---------------------- Report --------------------------------

View File

@@ -1,10 +1,10 @@
# routes/gst_release_routes.py
from flask import Blueprint, render_template, request, redirect, url_for, flash
from flask_login import login_required
from model.gst_release import GSTRelease
from model.Log import LogHelper
gst_release_bp = Blueprint('gst_release_bp', __name__)
gst_service = GSTRelease()
# ---------------- ADD GST RELEASE ----------------

View File

@@ -5,16 +5,16 @@ from model.GST import GST
hold_bp = Blueprint("hold_types", __name__)
hold = HoldTypes()
# ---------------- ADD HOLD TYPE ----------------
@hold_bp.route('/add_hold_type', methods=['GET','POST'])
@login_required
def add_hold_type():
hold = HoldTypes()
# hold = HoldTypes()
if request.method == 'POST':
hold.AddHoldType(request)
# Always redirect to same page (NO JSON)
# Always redirect to same page (NO JSON)
return redirect(url_for("hold_types.add_hold_type"))
# GET request → show data
@@ -30,7 +30,7 @@ def add_hold_type():
@login_required
def check_hold_type():
hold = HoldTypes()
# hold = HoldTypes()
return hold.CheckHoldType(request) # if exists
@@ -39,13 +39,13 @@ def check_hold_type():
@login_required
def edit_hold_type(id):
hold = HoldTypes()
# hold = HoldTypes()
if request.method == 'POST':
hold.EditHoldType(request, id)
hold.EditHoldType(request, id) # ✅
return hold.resultMessage
hold_data = hold.GetHoldTypeByID(id)
hold_data = hold.GetHoldTypeByID(id) # ✅
return render_template(
"edit_hold_type.html",
@@ -58,8 +58,8 @@ def edit_hold_type(id):
@login_required
def delete_hold_type(id):
hold = HoldTypes()
hold.DeleteHoldType(request, id)
# hold = HoldTypes()
hold.DeleteHoldType(request, id) # ✅
return redirect(url_for("hold_types.add_hold_type"))

View File

@@ -1,3 +1,5 @@
# controllers/invoice_controller.py
from flask import Blueprint, request, jsonify, render_template
from flask_login import login_required, current_user
from model.Invoice import *
@@ -35,7 +37,11 @@ def add_invoice():
village_id = village_result['Village_Id']
invoice_id = insert_invoice(data, village_id)
assign_subcontractor(data, village_id)
# assign_subcontractor(data, village_id)
print("********************************************************************")
print("Manully added invoice id :",invoice_id)
print("********************************************************************")
insert_hold_types(data, invoice_id)
log_action("Add invoice", f"added invoice '{data.get('pmc_no')}'")
@@ -78,6 +84,7 @@ def edit_invoice(invoice_id):
if request.method == 'POST':
data = request.form
update_invoice(data, invoice_id)
# update_inpayment(data)
log_action("Edit invoice", f"edited invoice '{invoice_id}'")
return jsonify({"status": "success", "message": "Invoice updated successfully"}), 200

View File

@@ -29,6 +29,7 @@ def add_payment():
LogHelper.log_action("Add Payment", f"User {current_user.id} Add Payment '{pmc_no}'")
Paymentmodel.insert_payment(subcontractor_id,pmc_no, invoice_no, amount, tds_amount, total_amount, utr)
# Paymentmodel.update_inpayment(subcontractor_id, pmc_no, invoice_no, amount, tds_amount, total_amount, utr)
return redirect(url_for('payment_bp.add_payment'))
@@ -70,15 +71,14 @@ def edit_payment(payment_id):
LogHelper.log_action("Edit Payment", f"User {current_user.id} Edit Payment '{pmc_no}'")
Paymentmodel.call_update_payment_proc(payment_id, pmc_no, invoice_no, amount, tds_amount, total_amount, utr)
connection = Paymentmodel.get_connection()
cursor = connection.cursor()
cursor.callproc(
'UpdateInpaymentByPMCInvoiceUTR',
[amount, tds_amount, total_amount, pmc_no, invoice_no, utr]
)
connection.commit()
cursor.close()
connection.close()
# Update inpayment
# connection = Paymentmodel.get_connection()
# cursor = connection.cursor()
# cursor.callproc('UpdateInpaymentByPMCInvoiceUTR',[amount, tds_amount, total_amount, pmc_no, invoice_no, utr])
# connection.commit()
# cursor.close()
# connection.close()
return redirect(url_for('payment_bp.add_payment'))

View File

@@ -1,41 +1,40 @@
from flask import Blueprint, render_template, send_from_directory
from flask_login import login_required
# from flask import Blueprint, render_template, send_from_directory
# from flask_login import login_required
# from model.PmcReport import PmcReport
from model.PmcReport import PmcReport
# pmc_report_bp = Blueprint("pmc_report", __name__)
pmc_report_bp = Blueprint("pmc_report", __name__)
# # ---------------- Contractor Report by pmc no ----------------
# @pmc_report_bp.route("/pmc_report/<pmc_no>")
# @login_required
# def pmc_report(pmc_no):
# data = PmcReport.get_pmc_report(pmc_no)
# if not data:
# return "No PMC found with this number", 404
# ---------------- Contractor Report by pmc no ----------------
@pmc_report_bp.route("/pmc_report/<pmc_no>")
@login_required
def pmc_report(pmc_no):
data = PmcReport.get_pmc_report(pmc_no)
if not data:
return "No PMC found with this number", 404
# return render_template(
# "pmc_report.html",
# info=data["info"],
# invoices=data["invoices"],
# hold_types=data["hold_types"],
# gst_rel=data["gst_rel"],
# payments=data["payments"],
# credit_note=data["credit_note"],
# hold_release=data["hold_release"],
# total=data["total"]
# )
return render_template(
"pmc_report.html",
info=data["info"],
invoices=data["invoices"],
hold_types=data["hold_types"],
gst_rel=data["gst_rel"],
payments=data["payments"],
credit_note=data["credit_note"],
hold_release=data["hold_release"],
total=data["total"]
)
# # ---------------- Contractor Download Report by pmc no ----------------
# @pmc_report_bp.route("/download_pmc_report/<pmc_no>")
# @login_required
# def download_pmc_report(pmc_no):
# ---------------- Contractor Download Report by pmc no ----------------
@pmc_report_bp.route("/download_pmc_report/<pmc_no>")
@login_required
def download_pmc_report(pmc_no):
# result = PmcReport.download_pmc_report(pmc_no)
result = PmcReport.download_pmc_report(pmc_no)
# if not result:
# return "No contractor found for this PMC No", 404
if not result:
return "No contractor found for this PMC No", 404
# output_folder, file_name = result
output_folder, file_name = result
return send_from_directory(output_folder, file_name, as_attachment=True)
# return send_from_directory(output_folder, file_name, as_attachment=True)

View File

@@ -1,12 +1,10 @@
from flask import Blueprint, render_template, request, jsonify,send_file
from flask import Blueprint, render_template, request, jsonify, send_file
from flask_login import login_required, current_user
from services.ReportService import ReportService
from model.Report import ReportHelper
from model.Log import LogHelper
report_bp = Blueprint("report", __name__)
# ---------------- Report Page ----------------
@report_bp.route("/report")
@login_required
@@ -19,36 +17,70 @@ def report_page():
@login_required
def search_contractor():
subcontractor_name = request.form.get("subcontractor_name")
LogHelper.log_action(
"Search Contractor",
f"User {current_user.id} searched contractor '{subcontractor_name}'"
)
data = ReportHelper.search_contractor(request)
return jsonify(data)
# Pagination (basic)
page = int(request.form.get("page", 1))
per_page = 20
start = (page - 1) * per_page
end = start + per_page
paginated_data = data[start:end]
return jsonify({
"data": paginated_data,
"total": len(data)
})
# ---------------- Contractor Report by contractor id ----------------
@report_bp.route('/contractor_report/<int:contractor_id>')
@login_required
def contractor_report(contractor_id):
data = ReportHelper.get_contractor_report(contractor_id)
service = ReportService(contractor_id=contractor_id).load_data()
return render_template(
'subcontractor_report.html',
contractor_id=contractor_id,
**data
**service.get_web_data()
)
# ---------------- Contractor Report by pmc no ----------------
@report_bp.route("/pmc_report/<pmc_no>")
@login_required
def pmc_report(pmc_no):
service = ReportService(pmc_no=pmc_no).load_data()
return render_template(
"pmc_report.html",
**service.get_web_data()
)
# ---------------- Contractor Download Report by contractor id ----------------
@report_bp.route('/download_report/<int:contractor_id>')
@login_required
def download_report(contractor_id):
output_file, error = ReportHelper.create_contractor_report(contractor_id)
service = ReportService(contractor_id=contractor_id).load_data()
file, error = service.download_excel()
if error:
return error, 404
return send_file(output_file, as_attachment=True)
return send_file(file, as_attachment=True)
# ---------------- Contractor Download Report by pmc no ----------------
@report_bp.route("/download_pmc_report/<pmc_no>")
@login_required
def download_pmc_report(pmc_no):
service = ReportService(pmc_no=pmc_no).load_data()
file, error = service.download_excel()
if error:
return error, 404
return send_file(file, as_attachment=True)

View File

@@ -3,13 +3,13 @@ from flask_login import login_required
from model.State import State
state_bp = Blueprint('state', __name__)
state = State()
# ----- State page ------
@state_bp.route('/add_state', methods=['GET', 'POST'])
@login_required
def add_state():
state = State()
# state = State()
if request.method == 'POST':
state.AddState(request=request)
@@ -24,7 +24,7 @@ def add_state():
@login_required
def check_state():
state = State()
# state = State()
return state.CheckState(request=request)
@@ -33,7 +33,7 @@ def check_state():
@login_required
def deleteState(id):
state = State()
# state = State()
state.DeleteState(request=request, id=id)
@@ -47,7 +47,7 @@ def deleteState(id):
@login_required
def editState(id):
state = State()
# state = State()
if request.method == 'POST':

View File

@@ -3,12 +3,17 @@ from flask_login import login_required
from model.Subcontractor import Subcontractor
from model.Utilities import HtmlHelper, ResponseHandler
subcontractor_bp = Blueprint('subcontractor', __name__)
# ----------------------------------------------------------
# LIST + ADD
# ----------------------------------------------------------
@subcontractor_bp.route('/subcontractor', methods=['GET', 'POST'])
@login_required
def subcontract():
sub = Subcontractor()
# ---------------- GET ----------------
@@ -26,22 +31,27 @@ def subcontract():
if request.method == 'POST':
sub.AddSubcontractor(request)
if not sub.isSuccess:
return HtmlHelper.json_response(
ResponseHandler.add_failure("Subcontractor"), 500
)
# Reload list after insert
subcontractor = sub.GetAllSubcontractors(request)
return render_template('add_subcontractor.html', subcontractor=subcontractor)
# ----------------------------------------------------------
# EDIT
# ----------------------------------------------------------
@subcontractor_bp.route('/edit_subcontractor/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_subcontractor(id):
sub = Subcontractor()
# Fetch data
subcontractor = sub.GetSubcontractorByID(id)
@@ -65,7 +75,9 @@ def edit_subcontractor(id):
return render_template('edit_subcontractor.html', subcontractor=subcontractor)
# ----------------------------------------------------------
# DELETE
# ----------------------------------------------------------
@subcontractor_bp.route('/deleteSubContractor/<int:id>', methods=['GET', 'POST'])
@login_required
def deleteSubContractor(id):

View File

@@ -1,3 +1,7 @@
from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify
from flask_login import login_required
@@ -7,14 +11,14 @@ from model.State import State
# Create Blueprint
village_bp = Blueprint('village', __name__)
village = Village()
# ------------------------- Add Village -------------------------
@village_bp.route('/add_village', methods=['GET', 'POST'])
@login_required
def add_village():
village = Village()
# village = Village()
if request.method == 'POST':
village.AddVillage(request=request)
@@ -75,24 +79,25 @@ def get_blocks(district_id):
@village_bp.route('/check_village', methods=['POST'])
@login_required
def check_village():
village = Village()
# village = Village()
return village.CheckVillage(request=request)
@village_bp.route('/delete_village/<int:village_id>')
@login_required
def delete_village(village_id):
village = Village()
# village = Village()
village.DeleteVillage(request=request, village_id=village_id)
# Convert resultMessage to string if it's a Response or tuple
# Convert resultMessage to string if it's a Response or tuple
raw_msg = village.resultMessage
if isinstance(raw_msg, tuple):
# e.g., (<Response ...>, 200)
msg = "Village deleted successfully!"
elif hasattr(raw_msg, 'get_data'):
# Flask Response object
msg = raw_msg.get_data(as_text=True)
msg = raw_msg.get_data(as_text=True) # get raw text
else:
# fallback
msg = str(raw_msg) if raw_msg else "Village deleted successfully!"
@@ -107,7 +112,7 @@ def delete_village(village_id):
@login_required
def edit_village(village_id):
village = Village()
# village = Village()
if request.method == 'POST':
@@ -130,6 +135,7 @@ def edit_village(village_id):
)
else:
# ✅ FIXED HERE (removed request)
village_data = village.GetVillageByID(id=village_id)
if not village.isSuccess: