10 Commits

40 changed files with 353 additions and 368 deletions

Binary file not shown.

View File

@@ -1,5 +1,5 @@
import config import config
from flask import Blueprint, render_template, request, redirect, url_for, jsonify from flask import Blueprint, render_template, request, redirect, url_for, jsonify, flash
from flask_login import login_required from flask_login import login_required
from model.State import State from model.State import State
@@ -74,7 +74,14 @@ def edit_block(block_id):
if request.method == 'POST': if request.method == 'POST':
block.EditBlock(request, block_id) block.EditBlock(request, block_id)
return block.resultMessage block.resultMessage
if block.resultMessage:
flash("Block updated successfully!", "success")
return redirect(url_for('block.add_block'))
else:
flash(block.resultMessage, "error")
connection = config.get_db_connection() connection = config.get_db_connection()
cursor = connection.cursor() cursor = connection.cursor()

View File

@@ -1,8 +1,8 @@
from flask import Blueprint, render_template, request, redirect, url_for # routes/gst_release_routes.py
from flask import Blueprint, render_template, request, redirect, url_for, flash
from flask_login import login_required from flask_login import login_required
from model.gst_release import GSTRelease from model.gst_release import GSTRelease
from model.Log import LogHelper from model.Log import LogHelper
from flask import flash, current_app
gst_release_bp = Blueprint('gst_release_bp', __name__) gst_release_bp = Blueprint('gst_release_bp', __name__)
gst_service = GSTRelease() gst_service = GSTRelease()
@@ -13,7 +13,7 @@ gst_service = GSTRelease()
def add_gst_release(): def add_gst_release():
if request.method == 'POST': if request.method == 'POST':
gst_service.AddGSTRelease(request) gst_service.AddGSTRelease(request)
LogHelper.log_action("Add GST Release", f"User added GST release") LogHelper.log_action("Add GST Release", "User added GST release")
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error') flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
return redirect(url_for('gst_release_bp.add_gst_release')) return redirect(url_for('gst_release_bp.add_gst_release'))
@@ -30,7 +30,7 @@ def edit_gst_release(gst_release_id):
if request.method == 'POST': if request.method == 'POST':
gst_service.EditGSTRelease(request, gst_release_id) gst_service.EditGSTRelease(request, gst_release_id)
LogHelper.log_action("Edit GST Release", f"User edited GST release") LogHelper.log_action("Edit GST Release", "User edited GST release")
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error') flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
return redirect(url_for('gst_release_bp.add_gst_release')) return redirect(url_for('gst_release_bp.add_gst_release'))
@@ -40,7 +40,7 @@ def edit_gst_release(gst_release_id):
@gst_release_bp.route('/delete_gst_release/<int:gst_release_id>', methods=['GET', 'POST']) @gst_release_bp.route('/delete_gst_release/<int:gst_release_id>', methods=['GET', 'POST'])
@login_required @login_required
def delete_gst_release(gst_release_id): def delete_gst_release(gst_release_id):
gst_service.DeleteGSTRelease(gst_release_id) # remove request gst_service.DeleteGSTRelease(gst_release_id)
LogHelper.log_action("Delete GST Release", f"User deleted GST release") LogHelper.log_action("Delete GST Release", "User deleted GST release")
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error') flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
return redirect(url_for('gst_release_bp.add_gst_release')) return redirect(url_for('gst_release_bp.add_gst_release'))

View File

@@ -86,12 +86,12 @@ def edit_payment(payment_id):
return render_template('edit_payment.html', payment_data=payment_data) return render_template('edit_payment.html', payment_data=payment_data)
# ------------------- Delete Payment ------------------- # ------------------- Delete Payment -------------------
@payment_bp.route('/delete_payment/<int:payment_id>', methods=['POST']) @payment_bp.route('/delete_payment/<int:payment_id>', methods=['GET'])
@login_required @login_required
def delete_payment(payment_id): def delete_payment(payment_id):
success, pmc_no, invoice_no = Paymentmodel.delete_payment(payment_id) success, pmc_no, invoice_no = Paymentmodel.delete_payment(payment_id)
if not success: if not success:
flash("Payment not found or failed to delete", "error") flash("Payment not found or failed to delete", "error")
else: else:

View File

