Compare commits
9 Commits
e7646eee76
...
laxmi-dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 82bedc3117 | |||
| cb68e454bc | |||
| 675301df7f | |||
| 7146391c18 | |||
| 94b5563d15 | |||
| 937018dc16 | |||
| eda238c235 | |||
| f184d6cecc | |||
| 64ca39944b |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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,8 +74,15 @@ 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()
|
||||||
|
|
||||||
|
|||||||
@@ -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'))
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -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 ]+$"
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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,12 +24,19 @@ 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,
|
||||||
storedprocfetch="CheckGSTReleaseExists",
|
storedprocfetch="CheckGSTReleaseExists",
|
||||||
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:
|
||||||
|
|||||||
@@ -68,50 +68,49 @@
|
|||||||
{% 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>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="sortable-header">GST_Release_Id</th>
|
<th class="sortable-header">GST_Release_Id</th>
|
||||||
<th class="sortable-header">PMC_No</th>
|
<th class="sortable-header">PMC_No</th>
|
||||||
<th>Invoice_No</th>
|
<th>Invoice_No</th>
|
||||||
<th>Basic_Amount</th>
|
<th>Basic_Amount</th>
|
||||||
<th>Final_Amount</th>
|
<th>Final_Amount</th>
|
||||||
<th>Total_Amount</th>
|
<th>Total_Amount</th>
|
||||||
<th>UTR</th>
|
<th>UTR</th>
|
||||||
<th>Update</th>
|
<th>Update</th>
|
||||||
<th>Delete</th>
|
<th>Delete</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<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="{{ url_for('gst_release_bp.delete_gst_release', gst_release_id=gst_rel.gst_release_id) }}"
|
||||||
<a href="/delete_gst_release/{{ gst_rel[0] }}"
|
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" class="icon">
|
||||||
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
|
</a>
|
||||||
class="icon">
|
</td>
|
||||||
</a>
|
</tr>
|
||||||
</td>
|
{% endfor %}
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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,91 +9,104 @@
|
|||||||
<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">
|
||||||
<button id="addButton" class="action-button">Add</button>
|
<button id="addButton" class="action-button">Add</button>
|
||||||
<button id="displayButton" class="action-button">Display</button>
|
<button id="displayButton" class="action-button">Display</button>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="addForm" style="display: none;">
|
|
||||||
<h2>Add Payment</h2>
|
|
||||||
|
|
||||||
<form action="/add_payment" method="POST" onsubmit="showSuccessAlert(event)">
|
|
||||||
<div class="row1">
|
|
||||||
<div>
|
|
||||||
<label for="subcontractor">Subcontractor Name:</label>
|
|
||||||
<input type="text" id="subcontractor" name="subcontractor" required autocomplete="off"/>
|
|
||||||
<input type="hidden" id="subcontractor_id" name="subcontractor_id"/>
|
|
||||||
<div id="subcontractor_list" class="autocomplete-items"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label for="PMC_No">PMC No:</label><br>
|
|
||||||
<select id="PMC_No" name="PMC_No" required>
|
|
||||||
<option value="">Select PMC No</option>
|
|
||||||
</select><br><br>
|
|
||||||
|
|
||||||
<label for="invoice_No">Invoice No:</label><br>
|
|
||||||
<input type="number" step="0.01" id="invoice_No" name="invoice_No" ><br><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>
|
|
||||||
|
|
||||||
<label for="TDS_Percentage">TDS Percentage (%):</label><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>
|
|
||||||
<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>
|
|
||||||
<input type="number" step="0.01" id="total_amount" name="total_amount" required readonly><br><br>
|
|
||||||
|
|
||||||
|
|
||||||
<label for="utr">UTR:</label><br>
|
|
||||||
<input type="text" id="utr" name="utr"><br><br>
|
|
||||||
|
|
||||||
<button type="submit">Submit Payment</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="successPopup" class="success-popup">
|
|
||||||
<i>✔</i> Payment added successfully!
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="addTable" style="display: none;">
|
|
||||||
<div class="search-container">
|
|
||||||
<h2>Payment History</h2>
|
|
||||||
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
|
||||||
</div>
|
</div>
|
||||||
<table id="sortableTable" border="1">
|
|
||||||
<thead>
|
<div id="addForm" style="display: none;">
|
||||||
<tr>
|
<h2>Add Payment</h2>
|
||||||
<th class="sortable-header">Payment ID</th>
|
|
||||||
<th class="sortable-header">PMC No</th>
|
<form action="/add_payment" method="POST" onsubmit="showSuccessAlert(event)">
|
||||||
<th>Invoice No</th>
|
<div class="row1">
|
||||||
<th>Payment Amount</th>
|
<div>
|
||||||
<th>TDS Amount</th>
|
<label for="subcontractor">Subcontractor Name:</label>
|
||||||
<th>Total Amount</th>
|
<input type="text" id="subcontractor" name="subcontractor" required autocomplete="off" />
|
||||||
<th>UTR</th>
|
<input type="hidden" id="subcontractor_id" name="subcontractor_id" />
|
||||||
<th>Update</th>
|
<div id="subcontractor_list" class="autocomplete-items"></div>
|
||||||
<th>Delete</th>
|
</div>
|
||||||
</tr>
|
</div>
|
||||||
</thead>
|
|
||||||
<tbody>
|
<label for="PMC_No">PMC No:</label><br>
|
||||||
{% for payment in payments %}
|
<select id="PMC_No" name="PMC_No" required>
|
||||||
<tr>
|
<option value="">Select PMC No</option>
|
||||||
<td>{{ payment[0] }}</td>
|
</select><br><br>
|
||||||
<td>{{ payment[1] }}</td>
|
|
||||||
<td>{{ payment[2] }}</td>
|
<label for="invoice_No">Invoice No:</label><br>
|
||||||
<td>{{ payment[3] }}</td>
|
<input type="number" step="0.01" id="invoice_No" name="invoice_No"><br><br>
|
||||||
<td>{{ payment[4] }}</td>
|
|
||||||
<td>{{ payment[5] }}</td>
|
<label for="Payment_Amount">Amount:</label><br>
|
||||||
<td>{{ payment[6] }}</td>
|
<input type="number" step="0.01" id="Payment_Amount" name="Payment_Amount" required
|
||||||
<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>
|
oninput="calculateTDSAndTotal()"><br><br>
|
||||||
<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>
|
|
||||||
</tr>
|
<label for="TDS_Percentage">TDS Percentage (%):</label><br>
|
||||||
<!-- <tr>
|
<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>
|
||||||
|
<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>
|
||||||
|
<input type="number" step="0.01" id="total_amount" name="total_amount" required readonly><br><br>
|
||||||
|
|
||||||
|
|
||||||
|
<label for="utr">UTR:</label><br>
|
||||||
|
<input type="text" id="utr" name="utr"><br><br>
|
||||||
|
|
||||||
|
<button type="submit">Submit Payment</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="successPopup" class="success-popup">
|
||||||
|
<i>✔</i> Payment added successfully!
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="addTable" style="display: none;">
|
||||||
|
<div class="search-container">
|
||||||
|
<h2>Payment History</h2>
|
||||||
|
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
||||||
|
</div>
|
||||||
|
<table id="sortableTable" border="1">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="sortable-header">Payment ID</th>
|
||||||
|
<th class="sortable-header">PMC No</th>
|
||||||
|
<th>Invoice No</th>
|
||||||
|
<th>Payment Amount</th>
|
||||||
|
<th>TDS Amount</th>
|
||||||
|
<th>Total Amount</th>
|
||||||
|
<th>UTR</th>
|
||||||
|
<th>Update</th>
|
||||||
|
<th>Delete</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for payment in payments %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ payment[0] }}</td>
|
||||||
|
<td>{{ payment[1] }}</td>
|
||||||
|
<td>{{ payment[2] }}</td>
|
||||||
|
<td>{{ payment[3] }}</td>
|
||||||
|
<td>{{ payment[4] }}</td>
|
||||||
|
<td>{{ payment[5] }}</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="{{ 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>
|
||||||
<td>{{ payment['Payment_Id'] }}</td>
|
<td>{{ payment['Payment_Id'] }}</td>
|
||||||
<td>{{ payment['PMC_No'] }}</td>
|
<td>{{ payment['PMC_No'] }}</td>
|
||||||
<td>{{ payment['invoice_no'] }}</td>
|
<td>{{ payment['invoice_no'] }}</td>
|
||||||
@@ -103,91 +117,91 @@
|
|||||||
<td><a href="/edit_payment/{{ payment['Payment_Id'] }}"><img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit" class="icon"></a></td>
|
<td><a href="/edit_payment/{{ payment['Payment_Id'] }}"><img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit" class="icon"></a></td>
|
||||||
<td><a href="/delete_payment/{{ payment['Payment_Id'] }}" 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>
|
<td><a href="/delete_payment/{{ payment['Payment_Id'] }}" 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> -->
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.getElementById("subcontractor").addEventListener("input", function () {
|
document.getElementById("subcontractor").addEventListener("input", function () {
|
||||||
const query = this.value;
|
const query = this.value;
|
||||||
const list = document.getElementById("subcontractor_list");
|
const list = document.getElementById("subcontractor_list");
|
||||||
|
|
||||||
if (query.length < 2) {
|
if (query.length < 2) {
|
||||||
list.innerHTML = '';
|
list.innerHTML = '';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fetch(`/search_subcontractor?query=${encodeURIComponent(query)}`)
|
fetch(`/search_subcontractor?query=${encodeURIComponent(query)}`)
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
list.innerHTML = '';
|
list.innerHTML = '';
|
||||||
data.results.forEach(item => {
|
data.results.forEach(item => {
|
||||||
const div = document.createElement("div");
|
const div = document.createElement("div");
|
||||||
div.setAttribute("data-id", item.id);
|
div.setAttribute("data-id", item.id);
|
||||||
div.textContent = item.name;
|
div.textContent = item.name;
|
||||||
list.appendChild(div);
|
list.appendChild(div);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("subcontractor_list").addEventListener("click", function (e) {
|
|
||||||
const selectedId = e.target.getAttribute("data-id");
|
|
||||||
const selectedName = e.target.textContent;
|
|
||||||
|
|
||||||
if (selectedId) {
|
|
||||||
document.getElementById("subcontractor_id").value = selectedId;
|
|
||||||
document.getElementById("subcontractor").value = selectedName;
|
|
||||||
document.getElementById("subcontractor_list").innerHTML = ""; // hide the list
|
|
||||||
|
|
||||||
console.log("Contractor id is", selectedId);
|
|
||||||
|
|
||||||
// Fetch PMC numbers
|
|
||||||
fetch(`/get_pmc_nos_by_subcontractor/${encodeURIComponent(selectedId)}`)
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(data => {
|
|
||||||
console.log("Fetched PMC Nos:", data.pmc_nos);
|
|
||||||
const pmcDropdown = document.getElementById("PMC_No");
|
|
||||||
pmcDropdown.innerHTML = "";
|
|
||||||
|
|
||||||
const defaultOption = document.createElement("option");
|
|
||||||
defaultOption.value = "";
|
|
||||||
defaultOption.textContent = "Select PMC No";
|
|
||||||
pmcDropdown.appendChild(defaultOption);
|
|
||||||
|
|
||||||
data.pmc_nos.forEach(pmc => {
|
|
||||||
const option = document.createElement("option");
|
|
||||||
option.value = pmc;
|
|
||||||
option.textContent = pmc;
|
|
||||||
pmcDropdown.appendChild(option);
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
if (data.pmc_nos.length === 0) {
|
document.getElementById("subcontractor_list").addEventListener("click", function (e) {
|
||||||
alert("No PMC Nos found for this subcontractor.");
|
const selectedId = e.target.getAttribute("data-id");
|
||||||
}
|
const selectedName = e.target.textContent;
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.error("Error fetching PMC Nos:", error);
|
|
||||||
alert("Failed to fetch PMC numbers.");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
if (selectedId) {
|
||||||
function calculateTDSAndTotal() {
|
document.getElementById("subcontractor_id").value = selectedId;
|
||||||
const amount = parseFloat(document.getElementById("Payment_Amount").value) || 0;
|
document.getElementById("subcontractor").value = selectedName;
|
||||||
const tdsPercent = parseFloat(document.getElementById("TDS_Percentage").value) || 0;
|
document.getElementById("subcontractor_list").innerHTML = ""; // hide the list
|
||||||
|
|
||||||
const tdsAmount = (amount * tdsPercent / 100).toFixed(2);
|
console.log("Contractor id is", selectedId);
|
||||||
const totalAmount = (amount - tdsAmount).toFixed(2);
|
|
||||||
|
|
||||||
document.getElementById("TDS_Payment_Amount").value = tdsAmount;
|
// Fetch PMC numbers
|
||||||
document.getElementById("total_amount").value = totalAmount;
|
fetch(`/get_pmc_nos_by_subcontractor/${encodeURIComponent(selectedId)}`)
|
||||||
}
|
.then(response => response.json())
|
||||||
</script>
|
.then(data => {
|
||||||
|
console.log("Fetched PMC Nos:", data.pmc_nos);
|
||||||
|
const pmcDropdown = document.getElementById("PMC_No");
|
||||||
|
pmcDropdown.innerHTML = "";
|
||||||
|
|
||||||
|
const defaultOption = document.createElement("option");
|
||||||
|
defaultOption.value = "";
|
||||||
|
defaultOption.textContent = "Select PMC No";
|
||||||
|
pmcDropdown.appendChild(defaultOption);
|
||||||
|
|
||||||
|
data.pmc_nos.forEach(pmc => {
|
||||||
|
const option = document.createElement("option");
|
||||||
|
option.value = pmc;
|
||||||
|
option.textContent = pmc;
|
||||||
|
pmcDropdown.appendChild(option);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (data.pmc_nos.length === 0) {
|
||||||
|
alert("No PMC Nos found for this subcontractor.");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error("Error fetching PMC Nos:", error);
|
||||||
|
alert("Failed to fetch PMC numbers.");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function calculateTDSAndTotal() {
|
||||||
|
const amount = parseFloat(document.getElementById("Payment_Amount").value) || 0;
|
||||||
|
const tdsPercent = parseFloat(document.getElementById("TDS_Percentage").value) || 0;
|
||||||
|
|
||||||
|
const tdsAmount = (amount * tdsPercent / 100).toFixed(2);
|
||||||
|
const totalAmount = (amount - tdsAmount).toFixed(2);
|
||||||
|
|
||||||
|
document.getElementById("TDS_Payment_Amount").value = tdsAmount;
|
||||||
|
document.getElementById("total_amount").value = totalAmount;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<script src="{{ url_for('static', filename='js/showSuccessAlert.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/showSuccessAlert.js') }}"></script>
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user