You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

596 lines
28 KiB

package com.gcc.communityHall.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.gcc.communityHall.entity.BookingDetails;
import com.gcc.communityHall.entity.BookingDetails.RefundStatus;
import com.gcc.communityHall.entity.CounterRefundList;
import com.gcc.communityHall.entity.GccBlockingDate;
import com.gcc.communityHall.entity.HallDetails;
import com.gcc.communityHall.entity.Payments;
import com.gcc.communityHall.entity.Settlement;
import com.gcc.communityHall.entity.Users;
import com.gcc.communityHall.others.AppConfig;
import com.gcc.communityHall.repository.BookingDetailsRepository;
import com.gcc.communityHall.repository.CounterRefundListRepository;
import com.gcc.communityHall.repository.GccBlockingDateRepository;
import com.gcc.communityHall.repository.HallDetailsRepository;
import com.gcc.communityHall.repository.PaymentsRepository;
import com.gcc.communityHall.repository.SettlementRepository;
import com.gcc.communityHall.repository.UsersRepository;
import com.gcc.communityHall.service.BookingService;
import com.gcc.communityHall.service.HallDetailService;
import jakarta.servlet.http.HttpSession;
@Controller
@RequestMapping("/communityhall/officer")
public class OfficerController {
@Autowired
private AppConfig appConfig;
@Autowired
private BookingDetailsRepository bookingDetailsRepository;
@Autowired
private PaymentsRepository paymentsRepository;
@Autowired
private UsersRepository usersRepository;
@Autowired
private SettlementRepository settlementRepository;
@Autowired
private CounterRefundListRepository counterRefundListRepository;
@Autowired
private BookingService bookingService;
@Autowired
private HallDetailsRepository hallDetailsRepository;
@Autowired
private HallDetailService hallDetailsService;
@Autowired
private GccBlockingDateRepository blockingDateRepository;
@GetMapping("/login")
public String viewLoginPage(Model model) {
String msg = "Login to Your Account";
model.addAttribute("errortxt", msg);
return "officiallogin";
}
@GetMapping("/officer-dashboard")
public String viewDashboard(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
String zone = (String) session.getAttribute("zone");
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("zone", zone);
return "officer/officer-dashboard";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/booking-pending")
public String viewhall(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "pending bookings");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> pendingbooking = bookingDetailsRepository.getPendingOrPaymentFailureBookings(zone);
model.addAttribute("pendingbooking", pendingbooking);
return "officer/booking-pending";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/payment-list")
public String viewPayment(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "paymentlist");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
// System.out.println(zone);
List<Payments> pay = paymentsRepository.getPaymentListByzone(zone);
model.addAttribute("paymentlist", pay);
return "officer/payment-list";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/bookingwaitinglist")
public String viewWaitingBookings(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "bookinglist");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> bookingList = bookingDetailsRepository.getWaitinglist(zone);
model.addAttribute("bookingList", bookingList);
return "officer/booking-list"; // Assuming "officer/rejected-booking-list" is the name of your HTML template
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/booking-list")
public String viewBookingList(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "bookinglist");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> bookingList = bookingDetailsRepository.getApprovedlist(zone);
model.addAttribute("bookingList", bookingList);
return "officer/booking-list"; // Assuming "officer/rejected-booking-list" is the name of your HTML template
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/rejected-list")
public String viewRejectedBookings(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "rejectedlist");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> rejectedBookings = bookingDetailsRepository.getrejectedlist(zone);
model.addAttribute("rejectedBookings", rejectedBookings);
return "officer/rejected-list";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/settlement-list")
public String settlementPendingList(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "settlement Pending");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
System.out.println("Zone: " + zone);
List<BookingDetails> settlement = bookingDetailsRepository.findSettlementPendingByZone(zone);
// ak
List<BookingDetails> settlementIntiated = bookingDetailsRepository
.findSettlementInitiatedPendingByZone(zone);
List<BookingDetails> cancelledbookings = bookingDetailsRepository.findCancelledListByZone(zone);
List<BookingDetails> rejectedbookings = bookingDetailsRepository.findRejectedListByZone(zone);
model.addAttribute("settlementlist", settlement);
// AK
model.addAttribute("settlementIntiated", settlementIntiated);
model.addAttribute("cancelledbookings", cancelledbookings);
model.addAttribute("rejectedbookings", rejectedbookings);
System.out.println("settlementIntiated" + settlementIntiated);
return "officer/settlement-list";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/refundfailed-list")
public String RefundFailedList(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "settlementapproved");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> settlementrefundfailed = bookingDetailsRepository
.findSettlementRefundFailedByZone(zone);
List<BookingDetails> refundfailedcancelledbookings = bookingDetailsRepository
.findRefundFaileCancelledListByZone(zone);
List<BookingDetails> refundfailedrejectedbookings = bookingDetailsRepository
.findRefundFaileRejectedListByZone(zone);
model.addAttribute("settlementrefundfailed", settlementrefundfailed);
model.addAttribute("refundfailedcancelledbookings", refundfailedcancelledbookings);
model.addAttribute("refundfailedrejectedbookings", refundfailedrejectedbookings);
return "officer/refund-failedlist";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/settlement-approved")
public String settlementApprovedList(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "settlementapproved");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> settlement = bookingDetailsRepository.findSettlementApprovedByZone(zone);
List<BookingDetails> approvedcancelledbookings = bookingDetailsRepository
.findapprovedCancelledListByZone(zone);
List<BookingDetails> approvedrejectedbookings = bookingDetailsRepository
.findapprovedRejectedListByZone(zone);
model.addAttribute("approvedSettlementlist", settlement);
model.addAttribute("approvedcancelledbookings", approvedcancelledbookings);
model.addAttribute("approvedrejectedbookings", approvedrejectedbookings);
return "officer/settlement-approved";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/settlement-reject")
public String settlementRejectedList(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "settlement rejected");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> settlement = bookingDetailsRepository.findSettlementRejectedByZone(zone);
model.addAttribute("rejectSettlementlist", settlement);
return "officer/settlement-reject";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/settlement-completedlist")
public String viewSettlementcompletedMaster(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<BookingDetails> completedlist = bookingDetailsRepository.findSettlementCompletedListbyzone(zone);
List<BookingDetails> cancelledcompletedlist = bookingDetailsRepository
.findCancelledCompletedListbyzone(zone);
List<BookingDetails> rejectedcompletedlist = bookingDetailsRepository
.findRejectedSettlementCompletedListbyzone(zone);
model.addAttribute("title", "settlement initiate");
model.addAttribute("officername", officername);
model.addAttribute("completedlist", completedlist);
model.addAttribute("cancelledcompletedlist", cancelledcompletedlist);
model.addAttribute("rejectedcompletedlist", rejectedcompletedlist);
return "officer/settlement-completed";
} else {
session.invalidate(); // Invalidate the session to clear all session attributes
return "redirect:/communityhall/login";
}
}
@GetMapping("/reports")
public String viewReports(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
String zone = (String) session.getAttribute("zone");
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("zone", zone);
List<HallDetails> hallnames = hallDetailsService.getHallNames();
model.addAttribute("hallnames", hallnames);
return "officer/report";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/getReport")
public String viewgetReports(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
String zone = (String) session.getAttribute("zone");
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("zone", zone);
List<HallDetails> hallnames = hallDetailsService.getHallNames();
model.addAttribute("hallnames", hallnames);
return "officer/report";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@PostMapping("/getReport")
public String generateReport(Model model, HttpSession session,
@RequestParam(name = "FromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String fromDate,
@RequestParam(name = "ToDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String toDate,
@RequestParam(name = "request") String request,
@RequestParam(name = "bookingStatus", required = false) String bookingStatus,
@RequestParam(name = "filterby", required = false) String filterby,
@RequestParam(name = "refundStatus", required = false) String refundStatus,
@RequestParam(name = "hallname", required = false, defaultValue = "0") Integer hallId) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
List<HallDetails> hallnames = hallDetailsService.getHallNamesbyzone(zone);
model.addAttribute("hallnames", hallnames);
List<BookingDetails> bookingList = handleBookingRequest(request, fromDate, toDate, bookingStatus, zone,
filterby);
List<BookingDetails> bookingSettlementList = handleBookingSettlementRequest(request, fromDate, toDate,
refundStatus, zone, filterby);
List<Object[]> paymentList = request.equals("3")
? bookingService.getAllPaymentsDetailsByZone(fromDate, toDate, zone)
: new ArrayList<>();
List<Object[]> hallbookingList = handleHallBookingRequest(request, fromDate, toDate, zone, hallId,
filterby);
model.addAttribute("bookings", bookingList);
model.addAttribute("bookingSettlementList", bookingSettlementList);
model.addAttribute("bookingStatus", bookingStatus);
model.addAttribute("refundStatus", refundStatus);
model.addAttribute("fromdate", fromDate);
model.addAttribute("todate", toDate);
model.addAttribute("request", request);
model.addAttribute("filterby", filterby);
model.addAttribute("paymentLists", paymentList);
model.addAttribute("hallbookingLists", hallbookingList);
return "officer/report";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
private List<BookingDetails> handleBookingRequest(String request, String fromDate, String toDate,
String bookingStatus, String zone, String filterby) {
if (!request.equals("1")) {
return new ArrayList<>();
}
if (bookingStatus.isEmpty() && filterby.isEmpty()) {
return bookingService.getAllBookingDetailsBookingDateByZone(fromDate, toDate, zone);
}
if (filterby.isEmpty() && !bookingStatus.isEmpty()) {
return bookingService.getAllBookingDetailsBookingDateByZoneWithStatus(fromDate, toDate, zone,
bookingStatus);
}
if (!filterby.isEmpty()) {
if ("1".equals(filterby)) {
if (bookingStatus.isEmpty()) {
return bookingService.getAllBookingDetailsBookingDateByZone(fromDate, toDate, zone);
} else {
return bookingService.getAllBookingDetailsBookingDateByZoneWithStatus(fromDate, toDate, zone,
bookingStatus);
}
}
if ("2".equals(filterby)) {
if (bookingStatus.isEmpty()) {
return bookingService.getAllBookingDetailsEventDateByZone(fromDate, toDate, zone);
} else {
return bookingService.getAllBookingDetailsEventDateByZoneWithStatus(fromDate, toDate, zone,
bookingStatus);
}
}
}
return new ArrayList<>();
}
private List<BookingDetails> handleBookingSettlementRequest(String request, String fromDate, String toDate,
String refundStatus, String zone, String filterby) {
if (!request.equals("2")) {
return new ArrayList<>();
}
if ((refundStatus == null || refundStatus.isEmpty()) && filterby.isEmpty()) {
return bookingService.getAllBookingsettlementDetailsByZoneByBookingDate(fromDate, toDate, zone);
}
if ((refundStatus != null && !refundStatus.isEmpty()) && filterby.isEmpty()) {
return bookingService.getAllBookingsettlementDetailsByZoneByBookingDateWithStatus(fromDate, toDate, zone,
refundStatus);
}
if (!filterby.isEmpty()) {
if ("1".equals(filterby)) {
if (refundStatus.isEmpty() || refundStatus == null) {
return bookingService.getAllBookingsettlementDetailsByZoneByBookingDate(fromDate, toDate, zone);
} else {
return bookingService.getAllBookingsettlementDetailsByZoneByBookingDateWithStatus(fromDate, toDate,
zone, refundStatus);
}
}
if ("2".equals(filterby)) {
if (refundStatus.isEmpty() || refundStatus == null) {
return bookingService.getAllBookingsettlementDetailsByZoneByEventDate(fromDate, toDate, zone);
} else {
return bookingService.getAllBookingsettlementDetailsByZoneByEventDateWithStatus(fromDate, toDate,
zone, refundStatus);
}
}
}
return new ArrayList<>();
}
private List<Object[]> handleHallBookingRequest(String request, String fromDate, String toDate, String zone,
Integer hallId, String filterby) {
if (!request.equals("4")) {
return new ArrayList<>();
}
if (filterby.isEmpty() && hallId == 0) {
return bookingService.getBookingHallDetailsReportByZoneByBookingDate(fromDate, toDate, zone);
}
if (filterby.isEmpty() && hallId != 0) {
return bookingService.getBookingHallDetailsReportByZoneByBookingDateHallname(fromDate, toDate, zone,
hallId);
}
if (!filterby.isEmpty()) {
if ("1".equals(filterby)) {
if (hallId != 0) {
return bookingService.getBookingHallDetailsReportByZoneByBookingDateHallname(fromDate, toDate, zone,
hallId);
} else {
return bookingService.getBookingHallDetailsReportByZoneByBookingDate(fromDate, toDate, zone);
}
}
if ("2".equals(filterby)) {
if (hallId != 0) {
return bookingService.getBookingHallDetailsReportByZoneByEventDateHallname(fromDate, toDate, zone,
hallId);
} else {
return bookingService.getBookingHallDetailsReportByZoneByEventDate(fromDate, toDate, zone);
}
}
}
return new ArrayList<>();
}
@GetMapping("/counter-refund")
public String counterRefundList(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
model.addAttribute("officername", officername);
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("title", "settlement rejected");
model.addAttribute("baseURL", appConfig.getBaseUrl());
String zone = (String) session.getAttribute("zone");
model.addAttribute("zone", zone);
List<CounterRefundList> counterRefund = counterRefundListRepository.findCounterRefundList(zone);
model.addAttribute("counterRefund", counterRefund);
return "officer/counter-refund";
} else {
session.invalidate();
return "redirect:/communityhall/login";
}
}
@GetMapping("/logout")
public String viewLogout(Model model, HttpSession session) {
session.invalidate();
return "redirect:/communityhall/login";
}
// Newly added for zone level block
@GetMapping("/Gccblocking")
public String viewGccBlocking(Model model, HttpSession session) {
String officername = (String) session.getAttribute("usertype");
if (officername != null) {
long mobileno = (long) session.getAttribute("mobileno");
model.addAttribute("mobileno", mobileno);
model.addAttribute("officername", officername);
// Fetch all blocked GCC dates
List<GccBlockingDate> gccBlocked = blockingDateRepository.findAllBlocked();
// Ensure distinct by hallId, blockingReason, startDate, and endDate
List<GccBlockingDate> uniqueGccBlockingDates = gccBlocked.stream()
.filter(distinctByKey(g -> Arrays.asList(
g.getHallId(),
g.getBlockingReason(),
g.getStartDate(),
g.getEndDate())))
.collect(Collectors.toList());
// Map to store the count of blocked halls for each GccBlockingDate
Map<Integer, Integer> hallCountMap = new HashMap<>();
for (GccBlockingDate blockedDate : uniqueGccBlockingDates) {
// Parse and count unique hall IDs
String hallIds = blockedDate.getHallId();
if (hallIds != null && !hallIds.isEmpty()) {
Set<String> uniqueHallIds = new HashSet<>(Arrays.asList(hallIds.split(",")));
int hallCount = uniqueHallIds.size();
hallCountMap.put(blockedDate.getBlockingId(), hallCount);
} else {
hallCountMap.put(blockedDate.getBlockingId(), 0); // No halls blocked
}
}
// Add attributes to the model for the view
model.addAttribute("gccblocked", uniqueGccBlockingDates);
model.addAttribute("hallCountMap", hallCountMap);
return "officer/gccblocking";
} else {
session.invalidate(); // Invalidate the session to clear all session attributes
return "redirect:/communityhall/login";
}
}
// Utility method to ensure distinct by a key
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = new HashSet<>();
return t -> seen.add(keyExtractor.apply(t));
}
}