@@ -1,4 +1,4 @@
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user from flask import Blueprint, render_template, request, redirect, url_for, jsonify
from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
from model.Log import LogData, LogHelper from model.Log import LogData, LogHelper
@@ -147,7 +147,7 @@ class Block:
self.isSuccess = block.isSuccess self.isSuccess = block.isSuccess
self.resultMessage = block.resultMessage self.resultMessage = block.resultMessage
return render_template('add_block.html') return
# ---------------------------------------------------------- # ----------------------------------------------------------
# Delete Block # Delete Block

View File

@@ -1,6 +1,3 @@
from flask_login import current_user from flask_login import current_user
from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
from model.Log import LogHelper from model.Log import LogHelper
@@ -9,7 +6,6 @@ import config
import re import re
import mysql.connector import mysql.connector
# ---------------------------------------------------------- # ----------------------------------------------------------
# Mapping Class # Mapping Class
# ---------------------------------------------------------- # ----------------------------------------------------------
@@ -26,10 +22,11 @@ class itemCRUDMapping:
self.name = "Hold Type" self.name = "Hold Type"
elif itemType is ItemCRUDType.Subcontractor: elif itemType is ItemCRUDType.Subcontractor:
self.name = "Subcontractor" self.name = "Subcontractor"
elif itemType.name == "GSTRelease":
self.name = "GSTRelease"
else: else:
self.name = "Item" self.name = "Item"
# ---------------------------------------------------------- # ----------------------------------------------------------
# Generic CRUD Class # Generic CRUD Class
# ---------------------------------------------------------- # ----------------------------------------------------------
@@ -38,7 +35,6 @@ class ItemCRUD:
def __init__(self, itemType): def __init__(self, itemType):
self.isSuccess = False self.isSuccess = False
self.resultMessage = "" self.resultMessage = ""
self.response = {} # ✅ ADDED
self.itemCRUDType = itemType self.itemCRUDType = itemType
self.itemCRUDMapping = itemCRUDMapping(itemType) self.itemCRUDMapping = itemCRUDMapping(itemType)
@@ -60,14 +56,16 @@ class ItemCRUD:
connection.commit() connection.commit()
self.isSuccess = True self.isSuccess = True
self.response = ResponseHandler.delete_success(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.delete_success(self.itemCRUDMapping.name), 200
)
except mysql.connector.Error as e: except mysql.connector.Error as e:
print(f"Error deleting {self.itemCRUDMapping.name}: {e}") print(f"Error deleting {self.itemCRUDMapping.name}: {e}")
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.delete_failure(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.delete_failure(self.itemCRUDMapping.name), 500
)
finally: finally:
cursor.close() cursor.close()
@@ -81,8 +79,9 @@ class ItemCRUD:
connection = config.get_db_connection() connection = config.get_db_connection()
if not connection: if not connection:
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.add_failure(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.db_connection_failure(), 500
)
return return
cursor = connection.cursor() cursor = connection.cursor()
@@ -93,18 +92,57 @@ class ItemCRUD:
) )
try: try:
# SUBCONTRACTOR # ======================================================
if data: # GSTRelease MULTI-FIELD
cursor.callproc(storedprocfetch, (data['Contractor_Name'],)) # ======================================================
if self.itemCRUDType.name == "GSTRelease" and data:
# Duplicate check (PMC_No + Invoice_No)
if storedprocfetch:
cursor.callproc(storedprocfetch, (data['PMC_No'], data['Invoice_No']))
existing_item = None
for rs in cursor.stored_results():
existing_item = rs.fetchone()
if existing_item:
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
)
return
# Insert GSTRelease
cursor.callproc(storedprocadd, (
data['PMC_No'],
data['Invoice_No'],
data['Basic_Amount'],
data['Final_Amount'],
data['Total_Amount'],
data['UTR'],
data['Contractor_ID']
))
connection.commit()
self.isSuccess = True
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
)
return
# ======================================================
# SUBCONTRACTOR MULTI-FIELD
# ======================================================
if self.itemCRUDType.name == "Subcontractor" and data:
cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
existing_item = None existing_item = None
for rs in cursor.stored_results(): for rs in cursor.stored_results():
existing_item = rs.fetchone() existing_item = rs.fetchone()
if existing_item: if existing_item:
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.already_exists(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
)
return return
cursor.callproc(storedprocadd, ( cursor.callproc(storedprocadd, (
@@ -118,19 +156,22 @@ class ItemCRUD:
data['GST_No'], data['GST_No'],
data['Contractor_password'] data['Contractor_password']
)) ))
connection.commit() connection.commit()
self.isSuccess = True self.isSuccess = True
self.response = ResponseHandler.add_success(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.add_success(self.itemCRUDMapping.name), 200
)
return return
# NORMAL
# ======================================================
# NORMAL SINGLE-FIELD (Village / Block / State)
# ======================================================
if not re.match(RegEx.patternAlphabetOnly, childname): if not re.match(RegEx.patternAlphabetOnly, childname):
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.invalid_name(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
)
return return
if parentid is None: if parentid is None:
@@ -144,8 +185,9 @@ class ItemCRUD:
if existing_item: if existing_item:
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.already_exists(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
)
return return
if parentid is None: if parentid is None:
@@ -154,16 +196,17 @@ class ItemCRUD:
cursor.callproc(storedprocadd, (childname, parentid)) cursor.callproc(storedprocadd, (childname, parentid))
connection.commit() connection.commit()
self.isSuccess = True self.isSuccess = True
self.response = ResponseHandler.add_success(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.add_success(self.itemCRUDMapping.name), 200
)
except mysql.connector.Error as e: except mysql.connector.Error as e:
print(f"Database Error: {e}") print(f"Database Error: {e}")
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.add_failure(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.add_failure(self.itemCRUDMapping.name), 500
)
finally: finally:
cursor.close() cursor.close()
@@ -183,7 +226,34 @@ class ItemCRUD:
) )
try: try:
if data: # ======================================================
# GSTRelease MULTI-FIELD
# ======================================================
if self.itemCRUDType.name == "GSTRelease" and data:
cursor.callproc(storedprocupdate, (
childid,
data['PMC_No'],
data['Invoice_No'],
data['Basic_Amount'],
data['Final_Amount'],
data['Total_Amount'],
data['UTR'],
data['Contractor_ID']
))
connection.commit()
self.isSuccess = True
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.update_success(self.itemCRUDMapping.name), 200
)
return
# ======================================================
# SUBCONTRACTOR MULTI-FIELD
# ======================================================
if self.itemCRUDType.name == "Subcontractor" and data:
cursor.callproc(storedprocupdate, ( cursor.callproc(storedprocupdate, (
childid, childid,
data['Contractor_Name'], data['Contractor_Name'],
@@ -196,18 +266,19 @@ class ItemCRUD:
data['GST_No'], data['GST_No'],
data['Contractor_password'] data['Contractor_password']
)) ))
connection.commit() connection.commit()
self.isSuccess = True self.isSuccess = True
self.response = ResponseHandler.update_success(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.update_success(self.itemCRUDMapping.name), 200
)
return return
# ======================================================
# NORMAL SINGLE-FIELD
# ======================================================
if not re.match(RegEx.patternAlphabetOnly, childname): if not re.match(RegEx.patternAlphabetOnly, childname):
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.update_failure(self.itemCRUDMapping.name) self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
self.resultMessage = self.response["message"]
return return
if parentid is None: if parentid is None:
@@ -216,16 +287,15 @@ class ItemCRUD:
cursor.callproc(storedprocupdate, (childid, parentid, childname)) cursor.callproc(storedprocupdate, (childid, parentid, childname))
connection.commit() connection.commit()
self.isSuccess = True self.isSuccess = True
self.response = ResponseHandler.update_success(self.itemCRUDMapping.name) self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
self.resultMessage = self.response["message"]
except mysql.connector.Error as e: except mysql.connector.Error as e:
print(f"Error updating {self.itemCRUDMapping.name}: {e}") print(f"Error updating {self.itemCRUDMapping.name}: {e}")
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.update_failure(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.update_failure(self.itemCRUDMapping.name), 500
)
finally: finally:
cursor.close() cursor.close()
@@ -238,27 +308,22 @@ class ItemCRUD:
data = [] data = []
connection = config.get_db_connection() connection = config.get_db_connection()
if not connection: if not connection:
return [] return []
cursor = connection.cursor() cursor = connection.cursor()
try: try:
cursor.callproc(storedproc) cursor.callproc(storedproc)
for result in cursor.stored_results(): for result in cursor.stored_results():
data = result.fetchall() data = result.fetchall()
self.isSuccess = True self.isSuccess = True
except mysql.connector.Error as e: except mysql.connector.Error as e:
print(f"Error fetching {self.itemCRUDMapping.name}: {e}") print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
self.isSuccess = False self.isSuccess = False
self.response = ResponseHandler.fetch_failure(self.itemCRUDMapping.name) self.resultMessage = HtmlHelper.json_response(
self.resultMessage = self.response["message"] ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
)
return [] return []
finally: finally:
cursor.close() cursor.close()
connection.close() connection.close()
@@ -276,13 +341,10 @@ class ItemCRUD:
try: try:
cursor.callproc(storedproc, (id,)) cursor.callproc(storedproc, (id,))
for rs in cursor.stored_results(): for rs in cursor.stored_results():
data = rs.fetchone() data = rs.fetchone()
except mysql.connector.Error as e: except mysql.connector.Error as e:
print(f"Error fetching {self.itemCRUDMapping.name}: {e}") print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
finally: finally:
cursor.close() cursor.close()
connection.close() connection.close()
@@ -290,7 +352,7 @@ class ItemCRUD:
return data return data
# ---------------------------------------------------------- # ----------------------------------------------------------
# CHECK ITEM (KEEP AS IS - API USE) # CHECK ITEM
# ---------------------------------------------------------- # ----------------------------------------------------------
def CheckItem(self, request, parentid, childname, storedprocfetch): def CheckItem(self, request, parentid, childname, storedprocfetch):
@@ -331,7 +393,6 @@ class ItemCRUD:
return HtmlHelper.json_response( return HtmlHelper.json_response(
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500 ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
) )
finally: finally:
cursor.close() cursor.close()
connection.close() connection.close()

View File

@@ -8,7 +8,7 @@ class ItemCRUDType(Enum):
State = 4 State = 4
HoldType = 5 HoldType = 5
Subcontractor = 6 Subcontractor = 6
GSTRelease = 7
class RegEx: class RegEx:
patternAlphabetOnly = "^[A-Za-z ]+$" patternAlphabetOnly = "^[A-Za-z ]+$"

View File

@@ -1,109 +1,8 @@
# from flask import request # model/gst_release.py
# from model.ItemCRUD import ItemCRUD
# from model.Utilities import ItemCRUDType
# class GSTRelease:
# """CRUD operations for GST Release using ItemCRUD"""
# def __init__(self):
# self.isSuccess = False
# self.resultMessage = ""
# # ------------------- Add GST Release -------------------
# def AddGSTRelease(self, request):
# pmc_no = request.form.get('PMC_No', '').strip()
# invoice_no = request.form.get('invoice_No', '').strip()
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
# gst.AddItem(
# request=request,
# parentid=None,
# childname=f"{pmc_no}-{invoice_no}",
# storedprocfetch="CheckGSTReleaseExists",
# storedprocadd="AddGSTReleaseFromExcel" # your stored procedure handles extra fields
# )
# self.isSuccess = gst.isSuccess
# self.resultMessage = str(gst.resultMessage)
# # ------------------- Get All GST Releases -------------------
# def GetAllGSTReleases(self):
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
# # Pass request=None for fetch
# rows = gst.GetAllData(request=None, storedproc="GetAllGSTReleases")
# self.isSuccess = gst.isSuccess
# self.resultMessage = str(gst.resultMessage)
# data = []
# for row in rows:
# data.append({
# "gst_release_id": row[0],
# "pmc_no": row[1],
# "invoice_no": row[2],
# "basic_amount": row[3],
# "final_amount": row[4],
# "total_amount": row[5],
# "utr": row[6],
# "contractor_id": row[7]
# })
# return data
# # ------------------- Get GST Release By ID -------------------
# def GetGSTReleaseByID(self, gst_release_id):
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
# row = gst.GetDataByID(gst_release_id, request=None, storedproc="GetGSTReleaseById")
# self.isSuccess = gst.isSuccess
# self.resultMessage = str(gst.resultMessage)
# if row:
# return {
# "gst_release_id": row[0],
# "pmc_no": row[1],
# "invoice_no": row[2],
# "basic_amount": row[3],
# "final_amount": row[4],
# "total_amount": row[5],
# "utr": row[6],
# "contractor_id": row[7]
# }
# return None
# # ------------------- Edit GST Release -------------------
# def EditGSTRelease(self, request, gst_release_id):
# pmc_no = request.form.get('PMC_No', '').strip()
# invoice_no = request.form.get('invoice_No', '').strip()
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
# gst.EditItem(
# request=request,
# childid=gst_release_id,
# parentid=None,
# childname=f"{pmc_no}-{invoice_no}",
# storedprocupdate="UpdateGSTRelease" # stored procedure handles extra fields
# )
# self.isSuccess = gst.isSuccess
# self.resultMessage = str(gst.resultMessage)
# # ------------------- Delete GST Release -------------------
# def DeleteGSTRelease(self, gst_release_id):
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
# gst.DeleteItem(
# itemID=gst_release_id,
# request=None,
# storedprocDelete="DeleteGSTReleaseById"
# )
# self.isSuccess = gst.isSuccess
# self.resultMessage = str(gst.resultMessage)
from flask import request, jsonify from flask import request, jsonify
from model.ItemCRUD import ItemCRUD from model.ItemCRUD import ItemCRUD
from model.Utilities import ItemCRUDType from model.Utilities import ItemCRUDType
class GSTRelease: class GSTRelease:
def __init__(self): def __init__(self):
@@ -125,6 +24,7 @@ class GSTRelease:
"Contractor_ID": int(request.form.get("Contractor_ID", 0) or 0) "Contractor_ID": int(request.form.get("Contractor_ID", 0) or 0)
} }
# Add GST Release
gst.AddItem( gst.AddItem(
request=request, request=request,
data=data, data=data,
@@ -132,6 +32,12 @@ class GSTRelease:
storedprocadd="AddGSTReleaseFromExcel" storedprocadd="AddGSTReleaseFromExcel"
) )
# Check if addition was successful
if gst.isSuccess:
print(f"GST Release Added: {data}")
else:
print(f"Failed to add GST Release: {gst.resultMessage}")
self.isSuccess = gst.isSuccess self.isSuccess = gst.isSuccess
self.resultMessage = str(gst.resultMessage) self.resultMessage = str(gst.resultMessage)
@@ -198,7 +104,6 @@ class GSTRelease:
def GetAllGSTReleases(self): def GetAllGSTReleases(self):
try: try:
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease) gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
rows = gst.GetAllData(None, "GetAllGSTReleases") rows = gst.GetAllData(None, "GetAllGSTReleases")
data = [] data = []
@@ -224,7 +129,6 @@ class GSTRelease:
def GetGSTReleaseByID(self, gst_release_id): def GetGSTReleaseByID(self, gst_release_id):
try: try:
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease) gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
row = gst.GetDataByID(gst_release_id, "GetGSTReleaseById") row = gst.GetDataByID(gst_release_id, "GetGSTReleaseById")
if row: if row:

