final payment reconciliation

This commit is contained in:
2026-04-06 10:46:47 +05:30
parent 0ca1749757
commit 5ae1fbe320
24 changed files with 766 additions and 638 deletions

View File

@@ -12,7 +12,6 @@ block = Block()
@block_bp.route('/add_block', methods=['GET', 'POST'])
@login_required
def add_block():
# block = Block()
if request.method == 'POST':
block.AddBlock(request)
@@ -30,7 +29,7 @@ def add_block():
)
# ✅ NEW ROUTE (FIX FOR DISTRICT FETCH)
# get district
@block_bp.route('/get_districts/<int:state_id>')
@login_required
def get_districts(state_id):
@@ -62,7 +61,6 @@ def get_districts(state_id):
@login_required
def check_block():
# block = Block()
return block.CheckBlock(request)
@@ -70,8 +68,6 @@ def check_block():
@login_required
def edit_block(block_id):
# block = Block()
if request.method == 'POST':
block.EditBlock(request, block_id)
block.resultMessage
@@ -111,7 +107,6 @@ def edit_block(block_id):
@login_required
def delete_block(block_id):
# block = Block()
block.DeleteBlock(request, block_id)
return redirect(url_for('block.add_block'))

View File

@@ -84,8 +84,6 @@ def show_table(filename):
subcontractor_data = result.fetchone()
if not subcontractor_data:
# 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']])
@@ -252,7 +250,7 @@ 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]
@@ -261,16 +259,16 @@ def save_data():
"SavePayment",
(
PMC_No,
Invoice_No, # required
Invoice_No,
Payment_Amount,
TDS_Payment_Amount,
Total_Amount,
UTR,
invoice_id # last
invoice_id
)
)
# 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):
@@ -282,7 +280,7 @@ def save_data():
hold_amount = entry.get(
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,
@@ -299,8 +297,7 @@ def save_data():
print(f"Invalid hold entry: {hold}")
else:
print("Hold columns data is not a valid list of dictionaries.")
#---------------------------------------------Credit Note---------------------------------------------------------------------------
# elif any(keyword in Invoice_Details.lower() for keyword in ['credit note ','credit note details','logging report']):
#-----------------------------------Credit Note----------------------------------------------------------------
elif any(keyword in Invoice_Details.lower() for keyword in ['credit', 'logging report']):
cursor.callproc(
'AddCreditNoteFromExcel',
@@ -310,7 +307,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
@@ -328,8 +325,7 @@ def save_data():
if any(kw in normalized_details for kw in keywords):
cursor.callproc(
'AddHoldReleaseFromExcel',
[PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Final_Amount, UTR, subcontractor_id]
)
[PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Final_Amount, UTR, subcontractor_id])
connection.commit()
#------------------------------------------------------------------------------------------------------------------
elif Invoice_Details and any(
@@ -339,15 +335,11 @@ 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 no village/work detected, only PMC/Payment
if not (Invoice_Details and 'village' in Invoice_Details.lower() and 'work' in Invoice_Details.lower()):
# ---------- Only PMC / Payment rows ----------
if PMC_No and not Invoice_No and UTR :
print(" extra payment :", PMC_No,Total_Amount,UTR, subcontractor_id)
cursor.callproc("insertExtrapaymet",(PMC_No, subcontractor_id))
for result in cursor.stored_results():
row = result.fetchone()
@@ -357,7 +349,7 @@ def save_data():
"SavePayment",
(
PMC_No,
Invoice_No, # required
Invoice_No,
Payment_Amount,
TDS_Payment_Amount,
Total_Amount,
@@ -375,4 +367,3 @@ def save_data():
cursor.close()
connection.close()
return render_template('index.html')
# ---------------------- Report --------------------------------

View File

@@ -10,11 +10,9 @@ hold = HoldTypes()
@hold_bp.route('/add_hold_type', methods=['GET','POST'])
@login_required
def add_hold_type():
# 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 +28,6 @@ def add_hold_type():
@login_required
def check_hold_type():
# hold = HoldTypes()
return hold.CheckHoldType(request) # if exists
@@ -39,13 +36,11 @@ def check_hold_type():
@login_required
def edit_hold_type(id):
# 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,9 +53,7 @@ def edit_hold_type(id):
@login_required
def delete_hold_type(id):
# hold = HoldTypes()
hold.DeleteHoldType(request, id) # ✅
hold.DeleteHoldType(request, id)
return redirect(url_for("hold_types.add_hold_type"))

View File

@@ -1,5 +1,3 @@
# controllers/invoice_controller.py
from flask import Blueprint, request, jsonify, render_template
from flask_login import login_required, current_user
from model.Invoice import *
@@ -37,7 +35,6 @@ def add_invoice():
village_id = village_result['Village_Id']
invoice_id = insert_invoice(data, village_id)
# assign_subcontractor(data, village_id)
insert_hold_types(data, invoice_id)
@@ -81,7 +78,6 @@ 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,8 +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'))
return render_template('add_payment.html', payments=payments)

View File

@@ -1,11 +1,9 @@
from flask import Blueprint, render_template, send_from_directory,send_file
from flask_login import login_required
# from model.PmcReport import PmcReport
from model.UnifiedReportService import UnifiedReportService
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):
@@ -18,15 +16,15 @@ def pmc_report(pmc_no):
info=data["info"],
invoices=data["invoices"],
hold_types=data["hold_types"],
hold_data=data["hold_data"], # <-- add this line
hold_data=data["hold_data"],
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 ----------------
# ---------------- Contractor Download Report by pmc no ----------------
@pmc_report_bp.route("/download_pmc_report/<pmc_no>")
@login_required
def download_pmc_report(pmc_no):

View File

@@ -5,7 +5,7 @@ from model.Report import ReportHelper
from model.Log import LogHelper
import os
from model.UnifiedReportService import UnifiedReportService
# DOWNLOAD_FOLDER = "static/download"
report_bp = Blueprint("report", __name__)
@@ -33,7 +33,6 @@ def search_contractor():
return jsonify(data)
# ---------------- Contractor Report by contractor id ----------------
@report_bp.route('/contractor_report/<int:contractor_id>')
@login_required
def contractor_report(contractor_id):
@@ -47,8 +46,7 @@ def contractor_report(contractor_id):
**data
)
# # ---------------- Contractor Download Report by contractor id ----------------
# ---------------- Contractor Download Report by contractor id ----------------
@report_bp.route('/download_report/<int:contractor_id>')
def download_report(contractor_id):

View File

@@ -4,13 +4,11 @@ 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()
if request.method == 'POST':
state.AddState(request=request)
return state.resultMessage
@@ -24,8 +22,6 @@ def add_state():
@login_required
def check_state():
# state = State()
return state.CheckState(request=request)
# ----- State delete by state id ------
@@ -33,8 +29,6 @@ def check_state():
@login_required
def deleteState(id):
# state = State()
state.DeleteState(request=request, id=id)
if not state.isSuccess:
@@ -47,8 +41,6 @@ def deleteState(id):
@login_required
def editState(id):
# state = State()
if request.method == 'POST':
state.EditState(request=request, id=id)

View File

@@ -15,7 +15,6 @@ subcontractor_bp = Blueprint('subcontractor', __name__)
def subcontract():
sub = Subcontractor()
# ---------------- GET ----------------
if request.method == 'GET':
subcontractor = sub.GetAllSubcontractors(request)

View File

@@ -1,7 +1,3 @@
from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify
from flask_login import login_required
@@ -17,8 +13,6 @@ village = Village()
@village_bp.route('/add_village', methods=['GET', 'POST'])
@login_required
def add_village():
# village = Village()
if request.method == 'POST':
village.AddVillage(request=request)
@@ -79,17 +73,17 @@ def get_blocks(district_id):
@village_bp.route('/check_village', methods=['POST'])
@login_required
def check_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.DeleteVillage(request=request, village_id=village_id)
# ✅ Convert resultMessage to string if it's a Response or tuple
# resultMessage to string if it's a Response or tuple
raw_msg = village.resultMessage
if isinstance(raw_msg, tuple):
@@ -112,8 +106,6 @@ def delete_village(village_id):
@login_required
def edit_village(village_id):
# village = Village()
if request.method == 'POST':
village.EditVillage(request=request, village_id=village_id)
@@ -135,7 +127,6 @@ def edit_village(village_id):
)
else:
# ✅ FIXED HERE (removed request)
village_data = village.GetVillageByID(id=village_id)
if not village.isSuccess: