Browse Source

first commit at GCC Shelter

master
Dizho A 2 months ago
parent
commit
a6000efbb7
  1. 12
      src/main/java/com/gcc/commissionerreview/configuration/AppConfig.java
  2. 26
      src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java
  3. 360
      src/main/java/com/gcc/commissionerreview/controller/GccShelterController.java
  4. 32
      src/main/java/com/gcc/commissionerreview/controller/MainController.java
  5. 258
      src/main/java/com/gcc/commissionerreview/controller/ShelterInspectionController.java
  6. 1181
      src/main/java/com/gcc/commissionerreview/service/GccShelterService.java
  7. 139
      src/main/java/com/gcc/commissionerreview/service/MasterShelterService.java
  8. 1419
      src/main/java/com/gcc/commissionerreview/service/ShelterInspectionService.java
  9. 2
      src/main/resources/application-dev.properties
  10. 2
      src/main/resources/application-prod.properties
  11. 3
      src/main/resources/application.properties
  12. 72
      src/main/resources/templates/modules/bulkwaste/bulkwastereport.html
  13. 1891
      src/main/resources/templates/modules/shelterinspection/complaintlist.html
  14. 2809
      src/main/resources/templates/modules/shelterinspection/dashboard.html
  15. 1751
      src/main/resources/templates/modules/shelterinspection/meetinglist.html
  16. 1848
      src/main/resources/templates/modules/shelterinspection/resucelist.html
  17. 634
      src/main/resources/templates/modules/shelterinspection/shelterlist.html
  18. 2147
      src/main/resources/templates/modules/shelterinspection/visitlist.html
  19. 389
      src/main/resources/templates/modules/shelterpagereport.html

12
src/main/java/com/gcc/commissionerreview/configuration/AppConfig.java

@ -11,7 +11,17 @@ import org.springframework.web.client.RestTemplate;
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
public String shelterurl="https://gccservices.in/gccofficialapp/api/shelterinspection";
public String sheltercomplainturl="https://gccservices.in/gccofficialapp/api/sheltercomplaint";
public String sheltermeetingurl="https://gccservices.in/gccofficialapp/api/sheltersmcmeeting";
public String shelterresuceurl="https://gccservices.in/gccofficialapp/api/shelterrescue";
@Bean
public RestTemplate restTemplate() {

26
src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java

@ -17,8 +17,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
public class DataSourceConfig {
// private static String host = "localhost:3306";
// private static String dbpassword = "root";
// private static String host = "localhost:3306";
// private static String dbpassword = "root";
private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
private static String dbpassword = "gcc-facial-password";
@ -278,5 +278,27 @@ public class DataSourceConfig {
dataSource.setPassword(dbpassword);
return dataSource;
}
/////////////// Shelter Inspection /////////////////////
@Bean(name = "mysqlShelterinspectionDataSource")
public DataSource mysqlShelterinspectionDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + host + "/gcc_night_shelter_inspection");
dataSource.setUsername("root");
dataSource.setPassword(dbpassword);
return dataSource;
}
////////////////////////////// For Shelter ////////////////////////
@Bean(name = "mysqlShelterDataSource")
public DataSource mysqlShelterDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + host + "/gcc_shelter");
dataSource.setUsername("root");
dataSource.setPassword(dbpassword);
return dataSource;
}
}

360
src/main/java/com/gcc/commissionerreview/controller/GccShelterController.java

@ -0,0 +1,360 @@
package com.gcc.commissionerreview.controller;
import java.util.HashMap;
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 org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate;
import com.gcc.commissionerreview.configuration.AppConfig;
import com.gcc.commissionerreview.service.MasterShelterService;
import com.gcc.commissionerreview.service.GccShelterService;
@RestController
@RequestMapping("/commissionerreview/api/shelter")
public class GccShelterController {
@Autowired
private GccShelterService shelterApiService;
@Autowired
private MasterShelterService masterShelterService;
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public GccShelterController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@GetMapping("/shelterComplaintList")
public List<Map<String,Object>> shelterComplaintList(
@RequestParam(required=false) String fromDate,
@RequestParam(required=false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String category) {
return shelterApiService.getShelterComplaintList(fromDate, toDate, zone, category);
}
@GetMapping("/shelterComplaintDetails")
public List<Map<String, Object>> shelterComplaintDetails(
@RequestParam String uqid,
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate) {
return shelterApiService.getShelterComplaintDetails(uqid, fromDate, toDate);
}
@GetMapping("/shelterComplaintMinDate")
public String shelterComplaintMinDate() {
return shelterApiService.getShelterComplaintMinDate();
}
@GetMapping("/shelterMeetingList")
public List<Map<String,Object>> shelterMeetingList(
@RequestParam(required=false) String fromDate,
@RequestParam(required=false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String category) {
return shelterApiService.getShelterMeetingList(fromDate, toDate, zone, category);
}
@GetMapping("/shelterMeetingDetails")
public List<Map<String, Object>> shelterMeetingDetails(
@RequestParam String uqid,
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate) {
return shelterApiService.getShelterMeetingDetails(uqid, fromDate, toDate);
}
@GetMapping("/shelterMeetingMinDate")
public String shelterMeetingMinDate() {
return shelterApiService.getShelterMeetingMinDate();
}
@GetMapping("/shelterResuceList")
public List<Map<String,Object>> shelterResuceList(
@RequestParam(required=false) String fromDate,
@RequestParam(required=false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String category) {
return shelterApiService.getShelterRescueList(fromDate, toDate, zone, category);
}
@GetMapping("/shelterResuceDetails")
public List<Map<String, Object>> shelterResuceDetails(
@RequestParam String uqid,
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate) {
return shelterApiService.getShelterRescueDetails(uqid, fromDate, toDate);
}
@GetMapping("/shelterRescuedPeopleDetails")
public List<Map<String, Object>> getShelterRescuedPeopleDetails(
@RequestParam String surveyId,@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate) {
return shelterApiService.getShelterRescuedPeopleDetails(surveyId, fromDate, toDate);
}
@GetMapping("/shelterResuceMinDate")
public String shelterResuceMinDate() {
return shelterApiService.getShelterResuceMinDate();
}
@GetMapping("/complaintquestions")
public ResponseEntity<?> getcomplaintquestionsDetails(
@RequestParam("cid") String cid) {
try {
String apiUrl = appConfig.sheltercomplainturl + "/questions?cid=" + cid;
System.out.println("API URL for complaint questions: " + apiUrl);
ResponseEntity<Object> response = restTemplate.getForEntity( apiUrl, Object.class);
return ResponseEntity.status(response.getStatusCode()).body(response.getBody());
}
catch (HttpClientErrorException e) {
System.out.println("COmplaint Question API Client Error: " + e.getStatusCode());
return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsString());
}
catch (HttpServerErrorException e) {
System.out.println("Complaint Question API Server Error: " + e.getStatusCode());
return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsString());
}
catch (ResourceAccessException e) {
System.out.println("Complaint Question API Connection Error: " + e.getMessage());
return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
.body(
Map.of(
"status", false,
"message",
"Unable to connect to Complaint Question Master API."
)
);
} catch (Exception e) {
System.out.println("Complaint Question API Exception");
e.printStackTrace();
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(
Map.of(
"status", false,
"message",
"Unable to load complaint question details."
)
);
}
}
@GetMapping("/meetingquestions")
public ResponseEntity<?> getmeetingquestionsDetails(
@RequestParam("cid") String cid) {
try {
String apiUrl =
appConfig.sheltermeetingurl + "/questions?cid=" + cid;
System.out.println(
"API URL for meeting questions: " + apiUrl
);
ResponseEntity<Object> response =
restTemplate.getForEntity(
apiUrl,
Object.class
);
return ResponseEntity
.status(response.getStatusCode())
.body(response.getBody());
} catch (HttpClientErrorException e) {
System.out.println(
"Meeting Question API Client Error: " +
e.getStatusCode()
);
return ResponseEntity
.status(e.getStatusCode())
.body(e.getResponseBodyAsString());
} catch (HttpServerErrorException e) {
System.out.println(
"Meeting Question API Server Error: " +
e.getStatusCode()
);
return ResponseEntity
.status(e.getStatusCode())
.body(e.getResponseBodyAsString());
} catch (ResourceAccessException e) {
System.out.println(
"Meeting Question API Connection Error: " +
e.getMessage()
);
return ResponseEntity
.status(HttpStatus.BAD_GATEWAY)
.body(
Map.of(
"status", false,
"message",
"Unable to connect to Meeting Question Master API."
)
);
} catch (Exception e) {
System.out.println(
"Meeting Question API Exception"
);
e.printStackTrace();
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(
Map.of(
"status", false,
"message",
"Unable to load meeting question details."
)
);
}
}
@GetMapping("/resucequestions")
public ResponseEntity<?> getresucequestionsDetails(
@RequestParam("cid") String cid) {
try {
String apiUrl =
appConfig.shelterresuceurl + "/questions?cid=" + cid;
System.out.println(
"API URL for meeting questions: " + apiUrl
);
ResponseEntity<Object> response =
restTemplate.getForEntity(
apiUrl,
Object.class
);
return ResponseEntity
.status(response.getStatusCode())
.body(response.getBody());
} catch (HttpClientErrorException e) {
System.out.println(
"Resuce Question API Client Error: " +
e.getStatusCode()
);
return ResponseEntity
.status(e.getStatusCode())
.body(e.getResponseBodyAsString());
} catch (HttpServerErrorException e) {
System.out.println(
"Resuce Question API Server Error: " +
e.getStatusCode()
);
return ResponseEntity
.status(e.getStatusCode())
.body(e.getResponseBodyAsString());
} catch (ResourceAccessException e) {
System.out.println(
"Resuce Question API Connection Error: " +
e.getMessage()
);
return ResponseEntity
.status(HttpStatus.BAD_GATEWAY)
.body(
Map.of(
"status", false,
"message",
"Unable to connect to Resuce Question Master API."
)
);
} catch (Exception e) {
System.out.println(
"Resuce Question API Exception"
);
e.printStackTrace();
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(
Map.of(
"status", false,
"message",
"Unable to load Resuce question details."
)
);
}
}
@GetMapping("/categories")
public List<String> getCategories() {
return masterShelterService.getCategoryList();
}
@GetMapping("/zones")
public List<String> getZones() {
return masterShelterService.getZoneList();
}
@GetMapping("/cdos")
public List<Map<String, Object>> getCdos() {
return masterShelterService.getCdos();
}
@GetMapping("/years")
public List<Integer> getYears() {
return masterShelterService.getAvailableYears();
}
}

32
src/main/java/com/gcc/commissionerreview/controller/MainController.java

@ -387,5 +387,37 @@ public class MainController {
public String bootreport(Model model) {
return "modules/boatreport";
}
// Shelter Review Main Controller
@GetMapping("/shelterpagereport")
public String ShelterPageReport(Model model) {
return "modules/shelterpagereport";
}
@GetMapping("/shelterlist")
public String ShelterList() {
return "modules/shelterinspection/shelterlist";
}
@GetMapping("/visitlist")
public String VisitList() {
return "modules/shelterinspection/visitlist";
}
@GetMapping("/complaintlist")
public String ComplaintList() {
return "modules/shelterinspection/complaintlist";
}
@GetMapping("/meetinglist")
public String MeetingList() {
return "modules/shelterinspection/meetinglist";
}
@GetMapping("/resucelist")
public String ResuceList() {
return "modules/shelterinspection/resucelist";
}
}

258
src/main/java/com/gcc/commissionerreview/controller/ShelterInspectionController.java

@ -0,0 +1,258 @@
package com.gcc.commissionerreview.controller;
import java.util.HashMap;
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 org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate;
import com.gcc.commissionerreview.configuration.AppConfig;
import com.gcc.commissionerreview.service.MasterShelterService;
import com.gcc.commissionerreview.service.ShelterInspectionService;
@RestController
@RequestMapping("/commissionerreview/api/shelterinspection")
public class ShelterInspectionController {
@Autowired
private ShelterInspectionService shelterApiService;
@Autowired
private MasterShelterService masterShelterService;
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public ShelterInspectionController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
//private final RestTemplate restTemplate = new RestTemplate();
@GetMapping("/Sheltercount")
public ResponseEntity<Map<String, Object>> getTotalCount() {
int count = shelterApiService.getTotalShelterCount();
Map<String, Object> response = new HashMap<>();
response.put("totalShelterCount", count);
return ResponseEntity.ok(response);
}
@GetMapping("/dashboard")
public Map<String,Object> dashboard(
@RequestParam String type,
@RequestParam String value){
return shelterApiService.getDashboardData(type,value);
}
@GetMapping("/top5Shelters")
public List<Map<String,Object>> top5Shelters(
@RequestParam String type,
@RequestParam String value){
return shelterApiService.getTop5Shelters(type,value);
}
@GetMapping("/regionSummary")
public List<Map<String,Object>> regionSummary(
@RequestParam String type,
@RequestParam String value){
return shelterApiService.getRegionSummary(type,value);
}
@GetMapping("/fundReceivedSummary")
public List<Map<String,Object>> fundSummary(
@RequestParam String type,
@RequestParam String value){
return shelterApiService.getFundReceivedSummary(type,value);
}
@GetMapping("/fundReceivedShelterDetails")
public List<Map<String, Object>> fundReceivedShelterDetails(
@RequestParam String type,
@RequestParam String value) {
return shelterApiService.getFundReceivedShelterDetails( type, value);
}
@GetMapping("/monthlyTrends")
public List<Map<String,Object>> monthlyTrends(
@RequestParam String type,
@RequestParam String value){
return shelterApiService.getMonthlyTrends(type,value);
}
@GetMapping("/weeklyVisits")
public List<Map<String,Object>> weeklyVisits(
@RequestParam String type,
@RequestParam String value){
List<Map<String,Object>> results = shelterApiService.getWeeklyVisits(type,value);
System.out.println("Weekly Visits Results:" +results);
return results;
}
@GetMapping("/latestVisitShelters")
public List<Map<String,Object>> latestVisitShelters(
@RequestParam String type,
@RequestParam String value){
return shelterApiService.getLatestVisitShelters(type,value);
}
@GetMapping("/shelterList")
public List<Map<String,Object>> shelterList(
@RequestParam(required = false) String zone,
@RequestParam(required = false) String category) {
return shelterApiService.getShelterList(zone, category);
}
@GetMapping("/visitList")
public List<Map<String,Object>> visitList(
@RequestParam(required=false) String fromDate,
@RequestParam(required=false) String toDate,
@RequestParam(required=false) String zone,
@RequestParam(required=false) String cdo){
return shelterApiService.getVisitList( fromDate, toDate, zone, cdo);
}
@GetMapping("/visitDetails")
public Map<String,Object> visitDetails(@RequestParam String surveyId){
return shelterApiService.getVisitDetails(surveyId);
}
@GetMapping("/shelterVisitMinDate")
public String shelterResuceMinDate() {
return shelterApiService.getShelterVisitMinDate();
}
@GetMapping("/questions")
public ResponseEntity<?> getquestionsDetails(
@RequestParam("cid") String cid) {
try {
String apiUrl =
appConfig.shelterurl + "/questions?cid=" + cid;
System.out.println(
"API URL for night inspection questions: " + apiUrl
);
ResponseEntity<Object> response =
restTemplate.getForEntity(
apiUrl,
Object.class
);
return ResponseEntity
.status(response.getStatusCode())
.body(response.getBody());
} catch (HttpClientErrorException e) {
System.out.println(
"Question API Client Error: " +
e.getStatusCode()
);
return ResponseEntity
.status(e.getStatusCode())
.body(e.getResponseBodyAsString());
} catch (HttpServerErrorException e) {
System.out.println(
"Question API Server Error: " +
e.getStatusCode()
);
return ResponseEntity
.status(e.getStatusCode())
.body(e.getResponseBodyAsString());
} catch (ResourceAccessException e) {
System.out.println(
"Question API Connection Error: " +
e.getMessage()
);
return ResponseEntity
.status(HttpStatus.BAD_GATEWAY)
.body(
Map.of(
"status", false,
"message",
"Unable to connect to Question Master API."
)
);
} catch (Exception e) {
System.out.println(
"Question API Exception"
);
e.printStackTrace();
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(
Map.of(
"status", false,
"message",
"Unable to load question details."
)
);
}
}
@GetMapping("/categories")
public List<String> getCategories() {
return masterShelterService.getCategoryList();
}
@GetMapping("/zones")
public List<String> getZones() {
return masterShelterService.getZoneList();
}
@GetMapping("/cdos")
public List<Map<String, Object>> getCdos() {
return masterShelterService.getCdos();
}
@GetMapping("/years")
public List<Integer> getYears() {
return masterShelterService.getAvailableYears();
}
}

1181
src/main/java/com/gcc/commissionerreview/service/GccShelterService.java
File diff suppressed because it is too large
View File

139
src/main/java/com/gcc/commissionerreview/service/MasterShelterService.java

@ -0,0 +1,139 @@
package com.gcc.commissionerreview.service;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.client.RestTemplate;
@Service
public class MasterShelterService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlShelterinspectionDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private final RestTemplate restTemplate = new RestTemplate();
private static final String API_URL = "https://nightshelter.gccservices.in/api/shelters/";
// Category Dropdown
public List<String> getCategoryList() {
ResponseEntity<List<Map<String, Object>>> response =
restTemplate.exchange(
API_URL,
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<Map<String, Object>>>() {});
List<Map<String, Object>> apiList = response.getBody();
if (apiList == null) {
return Collections.emptyList();
}
return apiList.stream()
.map(x -> String.valueOf(x.get("category")))
.filter(Objects::nonNull)
.distinct()
.sorted()
.collect(Collectors.toList());
}
//Zone Dropdown
public List<String> getZoneList() {
ResponseEntity<List<Map<String, Object>>> response =
restTemplate.exchange(
API_URL,
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<Map<String, Object>>>() {});
List<Map<String, Object>> apiList = response.getBody();
if (apiList == null) {
return Collections.emptyList();
}
return apiList.stream()
.map(x -> String.valueOf(x.get("zone")))
.filter(Objects::nonNull)
.distinct()
.sorted(Comparator.comparingInt(z ->
Integer.parseInt(z.replaceAll("[^0-9]", ""))))
.collect(Collectors.toList());
}
//CDO Dropdown
public List<Map<String,Object>> getCdos(){
String sql="""
SELECT DISTINCT
uid,
user_name
FROM login_details
ORDER BY user_name
""";
return jdbcTemplate.queryForList(sql);
}
// Year Dropdown
public List<Integer> getAvailableYears() {
String sql = """
SELECT DISTINCT YEAR(cdate) AS year
FROM night_shelter_inspection_response
WHERE isactive = 1
AND isdelete = 0
ORDER BY YEAR(cdate) DESC
""";
return jdbcTemplate.queryForList(sql, Integer.class);
}
// SHelter List
}

1419
src/main/java/com/gcc/commissionerreview/service/ShelterInspectionService.java
File diff suppressed because it is too large
View File

2
src/main/resources/application-dev.properties

@ -13,4 +13,4 @@ server.port=8078
#secondary.datasource.username=FAS
#secondary.datasource.password=FAS
#secondary.datasource.driver-class-name=oracle.jdbc.OracleDriver
fileBaseUrl=https://gccservices.in
fileBaseUrl=https://gccservices.in

2
src/main/resources/application-prod.properties

@ -35,4 +35,4 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# OR for detailed debugging:
# logging.level.root=INFO
fileBaseUrl=https://gccservices.in
fileBaseUrl=https://gccservices.in

3
src/main/resources/application.properties

@ -1 +1,2 @@
spring.profiles.active=prod
spring.profiles.active=prod
#spring.profiles.active=dev

72
src/main/resources/templates/modules/bulkwaste/bulkwastereport.html

@ -357,11 +357,7 @@
let endDate = $('#endDate').val();
let category = $('#categoryId').val();
<!-- // ✅ first load → don't filter by date-->
<!-- if (!isFilter) {-->
<!-- startDate = "";-->
<!-- endDate = "";-->
<!-- }-->
// ✅ correct validation
if (isFilter) {
@ -1191,73 +1187,7 @@ function renderBulkRequestCards(data) {
loadZoneReport(false);
}
<!-- function loadDefaultDate() {-->
<!-- // ✅ fixed launch date-->
<!-- let d = "2026-03-10";-->
<!-- // today date-->
<!-- let today = new Date().toISOString().split('T')[0];-->
<!-- // set value-->
<!-- $('#startDate').val(d);-->
<!-- $('#endDate').val(today);-->
<!-- // set min date (cannot select before launch)-->
<!-- $('#startDate').attr('min', start);-->
<!-- $('#endDate').attr('min', start);-->
<!-- // max = today-->
<!-- // max date-->
<!-- $('#startDate, #endDate').attr('max', today);-->
<!-- // trigger validation-->
<!-- $('#startDate').trigger('change');-->
<!-- // store default-->
<!-- $('#startDate').data('defaultDate', start);-->
<!-- $('#endDate').data('defaultDate', today);-->
<!-- // load table without filter-->
<!-- loadZoneReport(false);-->
<!--}-->
<!-- function loadDefaultDate() {-->
<!-- $.ajax({-->
<!-- url: '/commissionerreview/api/bulkwaste/getMinDate',-->
<!-- method: 'GET',-->
<!-- success: function(res){-->
<!-- if(res.status === "Success"){-->
<!-- let d = res.date;-->
<!-- // set value first-->
<!-- $('#startDate').val(d);-->
<!-- // set min date-->
<!-- $('#startDate').attr('min', d);-->
<!-- $('#endDate').attr('min', d);-->
<!-- // also set max today (safe)-->
<!-- const today = new Date().toISOString().split('T')[0];-->
<!-- $('#startDate, #endDate').attr('max', today);-->
<!-- // force refresh validation-->
<!-- $('#startDate').trigger('change');-->
<!-- // store default-->
<!-- $('#startDate').data('defaultDate', d);-->
<!-- // load table without filter-->
<!-- loadZoneReport(false);-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- }-->
function loadCategoryList() {

1891
src/main/resources/templates/modules/shelterinspection/complaintlist.html
File diff suppressed because it is too large
View File

2809
src/main/resources/templates/modules/shelterinspection/dashboard.html
File diff suppressed because it is too large
View File

1751
src/main/resources/templates/modules/shelterinspection/meetinglist.html
File diff suppressed because it is too large
View File

1848
src/main/resources/templates/modules/shelterinspection/resucelist.html
File diff suppressed because it is too large
View File

634
src/main/resources/templates/modules/shelterinspection/shelterlist.html

@ -0,0 +1,634 @@
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Shelter List</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- FontAwesome CSS for icons -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<!-- DataTables CSS -->
<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" />
<style>
body {
background-color: #f8f9fa;
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
font-weight: bold;
color: #003366;
text-transform: uppercase;
}
.filter-section {
background: #fff;
padding: 15px;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
margin-bottom: 20px;
}
thead th {
background-color: #003366 !important;
color: white !important;
}
.report-container {
background: #fff;
padding: 15px;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
/* ==============================
DATATABLE ALIGNMENT
============================== */
#detailDataTable {
width: 100% !important;
table-layout: fixed !important;
border-collapse: collapse !important;
}
#detailDataTable th,
#detailDataTable td {
box-sizing: border-box !important;
text-align: center !important;
vertical-align: middle !important;
border: 1px solid #dee2e6 !important;
}
#detailDataTable thead th {
background-color: #003366 !important;
color: #ffffff !important;
white-space: normal !important;
word-break: normal !important;
padding: 10px 8px !important;
}
#detailDataTable tbody td {
white-space: normal !important;
word-break: break-word !important;
overflow-wrap: anywhere !important;
padding: 8px !important;
}
/* Column widths */
#detailDataTable th:nth-child(1),
#detailDataTable td:nth-child(1) {
width: 6% !important;
}
#detailDataTable th:nth-child(2),
#detailDataTable td:nth-child(2) {
width: 25% !important;
}
#detailDataTable th:nth-child(3),
#detailDataTable td:nth-child(3) {
width: 9% !important;
}
#detailDataTable th:nth-child(4),
#detailDataTable td:nth-child(4) {
width: 15% !important;
}
#detailDataTable th:nth-child(5),
#detailDataTable td:nth-child(5) {
width: 9% !important;
}
#detailDataTable th:nth-child(6),
#detailDataTable td:nth-child(6) {
width: 13% !important;
}
#detailDataTable th:nth-child(7),
#detailDataTable td:nth-child(7) {
width: 14% !important;
}
#detailDataTable th:nth-child(8),
#detailDataTable td:nth-child(8) {
width: 9% !important;
}
</style>
</head>
<body>
<div class="container-fluid py-4">
<div class="page-header-title d-flex justify-content-between align-items-center">
<a href="/commissionerreview/shelterpagereport" class="btn btn-secondary"><i
class="fa-solid fa-arrow-left"></i> Back to Abstract</a>
<h4 class="mb-0 mx-auto">Shelter List</h4>
<div style="width: 100px;"></div>
</div>
<!-- Filter Section -->
<div class="filter-section d-flex justify-content-center align-items-end gap-3 flex-wrap mt-3">
<div>
<label for="zone" class="form-label fw-bold">Zone:</label>
<select id="zone" class="form-select">
<option value="">All Zone</option>
</select>
</div>
<div>
<label for="category" class="form-label fw-bold">Category:</label>
<select id="category" class="form-select">
<option value="">All Category</option>
</select>
</div>
<div>
<button id="btnSearch" class="btn btn-primary px-4"><i class="fa-solid fa-search"></i> Search</button>
</div>
<div>
<button class="btn btn-secondary px-4" onclick="resetFilters()"><i class="fa-solid fa-rotate-left"></i> Reset </button>
</div>
</div>
<div class="report-container">
<table id="detailDataTable" class="table table-striped table-bordered display nowrap" style="width:100%;">
<thead>
<tr>
<th class="text-center">S.No</th>
<th class="text-center">SHELTER</th>
<th class="text-center">ZONE</th>
<th class="text-center">CATEGORY</th>
<th class="text-center">RESIDENTS</th>
<th class="text-center">OCCUPANCY STATUS</th>
<th class="text-center">MAINTENANCE STATUS</th>
<th class="text-center">Latest Visit</th>
</tr>
</thead>
<tbody>
<!-- Populated via JS -->
</tbody>
</table>
</div>
</div>
<!-- Scripts -->
<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-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<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.2.7/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script th:inline="javascript">
var dataTable = null;
$(document).ready(function () {
// Load dropdowns
loadDropdowns();
// Initialize DataTable
dataTable = $('#detailDataTable').DataTable({
autoWidth: false,
columnDefs: [
{ width: "6%", targets: 0 },
{ width: "25%", targets: 1 },
{ width: "9%", targets: 2 },
{ width: "15%", targets: 3 },
{ width: "9%", targets: 4 },
{ width: "13%", targets: 5 },
{ width: "14%", targets: 6 },
{ width: "9%", targets: 7 }
],
responsive: false,
scrollX: false,
/* scrollY: "60vh",
scrollCollapse: true, */
searching: true,
paging: true,
info: true,
ordering: true,
dom: '<"d-flex justify-content-between align-items-center mb-3"lfB>rtip',
lengthMenu: [
[10, 25, 50, 100, -1],
[10, 25, 50, 100, "All"]
],
buttons: [
{
extend: 'excelHtml5',
text: '<i class="fa-solid fa-file-excel"></i> Excel',
className: 'btn btn-success btn-sm me-2',
title: function () {
return 'Commissioner Review - Shelter Inspection';
},
filename: function () {
var zone =
$('#zone option:selected').text()
.replace(/[^a-zA-Z0-9]/g, '_');
var category =
$('#category option:selected').text()
.replace(/[^a-zA-Z0-9]/g, '_');
return 'Shelter_Inspection_' +
zone + '_' +
category;
},
exportOptions: {
stripHtml: true,
format: {
body: function (data, row, column, node) {
var div = document.createElement("div");
div.innerHTML = data;
return div.textContent ||
div.innerText ||
"";
}
}
}
},
{
extend: 'pdfHtml5',
text: '<i class="fa-solid fa-file-pdf"></i> PDF',
className: 'btn btn-danger btn-sm',
orientation: 'landscape',
pageSize: 'A4',
title: function () {
return 'Commissioner Review - Shelter Inspection';
},
filename: function () {
var zone =
$('#zone option:selected').text()
.replace(/[^a-zA-Z0-9]/g, '_');
var category =
$('#category option:selected').text()
.replace(/[^a-zA-Z0-9]/g, '_');
return 'Shelter_Inspection_' +
zone + '_' +
category;
},
exportOptions: {
stripHtml: true,
format: {
body: function (data, row, column, node) {
var div = document.createElement("div");
div.innerHTML = data;
return div.textContent ||
div.innerText ||
"";
}
}
},
customize: function (doc) {
doc.styles.title = {
fontSize: 14,
bold: true,
alignment: 'center',
margin: [0, 0, 0, 10]
};
doc.styles.tableHeader.fontSize = 9;
doc.styles.tableHeader.alignment = 'center';
doc.defaultStyle.fontSize = 8;
doc.content[1].table.dontBreakRows = true;
}
}
]
});
// Search button
$('#btnSearch').click(function () {
loadDetailedReport();
});
// Load data initially
loadDetailedReport();
});
// =========================================================
// LOAD DROPDOWNS
// =========================================================
function loadDropdowns() {
// -------------------------
// Zone
// -------------------------
$.ajax({
url: "/commissionerreview/api/shelterinspection/zones",
type: "GET",
success: function (data) {
let options =
'<option value="">All Zones</option>';
data.forEach(function (zone) {
options +=
'<option value="' + zone + '">' +
zone +
'</option>';
});
$("#zone").html(options);
},
error: function () {
Swal.fire(
'Error',
'Unable to load zones.',
'error'
);
}
});
// -------------------------
// Category
// -------------------------
$.ajax({
url: "/commissionerreview/api/shelterinspection/categories",
type: "GET",
success: function (data) {
let options =
'<option value="">All Categories</option>';
data.forEach(function (category) {
let text = formatCategory(category);
options +=
'<option value="' + category + '">' +
text +
'</option>';
});
$("#category").html(options);
},
error: function () {
Swal.fire(
'Error',
'Unable to load categories.',
'error'
);
}
});
}
// =========================================================
// LOAD SHELTER REPORT
// =========================================================
function loadDetailedReport() {
var zone =
$('#zone').val() || '';
var category =
$('#category').val() || '';
Swal.fire({
title: 'Loading...',
allowOutsideClick: false,
didOpen: function () {
Swal.showLoading();
}
});
$.ajax({
url: "/commissionerreview/api/shelterinspection/shelterList",
type: "GET",
data: {
zone: zone,
category: category
},
success: function (response) {
Swal.close();
populateTable(response);
},
error: function () {
Swal.close();
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Unable to load shelter list.',
allowOutsideClick: false
});
}
});
}
// =========================================================
// POPULATE TABLE
// =========================================================
function populateTable(data) {
dataTable.clear();
if (!data || data.length === 0) {
dataTable.draw();
return;
}
data.forEach(function (item, index) {
var shelterName =
item.shelterName || '-';
var zone =
item.zone || '-';
var category =
formatCategory(item.category);
var residents =
item.totalResidents || 0;
var occupancyStatus =
getStatusBadge(residents);
var maintenanceStatus =
getMaintenanceBadge(
item.maintenanceStatus
);
var latestVisit =
item.latestVisit || '-';
dataTable.row.add([
index + 1,
'<strong>' +
shelterName +
'</strong>',
zone,
category,
residents,
occupancyStatus,
maintenanceStatus,
latestVisit
]);
});
dataTable.draw();
}
// =========================================================
// CATEGORY FORMAT
// =========================================================
function formatCategory(category) {
if (!category) {
return "-";
}
return category
.replace(/-/g, " ")
.replace(/\b\w/g, function (letter) {
return letter.toUpperCase();
});
}
// =========================================================
// OCCUPANCY STATUS
// =========================================================
function getStatusBadge(residents) {
residents = parseInt(residents) || 0;
if (residents >= 100) {
return '<span class="badge bg-success">Good</span>';
} else if (residents >= 25) {
return '<span class="badge bg-warning text-dark">Average</span>';
} else {
return '<span class="badge bg-danger">Poor</span>';
}
}
// =========================================================
// MAINTENANCE STATUS
// =========================================================
function getMaintenanceBadge(status) {
if (!status || status === "Not Available") {
return '<span class="badge bg-secondary">' +
'Not Available' +
'</span>';
}
if (status === "Well maintained") {
return '<span class="badge bg-success">' +
'Well maintained' +
'</span>';
}
if (status === "Averagely maintained") {
return '<span class="badge bg-warning text-dark">' +
'Averagely maintained' +
'</span>';
}
if (status === "Poorly maintained") {
return '<span class="badge bg-danger">' +
'Poorly maintained' +
'</span>';
}
if (status === "Extremely bad condition") {
return '<span class="badge bg-dark">' +
'Extremely bad condition' +
'</span>';
}
return '<span class="badge bg-secondary">' +
'Not Available' +
'</span>';
}
// =========================================================
// RESET FILTERS
// =========================================================
function resetFilters() {
$("#zone").val("");
$("#category").val("");
loadDetailedReport();
}
</script>
</body>
</html>