View File

@@ -68,10 +68,11 @@
{% endwith %} {% endwith %}
</div> </div>
<!-- GST Release History Table -->
<div id="addTable" style="display: none;"> <div id="addTable" style="display: none;">
<div class="search-container"> <div class="search-container">
<h2>GST Release History</h2> <h2>GST Release History</h2>
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()"> <input type="text" id="searchBar" placeholder="Search..." onkeyup="searchTable()">
</div> </div>
<table id="sortableTable" border="1"> <table id="sortableTable" border="1">
<thead> <thead>
@@ -90,24 +91,22 @@
<tbody> <tbody>
{% for gst_rel in gst_releases %} {% for gst_rel in gst_releases %}
<tr> <tr>
<td>{{ gst_rel[0] }}</td> <td>{{ gst_rel.gst_release_id }}</td>
<td>{{ gst_rel[1] }}</td> <td>{{ gst_rel.pmc_no }}</td>
<td>{{ gst_rel[2] }}</td> <td>{{ gst_rel.invoice_no }}</td>
<td>{{ gst_rel[3] }}</td> <td>{{ gst_rel.basic_amount }}</td>
<td>{{ gst_rel[4] }}</td> <td>{{ gst_rel.final_amount }}</td>
<td>{{ gst_rel[5] }}</td> <td>{{ gst_rel.total_amount }}</td>
<td>{{ gst_rel[6] }}</td> <td>{{ gst_rel.utr }}</td>
<td> <td>
<a href="/edit_gst_release/{{ gst_rel[0] }}"> <a href="{{ url_for('gst_release_bp.edit_gst_release', gst_release_id=gst_rel.gst_release_id) }}">
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit" <img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit" class="icon">
class="icon">
</a> </a>
</td> </td>
<td> <td>
<a href="/delete_gst_release/{{ gst_rel[0] }}" <a href="{{ url_for('gst_release_bp.delete_gst_release', gst_release_id=gst_rel.gst_release_id) }}"
onclick="return confirm('Are you sure you want to delete this GST Release?')"> onclick="return confirm('Are you sure you want to delete this GST Release?')">
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete" <img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete" class="icon">
class="icon">
</a> </a>
</td> </td>
</tr> </tr>

