Browse Source

implemented community hall report

master
AJITHKUMAR12 4 months ago
parent
commit
2bad7d43cd
  1. 20
      src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java
  2. 108
      src/main/java/com/gcc/commissionerreview/controller/CommunityHallController.java
  3. 15
      src/main/java/com/gcc/commissionerreview/controller/MainController.java
  4. 726
      src/main/java/com/gcc/commissionerreview/service/CommunityHallService.java
  5. 742
      src/main/resources/templates/modules/community.html
  6. 928
      src/main/resources/templates/modules/communitycaretaker.html
  7. 1006
      src/main/resources/templates/modules/communityrefund.html

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

@ -17,11 +17,12 @@ 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";
// private static String host =
// "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
// private static String dbpassword = "gcc-facial-password";
public static class MyDataSourceConfig {
@Primary
@ -201,6 +202,17 @@ public class DataSourceConfig {
return dataSource;
}
////////// Community Hall //////////////////////
@Bean(name = "mysqlCommunityHallDataSource")
public DataSource mysqlCommunityHallDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + host + "/communityhall_live");
dataSource.setUsername("root");
dataSource.setPassword(dbpassword);
return dataSource;
}
////////// Vending Committee //////////////////////
@Bean(name = "mysqlVendingCommitteeDataSource")
public DataSource mysqlVendingCommitteeDataSource() {

108
src/main/java/com/gcc/commissionerreview/controller/CommunityHallController.java

@ -0,0 +1,108 @@
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 com.gcc.commissionerreview.service.CommunityHallService;
@RestController
@RequestMapping("/commissionerreview/api/communityhall")
public class CommunityHallController {
@Autowired
private CommunityHallService communityHallService;
// ak
@GetMapping("/zones")
public List<Map<String, Object>> getZones() {
return communityHallService.getZones();
}
@GetMapping("/halls")
public List<Map<String, Object>> getHalls() {
return communityHallService.getHalls();
}
@GetMapping("/booking-report")
public List<Map<String, Object>> getReport(
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String hallId,
@RequestParam(required = false) String region,
@RequestParam(required = false) String status) {
return communityHallService.getBookingReport(
fromDate, toDate, zone, hallId, region, status);
}
@GetMapping("/refund-review-report")
public List<Map<String, Object>> getRefundReviewReport(
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String hallId,
@RequestParam(required = false) String region,
@RequestParam(required = false) String status) {
return communityHallService.getRefundReviewReport(
fromDate,
toDate,
zone,
hallId,
region,
status);
}
@GetMapping("/refund-pending-details")
public List<Map<String, Object>> getRefundPendingDetails(
@RequestParam String type,
@RequestParam(required = false) String hallId,
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String region,
@RequestParam(required = false) String status) {
return communityHallService.getRefundPendingDetails(
type,
hallId,
fromDate,
toDate,
zone,
region,
status);
}
@GetMapping("/caretaker-report")
public List<Map<String, Object>> getCaretakerReport(
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String hallId,
@RequestParam(required = false) String region,
@RequestParam(required = false) String status) {
return communityHallService.getCaretakerReport(
fromDate,
toDate,
zone,
hallId,
region,
status);
}
}

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

@ -336,4 +336,19 @@ public class MainController {
return "modules/streetvendor/inspectiondetails";
}
@GetMapping("/communityhallreport")
public String communityhallreport(Model model) {
return "modules/community";
}
@GetMapping("/communityhallrefund")
public String communityhallrefund(Model model) {
return "modules/communityrefund";
}
@GetMapping("/communityhallcaretaker")
public String communityhallcaretaker(Model model) {
return "modules/communitycaretaker";
}
}

726
src/main/java/com/gcc/commissionerreview/service/CommunityHallService.java

