23 changed files with 9028 additions and 2340 deletions
-
3.vscode/settings.json
-
2jwtToken.txt
-
25src/main/java/com/gcc/communityHall/controller/HeadquartersController.java
-
7src/main/java/com/gcc/communityHall/controller/UserAPIController.java
-
2src/main/java/com/gcc/communityHall/entity/BookingDetails.java
-
367src/main/java/com/gcc/communityHall/paymentService/controller/PaymentAPIController.java
-
108src/main/java/com/gcc/communityHall/paymentService/scheduler/PaymentStatusScheduler.java
-
6src/main/java/com/gcc/communityHall/repository/BookingDetailsRepository.java
-
8src/main/java/com/gcc/communityHall/repository/LoginRepository.java
-
9src/main/java/com/gcc/communityHall/service/BookingService.java
-
293src/main/java/com/gcc/communityHall/service/Impl/BookingServiceImpl.java
-
2src/main/java/com/gcc/communityHall/service/MailService.java
-
843src/main/resources/resources/templates/headquarters/sixmonthold-transactions.html
-
99src/main/resources/templates/admin/bookingwaiting.html
-
44src/main/resources/templates/fragments/PaymentScript.html
-
2src/main/resources/templates/fragments/headquartersMenu.html
-
99src/main/resources/templates/headquarters/bookingwaiting.html
-
4src/main/resources/templates/headquarters/reports.html
-
64src/main/resources/templates/headquarters/sixmonthold-transactions.html
-
18src/main/resources/templates/user/hallbookingform.html
-
155src/main/resources/templates/user/viewhistory.html
-
3530src/main/resources/templates/user/viewhistory_old.html
-
3538src/main/resources/templates/user/viewhistory_reschedulelogic.html
@ -1,3 +1,4 @@ |
|||||
{ |
{ |
||||
"java.compile.nullAnalysis.mode": "automatic" |
|
||||
|
"java.compile.nullAnalysis.mode": "automatic", |
||||
|
"java.configuration.updateBuildConfiguration": "interactive" |
||||
} |
} |
||||
@ -1 +1 @@ |
|||||
eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyVHlwZSI6ImhlYWRxdWFydGVycyIsImhhbGxJZCI6MCwiaGFsbElkcyI6IiIsIm1vYmlsZU51bWJlciI6OTUxNzUzODUyNCwiem9uZSI6IjAwIiwiZXhwIjoxNzgzOTI4NDY4fQ.JDuWljfRXzemAjgmLj4MFq3DgmL9Z1hbE8_LoLpQQ0jLZp4wBbyvmEopk9BHmWtzh8SlDN6dxQHEJDsxTRt0_Q |
|
||||
|
eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyVHlwZSI6ImhlYWRxdWFydGVycyIsImhhbGxJZCI6MCwiaGFsbElkcyI6IiIsIm1vYmlsZU51bWJlciI6OTUxNzUzODUyNCwiem9uZSI6IjAwIiwiZXhwIjoxNzg1MzI4MDYwfQ.aXxOu_OHvSMRSKZFqyQzzi9rFw8KCuC5m-Hv4QNSk36_lWZCcZJSvbPHDyQKyELJkbZdURa9p0dd6sPmDoZsLg |
||||
@ -1,843 +0,0 @@ |
|||||
<!DOCTYPE html> |
|
||||
<html xmlns:th="http://www.thymeleaf.org"> |
|
||||
|
|
||||
<head th:replace="~{fragments/head-headquarters :: head}"></head> |
|
||||
<style> |
|
||||
.nav-tabs .nav-link.active { |
|
||||
background: #1a73e8; |
|
||||
color: #fff !important; |
|
||||
border-color: #1a73e8; |
|
||||
border-radius: 6px 6px 0 0; |
|
||||
} |
|
||||
|
|
||||
.nav-tabs .nav-link { |
|
||||
color: #444; |
|
||||
font-weight: 500; |
|
||||
} |
|
||||
|
|
||||
.tab-badge { |
|
||||
background: #e8f0fe; |
|
||||
color: #1a73e8; |
|
||||
border-radius: 10px; |
|
||||
padding: 1px 8px; |
|
||||
font-size: 12px; |
|
||||
font-weight: 700; |
|
||||
margin-left: 4px; |
|
||||
} |
|
||||
|
|
||||
.nav-tabs .nav-link.active .tab-badge { |
|
||||
background: rgba(255, 255, 255, 0.25); |
|
||||
color: #fff; |
|
||||
} |
|
||||
|
|
||||
.table-responsive { |
|
||||
overflow-x: auto; |
|
||||
} |
|
||||
|
|
||||
.card-body table { |
|
||||
width: 100%; |
|
||||
} |
|
||||
|
|
||||
.card-body th, |
|
||||
td { |
|
||||
padding: 8px; |
|
||||
text-align: left; |
|
||||
} |
|
||||
|
|
||||
.amount-cell { |
|
||||
text-align: right; |
|
||||
padding-right: 1rem; |
|
||||
} |
|
||||
|
|
||||
.table { |
|
||||
width: 100% !important; |
|
||||
} |
|
||||
|
|
||||
.btn-sendmail { |
|
||||
background: #1a73e8; |
|
||||
color: #fff; |
|
||||
border: none; |
|
||||
border-radius: 4px; |
|
||||
padding: 3px 10px; |
|
||||
cursor: pointer; |
|
||||
font-size: 12px; |
|
||||
} |
|
||||
|
|
||||
.btn-sendmail:hover { |
|
||||
background: #1558b0; |
|
||||
} |
|
||||
|
|
||||
.btn-viewdetails { |
|
||||
background: #f59e0b; |
|
||||
color: #fff; |
|
||||
border: none; |
|
||||
border-radius: 4px; |
|
||||
padding: 3px 10px; |
|
||||
cursor: pointer; |
|
||||
font-size: 12px; |
|
||||
margin-right: 4px; |
|
||||
} |
|
||||
|
|
||||
.btn-viewdetails:hover { |
|
||||
background: #b45309; |
|
||||
} |
|
||||
|
|
||||
.badge-cancelled { |
|
||||
background: #dc2626; |
|
||||
color: #fff; |
|
||||
padding: 3px 8px; |
|
||||
border-radius: 10px; |
|
||||
font-size: 11px; |
|
||||
} |
|
||||
|
|
||||
.badge-rejected { |
|
||||
background: #7c3aed; |
|
||||
color: #fff; |
|
||||
padding: 3px 8px; |
|
||||
border-radius: 10px; |
|
||||
font-size: 11px; |
|
||||
} |
|
||||
|
|
||||
.badge-approved { |
|
||||
background: #16a34a; |
|
||||
color: #fff; |
|
||||
padding: 3px 8px; |
|
||||
border-radius: 10px; |
|
||||
font-size: 11px; |
|
||||
} |
|
||||
|
|
||||
.badge-other { |
|
||||
background: #64748b; |
|
||||
color: #fff; |
|
||||
padding: 3px 8px; |
|
||||
border-radius: 10px; |
|
||||
font-size: 11px; |
|
||||
} |
|
||||
|
|
||||
.not-initiated { |
|
||||
color: #dc2626; |
|
||||
font-style: italic; |
|
||||
font-size: 12px; |
|
||||
} |
|
||||
|
|
||||
/* Draft mail preview */ |
|
||||
#draftMailBody { |
|
||||
background: #f8fafc; |
|
||||
border: 1px solid #cbd5e1; |
|
||||
border-radius: 6px; |
|
||||
padding: 16px; |
|
||||
font-family: Arial, sans-serif; |
|
||||
font-size: 14px; |
|
||||
white-space: pre-wrap; |
|
||||
line-height: 1.6; |
|
||||
} |
|
||||
|
|
||||
.mail-header-row { |
|
||||
margin-bottom: 6px; |
|
||||
font-size: 13px; |
|
||||
} |
|
||||
|
|
||||
.mail-header-row strong { |
|
||||
display: inline-block; |
|
||||
width: 50px; |
|
||||
color: #475569; |
|
||||
} |
|
||||
</style> |
|
||||
|
|
||||
<body> |
|
||||
<!-- Page Container --> |
|
||||
<div id="page-container" |
|
||||
class="sidebar-o sidebar-dark enable-page-overlay side-scroll page-header-fixed page-header-dark"> |
|
||||
<!-- Side Overlay aside (right)--> |
|
||||
<aside th:replace="~{fragments/aside-right :: aside}"></aside> |
|
||||
<!-- END Side Overlay (right)--> |
|
||||
|
|
||||
<!-- Sidebar Nav--> |
|
||||
<nav th:replace="~{fragments/nav-headquarters :: nav}"></nav> |
|
||||
<!-- END Sidebar --> |
|
||||
|
|
||||
<!-- Header --> |
|
||||
<header th:replace="~{fragments/header-headquarters :: header}"></header> |
|
||||
<!-- END Header --> |
|
||||
|
|
||||
<!-- Main Container --> |
|
||||
<main id="main-container" class="container-fluid mt-4 px-4"> |
|
||||
<div class="block block-rounded"> |
|
||||
<div class="block-header block-header-default"> |
|
||||
<h3 class="block-title">6 Months Old Transaction Details</h3> |
|
||||
</div> |
|
||||
<div class="block-content"> |
|
||||
|
|
||||
<!-- ── TABS ───────────────────────────────────────────── --> |
|
||||
<ul class="nav nav-tabs mb-0" id="sixMonthTab" role="tablist"> |
|
||||
<li class="nav-item" role="presentation"> |
|
||||
<a class="nav-link active" id="tab-sixmonth-lnk" data-toggle="tab" href="#tab-sixmonth" |
|
||||
role="tab" aria-controls="tab-sixmonth" aria-selected="true"> |
|
||||
6 Month Old Bookings |
|
||||
<span class="tab-badge" |
|
||||
th:text="${sixMonthOldBookings != null ? #lists.size(sixMonthOldBookings) : 0}">0</span> |
|
||||
</a> |
|
||||
</li> |
|
||||
<li class="nav-item" role="presentation"> |
|
||||
<a class="nav-link" id="tab-cancelled-lnk" data-toggle="tab" href="#tab-cancelled" |
|
||||
role="tab" aria-controls="tab-cancelled" aria-selected="false"> |
|
||||
Cancelled Bookings |
|
||||
<span class="tab-badge" |
|
||||
th:text="${cancelledBookings != null ? #lists.size(cancelledBookings) : 0}">0</span> |
|
||||
</a> |
|
||||
</li> |
|
||||
<li class="nav-item" role="presentation"> |
|
||||
<a class="nav-link" id="tab-rejected-lnk" data-toggle="tab" href="#tab-rejected" |
|
||||
role="tab" aria-controls="tab-rejected" aria-selected="false"> |
|
||||
Rejected Bookings |
|
||||
<span class="tab-badge" |
|
||||
th:text="${rejectedBookings != null ? #lists.size(rejectedBookings) : 0}">0</span> |
|
||||
</a> |
|
||||
</li> |
|
||||
<li class="nav-item" role="presentation"> |
|
||||
<a class="nav-link" id="tab-mailsent-lnk" data-toggle="tab" href="#tab-mailsent" |
|
||||
role="tab" aria-controls="tab-mailsent" aria-selected="false"> |
|
||||
Mail Sent Bookings |
|
||||
<span class="tab-badge" |
|
||||
th:text="${mailSentBookings != null ? #lists.size(mailSentBookings) : 0}">0</span> |
|
||||
</a> |
|
||||
</li> |
|
||||
</ul> |
|
||||
|
|
||||
<div class="tab-content border border-top-0 p-3" id="sixMonthTabContent"> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════ |
|
||||
TAB 1 – 6 Month Old Bookings (non-cancelled/rejected) |
|
||||
══════════════════════════════════════════════════ --> |
|
||||
<div class="tab-pane fade show active" id="tab-sixmonth" role="tabpanel" aria-labelledby="tab-sixmonth-lnk"> |
|
||||
<div class="table-responsive"> |
|
||||
<table class="table table-bordered table-striped table-vcenter js-dataTable-responsive" |
|
||||
id="tbl-sixmonth"> |
|
||||
<thead class="thead-light"> |
|
||||
<tr> |
|
||||
<th>S.No</th> |
|
||||
<th>Zone</th> |
|
||||
<th>Division</th> |
|
||||
<th>Hall Name</th> |
|
||||
<th>Booking Date</th> |
|
||||
<th>Event Date (Start – End)</th> |
|
||||
<th>Settlement Raised Date</th> |
|
||||
<th>Refund Amount (₹)</th> |
|
||||
<th>Refund Status</th> |
|
||||
<th>Booking Status</th> |
|
||||
<th>Action</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<tr th:each="row, rowStat : ${sixMonthOldBookings}"> |
|
||||
<td class="text-center" th:text="${rowStat.index + 1}"></td> |
|
||||
<td th:text="${row['zone'] != null ? row['zone'] : ''}"></td> |
|
||||
<td th:text="${row['division'] != null ? row['division'] : ''}"></td> |
|
||||
<td th:text="${row['hall_name'] != null ? row['hall_name'] : ''}"></td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['booking_date'] != null ? row['booking_date'] : ''}"> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="(${row['event_start_date'] != null ? row['event_start_date'] : ''}) + ' – ' + (${row['event_end_date'] != null ? row['event_end_date'] : ''})"> |
|
||||
</td> |
|
||||
<!-- Settlement Raised Date: N/A if no settlement --> |
|
||||
<td class="text-center"> |
|
||||
<span th:if="${row['settlement_raised_date'] != null}" |
|
||||
th:text="${row['settlement_raised_date']}"></span> |
|
||||
<span th:if="${row['settlement_raised_date'] == null}" |
|
||||
class="not-initiated">Settlement Not Initiated</span> |
|
||||
</td> |
|
||||
<!-- Refund Amount: from settlement.refunded_amount --> |
|
||||
<td class="text-right"> |
|
||||
<span th:if="${row['refunded_amount'] != null}" |
|
||||
th:text="'₹ ' + ${row['refunded_amount']}"></span> |
|
||||
<span th:if="${row['refunded_amount'] == null}" |
|
||||
class="not-initiated">—</span> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['refund_status'] != null ? row['refund_status'] : ''}"> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<span th:classappend="${row['booking_status'] == 'CANCELED' || row['booking_status'] == 'CANCELLED'} ? 'badge-cancelled' : |
|
||||
(${row['booking_status'] == 'REJECTED'} ? 'badge-rejected' : |
|
||||
(${row['booking_status'] == 'APPROVED'} ? 'badge-approved' : 'badge-other'))" |
|
||||
th:text="${row['booking_status'] != null ? row['booking_status'] : ''}"></span> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<!-- View Details: calls getSettlementList if settlement exists --> |
|
||||
<button th:if="${row['settlement_id'] != null}" class="btn-viewdetails" |
|
||||
th:onclick="|viewSettlement(${row['settlement_id']})|"> |
|
||||
View Details |
|
||||
</button> |
|
||||
<span th:if="${row['settlement_id'] == null}" |
|
||||
class="not-initiated d-block mb-1">Settlement Not Initiated</span> |
|
||||
<button class="btn-sendmail" |
|
||||
th:onclick="|openSendMail(${row['booking_id'] != null ? row['booking_id'] : 0}, '${row['booking_status'] != null ? row['booking_status'] : ''}', '${row['txansaction_id'] != null ? row['txansaction_id'] : ''}', '${row['tpsl_txn_id'] != null ? row['tpsl_txn_id'] : ''}', '${row['transaction_date'] != null ? row['transaction_date'] : ''}', ${row['refunded_amount'] != null ? row['refunded_amount'] : 0})|"> |
|
||||
Send Mail |
|
||||
</button> |
|
||||
</td> |
|
||||
</tr> |
|
||||
<tr |
|
||||
th:if="${sixMonthOldBookings == null || #lists.isEmpty(sixMonthOldBookings)}"> |
|
||||
<td colspan="11" class="text-center text-muted py-3">No records found</td> |
|
||||
</tr> |
|
||||
</tbody> |
|
||||
</table> |
|
||||
</div> |
|
||||
</div><!-- /tab-sixmonth --> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════ |
|
||||
TAB 2 – Cancelled Bookings |
|
||||
Refund Amount = deposit_amount |
|
||||
No Settlement Raised Date column |
|
||||
══════════════════════════════════════════════════ --> |
|
||||
<div class="tab-pane fade" id="tab-cancelled" role="tabpanel" aria-labelledby="tab-cancelled-lnk"> |
|
||||
<div class="table-responsive"> |
|
||||
<table class="table table-bordered table-striped table-vcenter js-dataTable-responsive" |
|
||||
id="tbl-cancelled"> |
|
||||
<thead class="thead-light"> |
|
||||
<tr> |
|
||||
<th>S.No</th> |
|
||||
<th>Zone</th> |
|
||||
<th>Division</th> |
|
||||
<th>Hall Name</th> |
|
||||
<th>Booking Date</th> |
|
||||
<th>Event Date (Start – End)</th> |
|
||||
<th>Refund Amount (₹)</th> |
|
||||
<th>Booking Status</th> |
|
||||
<th>Action</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<tr th:each="row, rowStat : ${cancelledBookings}"> |
|
||||
<td class="text-center" th:text="${rowStat.index + 1}"></td> |
|
||||
<td th:text="${row['zone'] != null ? row['zone'] : ''}"></td> |
|
||||
<td th:text="${row['division'] != null ? row['division'] : ''}"></td> |
|
||||
<td th:text="${row['hall_name'] != null ? row['hall_name'] : ''}"></td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['booking_date'] != null ? row['booking_date'] : ''}"> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="(${row['event_start_date'] != null ? row['event_start_date'] : ''}) + ' – ' + (${row['event_end_date'] != null ? row['event_end_date'] : ''})"> |
|
||||
</td> |
|
||||
<td class="text-right" |
|
||||
th:text="${row['refund_amount'] != null ? '₹ ' + row['refund_amount'] : '—'}"> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<span class="badge-cancelled" |
|
||||
th:text="${row['booking_status'] != null ? row['booking_status'] : ''}"></span> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<button class="btn-viewdetails" |
|
||||
th:onclick="|viewBookingDetails(${row['booking_id'] != null ? row['booking_id'] : 0})|"> |
|
||||
View Details |
|
||||
</button> |
|
||||
<button class="btn-sendmail" |
|
||||
th:onclick="|openSendMail(${row['booking_id'] != null ? row['booking_id'] : 0}, '${row['booking_status'] != null ? row['booking_status'] : ''}', '${row['txansaction_id'] != null ? row['txansaction_id'] : ''}', '${row['tpsl_txn_id'] != null ? row['tpsl_txn_id'] : ''}', '${row['transaction_date'] != null ? row['transaction_date'] : ''}', ${row['refund_amount'] != null ? row['refund_amount'] : 0})|"> |
|
||||
Send Mail |
|
||||
</button> |
|
||||
</td> |
|
||||
</tr> |
|
||||
<tr th:if="${cancelledBookings == null || #lists.isEmpty(cancelledBookings)}"> |
|
||||
<td colspan="9" class="text-center text-muted py-3">No records found</td> |
|
||||
</tr> |
|
||||
</tbody> |
|
||||
</table> |
|
||||
</div> |
|
||||
</div><!-- /tab-cancelled --> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════ |
|
||||
TAB 3 – Rejected Bookings |
|
||||
Refund Amount = amount_received (full amount) |
|
||||
No Settlement Raised Date column |
|
||||
══════════════════════════════════════════════════ --> |
|
||||
<div class="tab-pane fade" id="tab-rejected" role="tabpanel" aria-labelledby="tab-rejected-lnk"> |
|
||||
<div class="table-responsive"> |
|
||||
<table class="table table-bordered table-striped table-vcenter js-dataTable-responsive" |
|
||||
id="tbl-rejected"> |
|
||||
<thead class="thead-light"> |
|
||||
<tr> |
|
||||
<th>S.No</th> |
|
||||
<th>Zone</th> |
|
||||
<th>Division</th> |
|
||||
<th>Hall Name</th> |
|
||||
<th>Booking Date</th> |
|
||||
<th>Event Date (Start – End)</th> |
|
||||
<th>Refund Amount (₹)</th> |
|
||||
<th>Booking Status</th> |
|
||||
<th>Action</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<tr th:each="row, rowStat : ${rejectedBookings}"> |
|
||||
<td class="text-center" th:text="${rowStat.index + 1}"></td> |
|
||||
<td th:text="${row['zone'] != null ? row['zone'] : ''}"></td> |
|
||||
<td th:text="${row['division'] != null ? row['division'] : ''}"></td> |
|
||||
<td th:text="${row['hall_name'] != null ? row['hall_name'] : ''}"></td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['booking_date'] != null ? row['booking_date'] : ''}"> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="(${row['event_start_date'] != null ? row['event_start_date'] : ''}) + ' – ' + (${row['event_end_date'] != null ? row['event_end_date'] : ''})"> |
|
||||
</td> |
|
||||
<td class="text-right" |
|
||||
th:text="${row['refund_amount'] != null ? '₹ ' + row['refund_amount'] : '—'}"> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<span class="badge-rejected" |
|
||||
th:text="${row['booking_status'] != null ? row['booking_status'] : ''}"></span> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<button class="btn-viewdetails" |
|
||||
th:onclick="|viewBookingDetails(${row['booking_id'] != null ? row['booking_id'] : 0})|"> |
|
||||
View Details |
|
||||
</button> |
|
||||
<button class="btn-sendmail" |
|
||||
th:onclick="|openSendMail(${row['booking_id'] != null ? row['booking_id'] : 0}, '${row['booking_status'] != null ? row['booking_status'] : ''}', '${row['txansaction_id'] != null ? row['txansaction_id'] : ''}', '${row['tpsl_txn_id'] != null ? row['tpsl_txn_id'] : ''}', '${row['transaction_date'] != null ? row['transaction_date'] : ''}', ${row['refund_amount'] != null ? row['refund_amount'] : 0})|"> |
|
||||
Send Mail |
|
||||
</button> |
|
||||
</td> |
|
||||
</tr> |
|
||||
<tr th:if="${rejectedBookings == null || #lists.isEmpty(rejectedBookings)}"> |
|
||||
<td colspan="9" class="text-center text-muted py-3">No records found</td> |
|
||||
</tr> |
|
||||
</tbody> |
|
||||
</table> |
|
||||
</div> |
|
||||
</div><!-- /tab-rejected --> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════ |
|
||||
TAB 4 – Mail Sent Bookings |
|
||||
══════════════════════════════════════════════════ --> |
|
||||
<div class="tab-pane fade" id="tab-mailsent" role="tabpanel" aria-labelledby="tab-mailsent-lnk"> |
|
||||
<div class="table-responsive"> |
|
||||
<table class="table table-bordered table-striped table-vcenter js-dataTable-responsive" |
|
||||
id="tbl-mailsent"> |
|
||||
<thead class="thead-light"> |
|
||||
<tr> |
|
||||
<th>S.No</th> |
|
||||
<th>Zone</th> |
|
||||
<th>Division</th> |
|
||||
<th>Hall Name</th> |
|
||||
<th>Booking Date</th> |
|
||||
<th>Event Date (Start – End)</th> |
|
||||
<th>Booking Status</th> |
|
||||
<th>Transaction ID</th> |
|
||||
<th>TPSL ID</th> |
|
||||
<th>Mail Sent Date</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<tr th:each="row, rowStat : ${mailSentBookings}"> |
|
||||
<td class="text-center" th:text="${rowStat.index + 1}"></td> |
|
||||
<td th:text="${row['zone'] != null ? row['zone'] : ''}"></td> |
|
||||
<td th:text="${row['division'] != null ? row['division'] : ''}"></td> |
|
||||
<td th:text="${row['hall_name'] != null ? row['hall_name'] : ''}"></td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['booking_date'] != null ? row['booking_date'] : ''}"> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="(${row['event_start_date'] != null ? row['event_start_date'] : ''}) + ' – ' + (${row['event_end_date'] != null ? row['event_end_date'] : ''})"> |
|
||||
</td> |
|
||||
<td class="text-center"> |
|
||||
<span th:classappend="${row['booking_status'] == 'CANCELED' || row['booking_status'] == 'CANCELLED'} ? 'badge-cancelled' : |
|
||||
(${row['booking_status'] == 'REJECTED'} ? 'badge-rejected' : |
|
||||
(${row['booking_status'] == 'APPROVED'} ? 'badge-approved' : 'badge-other'))" |
|
||||
th:text="${row['booking_status'] != null ? row['booking_status'] : ''}"></span> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['txansaction_id'] != null ? row['txansaction_id'] : ''}"> |
|
||||
</td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['tpsl_txn_id'] != null ? row['tpsl_txn_id'] : ''}"></td> |
|
||||
<td class="text-center" |
|
||||
th:text="${row['mail_sent_date'] != null ? row['mail_sent_date'] : ''}"> |
|
||||
</td> |
|
||||
</tr> |
|
||||
<tr th:if="${mailSentBookings == null || #lists.isEmpty(mailSentBookings)}"> |
|
||||
<td colspan="10" class="text-center text-muted py-3">No records found</td> |
|
||||
</tr> |
|
||||
</tbody> |
|
||||
</table> |
|
||||
</div> |
|
||||
</div><!-- /tab-mailsent --> |
|
||||
|
|
||||
</div><!-- /tab-content --> |
|
||||
</div><!-- /block-content --> |
|
||||
</div><!-- /block --> |
|
||||
</main> |
|
||||
<!-- END Main Container --> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════════════════════ |
|
||||
MODAL – Settlement View Details (Tab 1 with settlement) |
|
||||
══════════════════════════════════════════════════════════════════ --> |
|
||||
<div class="modal fade" id="settlementModal" data-backdrop="static" tabindex="-1" role="dialog" |
|
||||
aria-labelledby="settlementModalLabel" aria-hidden="true"> |
|
||||
<div class="modal-dialog modal-lg" role="document"> |
|
||||
<div class="modal-content"> |
|
||||
<div class="block block-rounded block-themed block-transparent mb-0"> |
|
||||
<div class="block-header bg-primary-dark"> |
|
||||
<h3 class="block-title" id="settlementModalLabel">Settlement Information</h3> |
|
||||
<div class="block-options"> |
|
||||
<button type="button" class="btn-block-option" data-dismiss="modal" aria-label="Close"> |
|
||||
<i class="fa fa-fw fa-times"></i> |
|
||||
</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="block-content row p-3" id="settlementModalBody"> |
|
||||
<!-- Populated by JS --> |
|
||||
</div> |
|
||||
<div class="block-content block-content-full text-right bg-body"> |
|
||||
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">Close</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════════════════════ |
|
||||
MODAL – Booking View Details (Tab 2 & 3 – cancelled/rejected) |
|
||||
══════════════════════════════════════════════════════════════════ --> |
|
||||
<div class="modal fade" id="bookingModal" data-backdrop="static" tabindex="-1" role="dialog" |
|
||||
aria-labelledby="bookingModalLabel" aria-hidden="true"> |
|
||||
<div class="modal-dialog modal-lg" role="document"> |
|
||||
<div class="modal-content"> |
|
||||
<div class="block block-rounded block-themed block-transparent mb-0"> |
|
||||
<div class="block-header bg-primary-dark"> |
|
||||
<h3 class="block-title" id="bookingModalLabel">Booking Information</h3> |
|
||||
<div class="block-options"> |
|
||||
<button type="button" class="btn-block-option" data-dismiss="modal" aria-label="Close"> |
|
||||
<i class="fa fa-fw fa-times"></i> |
|
||||
</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="block-content row p-3" id="bookingModalBody"> |
|
||||
<!-- Populated by JS --> |
|
||||
</div> |
|
||||
<div class="block-content block-content-full text-right bg-body"> |
|
||||
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">Close</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<!-- ══════════════════════════════════════════════════════════════════ |
|
||||
MODAL – Draft Mail Preview & Confirm |
|
||||
══════════════════════════════════════════════════════════════════ --> |
|
||||
<div class="modal fade" id="draftMailModal" data-backdrop="static" tabindex="-1" role="dialog" |
|
||||
aria-labelledby="draftMailModalLabel" aria-hidden="true"> |
|
||||
<div class="modal-dialog modal-lg" role="document"> |
|
||||
<div class="modal-content"> |
|
||||
<div class="modal-header" style="background:#1a73e8; color:#fff;"> |
|
||||
<h5 class="modal-title" id="draftMailModalLabel"> |
|
||||
<i class="fa fa-envelope mr-2"></i>Draft Mail Preview |
|
||||
</h5> |
|
||||
<button type="button" class="close text-white" data-dismiss="modal" aria-label="Close"> |
|
||||
<span aria-hidden="true">×</span> |
|
||||
</button> |
|
||||
</div> |
|
||||
<div class="modal-body"> |
|
||||
<!-- Mail Header Fields --> |
|
||||
<div class="mail-header-row"><strong>From:</strong> |
|
||||
communityhallsupport@chennaicorporation.gov.in</div> |
|
||||
<div class="mail-header-row"> |
|
||||
<strong>To:</strong> |
|
||||
pgsupport@mail.in.worldline-solutions.com, ranjithkumar@federal.bank.in, |
|
||||
megha.mattamana@federal.bank.in |
|
||||
</div> |
|
||||
<div class="mail-header-row"> |
|
||||
<strong>CC:</strong> |
|
||||
arohqcc@gmail.com, it@chennaicorporation.gov.in |
|
||||
</div> |
|
||||
<div class="mail-header-row"><strong>Sub:</strong> Refund Status Update Request – Community Hall |
|
||||
Booking</div> |
|
||||
<hr class="my-2"> |
|
||||
<!-- Mail Body --> |
|
||||
<div id="draftMailBody"></div> |
|
||||
|
|
||||
<!-- Hidden fields to carry data through to confirm step --> |
|
||||
<input type="hidden" id="dm_bookingId"> |
|
||||
<input type="hidden" id="dm_bookingStatus"> |
|
||||
<input type="hidden" id="dm_transactionId"> |
|
||||
<input type="hidden" id="dm_tpslId"> |
|
||||
<input type="hidden" id="dm_refundAmount"> |
|
||||
</div> |
|
||||
<div class="modal-footer"> |
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal"> |
|
||||
<i class="fa fa-times mr-1"></i>Close |
|
||||
</button> |
|
||||
<button type="button" class="btn btn-primary" id="btn-confirm-mail" onclick="confirmMailSent()"> |
|
||||
<i class="fa fa-check mr-1"></i>Confirm & Mark as Mail Sent |
|
||||
</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<!-- File Preview Modal (for settlement images) --> |
|
||||
<div class="modal fade" id="fileModal" tabindex="-1" role="dialog" aria-hidden="true"> |
|
||||
<div class="modal-dialog modal-lg"> |
|
||||
<div class="modal-content"> |
|
||||
<div class="modal-header"> |
|
||||
<h5 class="modal-title">File Preview</h5> |
|
||||
<button type="button" class="close" data-dismiss="modal"><span>×</span></button> |
|
||||
</div> |
|
||||
<div class="modal-body"> |
|
||||
<embed id="filePreview" src="" width="100%" height="600px"> |
|
||||
</div> |
|
||||
<div class="modal-footer"> |
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<footer th:replace="~{fragments/footer2 :: footer}"></footer> |
|
||||
</div> |
|
||||
<!-- END Page Container --> |
|
||||
|
|
||||
<div th:replace="~{fragments/resetpassword :: div}"></div> |
|
||||
<script th:replace="~{fragments/loginscript :: script}"></script> |
|
||||
|
|
||||
<script> |
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
// DataTable initialisation & Tab Switch Handlers |
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
$(document).ready(function () { |
|
||||
var dtButtons = [ |
|
||||
{ extend: 'pageLength', className: 'btn btn-primary' }, |
|
||||
{ extend: 'copyHtml5', text: 'Copy', className: 'btn btn-primary' }, |
|
||||
{ extend: 'excelHtml5', text: 'Excel', className: 'btn btn-primary' }, |
|
||||
{ extend: 'csvHtml5', text: 'CSV', className: 'btn btn-primary' }, |
|
||||
{ extend: 'pdfHtml5', text: 'PDF', className: 'btn btn-primary' } |
|
||||
]; |
|
||||
var dtOpts = { |
|
||||
dom: 'Bftip', |
|
||||
columnDefs: [{ targets: 'no-sort', orderable: false }], |
|
||||
lengthMenu: [[50, 100, 200, 500, -1], ['50 rows', '100 rows', '200 rows', '500 rows', 'Show all']], |
|
||||
buttons: dtButtons, |
|
||||
responsive: true, |
|
||||
searching: true, |
|
||||
autoWidth: false |
|
||||
}; |
|
||||
|
|
||||
// Initialize DataTables |
|
||||
$('#tbl-sixmonth').DataTable(dtOpts); |
|
||||
$('#tbl-cancelled').DataTable(dtOpts); |
|
||||
$('#tbl-rejected').DataTable(dtOpts); |
|
||||
$('#tbl-mailsent').DataTable(dtOpts); |
|
||||
|
|
||||
// Explicit click handler to guarantee tab activation |
|
||||
$('#sixMonthTab a').on('click', function (e) { |
|
||||
e.preventDefault(); |
|
||||
$(this).tab('show'); |
|
||||
}); |
|
||||
|
|
||||
// Recalculate columns and responsive layout whenever any tab is shown |
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { |
|
||||
var targetTab = $(e.target).attr('href'); |
|
||||
if (targetTab && $.fn.dataTable) { |
|
||||
try { |
|
||||
$(targetTab).find('table').each(function () { |
|
||||
if ($.fn.dataTable.isDataTable(this)) { |
|
||||
$(this).DataTable().columns.adjust().responsive.recalc(); |
|
||||
} |
|
||||
}); |
|
||||
} catch (err) { |
|
||||
console.log('Error adjusting table columns on tab switch:', err); |
|
||||
} |
|
||||
} |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
// View Settlement Details (Tab 1 – uses /getSettlementList by settlementId) |
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
function viewSettlement(settlementId) { |
|
||||
$.ajax({ |
|
||||
type: 'GET', |
|
||||
url: '/communityhall/api/officer/getSettlementList', |
|
||||
data: { settlementsid: settlementId }, |
|
||||
success: function (data) { |
|
||||
populateSettlementModal(data); |
|
||||
$('#settlementModal').modal('show'); |
|
||||
}, |
|
||||
error: function () { |
|
||||
Swal.fire('Error', 'Failed to fetch settlement details.', 'error'); |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
function populateSettlementModal(d) { |
|
||||
var html = '<div class="col-12">'; |
|
||||
html += '<table class="table table-sm table-bordered">'; |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">User Details</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">User Name:</th><td>' + (d.users ? d.users.name : '') + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Mobile No:</th><td>' + (d.users ? d.users.mobileNo : '') + '</td></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">User Type:</th><td colspan="3">' + (d.users ? d.users.usertype : '') + '</td></tr>'; |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">Hall Details</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Hall Name:</th><td colspan="3">' + (d.hallDetails ? d.hallDetails.hallName : '') + '</td></tr>'; |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">Booking Details (ID: ' + d.bookingId + ')</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Booking Date:</th><td>' + d.bookingDate + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Deposit Amount:</th><td>₹ ' + parseFloat(d.depositAmount).toFixed(2) + '</td></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Start Date:</th><td>' + d.startDate + '</td>'; |
|
||||
html += '<th style="font-weight:normal">End Date:</th><td>' + d.endDate + '</td></tr>'; |
|
||||
// Settlement |
|
||||
if (d.settlement) { |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">Settlement Details</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Refunded Amount:</th><td>₹ ' + parseFloat(d.settlement.refundedAmount || 0).toFixed(2) + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Damage Amount:</th><td>₹ ' + parseFloat(d.settlement.damageAmount || 0).toFixed(2) + '</td></tr>'; |
|
||||
} else { |
|
||||
html += '<tr><td colspan="4" class="text-danger text-center font-italic">Settlement Not Initiated</td></tr>'; |
|
||||
} |
|
||||
html += '</table></div>'; |
|
||||
$('#settlementModalBody').html(html); |
|
||||
} |
|
||||
|
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
// View Booking Details (Tab 2 & 3 – uses /getBookingDetails by bookingId) |
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
function viewBookingDetails(bookingId) { |
|
||||
if (!bookingId || bookingId === 0) { |
|
||||
Swal.fire('Warning', 'Invalid Booking ID.', 'warning'); |
|
||||
return; |
|
||||
} |
|
||||
$.ajax({ |
|
||||
type: 'GET', |
|
||||
url: '/communityhall/api/officer/getBookingDetails', |
|
||||
data: { bookingsId: bookingId }, |
|
||||
success: function (data) { |
|
||||
populateBookingModal(data); |
|
||||
$('#bookingModal').modal('show'); |
|
||||
}, |
|
||||
error: function () { |
|
||||
Swal.fire('Error', 'Failed to fetch booking details.', 'error'); |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
function populateBookingModal(d) { |
|
||||
var html = '<div class="col-12">'; |
|
||||
html += '<table class="table table-sm table-bordered">'; |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">User Details</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">User Name:</th><td>' + (d.users ? d.users.name : '') + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Mobile No:</th><td>' + (d.users ? d.users.mobileNo : '') + '</td></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">User Type:</th><td colspan="3">' + (d.users ? d.users.usertype : '') + '</td></tr>'; |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">Hall Details</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Hall Name:</th><td colspan="3">' + (d.hallDetails ? d.hallDetails.hallName : '') + '</td></tr>'; |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">Booking Details (ID: ' + d.bookingId + ')</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Booking Date:</th><td>' + d.bookingDate + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Booking Status:</th><td>' + d.bookingStatus + '</td></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Start Date:</th><td>' + d.startDate + '</td>'; |
|
||||
html += '<th style="font-weight:normal">End Date:</th><td>' + d.endDate + '</td></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Deposit Amount:</th><td>₹ ' + parseFloat(d.depositAmount).toFixed(2) + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Total Amount:</th><td>₹ ' + parseFloat(d.amountReceived).toFixed(2) + '</td></tr>'; |
|
||||
// Payment |
|
||||
if (d.payments) { |
|
||||
html += '<tr><th colspan="4" style="background:#f2f2f2;">Payment Details</th></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Transaction ID:</th><td colspan="3">' + d.payments.transactionId + '</td></tr>'; |
|
||||
html += '<tr><th style="font-weight:normal">Amount Received:</th><td>₹ ' + d.payments.amountReceived + '</td>'; |
|
||||
html += '<th style="font-weight:normal">Payment Status:</th><td>' + d.payments.paymentStatus + '</td></tr>'; |
|
||||
} |
|
||||
html += '</table></div>'; |
|
||||
$('#bookingModalBody').html(html); |
|
||||
} |
|
||||
|
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
// Send Mail Flow |
|
||||
// ───────────────────────────────────────────────────────────────────── |
|
||||
function openSendMail(bookingId, bookingStatus, transactionId, tpslId, transactionDate, refundAmount) { |
|
||||
Swal.fire({ |
|
||||
title: 'Send Refund Follow-up Mail?', |
|
||||
html: 'This will send a refund status request mail for Booking ID <strong>' + bookingId + '</strong>.<br>Do you want to proceed?', |
|
||||
icon: 'question', |
|
||||
showCancelButton: true, |
|
||||
confirmButtonText: 'Yes, Show Draft', |
|
||||
cancelButtonText: 'Cancel', |
|
||||
confirmButtonColor: '#1a73e8' |
|
||||
}).then(function (result) { |
|
||||
if (result.isConfirmed) { |
|
||||
showDraftMail(bookingId, bookingStatus, transactionId, tpslId, transactionDate, refundAmount); |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
function showDraftMail(bookingId, bookingStatus, transactionId, tpslId, transactionDate, refundAmount) { |
|
||||
document.getElementById('dm_bookingId').value = bookingId; |
|
||||
document.getElementById('dm_bookingStatus').value = bookingStatus; |
|
||||
document.getElementById('dm_transactionId').value = transactionId || ''; |
|
||||
document.getElementById('dm_tpslId').value = tpslId || ''; |
|
||||
document.getElementById('dm_refundAmount').value = refundAmount || 0; |
|
||||
|
|
||||
var amt = parseFloat(refundAmount || 0).toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); |
|
||||
|
|
||||
var body = 'Hi,\n\n'; |
|
||||
body += 'Kindly update refund status for the foresaid transaction made for Community Hall Booking.\n\n'; |
|
||||
body += 'Transaction Details:\n\n'; |
|
||||
body += ' Transaction ID : ' + (transactionId || 'N/A') + '\n'; |
|
||||
body += ' TPSL ID : ' + (tpslId || 'N/A') + '\n'; |
|
||||
body += ' Transaction Date : ' + (transactionDate || 'N/A') + '\n'; |
|
||||
body += ' Refund Amount : ₹ ' + amt + '\n\n'; |
|
||||
body += 'If refund was not initiated, kindly initiate the refund and update refund status at the earliest. '; |
|
||||
body += 'Make sure that no duplicate refund was processed against this transaction.\n\n'; |
|
||||
body += 'Regards,\n'; |
|
||||
body += 'Community Hall Support\n'; |
|
||||
body += 'Greater Chennai Corporation'; |
|
||||
|
|
||||
document.getElementById('draftMailBody').textContent = body; |
|
||||
$('#draftMailModal').modal('show'); |
|
||||
} |
|
||||
|
|
||||
function confirmMailSent() { |
|
||||
var bookingId = document.getElementById('dm_bookingId').value; |
|
||||
var bookingStatus = document.getElementById('dm_bookingStatus').value; |
|
||||
var transactionId = document.getElementById('dm_transactionId').value; |
|
||||
var tpslId = document.getElementById('dm_tpslId').value; |
|
||||
var refundAmount = document.getElementById('dm_refundAmount').value; |
|
||||
|
|
||||
var mailTo = "pgsupport@mail.in.worldline-solutions.com,ranjithkumar@federal.bank.in,megha.mattamana@federal.bank.in"; |
|
||||
var mailCc = "arohqcc@gmail.com,it@chennaicorporation.gov.in"; |
|
||||
var mailSubject = "Refund Status Update Request – Community Hall Booking"; |
|
||||
var mailBody = document.getElementById('draftMailBody').textContent; |
|
||||
var mailtoLink = "mailto:" + mailTo + "?cc=" + mailCc + "&subject=" + encodeURIComponent(mailSubject) + "&body=" + encodeURIComponent(mailBody); |
|
||||
|
|
||||
window.location.href = mailtoLink; |
|
||||
document.getElementById('btn-confirm-mail').disabled = true; |
|
||||
|
|
||||
$.ajax({ |
|
||||
type: 'POST', |
|
||||
url: '/communityhall/headquarters/sixmonthold-transactions/markMailSent', |
|
||||
data: { |
|
||||
bookingId: bookingId, |
|
||||
bookingStatus: bookingStatus, |
|
||||
transactionId: transactionId, |
|
||||
tpslId: tpslId, |
|
||||
refundAmount: refundAmount |
|
||||
}, |
|
||||
success: function (resp) { |
|
||||
$('#draftMailModal').modal('hide'); |
|
||||
if (resp.status === 'success') { |
|
||||
Swal.fire({ |
|
||||
icon: 'success', |
|
||||
title: 'Mail Recorded!', |
|
||||
text: 'Booking ID ' + bookingId + ' has been moved to "Mail Sent Bookings" tab.', |
|
||||
confirmButtonColor: '#1a73e8' |
|
||||
}).then(function () { |
|
||||
location.reload(); |
|
||||
}); |
|
||||
} else { |
|
||||
Swal.fire('Error', resp.message || 'An error occurred.', 'error'); |
|
||||
document.getElementById('btn-confirm-mail').disabled = false; |
|
||||
} |
|
||||
}, |
|
||||
error: function () { |
|
||||
Swal.fire('Error', 'Failed to mark mail as sent. Please try again.', 'error'); |
|
||||
document.getElementById('btn-confirm-mail').disabled = false; |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
</script> |
|
||||
</body> |
|
||||
|
|
||||
</html> |
|
||||
3530
src/main/resources/templates/user/viewhistory_old.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
3538
src/main/resources/templates/user/viewhistory_reschedulelogic.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue