Merge pull request 'add item crude' (#10) from pankaj-dev into main

Reviewed-on: #10
This commit was merged in pull request #10.
This commit is contained in:
2026-03-24 07:07:31 +00:00
2 changed files with 232 additions and 194 deletions

View File

@@ -1,6 +1,3 @@
from flask_login import current_user from flask_login import current_user
from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
from model.Log import LogHelper from model.Log import LogHelper
@@ -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,8 +92,12 @@ class ItemCRUD:
) )
try: try:
# SUBCONTRACTOR # ======================================================
# SUBCONTRACTOR (MULTI-FIELD)
# ======================================================
if data: if data:
# Duplicate check
cursor.callproc(storedprocfetch, (data['Contractor_Name'],)) cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
existing_item = None existing_item = None
@@ -103,10 +106,12 @@ 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
# Insert
cursor.callproc(storedprocadd, ( cursor.callproc(storedprocadd, (
data['Contractor_Name'], data['Contractor_Name'],
data['Address'], data['Address'],
@@ -122,17 +127,22 @@ class ItemCRUD:
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 (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
# Duplicate check
if parentid is None: if parentid is None:
cursor.callproc(storedprocfetch, (childname,)) cursor.callproc(storedprocfetch, (childname,))
else: else:
@@ -144,10 +154,12 @@ 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
# Insert
if parentid is None: if parentid is None:
cursor.callproc(storedprocadd, (childname,)) cursor.callproc(storedprocadd, (childname,))
else: else:
@@ -156,14 +168,17 @@ class ItemCRUD:
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,6 +198,9 @@ class ItemCRUD:
) )
try: try:
# ======================================================
# SUBCONTRACTOR (MULTI-FIELD)
# ======================================================
if data: if data:
cursor.callproc(storedprocupdate, ( cursor.callproc(storedprocupdate, (
childid, childid,
@@ -200,14 +218,17 @@ class ItemCRUD:
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
# ======================================================
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:
@@ -218,14 +239,14 @@ class ItemCRUD:
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()
@@ -255,8 +276,9 @@ class ItemCRUD:
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:
@@ -290,7 +312,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):

View File

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