Compare commits
14 Commits
630ee1744f
...
laxmi-dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 82bedc3117 | |||
| cb68e454bc | |||
| 675301df7f | |||
| 7146391c18 | |||
| 94b5563d15 | |||
| 937018dc16 | |||
| eda238c235 | |||
| f184d6cecc | |||
| e7646eee76 | |||
| 64ca39944b | |||
|
|
6b4beb5af8 | ||
|
|
d092eb0527 | ||
|
|
f9e9612df5 | ||
|
|
46ec2c0276 |
2
.env
2
.env
@@ -2,7 +2,7 @@ Secret_Key = 9f2a1b8c4d6e7f0123456789abcdef01
|
||||
|
||||
MYSQL_HOST=127.0.0.1
|
||||
MYSQL_USER=root
|
||||
MYSQL_PASSWORD=tiger
|
||||
MYSQL_PASSWORD=root
|
||||
MYSQL_DB=test
|
||||
|
||||
DEFAULT_USERNAME=admin
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,4 +3,5 @@ venv/
|
||||
__pycache__/
|
||||
|
||||
static/downloads/
|
||||
static/uploads/
|
||||
static/uploads/
|
||||
|
||||
|
||||
Binary file not shown.
13
activity.log
13
activity.log
@@ -1,13 +0,0 @@
|
||||
Timestamp: 2026-03-24 10:27:31 | User: Unknown | Action: Edit Village | Details: User admin edited '39'
|
||||
Timestamp: 2026-03-24 10:27:36 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '39'
|
||||
Timestamp: 2026-03-24 10:33:47 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '35'
|
||||
Timestamp: 2026-03-24 10:40:41 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '35'
|
||||
Timestamp: 2026-03-24 11:05:41 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '55'
|
||||
Timestamp: 2026-03-24 11:08:04 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '40'
|
||||
Timestamp: 2026-03-24 11:13:07 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '13'
|
||||
Timestamp: 2026-03-24 11:13:15 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '23'
|
||||
Timestamp: 2026-03-24 11:15:20 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '28'
|
||||
Timestamp: 2026-03-24 11:16:35 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '30'
|
||||
Timestamp: 2026-03-24 11:17:12 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '33'
|
||||
Timestamp: 2026-03-24 11:19:08 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '41'
|
||||
Timestamp: 2026-03-24 11:23:57 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '14'
|
||||
|
||||
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
|
||||
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 model.State import State
|
||||
@@ -74,8 +74,15 @@ def edit_block(block_id):
|
||||
|
||||
if request.method == 'POST':
|
||||
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()
|
||||
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 model.gst_release import GSTRelease
|
||||
from model.Log import LogHelper
|
||||
from flask import flash, current_app
|
||||
|
||||
gst_release_bp = Blueprint('gst_release_bp', __name__)
|
||||
gst_service = GSTRelease()
|
||||
@@ -13,7 +13,7 @@ gst_service = GSTRelease()
|
||||
def add_gst_release():
|
||||
if request.method == 'POST':
|
||||
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')
|
||||
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':
|
||||
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')
|
||||
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'])
|
||||
@login_required
|
||||
def delete_gst_release(gst_release_id):
|
||||
gst_service.DeleteGSTRelease(gst_release_id) # remove request
|
||||
LogHelper.log_action("Delete GST Release", f"User deleted GST release")
|
||||
gst_service.DeleteGSTRelease(gst_release_id)
|
||||
LogHelper.log_action("Delete GST Release", "User deleted GST release")
|
||||
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
||||
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)
|
||||
|
||||
|
||||
# ------------------- Delete Payment -------------------
|
||||
@payment_bp.route('/delete_payment/<int:payment_id>', methods=['POST'])
|
||||
@payment_bp.route('/delete_payment/<int:payment_id>', methods=['GET'])
|
||||
@login_required
|
||||
def delete_payment(payment_id):
|
||||
success, pmc_no, invoice_no = Paymentmodel.delete_payment(payment_id)
|
||||
|
||||
if not success:
|
||||
flash("Payment not found or failed to delete", "error")
|
||||
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.Log import LogData, LogHelper
|
||||
@@ -147,7 +147,7 @@ class Block:
|
||||
|
||||
self.isSuccess = block.isSuccess
|
||||
self.resultMessage = block.resultMessage
|
||||
return render_template('add_block.html')
|
||||
return
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Delete Block
|
||||
|
||||
@@ -1,364 +1,3 @@
|
||||
# from flask_login import current_user
|
||||
# from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
|
||||
# from model.Log import LogHelper
|
||||
|
||||
# import config
|
||||
# import re
|
||||
# import mysql.connector
|
||||
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # Mapping Class
|
||||
# # ----------------------------------------------------------
|
||||
# class itemCRUDMapping:
|
||||
|
||||
# def __init__(self, itemType):
|
||||
# if itemType is ItemCRUDType.Village:
|
||||
# self.name = "Village"
|
||||
# elif itemType is ItemCRUDType.Block:
|
||||
# self.name = "Block"
|
||||
# elif itemType is ItemCRUDType.State:
|
||||
# self.name = "State"
|
||||
# elif itemType is ItemCRUDType.HoldType:
|
||||
# self.name = "Hold Type"
|
||||
# elif itemType is ItemCRUDType.Subcontractor:
|
||||
# self.name = "Subcontractor"
|
||||
# else:
|
||||
# self.name = "Item"
|
||||
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # Generic CRUD Class
|
||||
# # ----------------------------------------------------------
|
||||
# class ItemCRUD:
|
||||
|
||||
# def __init__(self, itemType):
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = ""
|
||||
# self.itemCRUDType = itemType
|
||||
# self.itemCRUDMapping = itemCRUDMapping(itemType)
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # DELETE
|
||||
# # ----------------------------------------------------------
|
||||
# def DeleteItem(self, request, itemID, storedprocDelete):
|
||||
|
||||
# connection = config.get_db_connection()
|
||||
# cursor = connection.cursor()
|
||||
|
||||
# LogHelper.log_action(
|
||||
# f"Delete {self.itemCRUDMapping.name}",
|
||||
# f"User {current_user.id} deleted {self.itemCRUDMapping.name} '{itemID}'"
|
||||
# )
|
||||
|
||||
# try:
|
||||
# cursor.callproc(storedprocDelete, (itemID,))
|
||||
# connection.commit()
|
||||
|
||||
# self.isSuccess = True
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.delete_success(self.itemCRUDMapping.name), 200
|
||||
# )
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Error deleting {self.itemCRUDMapping.name}: {e}")
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.delete_failure(self.itemCRUDMapping.name), 500
|
||||
# )
|
||||
|
||||
# finally:
|
||||
# cursor.close()
|
||||
# connection.close()
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # ADD
|
||||
# # ----------------------------------------------------------
|
||||
# def AddItem(self, request, parentid=None, childname=None, storedprocfetch=None, storedprocadd=None, data=None):
|
||||
|
||||
# connection = config.get_db_connection()
|
||||
# if not connection:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.db_connection_failure(), 500
|
||||
# )
|
||||
# return
|
||||
|
||||
# cursor = connection.cursor()
|
||||
|
||||
# LogHelper.log_action(
|
||||
# f"Add {self.itemCRUDMapping.name}",
|
||||
# f"User {current_user.id} adding '{childname if childname else (data.get('Contractor_Name') if data else '')}'"
|
||||
# )
|
||||
|
||||
# try:
|
||||
# # ======================================================
|
||||
# # SUBCONTRACTOR (MULTI-FIELD)
|
||||
# # ======================================================
|
||||
# if data:
|
||||
|
||||
# # Duplicate check
|
||||
# cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
|
||||
|
||||
# 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
|
||||
# cursor.callproc(storedprocadd, (
|
||||
# data['Contractor_Name'],
|
||||
# data['Address'],
|
||||
# data['Mobile_No'],
|
||||
# data['PAN_No'],
|
||||
# data['Email'],
|
||||
# data['Gender'],
|
||||
# data['GST_Registration_Type'],
|
||||
# data['GST_No'],
|
||||
# data['Contractor_password']
|
||||
# ))
|
||||
|
||||
# connection.commit()
|
||||
|
||||
# self.isSuccess = True
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
||||
# )
|
||||
# return
|
||||
|
||||
# # ======================================================
|
||||
# # NORMAL (Village / Block / State)
|
||||
# # ======================================================
|
||||
# if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||
# )
|
||||
# return
|
||||
|
||||
# # Duplicate check
|
||||
# if parentid is None:
|
||||
# cursor.callproc(storedprocfetch, (childname,))
|
||||
# else:
|
||||
# cursor.callproc(storedprocfetch, (childname, parentid))
|
||||
|
||||
# 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
|
||||
# if parentid is None:
|
||||
# cursor.callproc(storedprocadd, (childname,))
|
||||
# else:
|
||||
# cursor.callproc(storedprocadd, (childname, parentid))
|
||||
|
||||
# connection.commit()
|
||||
|
||||
# self.isSuccess = True
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
|
||||
# ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
||||
# )
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Database Error: {e}")
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.add_failure(self.itemCRUDMapping.name), 500
|
||||
# )
|
||||
|
||||
# finally:
|
||||
# cursor.close()
|
||||
# connection.close()
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # EDIT
|
||||
# # ----------------------------------------------------------
|
||||
# def EditItem(self, request, childid, parentid=None, childname=None, storedprocupdate=None, data=None):
|
||||
|
||||
# connection = config.get_db_connection()
|
||||
# cursor = connection.cursor()
|
||||
|
||||
# LogHelper.log_action(
|
||||
# f"Edit {self.itemCRUDMapping.name}",
|
||||
# f"User {current_user.id} edited '{childid}'"
|
||||
# )
|
||||
|
||||
# try:
|
||||
# # ======================================================
|
||||
# # SUBCONTRACTOR (MULTI-FIELD)
|
||||
# # ======================================================
|
||||
# if data:
|
||||
# cursor.callproc(storedprocupdate, (
|
||||
# childid,
|
||||
# data['Contractor_Name'],
|
||||
# data['Address'],
|
||||
# data['Mobile_No'],
|
||||
# data['PAN_No'],
|
||||
# data['Email'],
|
||||
# data['Gender'],
|
||||
# data['GST_Registration_Type'],
|
||||
# data['GST_No'],
|
||||
# data['Contractor_password']
|
||||
# ))
|
||||
|
||||
# connection.commit()
|
||||
|
||||
# self.isSuccess = True
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.update_success(self.itemCRUDMapping.name), 200
|
||||
# )
|
||||
# return
|
||||
|
||||
# # ======================================================
|
||||
# # NORMAL
|
||||
# # ======================================================
|
||||
# if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
|
||||
# return
|
||||
|
||||
# if parentid is None:
|
||||
# cursor.callproc(storedprocupdate, (childid, childname))
|
||||
# else:
|
||||
# cursor.callproc(storedprocupdate, (childid, parentid, childname))
|
||||
|
||||
# connection.commit()
|
||||
|
||||
# self.isSuccess = True
|
||||
# self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Error updating {self.itemCRUDMapping.name}: {e}")
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.update_failure(self.itemCRUDMapping.name), 500
|
||||
# )
|
||||
|
||||
# finally:
|
||||
# cursor.close()
|
||||
# connection.close()
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # GET ALL
|
||||
# # ----------------------------------------------------------
|
||||
# def GetAllData(self, request, storedproc):
|
||||
|
||||
# data = []
|
||||
# connection = config.get_db_connection()
|
||||
|
||||
# if not connection:
|
||||
# return []
|
||||
|
||||
# cursor = connection.cursor()
|
||||
|
||||
# try:
|
||||
# cursor.callproc(storedproc)
|
||||
|
||||
# for result in cursor.stored_results():
|
||||
# data = result.fetchall()
|
||||
|
||||
# self.isSuccess = True
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
||||
# )
|
||||
# return []
|
||||
|
||||
# finally:
|
||||
# cursor.close()
|
||||
# connection.close()
|
||||
|
||||
# return data
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # GET BY ID
|
||||
# # ----------------------------------------------------------
|
||||
# def GetDataByID(self, id, storedproc):
|
||||
|
||||
# data = None
|
||||
# connection = config.get_db_connection()
|
||||
# cursor = connection.cursor()
|
||||
|
||||
# try:
|
||||
# cursor.callproc(storedproc, (id,))
|
||||
|
||||
# for rs in cursor.stored_results():
|
||||
# data = rs.fetchone()
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
||||
|
||||
# finally:
|
||||
# cursor.close()
|
||||
# connection.close()
|
||||
|
||||
# return data
|
||||
|
||||
# # ----------------------------------------------------------
|
||||
# # CHECK ITEM
|
||||
# # ----------------------------------------------------------
|
||||
# def CheckItem(self, request, parentid, childname, storedprocfetch):
|
||||
|
||||
# connection = config.get_db_connection()
|
||||
# cursor = connection.cursor()
|
||||
|
||||
# LogHelper.log_action(
|
||||
# f"Check {self.itemCRUDMapping.name}",
|
||||
# f"User {current_user.id} checked '{childname}'"
|
||||
# )
|
||||
|
||||
# if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
# return HtmlHelper.json_response(
|
||||
# ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||
# )
|
||||
|
||||
# try:
|
||||
# if parentid is None:
|
||||
# cursor.callproc(storedprocfetch, (childname,))
|
||||
# else:
|
||||
# cursor.callproc(storedprocfetch, (childname, parentid))
|
||||
|
||||
# existing_item = None
|
||||
# for rs in cursor.stored_results():
|
||||
# existing_item = rs.fetchone()
|
||||
|
||||
# if existing_item:
|
||||
# return HtmlHelper.json_response(
|
||||
# ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
|
||||
# )
|
||||
|
||||
# return HtmlHelper.json_response(
|
||||
# ResponseHandler.is_available(self.itemCRUDMapping.name), 200
|
||||
# )
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Error checking {self.itemCRUDMapping.name}: {e}")
|
||||
# return HtmlHelper.json_response(
|
||||
# ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
||||
# )
|
||||
|
||||
# finally:
|
||||
# cursor.close()
|
||||
# connection.close()
|
||||
|
||||
|
||||
from flask_login import current_user
|
||||
from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
|
||||
from model.Log import LogHelper
|
||||
@@ -367,7 +6,6 @@ import config
|
||||
import re
|
||||
import mysql.connector
|
||||
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Mapping Class
|
||||
# ----------------------------------------------------------
|
||||
@@ -384,10 +22,11 @@ class itemCRUDMapping:
|
||||
self.name = "Hold Type"
|
||||
elif itemType is ItemCRUDType.Subcontractor:
|
||||
self.name = "Subcontractor"
|
||||
elif itemType.name == "GSTRelease":
|
||||
self.name = "GSTRelease"
|
||||
else:
|
||||
self.name = "Item"
|
||||
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Generic CRUD Class
|
||||
# ----------------------------------------------------------
|
||||
@@ -396,7 +35,6 @@ class ItemCRUD:
|
||||
def __init__(self, itemType):
|
||||
self.isSuccess = False
|
||||
self.resultMessage = ""
|
||||
self.response = {} # ✅ ADDED
|
||||
self.itemCRUDType = itemType
|
||||
self.itemCRUDMapping = itemCRUDMapping(itemType)
|
||||
|
||||
@@ -418,14 +56,16 @@ class ItemCRUD:
|
||||
connection.commit()
|
||||
|
||||
self.isSuccess = True
|
||||
self.response = ResponseHandler.delete_success(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.delete_success(self.itemCRUDMapping.name), 200
|
||||
)
|
||||
|
||||
except mysql.connector.Error as e:
|
||||
print(f"Error deleting {self.itemCRUDMapping.name}: {e}")
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.delete_failure(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.delete_failure(self.itemCRUDMapping.name), 500
|
||||
)
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
@@ -439,8 +79,9 @@ class ItemCRUD:
|
||||
connection = config.get_db_connection()
|
||||
if not connection:
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.add_failure(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.db_connection_failure(), 500
|
||||
)
|
||||
return
|
||||
|
||||
cursor = connection.cursor()
|
||||
@@ -451,18 +92,57 @@ class ItemCRUD:
|
||||
)
|
||||
|
||||
try:
|
||||
# SUBCONTRACTOR
|
||||
if data:
|
||||
cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
|
||||
# ======================================================
|
||||
# GSTRelease MULTI-FIELD
|
||||
# ======================================================
|
||||
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
|
||||
for rs in cursor.stored_results():
|
||||
existing_item = rs.fetchone()
|
||||
|
||||
if existing_item:
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.already_exists(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
|
||||
)
|
||||
return
|
||||
|
||||
cursor.callproc(storedprocadd, (
|
||||
@@ -476,19 +156,22 @@ class ItemCRUD:
|
||||
data['GST_No'],
|
||||
data['Contractor_password']
|
||||
))
|
||||
|
||||
connection.commit()
|
||||
|
||||
self.isSuccess = True
|
||||
self.response = ResponseHandler.add_success(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
||||
)
|
||||
return
|
||||
|
||||
|
||||
# NORMAL
|
||||
# ======================================================
|
||||
# NORMAL SINGLE-FIELD (Village / Block / State)
|
||||
# ======================================================
|
||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.invalid_name(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||
)
|
||||
return
|
||||
|
||||
if parentid is None:
|
||||
@@ -502,8 +185,9 @@ class ItemCRUD:
|
||||
|
||||
if existing_item:
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.already_exists(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
|
||||
)
|
||||
return
|
||||
|
||||
if parentid is None:
|
||||
@@ -512,16 +196,17 @@ class ItemCRUD:
|
||||
cursor.callproc(storedprocadd, (childname, parentid))
|
||||
|
||||
connection.commit()
|
||||
|
||||
self.isSuccess = True
|
||||
self.response = ResponseHandler.add_success(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
||||
)
|
||||
|
||||
except mysql.connector.Error as e:
|
||||
print(f"Database Error: {e}")
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.add_failure(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.add_failure(self.itemCRUDMapping.name), 500
|
||||
)
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
@@ -541,7 +226,34 @@ class ItemCRUD:
|
||||
)
|
||||
|
||||
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, (
|
||||
childid,
|
||||
data['Contractor_Name'],
|
||||
@@ -554,18 +266,19 @@ class ItemCRUD:
|
||||
data['GST_No'],
|
||||
data['Contractor_password']
|
||||
))
|
||||
|
||||
connection.commit()
|
||||
|
||||
self.isSuccess = True
|
||||
self.response = ResponseHandler.update_success(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.update_success(self.itemCRUDMapping.name), 200
|
||||
)
|
||||
return
|
||||
|
||||
# ======================================================
|
||||
# NORMAL SINGLE-FIELD
|
||||
# ======================================================
|
||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.update_failure(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
|
||||
return
|
||||
|
||||
if parentid is None:
|
||||
@@ -574,16 +287,15 @@ class ItemCRUD:
|
||||
cursor.callproc(storedprocupdate, (childid, parentid, childname))
|
||||
|
||||
connection.commit()
|
||||
|
||||
self.isSuccess = True
|
||||
self.response = ResponseHandler.update_success(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
|
||||
|
||||
except mysql.connector.Error as e:
|
||||
print(f"Error updating {self.itemCRUDMapping.name}: {e}")
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.update_failure(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.update_failure(self.itemCRUDMapping.name), 500
|
||||
)
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
@@ -596,27 +308,22 @@ class ItemCRUD:
|
||||
|
||||
data = []
|
||||
connection = config.get_db_connection()
|
||||
|
||||
if not connection:
|
||||
return []
|
||||
|
||||
cursor = connection.cursor()
|
||||
|
||||
try:
|
||||
cursor.callproc(storedproc)
|
||||
|
||||
for result in cursor.stored_results():
|
||||
data = result.fetchall()
|
||||
|
||||
self.isSuccess = True
|
||||
|
||||
except mysql.connector.Error as e:
|
||||
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
||||
self.isSuccess = False
|
||||
self.response = ResponseHandler.fetch_failure(self.itemCRUDMapping.name)
|
||||
self.resultMessage = self.response["message"]
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
||||
)
|
||||
return []
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
connection.close()
|
||||
@@ -634,13 +341,10 @@ class ItemCRUD:
|
||||
|
||||
try:
|
||||
cursor.callproc(storedproc, (id,))
|
||||
|
||||
for rs in cursor.stored_results():
|
||||
data = rs.fetchone()
|
||||
|
||||
except mysql.connector.Error as e:
|
||||
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
connection.close()
|
||||
@@ -648,7 +352,7 @@ class ItemCRUD:
|
||||
return data
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# CHECK ITEM (KEEP AS IS - API USE)
|
||||
# CHECK ITEM
|
||||
# ----------------------------------------------------------
|
||||
def CheckItem(self, request, parentid, childname, storedprocfetch):
|
||||
|
||||
@@ -689,7 +393,6 @@ class ItemCRUD:
|
||||
return HtmlHelper.json_response(
|
||||
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
||||
)
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
connection.close()
|
||||
@@ -8,7 +8,7 @@ class ItemCRUDType(Enum):
|
||||
State = 4
|
||||
HoldType = 5
|
||||
Subcontractor = 6
|
||||
|
||||
GSTRelease = 7
|
||||
|
||||
class RegEx:
|
||||
patternAlphabetOnly = "^[A-Za-z ]+$"
|
||||
|
||||
171
model/Village.py
171
model/Village.py
@@ -1,175 +1,4 @@
|
||||
# from model.Utilities import ResponseHandler, HtmlHelper, ItemCRUDType
|
||||
# import config
|
||||
# import mysql.connector
|
||||
# from model.ItemCRUD import ItemCRUD
|
||||
|
||||
|
||||
# class Village:
|
||||
# isSuccess = False
|
||||
# resultMessage = ""
|
||||
|
||||
# def __init__(self):
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = ""
|
||||
# self.village = ItemCRUD(itemType=ItemCRUDType.Village)
|
||||
|
||||
# # 🔹 Helper: sync status
|
||||
# def _set_status(self, village):
|
||||
# self.isSuccess = village.isSuccess
|
||||
# self.resultMessage = village.resultMessage
|
||||
|
||||
# # 🔹 Helper: get request data
|
||||
# def _get_form_data(self, request):
|
||||
# block_id = request.form.get('block_Id')
|
||||
# village_name = request.form.get('Village_Name', '').strip()
|
||||
# return block_id, village_name
|
||||
|
||||
# def AddVillage(self, request):
|
||||
# block_id, village_name = self._get_form_data(request)
|
||||
|
||||
# if not village_name:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = "Village name cannot be empty"
|
||||
# return
|
||||
|
||||
# try:
|
||||
# self.village.AddItem(
|
||||
# request=request,
|
||||
# parentid=block_id,
|
||||
# childname=village_name,
|
||||
# storedprocfetch="GetVillageByNameAndBlock",
|
||||
# storedprocadd="SaveVillage"
|
||||
# )
|
||||
# self._set_status(self.village)
|
||||
|
||||
# except Exception as e:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = str(e)
|
||||
|
||||
# def GetAllVillages(self, request):
|
||||
|
||||
# try:
|
||||
# villagesdata = self.village.GetAllData(
|
||||
# request=request,
|
||||
# storedproc="GetAllVillages"
|
||||
# )
|
||||
# self._set_status(self.village)
|
||||
# return villagesdata
|
||||
|
||||
# except Exception as e:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = str(e)
|
||||
# return []
|
||||
|
||||
# def CheckVillage(self, request):
|
||||
# block_id, village_name = self._get_form_data(request)
|
||||
|
||||
# if not village_name:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = "Village name cannot be empty"
|
||||
# return None
|
||||
|
||||
# try:
|
||||
# result = self.village.CheckItem(
|
||||
# request=request,
|
||||
# parentid=block_id,
|
||||
# childname=village_name,
|
||||
# storedprocfetch="GetVillageByNameAndBlocks"
|
||||
# )
|
||||
# self._set_status(self.village)
|
||||
# return result
|
||||
|
||||
# except Exception as e:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = str(e)
|
||||
# return None
|
||||
|
||||
# def DeleteVillage(self, request, village_id):
|
||||
|
||||
# try:
|
||||
# self.village.DeleteItem(
|
||||
# request=request,
|
||||
# itemID=village_id,
|
||||
# storedprocDelete="DeleteVillage"
|
||||
# )
|
||||
# self._set_status(self.village)
|
||||
|
||||
# except Exception as e:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = str(e)
|
||||
|
||||
# def EditVillage(self, request, village_id):
|
||||
# block_id, village_name = self._get_form_data(request)
|
||||
|
||||
# if not village_name:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = "Village name cannot be empty"
|
||||
# return
|
||||
|
||||
# try:
|
||||
# self.village.EditItem(
|
||||
# request=request,
|
||||
# childid=village_id,
|
||||
# parentid=block_id,
|
||||
# childname=village_name,
|
||||
# storedprocupdate="UpdateVillage"
|
||||
# )
|
||||
# self._set_status(self.village)
|
||||
|
||||
# except Exception as e:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = str(e)
|
||||
|
||||
# def GetVillageByID(self, id):
|
||||
|
||||
# try:
|
||||
# villagedetailsdata = self.village.GetDataByID(
|
||||
# id=id,
|
||||
# storedproc="GetVillageDetailsById"
|
||||
# )
|
||||
|
||||
# if villagedetailsdata:
|
||||
# self.isSuccess = True
|
||||
# else:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = "Village not found"
|
||||
|
||||
# return villagedetailsdata
|
||||
|
||||
# except Exception as e:
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = str(e)
|
||||
# return None
|
||||
|
||||
# def GetAllBlocks(self):
|
||||
# blocks = []
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = ""
|
||||
|
||||
# connection = config.get_db_connection()
|
||||
# if not connection:
|
||||
# return []
|
||||
|
||||
# try:
|
||||
# with connection.cursor() as cursor:
|
||||
# cursor.callproc('GetAllBlocks')
|
||||
|
||||
# for result in cursor.stored_results():
|
||||
# blocks.extend(result.fetchall())
|
||||
|
||||
# self.isSuccess = True
|
||||
# return blocks
|
||||
|
||||
# except mysql.connector.Error as e:
|
||||
# print(f"Error fetching blocks: {e}")
|
||||
# self.isSuccess = False
|
||||
# self.resultMessage = HtmlHelper.json_response(
|
||||
# ResponseHandler.fetch_failure("block"), 500
|
||||
# )
|
||||
# return []
|
||||
|
||||
# finally:
|
||||
# connection.close()
|
||||
|
||||
from model.Utilities import ResponseHandler, HtmlHelper, ItemCRUDType
|
||||
import config
|
||||
|
||||
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
|
||||
# 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)
|
||||
|
||||
# model/gst_release.py
|
||||
from flask import request, jsonify
|
||||
from model.ItemCRUD import ItemCRUD
|
||||
from model.Utilities import ItemCRUDType
|
||||
|
||||
|
||||
class GSTRelease:
|
||||
|
||||
def __init__(self):
|
||||
@@ -125,12 +24,19 @@ class GSTRelease:
|
||||
"Contractor_ID": int(request.form.get("Contractor_ID", 0) or 0)
|
||||
}
|
||||
|
||||
# Add GST Release
|
||||
gst.AddItem(
|
||||
request=request,
|
||||
data=data,
|
||||
storedprocfetch="CheckGSTReleaseExists",
|
||||
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.resultMessage = str(gst.resultMessage)
|
||||
@@ -198,7 +104,6 @@ class GSTRelease:
|
||||
def GetAllGSTReleases(self):
|
||||
try:
|
||||
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||
|
||||
rows = gst.GetAllData(None, "GetAllGSTReleases")
|
||||
|
||||
data = []
|
||||
@@ -224,7 +129,6 @@ class GSTRelease:
|
||||
def GetGSTReleaseByID(self, gst_release_id):
|
||||
try:
|
||||
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||
|
||||
row = gst.GetDataByID(gst_release_id, "GetGSTReleaseById")
|
||||
|
||||
if row:
|
||||
|
||||
@@ -1,201 +1,4 @@
|
||||
// window.onload = function () {
|
||||
// document.getElementById('Village_Name').focus();
|
||||
// };
|
||||
|
||||
// $(document).ready(function () {
|
||||
|
||||
// // STATE → DISTRICT
|
||||
// $('#state_Id').change(function () {
|
||||
|
||||
// var stateId = $(this).val();
|
||||
|
||||
// if (stateId) {
|
||||
|
||||
// $.ajax({
|
||||
// url: '/get_districts/' + stateId,
|
||||
// type: 'GET',
|
||||
|
||||
// success: function (data) {
|
||||
|
||||
// var districtDropdown = $('#district_Id');
|
||||
|
||||
// districtDropdown.empty();
|
||||
// districtDropdown.append('<option value="" disabled selected>Select District</option>');
|
||||
|
||||
// data.forEach(function (district) {
|
||||
|
||||
// districtDropdown.append(
|
||||
// '<option value="' + district.id + '">' + district.name + '</option>'
|
||||
// );
|
||||
|
||||
// });
|
||||
|
||||
// districtDropdown.prop('disabled', false);
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
|
||||
// // DISTRICT → BLOCK
|
||||
// $('#district_Id').change(function () {
|
||||
|
||||
// var districtId = $(this).val();
|
||||
|
||||
// if (districtId) {
|
||||
|
||||
// $.ajax({
|
||||
// url: '/get_blocks/' + districtId,
|
||||
// type: 'GET',
|
||||
|
||||
// success: function (data) {
|
||||
|
||||
// var blockDropdown = $('#block_Id');
|
||||
|
||||
// blockDropdown.empty();
|
||||
// blockDropdown.append('<option value="" disabled selected>Select Block</option>');
|
||||
|
||||
// data.forEach(function (block) {
|
||||
|
||||
// blockDropdown.append(
|
||||
// '<option value="' + block.id + '">' + block.name + '</option>'
|
||||
// );
|
||||
|
||||
// });
|
||||
|
||||
// blockDropdown.prop('disabled', false);
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
|
||||
// // VILLAGE NAME VALIDATION
|
||||
// $('#Village_Name').on('input', function () {
|
||||
|
||||
// var villageName = $(this).val();
|
||||
// var validPattern = /^[A-Za-z ]*$/;
|
||||
|
||||
// if (!validPattern.test(villageName)) {
|
||||
|
||||
// $('#villageMessage')
|
||||
// .text('Only letters and spaces are allowed!')
|
||||
// .css('color', 'red');
|
||||
|
||||
// $('#submitVillage').prop('disabled', true);
|
||||
|
||||
// } else {
|
||||
|
||||
// $('#villageMessage').text('');
|
||||
// $('#submitVillage').prop('disabled', false);
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
|
||||
// // CHECK DUPLICATE VILLAGE
|
||||
// $('#Village_Name, #block_Id').on('change keyup', function () {
|
||||
|
||||
// var blockId = $('#block_Id').val();
|
||||
// var villageName = $('#Village_Name').val().trim();
|
||||
|
||||
// if (blockId && villageName) {
|
||||
|
||||
// $.ajax({
|
||||
|
||||
// url: '/check_village',
|
||||
// type: 'POST',
|
||||
|
||||
// data: {
|
||||
// block_Id: blockId,
|
||||
// Village_Name: villageName
|
||||
// },
|
||||
|
||||
// success: function (response) {
|
||||
|
||||
// if (response.status === 'exists') {
|
||||
|
||||
// $('#villageMessage')
|
||||
// .text(response.message)
|
||||
// .css('color', 'red');
|
||||
|
||||
// $('#submitVillage').prop('disabled', true);
|
||||
|
||||
// } else {
|
||||
|
||||
// $('#villageMessage')
|
||||
// .text(response.message)
|
||||
// .css('color', 'green');
|
||||
|
||||
// $('#submitVillage').prop('disabled', false);
|
||||
|
||||
// }
|
||||
|
||||
// },
|
||||
|
||||
// error: function () {
|
||||
|
||||
// $('#villageMessage')
|
||||
// .text('Error checking village name')
|
||||
// .css('color', 'red');
|
||||
|
||||
// $('#submitVillage').prop('disabled', true);
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
|
||||
// // ADD VILLAGE
|
||||
// $('#villageForm').submit(function (event) {
|
||||
|
||||
// event.preventDefault();
|
||||
|
||||
// $.ajax({
|
||||
|
||||
// url: '/add_village',
|
||||
// type: 'POST',
|
||||
// data: $(this).serialize(),
|
||||
|
||||
// success: function (response) {
|
||||
|
||||
// if (response.status === 'success') {
|
||||
|
||||
// alert('Village added successfully!');
|
||||
// location.reload();
|
||||
|
||||
// } else {
|
||||
|
||||
// alert('Error adding village. Please try again.');
|
||||
|
||||
// }
|
||||
|
||||
// },
|
||||
|
||||
// error: function () {
|
||||
|
||||
// alert('An error occurred. Please try again.');
|
||||
|
||||
// }
|
||||
|
||||
// });
|
||||
|
||||
// });
|
||||
|
||||
// });
|
||||
|
||||
window.onload = function () {
|
||||
document.getElementById('Village_Name').focus();
|
||||
|
||||
@@ -68,50 +68,49 @@
|
||||
{% endwith %}
|
||||
</div>
|
||||
|
||||
<!-- GST Release History Table -->
|
||||
<div id="addTable" style="display: none;">
|
||||
<div class="search-container">
|
||||
<h2>GST Release History</h2>
|
||||
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
||||
<input type="text" id="searchBar" placeholder="Search..." onkeyup="searchTable()">
|
||||
</div>
|
||||
<table id="sortableTable" border="1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable-header">GST_Release_Id</th>
|
||||
<th class="sortable-header">PMC_No</th>
|
||||
<th>Invoice_No</th>
|
||||
<th>Basic_Amount</th>
|
||||
<th>Final_Amount</th>
|
||||
<th>Total_Amount</th>
|
||||
<th>UTR</th>
|
||||
<th>Update</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="sortable-header">GST_Release_Id</th>
|
||||
<th class="sortable-header">PMC_No</th>
|
||||
<th>Invoice_No</th>
|
||||
<th>Basic_Amount</th>
|
||||
<th>Final_Amount</th>
|
||||
<th>Total_Amount</th>
|
||||
<th>UTR</th>
|
||||
<th>Update</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for gst_rel in gst_releases %}
|
||||
<tr>
|
||||
<td>{{ gst_rel[0] }}</td>
|
||||
<td>{{ gst_rel[1] }}</td>
|
||||
<td>{{ gst_rel[2] }}</td>
|
||||
<td>{{ gst_rel[3] }}</td>
|
||||
<td>{{ gst_rel[4] }}</td>
|
||||
<td>{{ gst_rel[5] }}</td>
|
||||
<td>{{ gst_rel[6] }}</td>
|
||||
<td>
|
||||
<a href="/edit_gst_release/{{ gst_rel[0] }}">
|
||||
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit"
|
||||
class="icon">
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/delete_gst_release/{{ gst_rel[0] }}"
|
||||
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">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% for gst_rel in gst_releases %}
|
||||
<tr>
|
||||
<td>{{ gst_rel.gst_release_id }}</td>
|
||||
<td>{{ gst_rel.pmc_no }}</td>
|
||||
<td>{{ gst_rel.invoice_no }}</td>
|
||||
<td>{{ gst_rel.basic_amount }}</td>
|
||||
<td>{{ gst_rel.final_amount }}</td>
|
||||
<td>{{ gst_rel.total_amount }}</td>
|
||||
<td>{{ gst_rel.utr }}</td>
|
||||
<td>
|
||||
<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" class="icon">
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<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?')">
|
||||
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete" class="icon">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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/invoice.js') }}"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="button-container">
|
||||
<button id="addButton" class="action-button">Add</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 class="button-container">
|
||||
<button id="addButton" class="action-button">Add</button>
|
||||
<button id="displayButton" class="action-button">Display</button>
|
||||
</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="/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>
|
||||
<!-- <tr>
|
||||
|
||||
<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>
|
||||
<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['PMC_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="/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> -->
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.getElementById("subcontractor").addEventListener("input", function () {
|
||||
const query = this.value;
|
||||
const list = document.getElementById("subcontractor_list");
|
||||
<script>
|
||||
document.getElementById("subcontractor").addEventListener("input", function () {
|
||||
const query = this.value;
|
||||
const list = document.getElementById("subcontractor_list");
|
||||
|
||||
if (query.length < 2) {
|
||||
list.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
if (query.length < 2) {
|
||||
list.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
fetch(`/search_subcontractor?query=${encodeURIComponent(query)}`)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
list.innerHTML = '';
|
||||
data.results.forEach(item => {
|
||||
const div = document.createElement("div");
|
||||
div.setAttribute("data-id", item.id);
|
||||
div.textContent = item.name;
|
||||
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);
|
||||
fetch(`/search_subcontractor?query=${encodeURIComponent(query)}`)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
list.innerHTML = '';
|
||||
data.results.forEach(item => {
|
||||
const div = document.createElement("div");
|
||||
div.setAttribute("data-id", item.id);
|
||||
div.textContent = item.name;
|
||||
list.appendChild(div);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
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>
|
||||
document.getElementById("subcontractor_list").addEventListener("click", function (e) {
|
||||
const selectedId = e.target.getAttribute("data-id");
|
||||
const selectedName = e.target.textContent;
|
||||
|
||||
<script>
|
||||
function calculateTDSAndTotal() {
|
||||
const amount = parseFloat(document.getElementById("Payment_Amount").value) || 0;
|
||||
const tdsPercent = parseFloat(document.getElementById("TDS_Percentage").value) || 0;
|
||||
if (selectedId) {
|
||||
document.getElementById("subcontractor_id").value = selectedId;
|
||||
document.getElementById("subcontractor").value = selectedName;
|
||||
document.getElementById("subcontractor_list").innerHTML = ""; // hide the list
|
||||
|
||||
const tdsAmount = (amount * tdsPercent / 100).toFixed(2);
|
||||
const totalAmount = (amount - tdsAmount).toFixed(2);
|
||||
console.log("Contractor id is", selectedId);
|
||||
|
||||
document.getElementById("TDS_Payment_Amount").value = tdsAmount;
|
||||
document.getElementById("total_amount").value = totalAmount;
|
||||
}
|
||||
</script>
|
||||
// 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) {
|
||||
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>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user