Browse Source
implemented dashboard for vph and added script for downloading scripts for total
master
implemented dashboard for vph and added script for downloading scripts for total
master
5 changed files with 741 additions and 1 deletions
-
22src/main/java/com/gcc/commissionerreview/controller/MainController.java
-
45src/main/java/com/gcc/commissionerreview/controller/VphApiController.java
-
162src/main/java/com/gcc/commissionerreview/service/VphService.java
-
4src/main/resources/templates/modules/pet/petreport.html
-
509src/main/resources/templates/modules/vphreport.html
@ -0,0 +1,45 @@ |
|||||
|
package com.gcc.commissionerreview.controller; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.http.HttpStatus; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
|
||||
|
import com.gcc.commissionerreview.service.VphService; |
||||
|
|
||||
|
@RestController |
||||
|
@RequestMapping("/commissionerreview/api") |
||||
|
public class VphApiController { |
||||
|
|
||||
|
@Autowired |
||||
|
private VphService vphservice; |
||||
|
|
||||
|
// ak |
||||
|
@GetMapping("/visitor-category") |
||||
|
public List<Map<String, Object>> visitorCategory( |
||||
|
@RequestParam String fromDate, |
||||
|
@RequestParam String toDate) { |
||||
|
return vphservice.getVisitorCategory(fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/total-visitors") |
||||
|
public List<Map<String, Object>> totalVisitors( |
||||
|
@RequestParam String fromDate, |
||||
|
@RequestParam String toDate) { |
||||
|
return vphservice.getTotalVisitors(fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/hall-bookings") |
||||
|
public List<Map<String, Object>> hallBookings( |
||||
|
@RequestParam String fromDate, |
||||
|
@RequestParam String toDate) { |
||||
|
return vphservice.getHallBookings(fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,162 @@ |
|||||
|
package com.gcc.commissionerreview.service; |
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
|
||||
|
import javax.imageio.ImageIO; |
||||
|
import javax.sql.DataSource; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.beans.factory.annotation.Qualifier; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
import org.springframework.jdbc.core.JdbcTemplate; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
@Service |
||||
|
public class VphService { |
||||
|
|
||||
|
@Autowired |
||||
|
private JdbcTemplate jdbcTemplate; |
||||
|
|
||||
|
@Autowired |
||||
|
public void setFeedbackDataSource(@Qualifier("mysqlVphDataSource") DataSource dataSource) { |
||||
|
this.jdbcTemplate = new JdbcTemplate(dataSource); |
||||
|
} |
||||
|
|
||||
|
public List<Map<String, Object>> getVisitorCategory(String fromDate, String toDate) { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT DATE_FORMAT(rd.visit_date,'%d-%m-%Y') AS visitDate, |
||||
|
COALESCE(SUM(CASE WHEN vac.user_type='Adult ' THEN vcd.no_of_people END),0) Adult, |
||||
|
COALESCE(SUM(CASE WHEN vac.user_type='Children [ below 10 year]' THEN vcd.no_of_people END),0) Children, |
||||
|
COALESCE(SUM(CASE WHEN vac.user_type='Senior Citizen [above 60+]' THEN vcd.no_of_people END),0) SeniorCitizen, |
||||
|
COALESCE(SUM(CASE WHEN vac.user_type='Students' THEN vcd.no_of_people END),0) Students, |
||||
|
COALESCE(SUM(CASE WHEN vac.user_type='Foreigner' THEN vcd.no_of_people END),0) Foreigner, |
||||
|
COALESCE(SUM(CASE WHEN vac.user_type='Physically challeged' THEN vcd.no_of_people END),0) PhysicallyChallenged, |
||||
|
COALESCE(SUM(vcd.no_of_people),0) TotalCount |
||||
|
FROM reg_details rd |
||||
|
LEFT JOIN visitor_count_details vcd ON rd.ref_id=vcd.ref_id |
||||
|
LEFT JOIN visit_amount_config vac ON vcd.user_type_id=vac.id |
||||
|
WHERE rd.booking_flag='B' |
||||
|
AND DATE(rd.visit_date) BETWEEN ? AND ? |
||||
|
GROUP BY rd.visit_date |
||||
|
ORDER BY rd.visit_date |
||||
|
"""; |
||||
|
|
||||
|
return jdbcTemplate.queryForList(sql, fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
public List<Map<String, Object>> getTotalVisitors(String fromDate, String toDate) { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT DATE_FORMAT(visit_date,'%d-%m-%Y') visitDate, |
||||
|
SUM(no_of_people) RegisteredCount |
||||
|
FROM reg_details |
||||
|
WHERE booking_flag='B' |
||||
|
AND DATE(visit_date) BETWEEN ? AND ? |
||||
|
GROUP BY visit_date |
||||
|
ORDER BY visit_date |
||||
|
"""; |
||||
|
|
||||
|
return jdbcTemplate.queryForList(sql, fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
public List<Map<String, Object>> getHallBookings(String fromDate, String toDate) { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT hd.hall_name, |
||||
|
us.name userName, |
||||
|
DATE_FORMAT(bd.booking_date,'%d-%m-%Y') bookingDate, |
||||
|
DATE_FORMAT(bd.end_date,'%d-%m-%Y') eventDate |
||||
|
FROM booking_details bd |
||||
|
LEFT JOIN hall_details hd ON bd.hall_details_hall_id=hd.hall_id |
||||
|
LEFT JOIN users us ON bd.users_user_id=us.user_id |
||||
|
WHERE bd.booking_status IN ('WAITING_FOR_NOC','APPROVED') |
||||
|
AND DATE(bd.booking_date) BETWEEN ? AND ? |
||||
|
ORDER BY bd.booking_date |
||||
|
"""; |
||||
|
|
||||
|
return jdbcTemplate.queryForList(sql, fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
// card |
||||
|
public Map<String, Integer> getCategoryTotalsTillToday() { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT |
||||
|
IFNULL(vac.user_type, 'TOTAL') AS userCategory, |
||||
|
COALESCE(SUM(rd.no_of_people), 0) AS registeredCount |
||||
|
FROM reg_details rd |
||||
|
LEFT JOIN visitor_count_details vcd ON rd.ref_id = vcd.ref_id |
||||
|
LEFT JOIN visit_amount_config vac ON vcd.user_type_id = vac.id |
||||
|
WHERE rd.booking_flag = 'B' |
||||
|
AND date(rd.cdate) <= CURDATE() |
||||
|
GROUP BY vac.user_type WITH ROLLUP |
||||
|
"""; |
||||
|
|
||||
|
Map<String, Integer> result = new HashMap<>(); |
||||
|
|
||||
|
jdbcTemplate.query(sql, rs -> { |
||||
|
result.put( |
||||
|
rs.getString("userCategory"), |
||||
|
rs.getInt("registeredCount")); |
||||
|
}); |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/* ================= HALL BOOKING COUNT ================= */ |
||||
|
public int getHallBookingCountTillToday() { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT COUNT(*) |
||||
|
FROM booking_details |
||||
|
WHERE booking_status IN ('WAITING_FOR_NOC', 'APPROVED') |
||||
|
AND DATE(booking_date) <= CURDATE() |
||||
|
"""; |
||||
|
|
||||
|
return jdbcTemplate.queryForObject(sql, Integer.class); |
||||
|
} |
||||
|
|
||||
|
// visitor |
||||
|
public Map<String, Integer> getVisitorTotalsTillToday() { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT |
||||
|
IFNULL(vac.user_type, 'TOTAL') AS userCategory, |
||||
|
COALESCE(SUM(rd.accepted_people), 0) AS registeredCount |
||||
|
FROM reg_details rd |
||||
|
LEFT JOIN visitor_count_details vcd ON rd.ref_id = vcd.ref_id |
||||
|
LEFT JOIN visit_amount_config vac ON vcd.user_type_id = vac.id |
||||
|
WHERE rd.booking_flag = 'B' |
||||
|
AND date(rd.visit_date) <= CURDATE() |
||||
|
GROUP BY vac.user_type WITH ROLLUP |
||||
|
"""; |
||||
|
|
||||
|
Map<String, Integer> result = new HashMap<>(); |
||||
|
|
||||
|
jdbcTemplate.query(sql, rs -> { |
||||
|
result.put( |
||||
|
rs.getString("userCategory"), |
||||
|
rs.getInt("registeredCount")); |
||||
|
}); |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/* ================= HALL BOOKING COUNT ================= */ |
||||
|
public int getVisitorBookingCountTillToday() { |
||||
|
|
||||
|
String sql = """ |
||||
|
SELECT COUNT(*) |
||||
|
FROM booking_details |
||||
|
WHERE booking_status IN ('WAITING_FOR_NOC', 'APPROVED') |
||||
|
AND DATE(booking_date) <= CURDATE() |
||||
|
"""; |
||||
|
|
||||
|
return jdbcTemplate.queryForObject(sql, Integer.class); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,509 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<title>Victoria MIS Dashboard</title> |
||||
|
|
||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> |
||||
|
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"> |
||||
|
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"> |
||||
|
|
||||
|
</head> |
||||
|
<style> |
||||
|
/* Override Bootstrap table-primary */ |
||||
|
.table-primary { |
||||
|
background-color: #003366 !important; |
||||
|
color: #ffffff; |
||||
|
/* text color */ |
||||
|
} |
||||
|
|
||||
|
.table-primary th { |
||||
|
background-color: #003366 !important; |
||||
|
color: #ffffff !important; |
||||
|
border-color: #002244; |
||||
|
} |
||||
|
</style> |
||||
|
|
||||
|
<body> |
||||
|
<div class="container-fluid mt-4"> |
||||
|
<div class="card"> |
||||
|
<div class="card-body"> |
||||
|
|
||||
|
<!--<h4 class="mb-3">Victoria Dashboard</h4> |
||||
|
|
||||
|
<div class="row mb-3"> |
||||
|
<div class="col-md-3"><input type="date" id="fromDate" class="form-control"></div> |
||||
|
<div class="col-md-3"><input type="date" id="toDate" class="form-control"></div> |
||||
|
<div class="col-md-2"> |
||||
|
<button class="btn btn-primary" onclick="loadVictoriaMIS()">Load</button> |
||||
|
</div> |
||||
|
</div>--> |
||||
|
<!-- HEADER + DATE FILTER ROW --> |
||||
|
<!-- HEADER + DATE FILTER ROW --> |
||||
|
<div class="row align-items-center mb-3"> |
||||
|
|
||||
|
<!-- LEFT (empty spacer) --> |
||||
|
<div class="col-md-3"></div> |
||||
|
|
||||
|
<!-- CENTER : TITLE --> |
||||
|
<div class="col-md-6 text-center"> |
||||
|
<h4 class="mb-0 fw-bold">Victoria Public Hall</h4> |
||||
|
</div> |
||||
|
|
||||
|
<!-- RIGHT : DATE FILTERS --> |
||||
|
<div class="col-md-3"> |
||||
|
<div class="d-flex justify-content-end gap-2"> |
||||
|
<input type="date" id="fromDate" class="form-control w-auto"> |
||||
|
<input type="date" id="toDate" class="form-control w-auto"> |
||||
|
<button class="btn btn-primary" onclick="loadVictoriaMIS()">Load</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
<!--category wise visitor count--> |
||||
|
<div class="row row-cols-1 row-cols-md-4 row-cols-lg-8 g-3 mb-4"> |
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm "> |
||||
|
<div class="card-body"> |
||||
|
<h6><b>Total Visitors</b></h6> |
||||
|
<!--<h4 th:text="${categoryTotals['TOTAL']}">0</h4>--> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${categoryTotals['TOTAL']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${visitorTotals['TOTAL']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Senior Citizen</h6> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" |
||||
|
th:text="${categoryTotals['Senior Citizen [above 60+]']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" |
||||
|
th:text="${visitorTotals['Senior Citizen [above 60+]']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Adult</h6> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${categoryTotals['Adult ']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${visitorTotals['Adult ']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Children</h6> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" |
||||
|
th:text="${categoryTotals['Children [ below 10 year]']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" |
||||
|
th:text="${visitorTotals['Children [ below 10 year]']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Students</h6> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${categoryTotals['Students']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${visitorTotals['Students']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Foreigner</h6> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${categoryTotals['Foreigner']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" th:text="${visitorTotals['Foreigner']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Physically Challenged</h6> |
||||
|
<p class="mb-1">Registered count : |
||||
|
<b class="text-twitter fw-700 mt-3" |
||||
|
th:text="${categoryTotals['Physically challeged']}">0</b> |
||||
|
</p> |
||||
|
<p class="mb-0">Visitor count : |
||||
|
<b class="text-twitter fw-700 mt-3" |
||||
|
th:text="${visitorTotals['Physically challeged']}">0</b> |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6><b>Hall Bookings</b></h6> |
||||
|
<h4 th:text="${hallBookingCount}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<!--visitor wise count--> |
||||
|
<!-- <div class="row row-cols-1 row-cols-md-4 row-cols-lg-8 g-3 mb-4"> |
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm "> |
||||
|
<div class="card-body"> |
||||
|
<h6><b>Total Visitors</b></h6> |
||||
|
<h4 th:text="${visitorTotals['TOTAL']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Senior Citizen</h6> |
||||
|
<h4 th:text="${visitorTotals['Senior Citizen [above 60+]']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Adult</h6> |
||||
|
<h4 th:text="${visitorTotals['Adult ']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Children</h6> |
||||
|
<h4 th:text="${visitorTotals['Children [ below 10 year]']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Students</h6> |
||||
|
<h4 th:text="${visitorTotals['Students']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Foreigner</h6> |
||||
|
<h4 th:text="${visitorTotals['Foreigner']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6>Physically Challenged</h6> |
||||
|
<h4 th:text="${visitorTotals['Physically challeged']}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="col"> |
||||
|
<div class="card text-center shadow-sm"> |
||||
|
<div class="card-body"> |
||||
|
<h6><b>Hall Bookings</b></h6> |
||||
|
<h4 th:text="${visitorBookingCount}">0</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div>--> |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
<!-- ================= TABLE 1 ================= --> |
||||
|
<h5>Visitor Booking Details – Category Wise</h5> |
||||
|
<div id="t1Export"></div> |
||||
|
|
||||
|
<table class="table table-bordered" id="visitorTable"> |
||||
|
<thead class="table-primary"> |
||||
|
<tr> |
||||
|
<th>Date</th> |
||||
|
<th>Adult</th> |
||||
|
<th>Children</th> |
||||
|
<th>Senior Citizen</th> |
||||
|
<th>Students</th> |
||||
|
<th>Foreigner</th> |
||||
|
<th>Physically Challenged</th> |
||||
|
<th>Total</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody></tbody> |
||||
|
</table> |
||||
|
|
||||
|
<!-- ================= TABLE 2 ================= --> |
||||
|
<!--<h5 class="mt-4">Total Visitors Per Date</h5> |
||||
|
<div id="t2Export"></div> |
||||
|
|
||||
|
<table class="table table-bordered" id="totalVisitorTable"> |
||||
|
<thead class="table-secondary"> |
||||
|
<tr> |
||||
|
<th>Date</th> |
||||
|
<th>Total Visitors</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody></tbody> |
||||
|
</table>--> |
||||
|
|
||||
|
<!-- ================= TABLE 3 ================= --> |
||||
|
<h5 class="mt-4">Hall Booking Details</h5> |
||||
|
<div id="t3Export"></div> |
||||
|
|
||||
|
<table class="table table-bordered" id="hallTable"> |
||||
|
<thead class="table-primary"> |
||||
|
<tr> |
||||
|
<th>Hall Name</th> |
||||
|
<th>User Name</th> |
||||
|
<th>Booking Date</th> |
||||
|
<th>Event Date</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody></tbody> |
||||
|
</table> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> |
||||
|
|
||||
|
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script> |
||||
|
|
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script> |
||||
|
<!-- SweetAlert --> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> |
||||
|
|
||||
|
<script> |
||||
|
$(document).ready(function () { |
||||
|
|
||||
|
// ✅ Set default date = today |
||||
|
const today = new Date().toISOString().split('T')[0]; |
||||
|
$("#fromDate").val(today); |
||||
|
$("#toDate").val(today); |
||||
|
|
||||
|
// ✅ Load data on page load |
||||
|
loadVictoriaMIS(); |
||||
|
}); |
||||
|
|
||||
|
function loadVictoriaMIS() { |
||||
|
|
||||
|
const fromDate = $("#fromDate").val(); |
||||
|
const toDate = $("#toDate").val(); |
||||
|
|
||||
|
if (!fromDate || !toDate) { |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: 'Select From & To date', |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
if (fromDate > toDate) { |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: 'From date should be less than To date', |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
loadVisitorCategory(fromDate, toDate); |
||||
|
loadTotalVisitors(fromDate, toDate); |
||||
|
loadHallBookings(fromDate, toDate); |
||||
|
} |
||||
|
|
||||
|
/* ================= TABLE 1 ================= */ |
||||
|
function loadVisitorCategory(fromDate, toDate) { |
||||
|
|
||||
|
if ($.fn.DataTable.isDataTable('#visitorTable')) { |
||||
|
$('#visitorTable').DataTable().clear().destroy(); |
||||
|
$("#t1Export").empty(); |
||||
|
} |
||||
|
|
||||
|
$("#visitorTable tbody").empty(); |
||||
|
|
||||
|
$.ajax({ |
||||
|
url: "/commissionerreview/api/visitor-category", |
||||
|
method: "GET", |
||||
|
data: { fromDate, toDate }, |
||||
|
success: function (data) { |
||||
|
|
||||
|
$.each(data, function (i, r) { |
||||
|
$("#visitorTable tbody").append(` |
||||
|
<tr> |
||||
|
<td>${r.visitDate}</td> |
||||
|
<td>${r.Adult}</td> |
||||
|
<td>${r.Children}</td> |
||||
|
<td>${r.SeniorCitizen}</td> |
||||
|
<td>${r.Students}</td> |
||||
|
<td>${r.Foreigner}</td> |
||||
|
<td>${r.PhysicallyChallenged}</td> |
||||
|
<td><b>${r.TotalCount}</b></td> |
||||
|
</tr> |
||||
|
`); |
||||
|
}); |
||||
|
|
||||
|
$('#visitorTable').DataTable({ |
||||
|
paging: true, // ✅ enable pagination |
||||
|
pageLength: 10, // default rows |
||||
|
lengthMenu: [10, 25, 50, 100], |
||||
|
searching: true, |
||||
|
ordering: true, |
||||
|
dom: 'Bfrtip', |
||||
|
buttons: [{ |
||||
|
extend: 'excelHtml5', |
||||
|
text: 'Download Excel' |
||||
|
}, { |
||||
|
extend: 'pdfHtml5', |
||||
|
text: 'Download PDF' |
||||
|
}] |
||||
|
}).buttons().container().appendTo('#t1Export'); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/* ================= TABLE 2 ================= */ |
||||
|
function loadTotalVisitors(fromDate, toDate) { |
||||
|
|
||||
|
if ($.fn.DataTable.isDataTable('#totalVisitorTable')) { |
||||
|
$('#totalVisitorTable').DataTable().clear().destroy(); |
||||
|
$("#t2Export").empty(); |
||||
|
} |
||||
|
|
||||
|
$("#totalVisitorTable tbody").empty(); |
||||
|
|
||||
|
$.ajax({ |
||||
|
url: "/commissionerreview/api/total-visitors", |
||||
|
method: "GET", |
||||
|
data: { fromDate, toDate }, |
||||
|
success: function (data) { |
||||
|
$.each(data, function (i, r) { |
||||
|
$("#totalVisitorTable tbody").append(` |
||||
|
<tr> |
||||
|
<td>${r.visitDate}</td> |
||||
|
<td><b>${r.RegisteredCount}</b></td> |
||||
|
</tr> |
||||
|
`); |
||||
|
}); |
||||
|
|
||||
|
$('#totalVisitorTable').DataTable({ |
||||
|
paging: false, searching: false, ordering: false, |
||||
|
dom: 'Bfrtip', |
||||
|
buttons: [{ |
||||
|
extend: 'excelHtml5', |
||||
|
text: 'Download Excel' |
||||
|
}, { |
||||
|
extend: 'pdfHtml5', |
||||
|
text: 'Download PDF' |
||||
|
}] |
||||
|
}).buttons().container().appendTo('#t2Export'); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/* ================= TABLE 3 ================= */ |
||||
|
function loadHallBookings(fromDate, toDate) { |
||||
|
|
||||
|
if ($.fn.DataTable.isDataTable('#hallTable')) { |
||||
|
$('#hallTable').DataTable().clear().destroy(); |
||||
|
$("#t3Export").empty(); |
||||
|
} |
||||
|
|
||||
|
$("#hallTable tbody").empty(); |
||||
|
|
||||
|
$.ajax({ |
||||
|
url: "/commissionerreview/api/hall-bookings", |
||||
|
method: "GET", |
||||
|
data: { fromDate, toDate }, |
||||
|
success: function (data) { |
||||
|
$.each(data, function (i, r) { |
||||
|
$("#hallTable tbody").append(` |
||||
|
<tr> |
||||
|
<td>${r.hall_name}</td> |
||||
|
<td>${r.userName}</td> |
||||
|
<td>${r.bookingDate}</td> |
||||
|
<td>${r.eventDate}</td> |
||||
|
</tr> |
||||
|
`); |
||||
|
}); |
||||
|
|
||||
|
$('#hallTable').DataTable({ |
||||
|
paging: false, searching: false, ordering: false, |
||||
|
dom: 'Bfrtip', |
||||
|
buttons: [{ |
||||
|
extend: 'excelHtml5', |
||||
|
|
||||
|
text: 'Download Excel' |
||||
|
}, { |
||||
|
extend: 'pdfHtml5', |
||||
|
|
||||
|
text: 'Download PDF' |
||||
|
}] |
||||
|
}).buttons().container().appendTo('#t3Export'); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
</script> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue