hold type updated , delete done by prajkta
This commit is contained in:
@@ -10,21 +10,21 @@ hold_bp = Blueprint("hold_types", __name__)
|
|||||||
@hold_bp.route('/add_hold_type', methods=['GET','POST'])
|
@hold_bp.route('/add_hold_type', methods=['GET','POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def add_hold_type():
|
def add_hold_type():
|
||||||
|
|
||||||
hold = HoldTypes()
|
hold = HoldTypes()
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
hold.AddHoldType(request) # ✅
|
hold.AddHoldType(request)
|
||||||
return hold.resultMessage
|
# ✅ Always redirect to same page (NO JSON)
|
||||||
|
return redirect(url_for("hold_types.add_hold_type"))
|
||||||
|
|
||||||
hold_types = hold.GetAllHoldTypes() # ✅
|
# GET request → show data
|
||||||
|
hold_types = hold.GetAllHoldTypes()
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"add_hold_type.html",
|
"add_hold_type.html",
|
||||||
Hold_Types_data=hold_types
|
Hold_Types_data=hold_types
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# ---------------- CHECK HOLD TYPE (OPTIONAL LIKE BLOCK) ----------------
|
# ---------------- CHECK HOLD TYPE (OPTIONAL LIKE BLOCK) ----------------
|
||||||
@hold_bp.route('/check_hold_type', methods=['POST'])
|
@hold_bp.route('/check_hold_type', methods=['POST'])
|
||||||
@login_required
|
@login_required
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ class ItemCRUD:
|
|||||||
# ======================================================
|
# ======================================================
|
||||||
# NORMAL (Village / Block / State)
|
# NORMAL (Village / Block / State)
|
||||||
# ======================================================
|
# ======================================================
|
||||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
if not re.match(RegEx.allPattern, childname):
|
||||||
self.isSuccess = False
|
self.isSuccess = False
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
self.resultMessage = HtmlHelper.json_response(
|
||||||
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||||
@@ -226,7 +226,7 @@ class ItemCRUD:
|
|||||||
# ======================================================
|
# ======================================================
|
||||||
# NORMAL
|
# NORMAL
|
||||||
# ======================================================
|
# ======================================================
|
||||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
if not re.match(RegEx.allPattern, childname):
|
||||||
self.isSuccess = False
|
self.isSuccess = False
|
||||||
self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
|
self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
|
||||||
return
|
return
|
||||||
@@ -324,7 +324,7 @@ class ItemCRUD:
|
|||||||
f"User {current_user.id} checked '{childname}'"
|
f"User {current_user.id} checked '{childname}'"
|
||||||
)
|
)
|
||||||
|
|
||||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
if not re.match(RegEx.allPattern, childname):
|
||||||
return HtmlHelper.json_response(
|
return HtmlHelper.json_response(
|
||||||
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class ItemCRUDType(Enum):
|
|||||||
|
|
||||||
class RegEx:
|
class RegEx:
|
||||||
patternAlphabetOnly = "^[A-Za-z ]+$"
|
patternAlphabetOnly = "^[A-Za-z ]+$"
|
||||||
|
allPattern = "^(?!\s*$).+"
|
||||||
|
|
||||||
|
|
||||||
class ResponseHandler:
|
class ResponseHandler:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ $(document).ready(function () {
|
|||||||
let holdType = $(this).val().replace(/^\s+/, "");
|
let holdType = $(this).val().replace(/^\s+/, "");
|
||||||
$(this).val(holdType);
|
$(this).val(holdType);
|
||||||
|
|
||||||
let reg = /^[A-Za-z]/;
|
let reg = /^.+$/; // all pattern allow
|
||||||
|
|
||||||
if (!reg.test(holdType)) {
|
if (!reg.test(holdType)) {
|
||||||
$("#holdTypeMessage").text("Hold Type must start with a letter.").css("color", "red");
|
$("#holdTypeMessage").text("Hold Type must start with a letter.").css("color", "red");
|
||||||
|
|||||||
@@ -1,59 +1,73 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>Manage Hold Types</title>
|
<title>Manage Hold Types</title>
|
||||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||||
<!-- <script src="{{ url_for('static', filename='js/hold_types.js') }}"></script> -->
|
<!-- <script src="{{ url_for('static', filename='js/hold_types.js') }}"></script> -->
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
||||||
<script src="{{ url_for('static', filename='js/search_on_table.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/search_on_table.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>
|
||||||
|
|
||||||
<div id="addForm">
|
<div id="addForm">
|
||||||
<h2>Add Hold Types</h2>
|
<h2>Add Hold Types</h2>
|
||||||
<form id="holdTypeForm" method="POST" action="{{ url_for('hold_types.add_hold_type') }}">
|
<form id="holdTypeForm" method="POST" action="{{ url_for('hold_types.add_hold_type') }}">
|
||||||
<label>Enter Hold Amount Type:</label>
|
<label>Enter Hold Amount Type:</label>
|
||||||
<input type="text" id="hold_type" name="hold_type" placeholder="Enter Type" required>
|
<input type="text" id="hold_type" name="hold_type" placeholder="Enter Type" required>
|
||||||
<span id="holdTypeMessage"></span>
|
<span id="holdTypeMessage"></span>
|
||||||
<button type="submit" value="Add Hold Type" id="successPopup">Add Hold Type</button>
|
<button type="submit" value="Add Hold Type" id="successPopup">Add Hold Type</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="addTable" style="display: none;">
|
<div id="addTable" style="display: none;">
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<h2>Hold Type List</h2>
|
<h2>Hold Type List</h2>
|
||||||
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
||||||
</div>
|
</div>
|
||||||
<table id="sortableTable" border="1">
|
<table id="sortableTable" border="1">
|
||||||
<tr>
|
<tr>
|
||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th class="sortable-header">
|
<th class="sortable-header">
|
||||||
Hold Type
|
Hold Type
|
||||||
<span class="sort-buttons">
|
<span class="sort-buttons">
|
||||||
<span class="sort-asc">⬆️</span>
|
<span class="sort-asc">⬆️</span>
|
||||||
<span class="sort-desc">⬇️</span>
|
<span class="sort-desc">⬇️</span>
|
||||||
</span>
|
</span>
|
||||||
</th>
|
</th>
|
||||||
<th>Update</th>
|
<th>Update</th>
|
||||||
<th>Delete</th>
|
<th>Delete</th>
|
||||||
</tr>
|
</tr>
|
||||||
{% for htd in Hold_Types_data %}
|
{% for htd in Hold_Types_data %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ htd['hold_type_id'] }}</td>
|
<td>{{ htd['hold_type_id'] }}</td>
|
||||||
<td>{{ htd['hold_type'] }}</td>
|
<td>{{ htd['hold_type'] }}</td>
|
||||||
<td><a href="{{ url_for('hold_types.edit_hold_type', id=htd['hold_type_id']) }}">Edit</a></td>
|
<td style="text-align:center;">
|
||||||
<td><button class="delete-button" data-id="{{ htd['hold_type_id'] }}">Delete</button></td>
|
<a href="{{ url_for('hold_types.edit_hold_type', id=htd['hold_type_id']) }}">
|
||||||
</tr>
|
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit"
|
||||||
{% endfor %}
|
class="icon">
|
||||||
</table>
|
</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
<a href="/">Back to Dashboard</a>
|
<td style="text-align:center;">
|
||||||
</div>
|
<a href="{{ url_for('hold_types.delete_hold_type', id=htd['hold_type_id']) }}"
|
||||||
|
onclick="return confirm('Are you sure you want to delete this hold type?');">
|
||||||
|
|
||||||
|
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
|
||||||
|
class="icon">
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<a href="/">Back to Dashboard</a>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>Edit Hold Type</title>
|
<title>Edit Hold Type</title>
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
||||||
@@ -10,10 +10,10 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h2>Edit Hold Type</h2>
|
<h2>Edit Hold Type</h2>
|
||||||
<form id="updateHoldTypeForm">
|
<form id="updateHoldTypeForm" method="POST">
|
||||||
<input type="hidden" id="hold_type_id" value="{{ hold_type[0] }}">
|
<input type="hidden" id="hold_type_id" value="{{ hold_type.hold_type_id }}">
|
||||||
<label for="edit_hold_type">Hold Type:</label>
|
<label for="edit_hold_type">Hold Type:</label>
|
||||||
<input type="text" id="edit_hold_type" name="hold_type" value="{{ hold_type[1] }}" required>
|
<input type="text" id="edit_hold_type" name="hold_type" value="{{ hold_type.hold_type }}" required>
|
||||||
<button type="submit">Update</button>
|
<button type="submit">Update</button>
|
||||||
<a href="{{ url_for('hold_types.add_hold_type') }}"></a>
|
<a href="{{ url_for('hold_types.add_hold_type') }}"></a>
|
||||||
</form>
|
</form>
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
formData.append('hold_type', newHoldType);
|
formData.append('hold_type', newHoldType);
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/update_hold_type/' + holdTypeId,
|
url: '/edit_hold_type/' + holdTypeId,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
data: formData,
|
data: formData,
|
||||||
processData: false,
|
processData: false,
|
||||||
@@ -55,8 +55,3 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
{% 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" />
|
||||||
<title>Edit Invoice</title>
|
<title>Edit Invoice</title>
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/invoice.css') }}">
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/invoice.css') }}">
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style1.css') }}">
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style1.css') }}">
|
||||||
@@ -12,158 +12,174 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div id="editForm">
|
<div id="editForm">
|
||||||
<h2>Edit Invoice</h2>
|
<h2>Edit Invoice</h2>
|
||||||
|
|
||||||
<!-- Success Alert Box -->
|
<!-- Success Alert Box -->
|
||||||
<div id="invoiceSuccessAlert" class="success-alert" style="display:none;">
|
<div id="invoiceSuccessAlert" class="success-alert" style="display:none;">
|
||||||
Invoice successfully updated!
|
Invoice successfully updated!
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="invoiceForm" action="{{ url_for('invoice.edit_invoice', invoice_id=invoice.Invoice_Id) }}"
|
||||||
|
method="POST">
|
||||||
|
|
||||||
|
<!-- Subcontractor Field -->
|
||||||
|
<div class="row1">
|
||||||
|
<div>
|
||||||
|
<label for="subcontractor">Subcontractor Name:</label>
|
||||||
|
<input class="form-control" list="subcontractor_list" id="subcontractor" name="subcontractor"
|
||||||
|
value="{{ invoice.Contractor_Name }}" placeholder="Type to search..." required>
|
||||||
|
<input type="hidden" id="subcontractor_id" name="subcontractor_id"
|
||||||
|
value="{{ invoice.Subcontractor_Id }}">
|
||||||
|
<datalist id="subcontractor_list"></datalist>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Village and PMC No Fields -->
|
||||||
|
<div class="row2">
|
||||||
|
<div>
|
||||||
|
<label for="village">Village Name:</label>
|
||||||
|
<input type="text" id="village" name="village" value="{{ invoice.Village_Name }}" required />
|
||||||
|
<datalist id="village_list"></datalist>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="pmc_no">PMC No:</label>
|
||||||
|
<input type="text" id="pmc_no" name="pmc_no" value="{{ invoice.PMC_No }}" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Work Type and Invoice Details -->
|
||||||
|
<div class="row2">
|
||||||
|
<div>
|
||||||
|
<label for="work_type">Work Type:</label>
|
||||||
|
<input type="text" id="work_type" name="work_type" value="{{ invoice.Work_Type }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="invoice_details">Invoice Details:</label>
|
||||||
|
<textarea id="invoice_details" name="invoice_details"
|
||||||
|
required>{{ invoice.Invoice_Details }}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Invoice No and Invoice Date -->
|
||||||
|
<div class="row2">
|
||||||
|
<div>
|
||||||
|
<label for="invoice_no">Invoice No:</label>
|
||||||
|
<input type="text" id="invoice_no" name="invoice_no" value="{{ invoice.invoice_no }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="invoice_date">Invoice Date:</label>
|
||||||
|
<input type="date" id="invoice_date" name="invoice_date" value="{{ invoice.Invoice_Date }}"
|
||||||
|
required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Amount Fields -->
|
||||||
|
<div class="row3">
|
||||||
|
<div>
|
||||||
|
<label for="basic_amount">Basic Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="basic_amount" name="basic_amount"
|
||||||
|
value="{{ invoice.Basic_Amount }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="debit_amount">Debit Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="debit_amount" name="debit_amount"
|
||||||
|
value="{{ invoice.Debit_Amount }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="after_debit_amount">After Debit Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="after_debit_amount" name="after_debit_amount"
|
||||||
|
value="{{ invoice.After_Debit_Amount }}" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- GST, TDS, and Other Amounts -->
|
||||||
|
<div class="row3">
|
||||||
|
<div>
|
||||||
|
<label for="amount">Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="amount" name="amount" value="{{ invoice.Amount }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="gst_amount">GST Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="gst_amount" name="gst_amount" value="{{ invoice.GST_Amount }}"
|
||||||
|
required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="tds_amount">TDS Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="tds_amount" name="tds_amount" value="{{ invoice.TDS_Amount }}"
|
||||||
|
required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- SD, On Commission, Hydro Testing -->
|
||||||
|
<div class="row3">
|
||||||
|
<div>
|
||||||
|
<label for="sd_amount">SD Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="sd_amount" name="sd_amount" value="{{ invoice.SD_Amount }}"
|
||||||
|
required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="on_commission">On Commission:</label>
|
||||||
|
<input type="number" step="0.01" id="on_commission" name="on_commission"
|
||||||
|
value="{{ invoice.On_Commission }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="hydro_testing">Hydro Testing:</label>
|
||||||
|
<input type="number" step="0.01" id="hydro_testing" name="hydro_testing"
|
||||||
|
value="{{ invoice.Hydro_Testing }}" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Hold Amount Section -->
|
||||||
|
<div id="hold_amount_container">
|
||||||
|
{% set seen_types = [] %}
|
||||||
|
{% for hold in invoice.hold_amounts %}
|
||||||
|
{% if hold.hold_type not in seen_types %}
|
||||||
|
{% set _ = seen_types.append(hold.hold_type) %}
|
||||||
|
<div class="hold-amount-row">
|
||||||
|
<label for="hold_type_{{ loop.index }}">Hold Type:</label>
|
||||||
|
<input type="text" id="hold_type_{{ loop.index }}" name="hold_type[]" value="{{ hold.hold_type }}"
|
||||||
|
required />
|
||||||
|
<label for="hold_amount_{{ loop.index }}">Hold Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="hold_amount_{{ loop.index }}" name="hold_amount[]"
|
||||||
|
value="{{ hold.hold_amount }}" required />
|
||||||
|
<button type="button" class="remove-hold-amount">Remove</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="hold-row">
|
||||||
|
<button type="button" id="add_hold_amount" class="button">+ Add Hold Amount</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Final Amounts -->
|
||||||
|
<div class="row2">
|
||||||
|
<div>
|
||||||
|
<label for="gst_sd_amount">GST SD Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="gst_sd_amount" name="gst_sd_amount"
|
||||||
|
value="{{ invoice.GST_SD_Amount }}" required />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="final_amount">Final Amount:</label>
|
||||||
|
<input type="number" step="0.01" id="final_amount" name="final_amount"
|
||||||
|
value="{{ invoice.Final_Amount }}" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Submit Button -->
|
||||||
|
<button type="submit" class="button">Update</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form id="invoiceForm" action="{{ url_for('invoice.edit_invoice', invoice_id=invoice.Invoice_Id) }}" method="POST">
|
<!-- JS for dynamic hold amount rows -->
|
||||||
|
<script>
|
||||||
<!-- Subcontractor Field -->
|
$(document).ready(function () {
|
||||||
<div class="row1">
|
// Add new hold amount row
|
||||||
<div>
|
$("#add_hold_amount").click(function () {
|
||||||
<label for="subcontractor">Subcontractor Name:</label>
|
const index = $("#hold_amount_container .hold-amount-row").length;
|
||||||
<input class="form-control" list="subcontractor_list" id="subcontractor" name="subcontractor"
|
const newRow = `
|
||||||
value="{{ invoice.Contractor_Name }}" placeholder="Type to search..." required>
|
|
||||||
<input type="hidden" id="subcontractor_id" name="subcontractor_id" value="{{ invoice.Subcontractor_Id }}">
|
|
||||||
<datalist id="subcontractor_list"></datalist>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Village and PMC No Fields -->
|
|
||||||
<div class="row2">
|
|
||||||
<div>
|
|
||||||
<label for="village">Village Name:</label>
|
|
||||||
<input type="text" id="village" name="village" value="{{ invoice.Village_Name }}" required/>
|
|
||||||
<datalist id="village_list"></datalist>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="pmc_no">PMC No:</label>
|
|
||||||
<input type="text" id="pmc_no" name="pmc_no" value="{{ invoice.PMC_No }}" required/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Work Type and Invoice Details -->
|
|
||||||
<div class="row2">
|
|
||||||
<div>
|
|
||||||
<label for="work_type">Work Type:</label>
|
|
||||||
<input type="text" id="work_type" name="work_type" value="{{ invoice.Work_Type }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="invoice_details">Invoice Details:</label>
|
|
||||||
<textarea id="invoice_details" name="invoice_details" required>{{ invoice.Invoice_Details }}</textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Invoice No and Invoice Date -->
|
|
||||||
<div class="row2">
|
|
||||||
<div>
|
|
||||||
<label for="invoice_no">Invoice No:</label>
|
|
||||||
<input type="text" id="invoice_no" name="invoice_no" value="{{ invoice.Invoice_No }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="invoice_date">Invoice Date:</label>
|
|
||||||
<input type="date" id="invoice_date" name="invoice_date" value="{{ invoice.Invoice_Date }}" required/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Amount Fields -->
|
|
||||||
<div class="row3">
|
|
||||||
<div>
|
|
||||||
<label for="basic_amount">Basic Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="basic_amount" name="basic_amount" value="{{ invoice.Basic_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="debit_amount">Debit Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="debit_amount" name="debit_amount" value="{{ invoice.Debit_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="after_debit_amount">After Debit Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="after_debit_amount" name="after_debit_amount" value="{{ invoice.After_Debit_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- GST, TDS, and Other Amounts -->
|
|
||||||
<div class="row3">
|
|
||||||
<div>
|
|
||||||
<label for="amount">Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="amount" name="amount" value="{{ invoice.Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="gst_amount">GST Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="gst_amount" name="gst_amount" value="{{ invoice.GST_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="tds_amount">TDS Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="tds_amount" name="tds_amount" value="{{ invoice.TDS_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- SD, On Commission, Hydro Testing -->
|
|
||||||
<div class="row3">
|
|
||||||
<div>
|
|
||||||
<label for="sd_amount">SD Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="sd_amount" name="sd_amount" value="{{ invoice.SD_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="on_commission">On Commission:</label>
|
|
||||||
<input type="number" step="0.01" id="on_commission" name="on_commission" value="{{ invoice.On_Commission }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="hydro_testing">Hydro Testing:</label>
|
|
||||||
<input type="number" step="0.01" id="hydro_testing" name="hydro_testing" value="{{ invoice.Hydro_Testing }}" required/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Hold Amount Section -->
|
|
||||||
<div id="hold_amount_container">
|
|
||||||
{% set seen_types = [] %}
|
|
||||||
{% for hold in invoice.hold_amounts %}
|
|
||||||
{% if hold.hold_type not in seen_types %}
|
|
||||||
{% set _ = seen_types.append(hold.hold_type) %}
|
|
||||||
<div class="hold-amount-row">
|
|
||||||
<label for="hold_type_{{ loop.index }}">Hold Type:</label>
|
|
||||||
<input type="text" id="hold_type_{{ loop.index }}" name="hold_type[]" value="{{ hold.hold_type }}" required/>
|
|
||||||
<label for="hold_amount_{{ loop.index }}">Hold Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="hold_amount_{{ loop.index }}" name="hold_amount[]" value="{{ hold.hold_amount }}" required/>
|
|
||||||
<button type="button" class="remove-hold-amount">Remove</button>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="hold-row">
|
|
||||||
<button type="button" id="add_hold_amount" class="button">+ Add Hold Amount</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Final Amounts -->
|
|
||||||
<div class="row2">
|
|
||||||
<div>
|
|
||||||
<label for="gst_sd_amount">GST SD Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="gst_sd_amount" name="gst_sd_amount" value="{{ invoice.GST_SD_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="final_amount">Final Amount:</label>
|
|
||||||
<input type="number" step="0.01" id="final_amount" name="final_amount" value="{{ invoice.Final_Amount }}" required/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Submit Button -->
|
|
||||||
<button type="submit" class="button">Update</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- JS for dynamic hold amount rows -->
|
|
||||||
<script>
|
|
||||||
$(document).ready(function() {
|
|
||||||
// Add new hold amount row
|
|
||||||
$("#add_hold_amount").click(function() {
|
|
||||||
const index = $("#hold_amount_container .hold-amount-row").length;
|
|
||||||
const newRow = `
|
|
||||||
<div class="hold-amount-row">
|
<div class="hold-amount-row">
|
||||||
<label for="hold_type_${index}">Hold Type:</label>
|
<label for="hold_type_${index}">Hold Type:</label>
|
||||||
<input type="text" id="hold_type_${index}" name="hold_type[]" required/>
|
<input type="text" id="hold_type_${index}" name="hold_type[]" required/>
|
||||||
@@ -172,36 +188,36 @@ $(document).ready(function() {
|
|||||||
<button type="button" class="remove-hold-amount">Remove</button>
|
<button type="button" class="remove-hold-amount">Remove</button>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
$("#hold_amount_container").append(newRow);
|
$("#hold_amount_container").append(newRow);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Remove hold amount row
|
// Remove hold amount row
|
||||||
$(document).on("click", ".remove-hold-amount", function() {
|
$(document).on("click", ".remove-hold-amount", function () {
|
||||||
$(this).closest(".hold-amount-row").remove();
|
$(this).closest(".hold-amount-row").remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Submit form via AJAX
|
// Submit form via AJAX
|
||||||
$("#invoiceForm").submit(function(e) {
|
$("#invoiceForm").submit(function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: $(this).attr("action"),
|
url: $(this).attr("action"),
|
||||||
data: $(this).serialize(),
|
data: $(this).serialize(),
|
||||||
success: function(response) {
|
success: function (response) {
|
||||||
if(response.status === "success") {
|
if (response.status === "success") {
|
||||||
$("#invoiceSuccessAlert").fadeIn().delay(3000).fadeOut();
|
$("#invoiceSuccessAlert").fadeIn().delay(3000).fadeOut();
|
||||||
alert("Invoice updated successfully!"); // <-- Popup alert
|
alert("Invoice updated successfully!"); // <-- Popup alert
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
error: function(xhr) {
|
error: function (xhr) {
|
||||||
alert("Error: " + xhr.responseJSON.message);
|
alert("Error: " + xhr.responseJSON.message);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
</script>
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user