2147
src/main/resources/templates/modules/shelterinspection/visitlist.html
File diff suppressed because it is too large
View File

389
src/main/resources/templates/modules/shelterpagereport.html

@ -0,0 +1,389 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Shelter Report</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- FontAwesome CSS for icons -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<!-- DataTables CSS -->
<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" />
<link href="https://cdn.datatables.net/fixedcolumns/4.2.2/css/fixedColumns.dataTables.min.css" rel="stylesheet" />
<style>
body {
background-color: #f8f9fa;
}
.report-container {
overflow-x: auto;
}
/*#hallBookingTable {
width: 100% !important;
}*/
.page-header-title h4 {
margin: 20px 0;
text-align: center;
font-weight: bold;
color: #003366;
text-transform: uppercase;
}
.filter-section {
background: #fff;
padding: 15px;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
margin-bottom: 20px;
}
.report-container {
background: #fff;
padding: 15px;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.dashboard-card {
height: 180px;
}
.dashboard-card .card-body {
display: flex;
flex-direction: column;
justify-content: center;
}
.category-card .card-body {
display: block;
overflow-y: auto;
height: 120px;
}
thead th {
background-color: #003366 !important;
color: white !important;
}
/* Horizontal Scroll */
.dataTables_scrollBody {
overflow-x: auto !important;
overflow-y: auto !important;
}
/* Fixed Column Background */
table.dataTable tbody tr td.dtfc-fixed-left {
background-color: #fff !important;
}
table.dataTable.table-striped tbody tr:nth-of-type(odd) td.dtfc-fixed-left {
background-color: #f9f9f9 !important;
}
.dataTables_scrollBody {
overflow-x: auto !important;
overflow-y: auto !important;
}
.select2-container {
width: 100% !important;
}
.select2-results__options {
max-height: 400px !important;
/* increase height */
}
.select2-dropdown {
z-index: 9999 !important;
}
.hall-name-wrap {
min-width: 220px !important;
max-width: 220px !important;
white-space: normal !important;
word-break: break-word;
}
.dashboard-card {
border: none;
border-radius: 12px;
min-height: 110px;
margin-bottom: 15px;
}
/* Total Buildings */
.building-card {
background: #E3F2FD;
color: #1565C0;
}
/* Total Bookings */
.booking-card {
background: #E8F5E9;
color: #2E7D32;
}
/* Total Revenue */
.revenue-card {
background: #FFF8E1;
color: #EF6C00;
}
.distribute-card {
background: #FFF8E1;
color: #c9431a;
}
.manage-card {
background: #FFF8E1;
color: #ac129a;
}
.dashboard-card h6 {
font-size: 18px;
font-weight: 600;
margin-bottom: 15px;
}
.dashboard-card h3 {
font-size: 42px;
font-weight: 700;
margin: 0;
}
#bookingTable th:nth-child(8),
#bookingTable td:nth-child(8) {
width: 50px !important;
min-width: 50px !important;
max-width: 50px !important;
text-align: center;
}
#bookingTable th:nth-child(9),
#bookingTable td:nth-child(9) {
width: 50px !important;
min-width: 50px !important;
max-width: 50px !important;
text-align: center;
}
/* #hallBookingTable th:not(:nth-child(4)),
#hallBookingTable td:not(:nth-child(4)) {
white-space: nowrap;
}*/
/* Wrap selected columns */
.wrap {
white-space: normal !important;
word-break: break-word;
line-height: 1.2;
text-align: center;
vertical-align: middle;
min-width: 110px;
}
#performanceTable thead tr:first-child th {
text-align: center;
vertical-align: middle;
background: #003366;
color: #fff;
}
#performanceTable thead tr:nth-child(2) th {
text-align: center;
vertical-align: middle;
background: #0d6efd;
color: #fff;
}
#performanceTable td {
text-align: center;
}
#performanceTable td:nth-child(2) {
text-align: left;
}
/* Scrollbar */
.dataTables_scrollBody::-webkit-scrollbar {
height: 8px;
}
.dataTables_scrollBody::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 4px;
}
.dataTables_scrollBody::-webkit-scrollbar-track {
background: #f1f1f1;
}
</style>
</head>
<body>
<div class="container-fluid py-4">
<div class="page-header-title">
<h4>Shelter Report</h4>
</div>
<div class="row mb-4">
<!-- Card 1 -->
<div class="col-md-4">
<div class="card dashboard-card building-card shadow" style="cursor:pointer;"
onclick="window.open('/commissionerreview/shelterlist', '_blank');">
<!-- onclick="window.open('https://gccservices.in/commissionerreview/feedbackreport', '_blank');" -->
<div class="card-body text-center">
<h6>Shelter Report</h6>
</div>
</div>
</div>
<!-- Card 2 -->
<div class="col-md-4">
<div class="card dashboard-card booking-card shadow" style="cursor:pointer;"
onclick="window.open('/commissionerreview/visitlist', '_blank');">
<!-- onclick="window.open('https://gccservices.in/commissionerreview/feedbackreport', '_blank');" -->
<div class="card-body text-center">
<h6>Shelter Visit Report</h6>
</div>
</div>
</div>
<!-- Card 3 -->
<div class="col-md-4">
<div class="card dashboard-card revenue-card shadow" style="cursor:pointer;"
onclick="window.open('/commissionerreview/complaintlist', '_blank');">
<!-- onclick="window.open('https://gccservices.in/commissionerreview/feedbackreport', '_blank');" -->
<div class="card-body text-center">
<h6>Shelter Complaint Report</h6>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card dashboard-card manage-card shadow" style="cursor:pointer;"
onclick="window.open('/commissionerreview/meetinglist', '_blank');">
<!-- onclick="window.open('https://gccservices.in/commissionerreview/fooddistributionreport', '_blank');" -->
<div class="card-body text-center">
<h6>Shelter Meeting Report</h6>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card dashboard-card distribute-card shadow" style="cursor:pointer;"
onclick="window.open('/commissionerreview/resucelist', '_blank');"
>
<!-- onclick="window.open('https://gccservices.in/commissionerreview/fooddistributiondetailedreport', '_blank');" -->
<div class="card-body text-center">
<h6>Shelter Resuce Report</h6>
</div>
</div>
</div>
</div>
<!--<div class="col-md-3">
<div class="card bg-primary text-white shadow dashboard-card">
<div class="card-body text-center">
<h6>Total Buildings</h6>
<h3 id="totalBuildings">0</h3>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-success text-white shadow dashboard-card">
<div class="card-body text-center">
<h6>Total Bookings</h6>
<h3 id="totalBookings">0</h3>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-warning text-dark shadow dashboard-card">
<div class="card-body text-center">
<h6>Total Revenue</h6>
<h3 id="totalRevenue">0</h3>
</div>
</div>
</div>-->
<!-- Media Modal -->
<div class="modal fade" id="mediaModal" tabindex="-1" aria-labelledby="mediaModalLabel" aria-hidden="true"
style="z-index: 1060;">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="mediaModalLabel">Media Viewer</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body text-center" id="mediaModalBody">
</div>
</div>
</div>
</div>
<div id="pageLoader"
style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p>
</div>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<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.2.7/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
<script src="https://cdn.datatables.net/fixedcolumns/4.2.2/js/dataTables.fixedColumns.min.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script th:inline="none">
</script>
</body>
</html>
Loading…
Cancel
Save