@ -0,0 +1,726 @@
package com.gcc.commissionerreview.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class CommunityHallService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setFeedbackDataSource(@Qualifier("mysqlCommunityHallDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getBookingReport(
String fromDate,
String toDate,
String zone,
String hallId,
String region,
String status) {
StringBuilder sql = new StringBuilder();
sql.append("""
SELECT
hd.zone,
hd.division,
hd.hall_id,
hd.hall_name,
DATE_FORMAT(
hd.c_date,
'%d-%m-%Y'
) AS hall_created_date,
CASE
WHEN hd.is_active=1
THEN 'Active Hall'
ELSE 'Deactivated Hall'
END AS hall_status,
hd.hall_incharge_name caretaker_name,
hd.hall_incharge_no caretaker_no,
DATEDIFF(
CURRENT_DATE,
DATE(hd.c_date)
) booking_available_days,
COUNT(bd.booking_id)
total_no_of_bookings,
SUM(
CASE
WHEN bd.no_of_days=0.5
THEN 1
ELSE 0
END
) half_day_booking_count,
SUM(
CASE
WHEN bd.no_of_days=1
THEN 1
ELSE 0
END
) full_day_booking_count,
SUM(
CASE
WHEN bd.no_of_days=1.5
THEN 1
ELSE 0
END
) one_point_five_days_booking_count,
SUM(
CASE
WHEN bd.no_of_days=2
THEN 1
ELSE 0
END
) two_days_booking_count
FROM hall_details hd
LEFT JOIN booking_details bd
ON hd.hall_id=bd.hall_details_hall_id
AND bd.booking_status NOT IN
('PENDING',
'REFUNDED',
'GCC_BLOCKED',
'GCC_UNBLOCKED')
WHERE 1=1
""");
List<Object> params = new ArrayList<>();
if (fromDate != null && !fromDate.isBlank()) {
sql.append("""
AND DATE(bd.booking_date)>=?
""");
params.add(fromDate);
}
if (toDate != null && !toDate.isBlank()) {
sql.append("""
AND DATE(bd.booking_date)<=?
""");
params.add(toDate);
}
if (zone != null && !zone.isBlank()) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED) = ?
""");
params.add(zone);
}
if (hallId != null && !hallId.isBlank()) {
sql.append("""
AND hd.hall_id=?
""");
params.add(hallId);
}
if (status != null && !status.isBlank()) {
if ("Active Hall".equals(status)) {
sql.append("""
AND hd.is_active = 1
""");
}
if ("Deactivated Hall".equals(status)) {
sql.append("""
AND hd.is_active = 0
""");
}
}
if (region != null && !region.isBlank()) {
if (region.equals("North")) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 1 AND 5
""");
}
if (region.equals("Center")) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 6 AND 10
""");
}
if (region.equals("South")) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 11 AND 15
""");
}
}
sql.append("""
GROUP BY
hd.zone,
hd.division,
hd.hall_id
ORDER BY
CAST(hd.zone AS UNSIGNED),
CAST(hd.division AS UNSIGNED),
hd.hall_id
""");
return jdbcTemplate.queryForList(
sql.toString(),
params.toArray());
}
public List<Map<String, Object>> getHalls() {
String sql = """
SELECT hall_id,
hall_name,
date_format(c_date,'%d-%m-%Y') as hall_created_date
FROM hall_details
ORDER BY hall_id
""";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getZones() {
String sql = """
SELECT id,
zone_name
FROM gcc_street_vendor.zone_master
ORDER BY id
""";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getRefundReviewReport(
String fromDate,
String toDate,
String zone,
String hallId,
String region,
String status) {
StringBuilder sql = new StringBuilder();
sql.append(
"""
select hd.zone, hd.division, hd.hall_id, hd.hall_name, date_format(hd.c_date, '%d-%m-%Y') as hall_Created_date,
case when hd.is_active = 1 then 'Active Hall' else 'Deactivated Hall' end as Hall_Status,
hd.hall_incharge_name as caretaker_name, hd.hall_incharge_no as caretake_no,
count(bd.booking_id) as total_no_of_bookings,
sum( case when bd.booking_status = 'CANCELED' THEN 1 ELSE 0 END) AS cancelled_bookings,
sum( case when bd.booking_status = 'REJECTED' THEN 1 ELSE 0 END) AS rejected_bookings,
sum( case when date(bd.end_date)<CURRENT_DATE and bd.booking_status not in ('CANCELED','REJECTED') then 1 else 0 end) as event_completed_count,
sum(case when bd.refund_status != 'COMPLETED' and bd.booking_status = 'CANCELED' THEN 1 ELSE 0 END) cancelled_settlement_pending,
sum(case when bd.refund_status != 'COMPLETED' and bd.booking_status = 'REJECTED' THEN 1 ELSE 0 END) rejected_settlement_pending,
SUM(CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE then 1 else 0 end) as refund_pending_count,
SUM(CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status = 'CANCELED' then 1 else 0 end) as cancelled_completed_count,
SUM(CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status = 'REJECTED' then 1 else 0 end) as rejected_completed_count,
SUM(CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE then 1 else 0 end) as refund_completed_count,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 0 AND 5 THEN 1 ELSE 0 END ) AS settlement_Pending_0_3_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 6 AND 15 THEN 1 ELSE 0 END ) AS settlement_Pending_6_15_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 16 AND 30 THEN 1 ELSE 0 END ) AS settlement_Pending_16_30_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) >30 THEN 1 ELSE 0 END ) AS settlement_Pending_more_than_30_days
from hall_details hd
left join booking_details bd on hd.hall_id = bd.hall_details_hall_id and bd.booking_status NOT IN ('PENDING', 'REFUNDED', 'GCC_BLOCKED','GCC_UNBLOCKED') and bd.booking_status IS NOT NULL
WHERE 1=1
""");
List<Object> params = new ArrayList<>();
if (fromDate != null && !fromDate.isBlank()) {
sql.append("""
AND DATE(bd.end_date) >= ?
""");
params.add(fromDate);
}
if (toDate != null && !toDate.isBlank()) {
sql.append("""
AND DATE(bd.end_date) <= ?
""");
params.add(toDate);
}
if (zone != null && !zone.isBlank()) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED) = ?
""");
params.add(zone);
}
if (hallId != null && !hallId.isBlank()) {
sql.append("""
AND hd.hall_id = ?
""");
params.add(hallId);
}
if (status != null && !status.isBlank()) {
sql.append("""
AND (
CASE
WHEN hd.is_active = 1
THEN 'Active Hall'
ELSE 'Deactivated Hall'
END
) = ?
""");
params.add(status);
}
if (region != null && !region.isBlank()) {
if ("North".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 1 AND 5
""");
}
if ("Center".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 6 AND 10
""");
}
if ("South".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 11 AND 15
""");
}
}
sql.append("""
GROUP BY
hd.zone,
hd.division,
hd.hall_id
ORDER BY
CAST(hd.zone AS UNSIGNED),
CAST(hd.division AS UNSIGNED),
hd.hall_id
""");
return jdbcTemplate.queryForList(
sql.toString(),
params.toArray());
}
public List<Map<String, Object>> getCaretakerReport(
String fromDate,
String toDate,
String zone,
String hallId,
String region,
String status) {
StringBuilder sql = new StringBuilder();
sql.append(
"""
select hd.zone, hd.division, hd.hall_id, hd.hall_name, date_format(hd.c_date, '%d-%m-%Y') as hall_Created_date,
case when hd.is_active = 1 then 'Active Hall' else 'Deactivated Hall' end as Hall_Status,
hd.hall_incharge_name as caretaker_name, hd.hall_incharge_no as caretake_no,
count(bd.booking_id) as total_no_of_bookings,
sum( case when bd.booking_status = 'CANCELED' THEN 1 ELSE 0 END) AS cancelled_bookings,
sum( case when bd.booking_status = 'REJECTED' THEN 1 ELSE 0 END) AS rejected_bookings,
sum( case when date(bd.end_date)<CURRENT_DATE and bd.booking_status not in ('CANCELED','REJECTED') then 1 else 0 end) as event_completed_count,
sum(case when bd.refund_status != 'COMPLETED' and bd.booking_status = 'CANCELED' THEN 1 ELSE 0 END) cancelled_settlement_pending,
sum(case when bd.refund_status != 'COMPLETED' and bd.booking_status = 'REJECTED' THEN 1 ELSE 0 END) rejected_settlement_pending,
SUM(CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE then 1 else 0 end) as refund_pending_count,
SUM(CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status = 'CANCELED' then 1 else 0 end) as cancelled_completed_count,
SUM(CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status = 'REJECTED' then 1 else 0 end) as rejected_completed_count,
SUM(CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE then 1 else 0 end) as refund_completed_count,
SUM( CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 0 AND 5 THEN 1 ELSE 0 END ) AS settlement_Completed_0_5_days,
SUM( CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 6 AND 15 THEN 1 ELSE 0 END ) AS settlement_Completed_6_15_days,
SUM( CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 16 AND 30 THEN 1 ELSE 0 END ) AS settlement_Completed_16_30_days,
SUM( CASE WHEN bd.refund_status = 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) >30 THEN 1 ELSE 0 END ) AS settlement_Completed_more_than_30_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 0 AND 5 THEN 1 ELSE 0 END ) AS settlement_Pending_0_5_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 6 AND 15 THEN 1 ELSE 0 END ) AS settlement_Pending_6_15_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) BETWEEN 16 AND 30 THEN 1 ELSE 0 END ) AS settlement_Pending_16_30_days,
SUM( CASE WHEN bd.refund_status != 'COMPLETED' and bd.booking_status not in ('CANCELED','REJECTED') and date(bd.end_date)< CURRENT_DATE AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date)) >30 THEN 1 ELSE 0 END ) AS settlement_Pending_more_than_30_days
from hall_details hd
left join booking_details bd on hd.hall_id = bd.hall_details_hall_id and bd.booking_status NOT IN ('PENDING', 'REFUNDED', 'GCC_BLOCKED','GCC_UNBLOCKED') and bd.booking_status IS NOT NULL
WHERE 1=1
""");
List<Object> params = new ArrayList<>();
if (fromDate != null && !fromDate.isBlank()) {
sql.append("""
AND DATE(bd.end_date) >= ?
""");
params.add(fromDate);
}
if (toDate != null && !toDate.isBlank()) {
sql.append("""
AND DATE(bd.end_date) <= ?
""");
params.add(toDate);
}
if (zone != null && !zone.isBlank()) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED) = ?
""");
params.add(zone);
}
if (hallId != null && !hallId.isBlank()) {
sql.append("""
AND hd.hall_id = ?
""");
params.add(hallId);
}
if (status != null && !status.isBlank()) {
sql.append("""
AND (
CASE
WHEN hd.is_active = 1
THEN 'Active Hall'
ELSE 'Deactivated Hall'
END
) = ?
""");
params.add(status);
}
if (region != null && !region.isBlank()) {
if ("North".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 1 AND 5
""");
}
if ("Center".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 6 AND 10
""");
}
if ("South".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 11 AND 15
""");
}
}
sql.append("""
GROUP BY
hd.zone,
hd.division,
hd.hall_id
ORDER BY
CAST(hd.zone AS UNSIGNED),
CAST(hd.division AS UNSIGNED),
hd.hall_id
""");
return jdbcTemplate.queryForList(
sql.toString(),
params.toArray());
}
public List<Map<String, Object>> getRefundPendingDetails(
String type,
String hallId,
String fromDate,
String toDate,
String zone,
String region,
String status) {
StringBuilder sql = new StringBuilder();
sql.append(
"""
SELECT
bd.booking_id,
us.name AS user_name,
us.mobile_no,
hd.hall_incharge_name,
hd.hall_incharge_no,
DATE_FORMAT(bd.end_date,'%d-%m-%Y') AS event_date,
CASE
WHEN ed.updated_date IS NULL THEN 'EB Not entered'
ELSE DATEDIFF(current_date, bd.end_date)
END AS care_taker_pending_days,
DATE_FORMAT(ed.updated_date,'%d-%m-%Y %r') AS caretaker_updated_date,
CASE
WHEN ed.updated_date IS NULL THEN 'Action not taken'
ELSE DATEDIFF(st.approved_flag_date, ed.updated_date)
END AS ARO_pending_days,
DATE_FORMAT(st.approved_flag_date,'%d-%m-%Y %r') AS ARO_action_taken_date
FROM hall_details hd
LEFT JOIN booking_details bd
ON hd.hall_id = bd.hall_details_hall_id
AND bd.booking_status NOT IN ('PENDING','REFUNDED','GCC_BLOCKED','GCC_UNBLOCKED')
AND bd.booking_status IS NOT NULL
LEFT JOIN users us
ON bd.users_user_id = us.user_id
LEFT JOIN eb_details ed
ON bd.booking_id = ed.booking_details_booking_id
LEFT JOIN settlement st
ON bd.booking_id = st.booking_details_booking_id
WHERE 1=1
""");
List<Object> params = new ArrayList<>();
// --------------------------------------------------
// TYPE CONDITIONS
// --------------------------------------------------
if ("PENDING_0_5".equals(type)) {
sql.append("""
AND bd.refund_status != 'COMPLETED'
AND bd.booking_status NOT IN ('CANCELED','REJECTED')
AND DATE(bd.end_date) < CURRENT_DATE
AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date))
BETWEEN 0 AND 5
""");
} else if ("PENDING_6_15".equals(type)) {
sql.append("""
AND bd.refund_status != 'COMPLETED'
AND bd.booking_status NOT IN ('CANCELED','REJECTED')
AND DATE(bd.end_date) < CURRENT_DATE
AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date))
BETWEEN 6 AND 15
""");
} else if ("PENDING_16_30".equals(type)) {
sql.append("""
AND bd.refund_status != 'COMPLETED'
AND bd.booking_status NOT IN ('CANCELED','REJECTED')
AND DATE(bd.end_date) < CURRENT_DATE
AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date))
BETWEEN 16 AND 30
""");
} else if ("PENDING_GT_30".equals(type)) {
sql.append("""
AND bd.refund_status != 'COMPLETED'
AND bd.booking_status NOT IN ('CANCELED','REJECTED')
AND DATE(bd.end_date) < CURRENT_DATE
AND DATEDIFF(CURRENT_DATE, DATE(bd.end_date))
> 30
""");
} else if ("CANCELLED_PENDING".equals(type)) {
sql.append("""
AND bd.refund_status != 'COMPLETED'
AND bd.booking_status = 'CANCELED'
""");
} else if ("REJECTED_PENDING".equals(type)) {
sql.append("""
AND bd.refund_status != 'COMPLETED'
AND bd.booking_status = 'REJECTED'
""");
}
// --------------------------------------------------
// DATE FILTERS
// --------------------------------------------------
if (fromDate != null && !fromDate.isBlank()) {
sql.append("""
AND DATE(bd.end_date) >= ?
""");
params.add(fromDate);
}
if (toDate != null && !toDate.isBlank()) {
sql.append("""
AND DATE(bd.end_date) <= ?
""");
params.add(toDate);
}
// --------------------------------------------------
// ZONE FILTER
// --------------------------------------------------
if (zone != null && !zone.isBlank()) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED) = ?
""");
params.add(zone);
}
// --------------------------------------------------
// HALL FILTER
// --------------------------------------------------
if (hallId != null && !hallId.isBlank()) {
sql.append("""
AND hd.hall_id = ?
""");
params.add(hallId);
}
// --------------------------------------------------
// STATUS FILTER
// --------------------------------------------------
if (status != null && !status.isBlank()) {
sql.append("""
AND (
CASE
WHEN hd.is_active = 1
THEN 'Active Hall'
ELSE 'Deactivated Hall'
END
) = ?
""");
params.add(status);
}
// --------------------------------------------------
// REGION FILTER
// --------------------------------------------------
if (region != null && !region.isBlank()) {
if ("North".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 1 AND 5
""");
}
else if ("Center".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 6 AND 10
""");
}
else if ("South".equals(region)) {
sql.append("""
AND CAST(hd.zone AS UNSIGNED)
BETWEEN 11 AND 15
""");
}
}
sql.append("""
ORDER BY
CAST(hd.zone AS UNSIGNED),
CAST(hd.division AS UNSIGNED),
hd.hall_id,
bd.booking_id
""");
return jdbcTemplate.queryForList(
sql.toString(),
params.toArray());
}
}

742
src/main/resources/templates/modules/community.html

@ -0,0 +1,742 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Community Hall Booking 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);
}
table.dataTable th,
table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #dee2e6 !important;
white-space: nowrap;
}
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;
}
/*.dataTables_scrollHeadInner,
#hallBookingTable {
width: max-content !important;
}*/
/* table.dataTable th,
table.dataTable td {
white-space: nowrap;
}*/
table.dataTable th,
table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #dee2e6 !important;
}
#hallBookingTable th:nth-child(8),
#hallBookingTable td:nth-child(8) {
white-space: nowrap !important;
min-width: 180px;
}
#hallBookingTable th:nth-child(5),
#hallBookingTable td:nth-child(5) {
min-width: 220px;
max-width: 220px;
white-space: normal !important;
word-wrap: break-word;
word-break: break-word;
}
#hallBookingTable th:not(:nth-child(4)),
#hallBookingTable td:not(:nth-child(4)) {
white-space: nowrap;
}
/* 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>Community Hall Popularity Report</h4>
</div>
<!-- Filter Section -->
<div class="filter-section row">
<div class="col-md-2">
<label>From Date</label>
<input type="date" id="fromDate" class="form-control">
</div>
<div class="col-md-2">
<label>To Date</label>
<input type="date" id="toDate" class="form-control">
</div>
<div class="col-md-2">
<label>Region</label>
<select id="region" class="form-control">
<option value="">All</option>
<option value="North">North Region</option>
<option value="Center">Center Region</option>
<option value="South">South Region</option>
</select>
</div>
<div class="col-md-2">
<label>Zone</label>
<select id="zone" class="form-control">
<option value="">All</option>
</select>
</div>
<div class="col-md-2">
<label>Hall</label>
<select id="hallId" class="form-control">
<option value="">All</option>
</select>
</div>
<div class="col-md-2">
<label>Status</label>
<select id="status" class="form-control">
<option value="">All</option>
<option value="Active Hall">Active Hall</option>
<option value="Deactivated Hall">Deactivated Hall</option>
</select>
</div>
<div class="col-md-12 d-flex justify-content-center gap-2 mt-3">
<button id="searchBtn" class="btn btn-primary">
Search
</button>
<button id="resetBtn" class="btn btn-primary">
Reset
</button>
</div>
<!--<div class="col-md-2 mt-4">
<button class="btn btn-primary" id="searchBtn">
Search
</button>
<button class="btn btn-primary" id="resetBtn">
Reset
</button>
</div>-->
</div>
<div class="report-container">
<table id="hallBookingTable" class="table table-bordered table-striped nowrap" width="100%">
<thead>
<tr>
<th>S.No</th>
<th>Zone</th>
<th>Division</th>
<th>Hall Id</th>
<th class="text-wrap">Hall Name</th>
<th class="text-center">Created Date</th>
<th class="text-center">Status</th>
<th class="text-center">Caretaker Name</th>
<th class="text-center">Caretaker No</th>
<th>Booking Available Days</th>
<th>Total Bookings</th>
<th>Half Day</th>
<th>Full Day</th>
<th>1.5 Days</th>
<th>2 Days</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<!-- Details Modal -->
<div class="modal fade" id="detailModal" tabindex="-1" aria-labelledby="detailModalLabel" aria-hidden="true"
data-bs-backdrop="static">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="detailModalLabel">Compliance Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="modalDataTable" class="table table-bordered table-striped">
<thead class="table-dark">
<tr>
<th class="text-center">S.No</th>
<th class="text-center">Audit Date</th>
<th class="text-center">Shift</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Address</th>
<th class="text-center">Audit Category</th>
<th class="text-center">Question</th>
<th class="text-center">Answer</th>
<th class="text-center">Kitchen SI Name</th>
<th class="text-center">Raised By</th>
<th class="text-center">PMC Remarks</th>
<th class="text-center">PMC Image/Video Viewer</th>
<th class="text-center">FS Status</th>
<th class="text-center">FS Challenged By</th>
<th class="text-center">FS Remarks</th>
<th class="text-center">FS Image/Video Viewer</th>
<th class="text-center">CE Status</th>
<th class="text-center">CE Remarks</th>
<th class="text-center">CE Updated By</th>
<th class="text-center">Penalty Amount</th>
</tr>
</thead>
<tbody id="modalTableBody">
</tbody>
</table>
</div>
</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>
<!-- 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">
function loadZones() {
$.get("/commissionerreview/api/communityhall/zones", function (data) {
$('#zone').empty();
$('#zone').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
$('#zone').append(
'<option value="' + row.id + '">' +
row.zone_name +
'</option>'
);
});
});
}
let table;
function initializeTable() {
table = $('#hallBookingTable').DataTable({
dom: 'Bfrtip',
buttons: [
'excel',
/* {
extend: 'pdfHtml5',
text: 'PDF',
orientation: 'landscape',
pageSize: 'A3',
title: 'Community Hall Booking Report',
customize: function (doc) {
doc.defaultStyle.fontSize = 7;
doc.styles.tableHeader.fontSize = 8;
doc.content[1].table.widths =
Array(doc.content[1].table.body[0].length).fill('*');
doc.pageMargins = [10, 10, 10, 10];
}
},*/ {
extend: 'pdfHtml5',
text: 'PDF',
orientation: 'landscape',
pageSize: 'A3',
title: 'Community Hall Popularity Report',
exportOptions: {
columns: ':visible'
},
customize: function (doc) {
doc.pageMargins = [5, 5, 5, 5];
doc.defaultStyle.fontSize = 8;
doc.styles.tableHeader.fontSize = 9;
// Reduce unwanted columns
doc.content[1].table.widths = [
30, // S.No
30, // Zone
50, // Division
30, // Hall Id
130, // Hall Name
60, // Created Date
70, // Status
70, // Caretaker Name
70, // Caretaker No
80, // Booking Available Days
80, // Total Bookings
80, // Half Day
80, // Full Day
80, // 1.5 Day
80 // 2 Days
];
doc.styles.tableHeader.alignment = 'center';
doc.defaultStyle.alignment = 'center';
}
}
],
/*buttons: [
'copy',
'csv',
'excel',
'pdf'
],*/
scrollX: true,
scrollCollapse: true,
autoWidth: false,
paging: false,
fixedColumns: {
leftColumns: 9
},
/* columns: [
{ data: 'zone' },
{ data: 'division' },
{ data: 'hall_id' },
{ data: 'hall_name' },
{ data: 'hall_created_date' },
{ data: 'hall_status' },
{ data: 'caretaker_name' },
{ data: 'caretaker_no' },
{ data: 'booking_available_days' },
{ data: 'total_no_of_bookings' },
{ data: 'half_day_booking_count' },
{ data: 'full_day_booking_count' },
{ data: 'one_point_five_days_booking_count' },
{ data: 'two_days_booking_count' }
]*/
columns: [
{ data: 'sno', width: '50px' },
{ data: 'zone', width: '60px' },
{ data: 'division', width: '70px' },
{ data: 'hall_id', width: '60px' },
{ data: 'hall_name', width: '220px' },
{ data: 'hall_created_date', width: '100px' },
{ data: 'hall_status', width: '120px' },
{ data: 'caretaker_name', width: '150px' },
{ data: 'caretaker_no', width: '120px' },
{ data: 'booking_available_days', width: '120px' },
{ data: 'total_no_of_bookings', width: '100px' },
{ data: 'half_day_booking_count', width: '80px' },
{ data: 'full_day_booking_count', width: '80px' },
{ data: 'one_point_five_days_booking_count', width: '90px' },
{ data: 'two_days_booking_count', width: '80px' }
]
});
}
$('#region').change(function () {
var region = $(this).val();
$('#zone').val('');
if (region == 'North') {
loadRegionZones([1, 2, 3, 4, 5]);
}
else if (region == 'Center') {
loadRegionZones([6, 7, 8, 9, 10]);
}
else if (region == 'South') {
loadRegionZones([11, 12, 13, 14, 15]);
}
else {
loadZones();
}
});
function loadRegionZones(zoneIds) {
$.get("/commissionerreview/api/communityhall/zones", function (data) {
$('#zone').empty();
$('#zone').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
if (zoneIds.includes(row.id)) {
$('#zone').append(
'<option value="' + row.id + '">' +
row.zone_name +
'</option>'
);
}
});
});
}
$('#searchBtn').click(function () {
loadReport(false);
});
$('#resetBtn').click(function () {
$('#fromDate').val('');
$('#toDate').val('');
$('#region').val('');
$('#zone').val('');
$('#hallId').val('');
$('#hallId').trigger('change');
$('#status').val('');
loadReport(true);
});
function loadReport(isInitialLoad) {
let zone = $("#zone").val();
let fromDate = $("#fromDate").val();
let toDate = $("#toDate").val();
let region = $("#region").val();
let hallId = $("#hallId").val();
let status = $('#status').val();
if (!isInitialLoad &&
zone == '' &&
region == '' &&
hallId == '' &&
fromDate == '' &&
toDate == '' &&
status == '') {
Swal.fire({
icon: 'warning',
title: 'Warning',
text: 'Please select at least one filter.',
confirmButtonColor: '#3085d6'
});
return;
}
if (fromDate != '') {
if (toDate == '') {
Swal.fire({
icon: 'warning',
title: 'Warning',
text: 'Please select both from date and to date.',
confirmButtonColor: '#3085d6'
});
return;
}
}
if (toDate != '') {
if (fromDate == '') {
Swal.fire({
icon: 'warning',
title: 'Warning',
text: 'Please select both from date and to date.',
confirmButtonColor: '#3085d6'
});
return;
}
}
$.ajax({
url: '/commissionerreview/api/communityhall/booking-report',
type: 'GET',
data: {
fromDate: $('#fromDate').val(),
toDate: $('#toDate').val(),
region: $('#region').val(),
zone: $('#zone').val(),
hallId: $('#hallId').val(),
status: $('#status').val()
},
success: function (response) {
table.clear();
response.forEach(function (row, index) {
row.sno = index + 1;
});
table.rows.add(response);
table.draw();
setTimeout(function () {
table.columns.adjust();
}, 200);
}
});
}
/* $(document).ready(function () {
loadZones();
loadHalls();
initializeTable();
// Loads complete report
loadReport();
});*/
$(document).ready(function () {
$("#fromDate").on("change", function () {
let fromDate = $(this).val();
// Set minimum selectable date for To Date
$("#toDate").attr("min", fromDate);
// If current To Date is less than From Date, clear it
if ($("#toDate").val() < fromDate) {
$("#toDate").val('');
}
});
loadZones();
loadHalls();
initializeTable();
loadReport(true);
});
/*function loadHalls() {
$.get("/commissionerreview/api/communityhall/halls", function (data) {
$('#hallId').empty();
$('#hallId').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
$('#hallId').append(
'<option value="' + row.hall_id + '">' +
row.hall_id + " - " + row.hall_name + " - " + row.hall_created_date +
'</option>'
);
});
}).fail(function () {
alert("Failed to load halls");
});
}*/
function loadHalls() {
$.get("/commissionerreview/api/communityhall/halls", function (data) {
$('#hallId').empty();
$('#hallId').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
$('#hallId').append(
'<option value="' + row.hall_id + '">' +
row.hall_id + ' - ' + row.hall_name + ' - ' + row.hall_created_date +
'</option>'
);
});
// Destroy existing Select2 if already initialized
if ($('#hallId').hasClass('select2-hidden-accessible')) {
$('#hallId').select2('destroy');
}
// Initialize Select2
$('#hallId').select2({
placeholder: 'Search Hall',
allowClear: true,
width: '100%'
});
});
}
// if (true) {
// var a = 5;
// }
// console.log(a);
// Error
// Recalculate precisely after Bootstrap entirely finishes destroying modal padding
</script>
</body>
</html>

928
src/main/resources/templates/modules/communitycaretaker.html

@ -0,0 +1,928 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Community Hall CareTaker Performance 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);
}
/* table.dataTable th,
table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #dee2e6 !important;
white-space: nowrap;
}*/
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;
}
/*.dataTables_scrollHeadInner,
#hallBookingTable {
width: max-content !important;
}*/
/* table.dataTable th,
table.dataTable td {
white-space: nowrap;
}*/
/* table.dataTable th,
table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #dee2e6 !important;
}
#hallBookingTable th:nth-child(8),
#hallBookingTable td:nth-child(8) {
white-space: nowrap !important;
min-width: 180px;
}
#hallBookingTable th:nth-child(5),
#hallBookingTable td:nth-child(5) {
min-width: 220px;
max-width: 220px;
white-space: normal !important;
word-wrap: break-word;
word-break: break-word;
}
#hallBookingTable th:nth-child(20),
#hallBookingTable td:nth-child(20) {
width: 80px !important;
max-width: 80px !important;
min-width: 80px !important;
white-space: normal !important;
word-break: break-word !important;
}*/
.hall-name-wrap {
min-width: 220px !important;
max-width: 220px !important;
white-space: normal !important;
word-break: break-word;
}
/* #hallBookingTable th:not(:nth-child(4)),
#hallBookingTable td:not(:nth-child(4)) {
white-space: nowrap;
}*/
/* Wrap selected columns */
/* 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>Community Hall CareTaker Performance Report</h4>
</div>
<!-- Filter Section -->
<div class="filter-section row">
<div class="col-md-2">
<label>From Date</label>
<input type="date" id="fromDate" class="form-control">
</div>
<div class="col-md-2">
<label>To Date</label>
<input type="date" id="toDate" class="form-control">
</div>
<div class="col-md-2">
<label>Region</label>
<select id="region" class="form-control">
<option value="">All</option>
<option value="North">North Region</option>
<option value="Center">Center Region</option>
<option value="South">South Region</option>
</select>
</div>
<div class="col-md-2">
<label>Zone</label>
<select id="zone" class="form-control">
<option value="">All</option>
</select>
</div>
<div class="col-md-2">
<label>Hall</label>
<select id="hallId" class="form-control">
<option value="">All</option>
</select>
</div>
<div class="col-md-2">
<label>Status</label>
<select id="status" class="form-control">
<option value="">All</option>
<option value="Active Hall">Active Hall</option>
<option value="Deactivated Hall">Deactivated Hall</option>
</select>
</div>
<div class="col-md-12 d-flex justify-content-center gap-2 mt-3">
<button id="searchBtn" class="btn btn-primary">
Search
</button>
<button id="resetBtn" class="btn btn-primary">
Reset
</button>
</div>
<!--<div class="col-md-2 mt-4">
<button class="btn btn-primary" id="searchBtn">
Search
</button>
<button class="btn btn-primary" id="resetBtn">
Reset
</button>
</div>-->
</div>
<div class="report-container">
<table id="hallBookingTable" class="table table-bordered table-striped nowrap" width="100%">
<thead>
<tr>
<th rowspan="2">S.No</th>
<th rowspan="2">Zone</th>
<th rowspan="2">Division</th>
<th rowspan="2">Hall Id</th>
<th rowspan="2">Hall Name</th>
<th rowspan="2">Hall Created On</th>
<th rowspan="2">Hall Status</th>
<th rowspan="2">Caretaker Name</th>
<th rowspan="2">Mobile No</th>
<th rowspan="2">Total Booking</th>
<th rowspan="2" class="wrap-text">Cancelled<br> Bookings</th>
<th rowspan="2" class="wrap-text">Rejected<br> Booking</th>
<th rowspan="2" class="wrap-text">Event Completed<br> Bookings</th>
<th rowspan="2" class="wrap-text">Cancelled Refund<br> Completed</th>
<th rowspan="2" class="wrap-text">Rejected Refund<br> Completed</th>
<th class="text-center" colspan="5">Refund Completed</th>
<th class="text-center" colspan="7">Refund Pending</th>
</tr>
<tr>
<!-- Refund Completed -->
<th>0-5 Days</th>
<th>6-15 Days</th>
<th>16-30 Days</th>
<th class="wrap-text">More than <br> 30 Days</th>
<th class="wrap-text">Total Refund <br> Completed</th>
<!-- Refund Pending -->
<th>0-5 Days</th>
<th>6-15 Days</th>
<th class="wrap-text">16-30 Days</th>
<th class="wrap-text">More than <br> 30 Days</th>
<th class="wrap-text">Cancelled <br> Booking</th>
<th class="wrap-text">Rejected <br> Booking</th>
<th class="wrap-text">Total Refund<br> Pending</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<!-- Details Modal -->
<div class="modal fade" id="detailModal" tabindex="-1" aria-labelledby="detailModalLabel" aria-hidden="true"
data-bs-backdrop="static">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="detailModalLabel">Compliance Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="modalDataTable" class="table table-bordered table-striped">
<thead class="table-dark">
<tr>
<th class="text-center">S.No</th>
<th class="text-center">Audit Date</th>
<th class="text-center">Shift</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Address</th>
<th class="text-center">Audit Category</th>
<th class="text-center">Question</th>
<th class="text-center">Answer</th>
<th class="text-center">Kitchen SI Name</th>
<th class="text-center">Raised By</th>
<th class="text-center">PMC Remarks</th>
<th class="text-center">PMC Image/Video Viewer</th>
<th class="text-center">FS Status</th>
<th class="text-center">FS Challenged By</th>
<th class="text-center">FS Remarks</th>
<th class="text-center">FS Image/Video Viewer</th>
<th class="text-center">CE Status</th>
<th class="text-center">CE Remarks</th>
<th class="text-center">CE Updated By</th>
<th class="text-center">Penalty Amount</th>
</tr>
</thead>
<tbody id="modalTableBody">
</tbody>
</table>
</div>
</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>
<!-- 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">
function loadZones() {
$.get("/commissionerreview/api/communityhall/zones", function (data) {
$('#zone').empty();
$('#zone').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
$('#zone').append(
'<option value="' + row.id + '">' +
row.zone_name +
'</option>'
);
});
});
}
let table;
function initializeTable() {
table = $('#hallBookingTable').DataTable({
dom: 'Bfrtip',
buttons: [
'excel',
/* {
extend: 'pdfHtml5',
text: 'PDF',
orientation: 'landscape',
pageSize: 'A3',
title: 'Community Hall Booking Report',
customize: function (doc) {
doc.defaultStyle.fontSize = 7;
doc.styles.tableHeader.fontSize = 8;
doc.content[1].table.widths =
Array(doc.content[1].table.body[0].length).fill('*');
doc.pageMargins = [10, 10, 10, 10];
}
},*/
/*{
extend: 'pdfHtml5',
text: 'PDF',
orientation: 'landscape',
pageSize: 'A2',
title: 'Community Hall Refund Review Report',
exportOptions: {
columns: ':visible'
},
customize: function (doc) {
doc.pageMargins = [5, 5, 5, 5];
doc.defaultStyle.fontSize = 8;
doc.styles.tableHeader.fontSize = 9;
doc.content[1].table.widths = [
20, // S.No
20, // Zone
25, // Division
25, // Hall Id
130, // Hall Name
65, // Hall Created On
65, // Hall Status
80, // Caretaker Name
50, // Mobile No
55, // Total Booking
55, // Cancelled Booking
55, // Rejected Booking
65, // Event Completed
55, // Cancelled Completed
55, // Rejected Completed
60, // Settlement Completed
50, // 0-5 Days
50, // 6-15 Days
50, // 16-30 Days
55, // More Than 30 Days
55, // Cancelled Pending
55, // Rejected Pending
55 // Total Pending
];
doc.styles.tableHeader.alignment = 'center';
doc.defaultStyle.alignment = 'center';
doc.content[0].margin = [0, 0, 0, 10];
// Hall Name wrap
doc.content[1].table.body.forEach(function (row, index) {
if (index > 0) {
row[4].alignment = 'left'; // Hall Name
row[7].alignment = 'left'; // Caretaker Name
}
});
}*/
{
extend: 'pdfHtml5',
text: 'PDF',
orientation: 'landscape',
pageSize: 'A3',
title: 'Community Hall Caretaker Report',
exportOptions: {
columns: ':visible'
},
customize: function (doc) {
doc.pageMargins = [5, 5, 5, 5];
doc.defaultStyle.fontSize = 8;
doc.styles.tableHeader.fontSize = 9;
// Reduce unwanted columns
doc.content[1].table.widths = [
10, // S.No
25, // Zone
35, // Division
25, // Hall Id
80, // Hall Name
50, // Hall Created On
50, // Hall Status
60, // Caretaker Name
50, // Mobile No
35, // Total Booking
45, // Cancelled Booking
35, // Rejected Booking
45, // Event Completed
45, // Cancelled Completed
45, // Rejected Completed
25, // 0-5 Days
25, // 6-15 Days
25, // 16-30 Days
25, // More Than 30 Days
45, // Settlement Completed
25, // Pending 0-5
25, // Pending 6-15
25, // Pending 16-30
25, // Pending >30
30, // Pending Cancelled
30, // Pending Rejected
35 // Total Pending
];
doc.styles.tableHeader.alignment = 'center';
doc.defaultStyle.alignment = 'center';
}
}
],
/*buttons: [
'copy',
'csv',
'excel',
'pdf'
],*/
scrollX: true,
scrollCollapse: true,
autoWidth: false,
paging: false,
fixedColumns: {
leftColumns: 9
},
/* columns: [
{ data: 'zone' },
{ data: 'division' },
{ data: 'hall_id' },
{ data: 'hall_name' },
{ data: 'hall_created_date' },
{ data: 'hall_status' },
{ data: 'caretaker_name' },
{ data: 'caretaker_no' },
{ data: 'booking_available_days' },
{ data: 'total_no_of_bookings' },
{ data: 'half_day_booking_count' },
{ data: 'full_day_booking_count' },
{ data: 'one_point_five_days_booking_count' },
{ data: 'two_days_booking_count' }
]*/
columns: [
{
data: null,
render: function (data, type, row, meta) {
return meta.row + 1;
}
},
{ data: 'zone' },
{ data: 'division' },
{ data: 'hall_id' },
{ data: 'hall_name' },
{ data: 'hall_Created_date' },
{ data: 'Hall_Status' },
{ data: 'caretaker_name' },
{ data: 'caretake_no' },
{ data: 'total_no_of_bookings' },
{ data: 'cancelled_bookings' },
{ data: 'rejected_bookings' },
{ data: 'event_completed_count' },
/* Refund Completed */
{ data: 'cancelled_completed_count' },
{ data: 'rejected_completed_count' },
{ data: 'settlement_Completed_0_5_days' },
{ data: 'settlement_Completed_6_15_days' },
{ data: 'settlement_Completed_16_30_days' },
{ data: 'settlement_Completed_more_than_30_days' },
{ data: 'refund_completed_count' },
/* Refund Pending */
{ data: 'settlement_Pending_0_5_days' },
{ data: 'settlement_Pending_6_15_days' },
{ data: 'settlement_Pending_16_30_days' },
{ data: 'settlement_Pending_more_than_30_days' },
{ data: 'cancelled_settlement_pending' },
{ data: 'rejected_settlement_pending' },
{ data: 'total_bookings' }
],
columnDefs: [
{
targets: 4, // Hall Name column (0-based index)
className: 'hall-name-wrap'
}
]
});
}
$('#region').change(function () {
var region = $(this).val();
$('#zone').val('');
if (region == 'North') {
loadRegionZones([1, 2, 3, 4, 5]);
}
else if (region == 'Center') {
loadRegionZones([6, 7, 8, 9, 10]);
}
else if (region == 'South') {
loadRegionZones([11, 12, 13, 14, 15]);
}
else {
loadZones();
}
});
function loadRegionZones(zoneIds) {
$.get("/commissionerreview/api/communityhall/zones", function (data) {
$('#zone').empty();
$('#zone').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
if (zoneIds.includes(row.id)) {
$('#zone').append(
'<option value="' + row.id + '">' +
row.zone_name +
'</option>'
);
}
});
});
}
$('#searchBtn').click(function () {
loadReport(false);
});
$('#resetBtn').click(function () {
$('#fromDate').val('');
$('#toDate').val('');
$('#region').val('');
$('#zone').val('');
$('#hallId').val('');
$('#hallId').trigger('change');
$('#status').val('');
loadReport(true);
});
function loadReport(isInitialLoad) {
let zone = $("#zone").val();
let fromDate = $("#fromDate").val();
let toDate = $("#toDate").val();
let region = $("#region").val();
let hallId = $("#hallId").val();
let status = $('#status').val();
if (!isInitialLoad &&
zone == '' &&
region == '' &&
hallId == '' &&
fromDate == '' &&
toDate == '' &&
status == '') {
Swal.fire({
icon: 'warning',
title: 'Warning',
text: 'Please select at least one filter.',
confirmButtonColor: '#3085d6'
});
return;
}
if (fromDate != '') {
if (toDate == '') {
Swal.fire({
icon: 'warning',
title: 'Warning',
text: 'Please select both from date and to date.',
confirmButtonColor: '#3085d6'
});
return;
}
}
if (toDate != '') {
if (fromDate == '') {
Swal.fire({
icon: 'warning',
title: 'Warning',
text: 'Please select both from date and to date.',
confirmButtonColor: '#3085d6'
});
return;
}
}
$.ajax({
url: '/commissionerreview/api/communityhall/caretaker-report',
type: 'GET',
data: {
fromDate: $('#fromDate').val(),
toDate: $('#toDate').val(),
region: $('#region').val(),
zone: $('#zone').val(),
hallId: $('#hallId').val(),
status: $('#status').val()
},
success: function (response) {
table.clear();
response.forEach(function (row, index) {
row.sno = index + 1;
});
response.forEach(function (row, index) {
var total_bookings = row.settlement_Pending_0_5_days + row.settlement_Pending_6_15_days + row.settlement_Pending_16_30_days + row.settlement_Pending_more_than_30_days + row.cancelled_settlement_pending + row.rejected_settlement_pending;
row.total_bookings = total_bookings;
});
table.rows.add(response);
table.draw();
setTimeout(function () {
table.columns.adjust();
}, 200);
}
});
}
/* $(document).ready(function () {
loadZones();
loadHalls();
initializeTable();
// Loads complete report
loadReport();
});*/
$(document).ready(function () {
$("#fromDate").on("change", function () {
let fromDate = $(this).val();
// Set minimum selectable date for To Date
$("#toDate").attr("min", fromDate);
// If current To Date is less than From Date, clear it
if ($("#toDate").val() < fromDate) {
$("#toDate").val('');
}
});
loadZones();
loadHalls();
initializeTable();
loadReport(true);
});
/*function loadHalls() {
$.get("/commissionerreview/api/communityhall/halls", function (data) {
$('#hallId').empty();
$('#hallId').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
$('#hallId').append(
'<option value="' + row.hall_id + '">' +
row.hall_id + " - " + row.hall_name + " - " + row.hall_created_date +
'</option>'
);
});
}).fail(function () {
alert("Failed to load halls");
});
}*/
function loadHalls() {
$.get("/commissionerreview/api/communityhall/halls", function (data) {
$('#hallId').empty();
$('#hallId').append(
'<option value="">All</option>'
);
$.each(data, function (i, row) {
$('#hallId').append(
'<option value="' + row.hall_id + '">' +
row.hall_id + ' - ' + row.hall_name + ' - ' + row.hall_created_date +
'</option>'
);
});
// Destroy existing Select2 if already initialized
if ($('#hallId').hasClass('select2-hidden-accessible')) {
$('#hallId').select2('destroy');
}
// Initialize Select2
$('#hallId').select2({
placeholder: 'Search Hall',
allowClear: true,
width: '100%'
});
});
}
// if (true) {
// var a = 5;
// }
// console.log(a);
// Error
// Recalculate precisely after Bootstrap entirely finishes destroying modal padding
</script>
</body>
</html>

1006
src/main/resources/templates/modules/communityrefund.html
File diff suppressed because it is too large
View File

Loading…
Cancel
Save