View File

@@ -1,5 +1,6 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -8,6 +9,7 @@
<script src="{{ url_for('static', filename='js/search_on_table.js') }}"></script> <script src="{{ url_for('static', filename='js/search_on_table.js') }}"></script>
<script src="{{ url_for('static', filename='js/invoice.js') }}"></script> <script src="{{ url_for('static', filename='js/invoice.js') }}"></script>
</head> </head>
<body> <body>
<div class="button-container"> <div class="button-container">
@@ -37,13 +39,16 @@
<input type="number" step="0.01" id="invoice_No" name="invoice_No"><br><br> <input type="number" step="0.01" id="invoice_No" name="invoice_No"><br><br>
<label for="Payment_Amount">Amount:</label><br> <label for="Payment_Amount">Amount:</label><br>
<input type="number" step="0.01" id="Payment_Amount" name="Payment_Amount" required oninput="calculateTDSAndTotal()"><br><br> <input type="number" step="0.01" id="Payment_Amount" name="Payment_Amount" required
oninput="calculateTDSAndTotal()"><br><br>
<label for="TDS_Percentage">TDS Percentage (%):</label><br> <label for="TDS_Percentage">TDS Percentage (%):</label><br>
<input type="number" step="0.01" id="TDS_Percentage" name="TDS_Percentage" oninput="calculateTDSAndTotal()"><br><br> <input type="number" step="0.01" id="TDS_Percentage" name="TDS_Percentage"
oninput="calculateTDSAndTotal()"><br><br>
<label for="TDS_Payment_Amount">TDS Amount:</label><br> <label for="TDS_Payment_Amount">TDS Amount:</label><br>
<input type="number" step="0.01" id="TDS_Payment_Amount" name="TDS_Payment_Amount" required readonly><br><br> <input type="number" step="0.01" id="TDS_Payment_Amount" name="TDS_Payment_Amount" required
readonly><br><br>
<label for="total_amount">Total Amount:</label><br> <label for="total_amount">Total Amount:</label><br>
<input type="number" step="0.01" id="total_amount" name="total_amount" required readonly><br><br> <input type="number" step="0.01" id="total_amount" name="total_amount" required readonly><br><br>
@@ -89,8 +94,17 @@
<td>{{ payment[4] }}</td> <td>{{ payment[4] }}</td>
<td>{{ payment[5] }}</td> <td>{{ payment[5] }}</td>
<td>{{ payment[6] }}</td> <td>{{ payment[6] }}</td>
<td><a href="/edit_payment/{{ payment[0] }}"><img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit" class="icon"></a></td> <td><a href="/edit_payment/{{ payment[0] }}"><img
<td><a href="/delete_payment/{{ payment[0] }}" onclick="return confirm('Are you sure you want to delete this payment?')"><img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete" class="icon"></a></td> src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit"
class="icon"></a></td>
<td>
<a href="{{ url_for('payment_bp.delete_payment', payment_id=payment[0]) }}"
onclick="return confirm('Are you sure you want to delete this Payment?')">
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
class="icon">
</a>
</td>
</tr> </tr>
<!-- <tr> <!-- <tr>
<td>{{ payment['Payment_Id'] }}</td> <td>{{ payment['Payment_Id'] }}</td>