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.
 
 
 
 
 

2450 lines
138 KiB

package com.gcc.communityHall.service.Impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.gcc.communityHall.entity.ApplicationLogs;
import com.gcc.communityHall.entity.BookingCalendar;
import com.gcc.communityHall.entity.BookingDetails;
import com.gcc.communityHall.entity.BookingDetails.BookingStatus;
import com.gcc.communityHall.entity.BookingDetails.RefundStatus;
import com.gcc.communityHall.entity.BookingDocuments;
import com.gcc.communityHall.entity.BookingHistory;
import com.gcc.communityHall.entity.Damage;
import com.gcc.communityHall.entity.DiscountRange;
import com.gcc.communityHall.entity.EbDetails;
import com.gcc.communityHall.entity.GccBlockingDate;
import com.gcc.communityHall.entity.GccBlockingHistory;
import com.gcc.communityHall.entity.GccblockingDocuments;
import com.gcc.communityHall.entity.HallDetails;
import com.gcc.communityHall.entity.HallDetailsConcession;
import com.gcc.communityHall.entity.ReasonDocumentMaster;
import com.gcc.communityHall.entity.ReasonMaster;
import com.gcc.communityHall.entity.Settlement;
import com.gcc.communityHall.entity.Users;
import com.gcc.communityHall.exception.SlotOccupiedException;
import com.gcc.communityHall.others.UserSession;
import com.gcc.communityHall.paymentService.repository.TransRefundResRepository;
import com.gcc.communityHall.paymentService.repository.TransactionResponseRepository;
import com.gcc.communityHall.paymentService.service.PaymentGatewayService;
import com.gcc.communityHall.repository.ApplicationLogsRepository;
import com.gcc.communityHall.repository.BookingCalendarRepository;
import com.gcc.communityHall.repository.BookingDetailsRepository;
import com.gcc.communityHall.repository.BookingDocumentsRepository;
import com.gcc.communityHall.repository.BookingHistoryRepository;
import com.gcc.communityHall.repository.DamageRepository;
import com.gcc.communityHall.repository.EbDetailsRepository;
import com.gcc.communityHall.repository.GccBlockingDateRepository;
import com.gcc.communityHall.repository.GccBlockingHistoryRepository;
import com.gcc.communityHall.repository.GccblockingDocumentsRepo;
import com.gcc.communityHall.repository.HallDetailsConcessionRepo;
import com.gcc.communityHall.repository.HallDetailsRepository;
import com.gcc.communityHall.repository.ReasonMasterRepository;
import com.gcc.communityHall.repository.SettlementRepository;
import com.gcc.communityHall.repository.UsersRepository;
import com.gcc.communityHall.service.ApplicationLogService;
import com.gcc.communityHall.service.BookingService;
import com.gcc.communityHall.service.DiscountRangeService;
import com.gcc.communityHall.service.HallDetailService;
import com.gcc.communityHall.service.ReasonMasterService;
import com.gcc.communityHall.service.UserService;
@Service
public class BookingServiceImpl implements BookingService {
@Autowired
private BookingDetailsRepository bookingDetailsRepository;
@Autowired
private BookingDocumentsRepository bookingDocumentsRepository;
@Autowired
private ReasonMasterService reasonMasterService;
@Autowired
private HallDetailService hallDetailService;
@Autowired
private UserService userService;
@Autowired
private UsersRepository userRepository;
@Autowired
private UserSession userSession;
@Autowired
private GccBlockingDateRepository gccBlockingDateRepository;
@Autowired
private BookingCalendarRepository bookingCalendarRepository;
@Autowired
private BookingHistoryRepository bookingHistoryRepository;
@Autowired
private EbDetailsRepository ebDetailsRepository;
@Autowired
private DamageRepository damageRepository;
@Autowired
private SettlementRepository settlementRepository;
@Autowired
private ApplicationLogService applicationLogService;
@Autowired
private PaymentGatewayService paymentGatewayService;
@Autowired
private GccBlockingDateRepository blockingDateRepository;
@Autowired
private DiscountRangeService discountRangeService;
@Autowired
private HallDetailsRepository hallDetailsRepository;
@Autowired
private GccBlockingHistoryRepository blockingHistoryRepository;
@Autowired
private WhatsappMsgServiceImpl whatsappMsgServiceImpl;
@Autowired
private GccblockingDocumentsRepo gccblockingDocumentsRepo;
@Autowired
private HttpSession session;
@Autowired
private HallDetailsConcessionRepo hallDetailsConcessionRepo;
@Autowired
private ReasonMasterRepository reasonMasterRepository;
@Autowired
private ApplicationLogsRepository applicationLogsRepository;
@Autowired
private TransactionResponseRepository transactionResponseRepository;
@Autowired
private TransRefundResRepository transRefundResRepository;
@Value("${file.upload.directory}")
private String uploadDirectory;
@Value("${file.fullpath}")
private String serverPath;
private final PlatformTransactionManager transactionManager;
public BookingServiceImpl(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
@Override
public BookingDetails getBookingsById(int BookingId) {
Optional<BookingDetails> OPBookingDetails = bookingDetailsRepository.findById(BookingId);
if (OPBookingDetails.isPresent()) {
return OPBookingDetails.get();
}
return null;
}
@Override
public BookingDetails updateBookingDetails(BookingDetails bd) {
return bookingDetailsRepository.save(bd);
}
@Override
public BookingDetails updateBookingStatus(int bookingId, BookingDetails.BookingStatus status, String comments) {
Optional<BookingDetails> booking = bookingDetailsRepository.findById(bookingId);
if (booking.isPresent()) {
BookingDetails book = booking.get();
/*BookingHistory bookingHistory = new BookingHistory();
bookingHistory.setBookingDetails(book);
bookingHistory.setStartDate(book.getStartDate());
bookingHistory.setEndDate(book.getEndDate());
bookingHistory.setBookingStatus(book.getBookingStatus());
bookingHistory.setComments(book.getComments());
bookingHistory.setCdate(new Date());
bookingHistory.setRefundStatus(book.getRefundStatus());
System.out.println("bookingHistory.."+bookingHistory);
bookingHistoryRepository.save(bookingHistory);*/
book.setBookingStatus(status);
book.setComments(comments);
BookingDetails bookings = bookingDetailsRepository.save(book);
return bookings;
}
return null;
}
@Override
public String confirmTheDateAndSlot(String fromDate, String toDate, int days, int fromStartingSlot, int fromEndingSlot, int toStartingSlot, int toEndingSlot, int bookingId, int userId) {
return null;
}
@Override
@Transactional
public String confirmBooking(int bookingId) {
String exMsg = "Slot occupied";
BookingDetails bookingDetails = null;
try {
Optional<BookingDetails> bookingDet = bookingDetailsRepository.findById(bookingId);
if (!bookingDet.isPresent()) {
// Handle invalid booking ID
return "Invalid booking ID";
}
bookingDetails = bookingDet.get();
// Validate booking details
int hallId = bookingDetails.getHallDetails().getHallId();
LocalDate startDate = LocalDate.parse(bookingDetails.getStartDate());
LocalDate endDate = LocalDate.parse(bookingDetails.getEndDate());
// Iterate through each date of the booking
int i = 0;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
BookingCalendar bookingCalendar = bookingCalendarRepository.findByBdateAndHallId(date, hallId);
if (bookingCalendar != null) {
// System.out.println(bookingCalendar.toString());
// System.out.println("date:-"+date );
// System.out.println("bookingDetails.getEndingSlot() :- "+bookingDetails.getEndingSlot());
//System.out.println("bookingCalendar.isMorningSlot():-"+bookingCalendar.isMorningSlot());
//System.out.println(date.equals(endDate) && bookingDetails.getEndingSlot() == 1 && bookingCalendar.isMorningSlot());
//System.out.println();
// Check if the slot is already occupied
if (bookingCalendar.getIs_blocked()) {
throw new RuntimeException("GCC Blocked Date");
} else if ((date.equals(startDate) && bookingDetails.getStartingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(startDate) && bookingDetails.getStartingSlot() == 2 && bookingCalendar.isEveningSlot()) ||
(date.equals(endDate) && bookingDetails.getEndingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(endDate) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isEveningSlot())) {
//System.out.println("booking slot occupied:- 218");
throw new RuntimeException(exMsg);
} else if (bookingCalendar.isMorningSlot() && bookingCalendar.isEveningSlot()) {
//System.out.println("booking slot occupied:- 221");
throw new RuntimeException(exMsg);
} else if (!date.equals(endDate) && i != 0 && i != Math.round(bookingDetails.getNoOfDays() - 1)
&& (bookingCalendar.isMorningSlot() || bookingCalendar.isEveningSlot())) {
//System.out.println("booking slot occupied:- 227 :-"+Math.round(bookingDetails.getNoOfDays()-1) );
throw new RuntimeException(exMsg);
} else if (date.equals(endDate) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isMorningSlot()
&& i != 0 && i == Math.round(bookingDetails.getNoOfDays() - 1)) {
// System.out.println("booking slot occupied:- 240 :-"+Math.round(bookingDetails.getNoOfDays()-1) );
throw new RuntimeException(exMsg);
}
} else {
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
System.out.println("uniqueId....." + uniqueId);
bookingCalendar = new BookingCalendar();
bookingCalendar.setBdate(date);
bookingCalendar.setHallId(hallId);
bookingCalendar.setIs_booked(0);
bookingCalendar.setIs_active(true);
bookingCalendar.setUnique_id(uniqueId);
}
// Mark the appropriate slot as booked based on starting and ending slots
if (date.equals(startDate)) {
//System.out.println(i + "start :-"+bookingCalendar.toString());
if (bookingDetails.getStartingSlot() == 1) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
if (!date.equals(endDate)) {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
} else if (startDate.equals(endDate) && bookingDetails.getStartingSlot() == 1 && bookingDetails.getEndingSlot() == 2) {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
} else {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
} else if (date.equals(endDate)) {
if (bookingDetails.getEndingSlot() == 1) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
} else {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
if (bookingDetails.getEndingSlot() == 2) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
}
} else {
// For dates between start and end date, mark both slots as booked
bookingCalendar.setMorningSlot(true);
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 2);
}
// System.out.println(i + "end:-"+bookingCalendar.toString());
bookingCalendarRepository.save(bookingCalendar);
i++;
}
String statusMessage = processBookingStatusAndSendMessages(bookingDetails);
return statusMessage;
/*String reason = bookingDetails.getReason();
ReasonMaster reasondetails = reasonMasterRepository.findByReason(reason);
String reasoncode = reasondetails.getReasoncode();
if (reasoncode == null) {
reasoncode = ""; // or any default value
}
if (reasoncode.equals("CGE") || reasoncode.equals("CAO") || reasoncode.equals("SGE")) {
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.WAITING_FOR_NOC, "Waiting For NOC Documents");
String bookingconfirmationmsg = "Your booking ID " + bookingDetails.getBookingId() + " on " + bookingDetails.getBookingDate() + " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookingDetails.getUsers().getMobileNo() + "&from=GCCCRP&body=" + bookingconfirmationmsg + "&entityid=1401572690000011081&templateid=1407172346459428987";
String whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" + bookingDetails.getBookingId() + "+on+" + bookingDetails.getBookingDate() + "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Waiting For NOC Documents";
} else {
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.APPROVED, "Booking Confirmed Successfully");
String bookingconfirmationmsg = "Your booking ID " + bookingDetails.getBookingId() + " on " + bookingDetails.getStartDate() + " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookingDetails.getUsers().getMobileNo() + "&from=GCCCRP&body=" + bookingconfirmationmsg + "&entityid=1401572690000011081&templateid=1407172346459428987";
String whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" + bookingDetails.getBookingId() + "+on+" + bookingDetails.getStartDate() + "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Booking confirmed successfully";
}*/
} catch (Exception e) {
e.printStackTrace();
bookingFailure(bookingDetails, 2);
// System.out.println(bookingDetails.getBookingStatus()+","+bookingDetails.getRefundStatus()+","+bookingDetails.getComments());
return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId();
}
}
@Transactional
public String processBookingStatusAndSendMessages(BookingDetails bookingDetails) {
try {
String reason = bookingDetails.getReason();
ReasonMaster reasonDetails = reasonMasterRepository.findByReason(reason);
String reasonCode = (reasonDetails != null && reasonDetails.getReasoncode() != null) ? reasonDetails.getReasoncode() : "";
String bookingconfirmationmsg, urlString, whatsupmsg;
if (reasonCode.equals("CGE") || reasonCode.equals("CAO") || reasonCode.equals("SGE")) {
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.WAITING_FOR_NOC, "Waiting For NOC Documents");
bookingconfirmationmsg = "Your booking ID " + bookingDetails.getBookingId() + " on " + bookingDetails.getBookingDate() + " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookingDetails.getUsers().getMobileNo() +
"&from=GCCCRP&body=" + bookingconfirmationmsg + "&entityid=1401572690000011081&templateid=1407172346459428987";
whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" +
bookingDetails.getUsers().getMobileNo() +
"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" +
bookingDetails.getBookingId() + "+on+" + bookingDetails.getBookingDate() +
"+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Waiting For NOC Documents";
} else {
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.APPROVED, "Booking Confirmed Successfully");
bookingconfirmationmsg = "Your booking ID " + bookingDetails.getBookingId() + " on " + bookingDetails.getStartDate() + " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookingDetails.getUsers().getMobileNo() +
"&from=GCCCRP&body=" + bookingconfirmationmsg + "&entityid=1401572690000011081&templateid=1407172346459428987";
whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" +
bookingDetails.getUsers().getMobileNo() +
"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" +
bookingDetails.getBookingId() + "+on+" + bookingDetails.getStartDate() +
"+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Booking confirmed successfully";
}
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
@Override
@Transactional
public String confirmStateBooking(int bookingId) {
String exMsg = "Slot occupied";
BookingDetails bookingDetails = null;
try {
Optional<BookingDetails> bookingDet = bookingDetailsRepository.findById(bookingId);
if (!bookingDet.isPresent()) {
// Handle invalid booking ID
return "Invalid booking ID";
}
bookingDetails = bookingDet.get();
// Validate booking details
int hallId = bookingDetails.getHallDetails().getHallId();
LocalDate startDate = LocalDate.parse(bookingDetails.getStartDate());
LocalDate endDate = LocalDate.parse(bookingDetails.getEndDate());
// Iterate through each date of the booking
int i = 0;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
BookingCalendar bookingCalendar = bookingCalendarRepository.findByBdateAndHallId(date, hallId);
if (bookingCalendar != null) {
// System.out.println(bookingCalendar.toString());
// System.out.println("date:-"+date );
// System.out.println("bookingDetails.getEndingSlot() :- "+bookingDetails.getEndingSlot());
//System.out.println("bookingCalendar.isMorningSlot():-"+bookingCalendar.isMorningSlot());
//System.out.println(date.equals(endDate) && bookingDetails.getEndingSlot() == 1 && bookingCalendar.isMorningSlot());
//System.out.println();
// Check if the slot is already occupied
if ((date.equals(startDate) && bookingDetails.getStartingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(startDate) && bookingDetails.getStartingSlot() == 2 && bookingCalendar.isEveningSlot()) ||
(date.equals(endDate) && bookingDetails.getEndingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(endDate) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isEveningSlot())) {
//System.out.println("booking slot occupied:- 218");
throw new RuntimeException(exMsg);
} else if (bookingCalendar.isMorningSlot() && bookingCalendar.isEveningSlot()) {
//System.out.println("booking slot occupied:- 221");
throw new RuntimeException(exMsg);
} else if (!date.equals(endDate) && i != 0 && i != Math.round(bookingDetails.getNoOfDays() - 1)
&& (bookingCalendar.isMorningSlot() || bookingCalendar.isEveningSlot())) {
//System.out.println("booking slot occupied:- 227 :-"+Math.round(bookingDetails.getNoOfDays()-1) );
throw new RuntimeException(exMsg);
} else if (date.equals(endDate) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isMorningSlot()
&& i != 0 && i == Math.round(bookingDetails.getNoOfDays() - 1)) {
// System.out.println("booking slot occupied:- 240 :-"+Math.round(bookingDetails.getNoOfDays()-1) );
throw new RuntimeException(exMsg);
}
} else {
bookingCalendar = new BookingCalendar();
bookingCalendar.setBdate(date);
bookingCalendar.setHallId(hallId);
bookingCalendar.setIs_booked(0);
bookingCalendar.setIs_active(true);
}
// Mark the appropriate slot as booked based on starting and ending slots
if (date.equals(startDate)) {
//System.out.println(i + "start :-"+bookingCalendar.toString());
if (bookingDetails.getStartingSlot() == 1) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
if (!date.equals(endDate)) {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
} else if (startDate.equals(endDate) && bookingDetails.getStartingSlot() == 1 && bookingDetails.getEndingSlot() == 2) {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
} else {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
} else if (date.equals(endDate)) {
if (bookingDetails.getEndingSlot() == 1) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
} else {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
if (bookingDetails.getEndingSlot() == 2) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
}
} else {
// For dates between start and end date, mark both slots as booked
bookingCalendar.setMorningSlot(true);
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 2);
}
// System.out.println(i + "end:-"+bookingCalendar.toString());
bookingCalendarRepository.save(bookingCalendar);
i++;
}
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.WAITING_FOR_NOC, "Waiting for NOC Documents");
String bookingconfirmationmsg = "Your booking ID " + bookingDetails.getBookingId() + " on " + bookingDetails.getBookingDate() + " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookingDetails.getUsers().getMobileNo() + "&from=GCCCRP&body=" + bookingconfirmationmsg + "&entityid=1401572690000011081&templateid=1407172346459428987";
String whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" + bookingDetails.getBookingId() + "+on+" + bookingDetails.getBookingDate() + "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId();
} catch (Exception e) {
bookingFailure(bookingDetails, 2);
// System.out.println(bookingDetails.getBookingStatus()+","+bookingDetails.getRefundStatus()+","+bookingDetails.getComments());
return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId();
}
}
/*@Transactional(propagation = Propagation.REQUIRES_NEW)
public String bookingFailure(BookingDetails bookingDetails) {
// System.out.println("Booking Failure:-"+bookingDetails.getBookingId());
bookingDetails.setBookingStatus(BookingStatus.REFUNDED);
bookingDetails.setComments("Slot occupied by other user,Amount paid will be refunded.");
bookingDetailsRepository.save(bookingDetails);
if (!(bookingDetails.getRefundStatus() == RefundStatus.COMPLETED) && !(bookingDetails.getRefundStatus() == RefundStatus.CLOSED)) {
// BookingDetails bd =updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.REFUNDED, "slot occupied Refund will happen shortly");
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.REFUNDED.toString(), "Refund will happen shortly");
try {
String refundedMsg = paymentGatewayService.refundTheAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId());
//System.out.println("refundedMsg=="+refundedMsg);
if (refundedMsg.equals("Refunded")) {
//System.out.println("Refund completed........");
bookingDetails.setRefundStatus(BookingDetails.RefundStatus.COMPLETED);
bookingDetailsRepository.save(bookingDetails);
//System.out.println("refundStatus===="+bookingDetails.getRefundStatus());
long mobile = bookingDetails.getUsers().getMobileNo();
int bookingId = bookingDetails.getBookingId();
double refundAmt = bookingDetails.getAmountReceived();
// Thread thread = new Thread(() -> {
String settlementrefundsms = "Your refund amount of Rs. " + refundAmt + " for Booking ID " + bookingId + " has been initiated. The amount will be credited to your account within 3 to 15 days. Thanks for using the GCC Community Hall Booking System.";
String settlementrefundurlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + mobile + "&from=GCCCRP&body=" + settlementrefundsms + "&entityid=1401572690000011081&templateid=1407172346804951524";
String settlementrefundwhatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + mobile + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + refundAmt + "+for+Booking+ID+" + bookingId + "+has+been+initiated.+%0AThe+amount+will+be+credited+to+your+account+within+3+to+15+days.";
whatsappMsgServiceImpl.sendMsg(settlementrefundwhatsupmsg);
whatsappMsgServiceImpl.sendSMS(settlementrefundurlString);
// });
// thread.start();
return "Success";
}
} catch (Exception e) {
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.ERROR.toString(), "Refund Error");
return "error";
}
}
return "error";
}*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String bookingFailure(BookingDetails bookingDetails, int flag) {
// System.out.println("Booking Failure:-"+bookingDetails.getBookingId());
bookingDetails.setBookingStatus(BookingStatus.REFUNDED);
if (flag == 1) {
bookingDetails.setComments("Booking Not Confirmed");
} else {
bookingDetails.setComments("Slot occupied by other user,Amount paid will be refunded.");
}
bookingDetailsRepository.save(bookingDetails);
if (!(bookingDetails.getRefundStatus() == RefundStatus.COMPLETED) && !(bookingDetails.getRefundStatus() == RefundStatus.CLOSED)) {
// BookingDetails bd =updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.REFUNDED, "slot occupied Refund will happen shortly");
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.REFUNDED.toString(), "Refund will happen shortly");
try {
String refundedMsg = paymentGatewayService.refundTheAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId());
//System.out.println("refundedMsg=="+refundedMsg);
if (refundedMsg.equals("Refunded")) {
//System.out.println("Refund completed........");
bookingDetails.setRefundStatus(BookingDetails.RefundStatus.COMPLETED);
bookingDetailsRepository.save(bookingDetails);
//System.out.println("refundStatus===="+bookingDetails.getRefundStatus());
long mobile = bookingDetails.getUsers().getMobileNo();
int bookingId = bookingDetails.getBookingId();
double refundAmt = bookingDetails.getAmountReceived();
// Thread thread = new Thread(() -> {
String settlementrefundsms = "Your refund amount of Rs. " + refundAmt + " for Booking ID " + bookingId + " has been initiated. The amount will be credited to your account within 3 to 15 days. Thanks for using the GCC Community Hall Booking System.";
String settlementrefundurlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + mobile + "&from=GCCCRP&body=" + settlementrefundsms + "&entityid=1401572690000011081&templateid=1407172346804951524";
String settlementrefundwhatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + mobile + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + refundAmt + "+for+Booking+ID+" + bookingId + "+has+been+initiated.+%0AThe+amount+will+be+credited+to+your+account+within+3+to+15+days.";
whatsappMsgServiceImpl.sendMsg(settlementrefundwhatsupmsg);
whatsappMsgServiceImpl.sendSMS(settlementrefundurlString);
// });
// thread.start();
return "Success";
}
} catch (Exception e) {
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.ERROR.toString(), "Refund Error");
return "error";
}
}
return "error";
}
@Override
public Map<String, Object> saveBookingDetails(Map<String, Object> formData) {
Map<String, Object> hs = new HashMap<>();
BookingDetails bookingDetails = null;
Integer userId = userSession.getUserId();
String counterId = userSession.getCounter();
ReasonMaster reasonMaster = reasonMasterService.getReasonById(Integer.parseInt(formData.get("reasonId").toString()));
HallDetails hallDetails = hallDetailService.getHallById(Integer.parseInt(formData.get("hallId").toString()));
Users user = userService.getUserById(userId);
String bookingId = formData.get("bookingId").toString();
if (bookingId != null && bookingId.equals("0")) {
bookingDetails = new BookingDetails();
} else {
BookingDetails book = getBookingsById(Integer.parseInt(formData.get("bookingId").toString()));
if (book != null) {
bookingDetails = book;
bookingDocumentsRepository.deleteByBookingId(book.getBookingId());
} else {
bookingDetails = new BookingDetails();
}
}
if (user != null) {
bookingDetails.setUsers(user);
if (counterId != null) {
bookingDetails.setCounterId(counterId);
}
if (hallDetails != null) {
bookingDetails.setHallDetails(hallDetails);
String startDate = formData.get("startDate").toString();
String endDate = formData.get("endDate").toString();
String relation = formData.get("relation").toString();
double days = Double.parseDouble(formData.get("days").toString());
int daysrange = Integer.parseInt(formData.get("daysrange").toString());
Optional<DiscountRange> discountOpt = discountRangeService.getDiscountByUserType(user.getUsertype());
DiscountRange discountrange = discountOpt.get();
float discount = discountrange.getDiscountRange();
int startingSlot = Integer.parseInt(formData.get("startingSlot").toString());
int endingSlot = Integer.parseInt(formData.get("endingSlot").toString());
double hallAmount = calcHallAmount(hallDetails, daysrange, startingSlot, endingSlot);
hs.put("actualhallamount", hallAmount);
double discountAmount = 0;
String usertype = user.getUsertype().toString();
String reason = reasonMaster.getReason();
//double depositeamount = hallDetails.getDepositAmount() * daysrange;
double depositeamount = hallDetails.getDepositAmount() * Math.ceil(days);
// Calculate discount based on user type
if (usertype.equals("COUNCILLOR") || usertype.equals("PENSIONER") || usertype.equals("GCC_EMPLOYEE") || usertype.equals("PUBLIC")) {
discountAmount = (hallAmount * discount) / 100;
hallAmount = hallAmount - discountAmount;
double gstAmount = Math.round(hallAmount * hallDetails.getGst()) / 100.0;
double totalAmount = hallAmount + gstAmount + depositeamount;
// Truncate the total amount to two decimal places
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
// Set the calculated amounts to bookingDetails
bookingDetails.setDepositAmount(depositeamount);
bookingDetails.setHallAmount(hallAmount);
bookingDetails.setGst(gstAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
hs.put("totalAmount", truncatedTotalAmount);
}
// Calculate final hall amount after applying the discount
hs.put("discount", discountrange.getDiscountRange());
// Handle discount or hall amount adjustments based on the event reason
String reasoncode = reasonMaster.getReasoncode();
if (reasoncode == null) {
reasoncode = ""; // or any default value
}
hs.put("reasoncode", reasoncode);
HallDetailsConcession governmentevents = hallDetailsConcessionRepo.findbyhallId(hallDetails.getHallId());
if (reasoncode.equals("SGE")) {
if (startingSlot == 1 && endingSlot == 2) {
discountAmount = (governmentevents.getFulldayhallamount() * hallDetails.getSGEdiscount()) / 100;
hallAmount = governmentevents.getFulldayhallamount();
hs.put("discount", hallDetails.getSGEdiscount()); // No discount for State Govt Event
double cleaningCharges = governmentevents.getFullDayCleaningcharges();
double PASystem = governmentevents.getFulldayPAsystem();
double EB = governmentevents.getFulldayEBcharges();
double additionalcharges = cleaningCharges + PASystem + EB;
double gstAmount = Math.round(additionalcharges * hallDetails.getGst()) / 100.0;
double depositAmount = hallDetails.getDepositAmount() * daysrange;
double totalAmount = additionalcharges + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
bookingDetails.setDepositAmount(depositeamount);
bookingDetails.setHallAmount(additionalcharges);
bookingDetails.setGst(gstAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
} else {
hallAmount = governmentevents.getHalfdayhallamount();
discountAmount = (hallAmount * hallDetails.getSGEdiscount()) / 100;
hs.put("discount", hallDetails.getSGEdiscount()); // No discount for State Govt Event
double cleaningCharges = governmentevents.getHalfDayCleaningcharges();
double PASystem = governmentevents.getHalfdayPAsystem();
double EB = governmentevents.getHalfdayEBcharges();
double additionalcharges = cleaningCharges + PASystem + EB;
double gstAmount = Math.round(additionalcharges * hallDetails.getGst()) / 100.0;
double depositAmount = hallDetails.getDepositAmount() * daysrange;
double totalAmount = additionalcharges + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
bookingDetails.setDepositAmount(depositeamount);
bookingDetails.setHallAmount(additionalcharges);
bookingDetails.setGst(gstAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
}
} /*else if (reasoncode.equals("CGE")) {
double hallAmountforcentral = calcHallAmount(hallDetails, daysrange, startingSlot, endingSlot);
double discountAmounts = (hallAmountforcentral * hallDetails.getCGEdiscount()) / 100;
hs.put("discount", hallDetails.getCGEdiscount()); // 50% discount for Central Govt Event
hallAmountforcentral = hallAmountforcentral - discountAmounts;
// Calculate GST and total amount
double gstAmount = Math.round(hallAmountforcentral * hallDetails.getGst()) / 100.0;
double totalAmount = hallAmountforcentral + gstAmount + depositeamount;
// Truncate the total amount to two decimal places
//double truncatedTotalAmount = Math.floor(totalAmount * 100) / 100;
// Round the total amount to two decimal places
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
// Set the calculated amounts to bookingDetails
bookingDetails.setDepositAmount(depositeamount);
bookingDetails.setHallAmount(hallAmountforcentral);
bookingDetails.setGst(gstAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
hs.put("totalAmount", truncatedTotalAmount);
}*/ else if (reasoncode.equals("CGE")) {
if (startingSlot == 1 && endingSlot == 2) {
discountAmount = (hallDetails.getFullDayRent() * hallDetails.getCGEdiscount()) / 100;
hallAmount = hallDetails.getFullDayRent();
hs.put("discount", hallDetails.getCGEdiscount()); // No discount for State Govt Event
double cleaningCharges = governmentevents.getFullDayCleaningcharges();
double PASystem = governmentevents.getFulldayPAsystem();
double EB = governmentevents.getFulldayEBcharges();
double additionalcharges = cleaningCharges + PASystem + EB;
double rentAmount = discountAmount;
double netAmount = rentAmount + additionalcharges;
double gstAmount = Math.round(netAmount * hallDetails.getGst()) / 100.0;
double depositAmount = hallDetails.getDepositAmount() * daysrange;
double totalAmount = netAmount + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
bookingDetails.setDepositAmount(depositeamount);
//bookingDetails.setHallAmount(additionalcharges);
bookingDetails.setHallAmount(netAmount);
bookingDetails.setGst(gstAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
hs.put("rentAmount", rentAmount);
hs.put("gstAmount", gstAmount);
hs.put("netAmount", netAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
} else {
discountAmount = (hallDetails.getHalfDayRent() * hallDetails.getCGEdiscount()) / 100;
hallAmount = hallDetails.getHalfDayRent();
hs.put("discount", hallDetails.getCGEdiscount()); // No discount for State Govt Event
double cleaningCharges = governmentevents.getHalfDayCleaningcharges();
double PASystem = governmentevents.getHalfdayPAsystem();
double EB = governmentevents.getHalfdayEBcharges();
double additionalcharges = cleaningCharges + PASystem + EB;
double rentAmount = discountAmount;
double netAmount = rentAmount + additionalcharges;
double gstAmount = Math.round(netAmount * hallDetails.getGst()) / 100.0;
double depositAmount = hallDetails.getDepositAmount() * daysrange;
double totalAmount = netAmount + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
bookingDetails.setDepositAmount(depositeamount);
//bookingDetails.setHallAmount(additionalcharges);
bookingDetails.setHallAmount(netAmount);
bookingDetails.setGst(gstAmount);
bookingDetails.setAmountReceived(truncatedTotalAmount);
hs.put("rentAmount", rentAmount);
hs.put("gstAmount", gstAmount);
hs.put("netAmount", netAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
}
}
bookingDetails.setNoOfDays(days);
bookingDetails.setStartingSlot(startingSlot);
bookingDetails.setEndingSlot(endingSlot);
bookingDetails.setStartDate(startDate);
bookingDetails.setEndDate(endDate);
bookingDetails.setBookingDate(LocalDate.now());
bookingDetails.setReason(reasonMaster.getReason());
bookingDetails.setRefundStatus(BookingDetails.RefundStatus.WAITING);
bookingDetails.setComments("Booking Slot not Confirmed.");
bookingDetails.setBookingtype(BookingDetails.BookingType.ONLINE);
bookingDetails.setRelationship(relation);
int i = 0;
String startDateStr = bookingDetails.getStartDate();
String endDateStr = bookingDetails.getEndDate();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start = LocalDate.parse(startDateStr, formatter);
LocalDate end = LocalDate.parse(endDateStr, formatter);
int hallId = bookingDetails.getHallDetails().getHallId();
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
BookingCalendar bookingCalendar = bookingCalendarRepository.findByBdateAndHallId(date, hallId);
if (bookingCalendar != null) {
if ((date.equals(start) && bookingDetails.getStartingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(start) && bookingDetails.getStartingSlot() == 2 && bookingCalendar.isEveningSlot()) ||
(date.equals(end) && bookingDetails.getEndingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(end) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isEveningSlot())) {
return Collections.singletonMap("status", "slotOccupied");
} else if (bookingCalendar.isMorningSlot() && bookingCalendar.isEveningSlot()) {
return Collections.singletonMap("status", "slotOccupied");
} else if (!date.equals(end) && i != 0 && i != Math.round(bookingDetails.getNoOfDays() - 1)
&& (bookingCalendar.isMorningSlot() || bookingCalendar.isEveningSlot())) {
return Collections.singletonMap("status", "slotOccupied");
} else if (date.equals(end) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isMorningSlot()
&& i != 0 && i == Math.round(bookingDetails.getNoOfDays() - 1)) {
return Collections.singletonMap("status", "slotOccupied");
}
}
i++;
}
// Save the booking details after the loop
bookingDetails = bookingDetailsRepository.save(bookingDetails);
// confirmation of amount
hs.put("bookingId", bookingDetails.getBookingId());
hs.put("hallName", bookingDetails.getHallDetails().getHallName());
hs.put("NoOfDay", bookingDetails.getNoOfDays());
hs.put("startDate", bookingDetails.getStartDate());
hs.put("endDate", bookingDetails.getEndDate());
hs.put("startingSlot", bookingDetails.getStartingSlot());
hs.put("endingSlot", bookingDetails.getEndingSlot());
hs.put("hallAmount", bookingDetails.getHallAmount());
hs.put("gst", bookingDetails.getGst());
hs.put("depositAmount", depositeamount);
hs.put("username", bookingDetails.getUsers().getName());
hs.put("userId", bookingDetails.getUsers().getUserId());
hs.put("mobileNo", bookingDetails.getUsers().getMobileNo());
hs.put("userType", bookingDetails.getUsers().getUsertype());
hs.put("reason", bookingDetails.getReason());
}
if (reasonMaster != null) {
List<ReasonDocumentMaster> reasonDocMaster = reasonMaster.getReasonDocumentMasterList();
List<BookingDocuments> uploadedDocs = new ArrayList<>();
for (ReasonDocumentMaster rm : reasonDocMaster) {
BookingDocuments bd = new BookingDocuments();
bd.setBookingDetails(bookingDetails);
if (rm.isAddTextField()) {
bd.setName(formData.get(rm.getFieldName()).toString());
bd.setBooking_label(rm.getFieldName());
}
if (rm.isAddDocumentField()) {
MultipartFile file = (MultipartFile) formData.get(rm.getDocFieldName());
bd.setBookingDocUrl(serverPath + "images/" + reasonMaster.getReason() + "/" + bookingDetails.getBookingId() + "_" + file.getOriginalFilename());
String filePath = uploadDirectory + "/" + reasonMaster.getReason() + "/" + bookingDetails.getBookingId() + "_" + file.getOriginalFilename();
bd.setDocumentName(file.getOriginalFilename());
bd.setDocumentType(file.getContentType());
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = file.getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
bookingDocumentsRepository.save(bd);
uploadedDocs.add(bd);
}
}
hs.put("uploadedDocs", uploadedDocs);
}
}
return hs;
}
private double calcHallAmount(HallDetails hallDetails, int daysrange, int startPeriod, int endPeriod) {
double hallAmount = 0;
if (daysrange == 1) {
if (startPeriod == 1 && endPeriod == 2) {
hallAmount = hallDetails.getFullDayRent();
} else if (startPeriod == 1 && endPeriod == 1) {
hallAmount = hallDetails.getHalfDayRent();
} else if (startPeriod == 2 && endPeriod == 2) {
hallAmount = hallDetails.getHalfDayRent();
} else if (startPeriod == 2 && endPeriod == 1) {
hallAmount = hallDetails.getFullDayRent();
}
} else {
// For multiple days
if (startPeriod == 1 && endPeriod == 2) {
hallAmount = hallDetails.getFullDayRent() * daysrange;
} else if (startPeriod == 1 && endPeriod == 1) {
hallAmount = hallDetails.getFullDayRent() * (daysrange - 1) + hallDetails.getHalfDayRent();
} else if (startPeriod == 2 && endPeriod == 2) {
hallAmount = hallDetails.getFullDayRent() * (daysrange - 1) + hallDetails.getHalfDayRent();
} else if (startPeriod == 2 && endPeriod == 1) {
hallAmount = hallDetails.getFullDayRent() * (daysrange - 2) + hallDetails.getHalfDayRent() * 2;
}
}
return hallAmount;
}
public String uploadNOCFile(MultipartFile file, int bookingId) {
// Retrieve booking details, throw an exception if not found
BookingDetails bookingDetails = bookingDetailsRepository.findById(bookingId)
.orElseThrow(() -> new IllegalArgumentException("Invalid booking ID: " + bookingId));
String reason = "NOC";
String fileName = bookingId + "_" + file.getOriginalFilename();
String fileUrl = serverPath + "images/" + reason + "/" + fileName;
String filePath = uploadDirectory + File.separator + reason + File.separator + fileName;
// Ensure the directory exists
File directory = new File(uploadDirectory + File.separator + reason);
if (!directory.exists()) {
directory.mkdirs(); // Create the directory if it doesn't exist
}
BookingHistory bookinghistory = new BookingHistory();
bookinghistory.setBookingStatus(bookingDetails.getBookingStatus());
bookinghistory.setBookingDetails(bookingDetails);
bookinghistory.setStartDate(bookingDetails.getStartDate());
bookinghistory.setEndDate(bookingDetails.getEndDate());
bookinghistory.setComments(bookingDetails.getComments());
bookinghistory.setCdate(new Date());
bookinghistory.setRefundStatus(bookingDetails.getRefundStatus());
bookingHistoryRepository.save(bookinghistory);
BookingDocuments bd = new BookingDocuments();
bd.setBookingDocUrl(fileUrl);
bd.setDocumentName(file.getOriginalFilename());
bd.setDocumentType(file.getContentType());
bd.setBookingDetails(bookingDetails); // Set the associated booking details
bookingDetails.setBookingStatus(BookingStatus.WAITING_FOR_NOC_APPROVAL);
bookingDetails.setComments("Waiting for Admin Approval");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = LocalDateTime.now().format(formatter);
bookingDetails.setUpdatedDate(formattedDate);
// Save the file to the server
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = file.getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new RuntimeException("Error saving file", e);
}
// Save the document details in the repository
bookingDetailsRepository.save(bookingDetails);
bookingDocumentsRepository.save(bd);
return "File uploaded and saved successfully";
}
@Transactional
public List<Integer> saveGCCBlockingDate(GccBlockingDate gcc) {
// Save the GccBlockingDate first
GccBlockingDate savedGcc = gccBlockingDateRepository.save(gcc);
// Extract hall IDs and initialize list for booking IDs
String[] hallIds = savedGcc.getHallId().split(",");
List<Integer> bookingIds = new ArrayList<>();
for (String hallId : hallIds) {
HallDetails hallDetails = hallDetailsRepository.findById(Integer.parseInt(hallId))
.orElseThrow(() -> new RuntimeException("HallDetails not found for id: " + hallId));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// Get GCC User
Users user = userRepository.findByUsername("gccuser");
if (user == null) {
throw new RuntimeException("User not found for username: gccuser");
}
// Create and save BookingDetails
BookingDetails bookingDetails = new BookingDetails();
bookingDetails.setBookingStatus(BookingDetails.BookingStatus.GCC_BLOCKED);
bookingDetails.setReason(gcc.getBlockingReason());
bookingDetails.setNoOfDays(0);
bookingDetails.setAmountReceived(0);
bookingDetails.setDepositAmount(0);
bookingDetails.setRefundStatus(BookingDetails.RefundStatus.NA);
bookingDetails.setBookingDate(LocalDate.now());
bookingDetails.setStartDate(LocalDate.ofInstant(savedGcc.getStartDate().toInstant(), ZoneId.systemDefault()).format(formatter));
bookingDetails.setEndDate(LocalDate.ofInstant(savedGcc.getEndDate().toInstant(), ZoneId.systemDefault()).format(formatter));
bookingDetails.setHallAmount(0);
bookingDetails.setHallDetails(hallDetails);
bookingDetails.setUsers(user);
bookingDetails = bookingDetailsRepository.save(bookingDetails);
bookingIds.add(bookingDetails.getBookingId());
System.out.println("BookingDetails saved with ID: " + bookingDetails.getBookingId());
}
// Save the list of booking IDs in the GccBlockingDate entity
String bookingIdsStr = bookingIds.stream()
.map(String::valueOf)
.collect(Collectors.joining(","));
savedGcc.setBookingIds(bookingIdsStr);
gccBlockingDateRepository.save(savedGcc);
// Return the list of booking IDs
return bookingIds;
}
public List<String> getCancelling(String fromDate, String toDate, String hallID) {
List<String> data = bookingCalendarRepository.getCancelling(fromDate, toDate, hallID);
return data;
}
public BookingCalendar getbyDates(LocalDate aa, String hallID) {
BookingCalendar data = bookingCalendarRepository.getbyDates(aa, hallID);
return data;
}
public void updateBookingStatus(BookingCalendar book) {
bookingCalendarRepository.save(book);
}
public List<BookingCalendar> getCancellingdata1(String bookID) {
List<BookingCalendar> data = bookingCalendarRepository.getCancellingdata1(bookID);
return data;
}
//caretaker
@Override
public List<BookingDetails> getPresentsEventsByUserId(Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.findPresentsEventsByUserId(hallId);
}
public List<BookingDetails> getSettlementList(Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getSettlementList(hallId);
}
@Override
public List<BookingDetails> getPastsEventsByUserId(Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.findPastEventsByHallId(hallId);
}
@Override
public List<BookingDetails> getFuturesEventsByUserId(Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.findFutureEventsByHallId(hallId);
}
@Override
public List<BookingDetails> getFilteredBookings(LocalDate fromDate, LocalDate toDate, List<Long> hallIds) {
return bookingDetailsRepository.findByFromDateBetweenAndToDateBetweenAndHallIdIn(fromDate, toDate, hallIds);
}
@Override
public List<GccBlockingDate> getBlockedEvents(LocalDate fromDate, LocalDate toDate, List<Long> hallIds) {
return blockingDateRepository.findByFromDateAndToDateBetweenAndHallIdIn(fromDate, toDate, hallIds);
}
@Override
public BookingDetails updateBookingStatustoGCCBlocked(BookingDetails bookingDetails) {
BookingDetails save = bookingDetailsRepository.save(bookingDetails);
return save;
}
//carearetakerend
@Override
public BookingDetails updateBookingStatusById(int bookingId, BookingDetails.BookingStatus status, String comments) {
Optional<BookingDetails> bookingDetails = bookingDetailsRepository.findById(bookingId);
if (bookingDetails.isPresent()) {
BookingDetails bookDet = bookingDetails.get();
// Update Booking Status
bookDet.setBookingStatus(status);
bookDet.setComments(comments);
BookingDetails updatedBookingDetails = bookingDetailsRepository.save(bookDet);
return updatedBookingDetails;
}
return null;
}
@Override
public BookingDetails updateCancelledBookingStatus(int bookingId, BookingDetails.BookingStatus status, String comments) {
Optional<BookingDetails> bookingDetails = bookingDetailsRepository.findById(bookingId);
if (bookingDetails.isPresent()) {
BookingDetails bookDet = bookingDetails.get();
// System.out.println("Current booking status: " + bookDet.getBookingStatus());
// Create Booking History Entry
BookingHistory bookHistory = new BookingHistory();
bookHistory.setBookingDetails(bookDet);
bookHistory.setBookingStatus(bookDet.getBookingStatus());
bookHistory.setStartDate(bookDet.getStartDate());
bookHistory.setEndDate(bookDet.getEndDate());
bookHistory.setComments(bookDet.getComments());
bookHistory.setCdate(new Date());
bookHistory.setRefundStatus(bookDet.getRefundStatus());
bookingHistoryRepository.save(bookHistory);
// Update Booking Status
bookDet.setBookingStatus(status);
bookDet.setComments(comments);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = LocalDateTime.now().format(formatter);
bookDet.setUpdatedDate(formattedDate);
BookingDetails updatedBookingDetails = bookingDetailsRepository.save(bookDet);
List<BookingCalendar> bookingCalendarList = bookingCalendarRepository.getCancellingdata1(String.valueOf(bookDet.getBookingId()));
for (BookingCalendar calendar : bookingCalendarList) {
if (String.valueOf(bookDet.getBookingId()).equals(calendar.getBookingId_1())) {
calendar.setBookingId_1(null);
calendar.setMorningSlot(false);
}
if (String.valueOf(bookDet.getBookingId()).equals(calendar.getBookingId_2())) {
calendar.setBookingId_2(null);
calendar.setEveningSlot(false);
}
bookingCalendarRepository.save(calendar);
}
return updatedBookingDetails;
}
//System.out.println("Booking details not found for ID: " + bookingId);
return null;
}
@Override
public EbDetails updateEbDetails(int bookingId, double startUnit, double endUnit, char status) {
Optional<BookingDetails> bookingDetails = bookingDetailsRepository.findById(bookingId);
if (bookingDetails.isPresent()) {
BookingDetails bd = bookingDetails.get();
EbDetails ed = bd.getEbDetails();
if (ed == null) {
ed = new EbDetails();
ed.setBookingDetails(bd);
}
if (status == 'S') {
ed.setCdate(new Date());
ed.setStartingReading(startUnit);
return ebDetailsRepository.save(ed);
} else if (status == 'E') {
double startReading = ed.getStartingReading();
if (endUnit != 0) {
ed.setEndingReading(endUnit);
double usedUnit = Math.floor((endUnit - startReading) * 100) / 100.0;
ed.setUsedUnit(Float.parseFloat(usedUnit + ""));
float costPerUnit = bd.getHallDetails().getEbCostPerUnit();
double ebAmount = Math.floor((usedUnit * costPerUnit) * 100) / 100.0;
ed.setEbAmount(ebAmount);
ed.setUpdatedDate(new Date());
return ebDetailsRepository.save(ed);
}
}
}
return null;
}
@Override
public String cancelBooking(int bookingId, BookingDetails.BookingStatus currentStatus, String comments) {
Optional<BookingDetails> bd = bookingDetailsRepository.findById(bookingId);
if (bd.isPresent()) {
BookingDetails bookingDetails = bd.get();
//System.out.println("currentStatus:-"+currentStatus);
if (bookingDetails.getBookingStatus().equals(BookingDetails.BookingStatus.APPROVED)) {
//System.err.println("test"+currentStatus);
if (currentStatus.equals(BookingDetails.BookingStatus.CANCELED)) {
//System.err.println("test11"+currentStatus);
try {
//System.err.println("test13331==="+currentStatus);
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.USER_CANCELLED_BOOKING.toString(), comments);
String refundTheDepositAmount = paymentGatewayService.refundTheDepositAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId(), bookingDetails.getDepositAmount());
//System.out.println("refundTheDepositAmount==="+refundTheDepositAmount);
if (refundTheDepositAmount.equals("Refunded")) {
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.CANCELED, "user cancelled Date:-" + new Date());
List<BookingCalendar> bookingCalendarList = bookingCalendarRepository.getCancellingdata1(String.valueOf(bookingDetails.getBookingId()));
for (BookingCalendar calendar : bookingCalendarList) {
boolean isUpdated = false;
if (String.valueOf(bookingDetails.getBookingId()).equals(calendar.getBookingId_1())) {
calendar.setBookingId_1(null);
isUpdated = true;
}
if (String.valueOf(bookingDetails.getBookingId()).equals(calendar.getBookingId_2())) {
calendar.setBookingId_2(null);
isUpdated = true;
}
if (calendar.isMorningSlot()) {
calendar.setMorningSlot(false);
isUpdated = true;
}
if (calendar.isEveningSlot()) {
calendar.setEveningSlot(false);
isUpdated = true;
}
if (isUpdated) {
calendar.setIs_delete(true);
bookingCalendarRepository.save(calendar);
}
}
return "success";
}
return "error";
} catch (Exception e) {
e.printStackTrace();
}
} else if (currentStatus.equals(BookingDetails.BookingStatus.REJECTED)) {
try {
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.GCC_REJECTED.toString(), comments);
String refundtheAmount = paymentGatewayService.refundTheAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId());
//System.out.println("refundtheAmount==="+refundtheAmount);
if (refundtheAmount.equals("Refunded")) {
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.REJECTED, comments);
List<BookingCalendar> bookingCalendarList = bookingCalendarRepository.getCancellingdata1(String.valueOf(bookingDetails.getBookingId()));
for (BookingCalendar calendar : bookingCalendarList) {
boolean isUpdated = false;
if (String.valueOf(bookingDetails.getBookingId()).equals(calendar.getBookingId_1())) {
calendar.setBookingId_1(null);
isUpdated = true;
}
if (String.valueOf(bookingDetails.getBookingId()).equals(calendar.getBookingId_2())) {
calendar.setBookingId_2(null);
isUpdated = true;
}
if (calendar.isMorningSlot()) {
calendar.setMorningSlot(false);
isUpdated = true;
}
if (calendar.isEveningSlot()) {
calendar.setEveningSlot(false);
isUpdated = true;
}
if (isUpdated) {
calendar.setIs_delete(true);
bookingCalendarRepository.save(calendar);
}
}
return "success";
}
return "error";
} catch (Exception e) {
e.printStackTrace();
}
} else if (currentStatus.equals(BookingDetails.BookingStatus.GCC_BLOCKED)) {
try {
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.GCC_BLOCKED_DATE.toString(), comments);
paymentGatewayService.refundTheAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId());
updateBookingStatusById(bookingDetails.getBookingId(), BookingDetails.BookingStatus.GCC_BLOCKED, "total amount will refund shortly");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return null;
}
@Override
public BookingDetails getBookingDetailsWithSettlement(int settlementId) {
Optional<BookingDetails> SettleBookingDetails = Optional.of(bookingDetailsRepository.findBySettlementIdWithBookingDetails(settlementId));
if (SettleBookingDetails.isPresent()) {
return SettleBookingDetails.get();
}
return null;
}
@Override
public BookingDetails saveebdetails(int bookingId, double startingReading,
MultipartFile startingReadingimage) {
BookingDetails bd = getBookingsById(bookingId);
if (bd != null) {
if (bd.getEbDetails() == null) {
EbDetails eb = new EbDetails();
eb.setCdate(new Date());
eb.setStartingReading(startingReading);
if (startingReadingimage != null) {
eb.setEbImageUrl((serverPath + "images/eb/" + bookingId + "_" + startingReadingimage.getOriginalFilename()));
String filePath = uploadDirectory + "/eb/" + bookingId + "_" + startingReadingimage.getOriginalFilename();
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = startingReadingimage.getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
eb.setBookingDetails(bd);
bd.setEbDetails(eb);
return bd;
}
}
return null;
}
@Override
public String processEbDetailsAndDamage(int bookingId, int ebId, double startingReading, double endingReading,
float usedUnit, double ebAmount, String[] assetNames, String[] comments, int[] quantities,
Double[] assetAmounts, MultipartFile[] assetImages) {
Optional<BookingDetails> findById = bookingDetailsRepository.findById(bookingId);
if (findById.isPresent()) {
BookingDetails book = findById.get();
book.setRefundStatus(RefundStatus.WAITING);
EbDetails updateEbDetails = updateEbDetails(bookingId, startingReading, endingReading, 'E');
double damageAmount = 0;
String adminname = (String) session.getAttribute("usertype");
if (assetNames != null && assetNames.length > 0) {
for (int i = 0; i < assetNames.length; i++) {
Damage damage = new Damage();
damage.setAssetName(assetNames[i]);
damage.setComments(comments[i]);
damage.setQuantity(quantities[i]);
damage.setAssetAmount(assetAmounts[i]);
damage.setUpdatedBy(adminname);
damage.setHallDetails(book.getHallDetails());
damageAmount = damageAmount + assetAmounts[i];
if (assetImages != null && !assetImages[i].isEmpty()) {
damage.setDamageImageUrl(serverPath + "images/damage/" + bookingId + "_" + assetImages[i].getOriginalFilename());
String filePath = uploadDirectory + "/damage/" + bookingId + "_" + assetImages[i].getOriginalFilename();
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = assetImages[i].getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
damage.setBookingDetails(book);
damageRepository.save(damage);
}
}
Settlement settlement;
if (book.getSettlement() != null) {
settlement = book.getSettlement(); // Update existing settlement
} else {
settlement = new Settlement(); // Create new settlement
}
settlement.setCdate(LocalDate.now());
settlement.setBookingDetails(book);
settlement.setDepositAmount(book.getDepositAmount());
settlement.setEbAmount(updateEbDetails.getEbAmount());
settlement.setDamageAmount(damageAmount);
settlement.setUpdatedId(adminname);
double refundamount = book.getDepositAmount() - (updateEbDetails.getEbAmount() + damageAmount);
if (refundamount < 0) {
settlement.setRefundedAmount(0);
settlement.setCollectionPending(Math.abs(refundamount));
settlement.setCollectionStatus("waiting");
} else {
settlement.setRefundedAmount(refundamount);
settlement.setCollectionPending(0);
}
settlementRepository.save(settlement);
return "Success";
}
return "Error";
}
//sreeja
@Override
public List<BookingCalendar> getPastData(int hall_id) {
List<BookingCalendar> data = bookingCalendarRepository.getPastData(hall_id);
return data;
}
@Override
public int checkUserBookinglimitation(int userId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.checkUserBookinglimitation(userId);
}
@Override
public List<BookingDetails> getAllBookingsByUserId(Integer userId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsByUserId(userId);
}
public BookingDetails getByBookingId(String bookID) {
return bookingDetailsRepository.getByBookingId(bookID);
}
public void updateBookingDetailsStatus(BookingDetails bookingDetails) {
bookingDetailsRepository.save(bookingDetails);
}
@Override
public List<Object[]> getBookingUserDetailsReport(String fromDate, String toDate) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingUserDetailsReport(fromDate, toDate);
}
@Override
public List<Object[]> getBookingHallDetailsReport(String fromDate, String toDate) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReport(fromDate, toDate);
}
public List<Map<String, Object>> getAllBookingEventsByUserId(Integer userId) {
return bookingDetailsRepository.getAllBookingEventsByUserId(userId);
}
//counter
public List<Map<String, Object>> getOfflineBookings() {
return bookingDetailsRepository.findAllByBookingType();
}
@Override
public List<BookingCalendar> getBookedslots(LocalDate fromDate, LocalDate endDate, List<Long> hallIdList) {
return bookingCalendarRepository.findByHallIdAndDateRange(fromDate, endDate, hallIdList);
}
// public List<String> processRefundRequests(List<String> bookingIds) {
// List<String> bookIds = new ArrayList<>();
//
// for (String bookingIdStr : bookingIds) {
// try {
// int bookingId = Integer.parseInt(bookingIdStr);
// Optional<BookingDetails> bookings = bookingDetailsRepository.findById(bookingId);
// if (bookings.isPresent()) {
// BookingDetails bookingDetails = bookings.get();
// boolean refundSuccess = SettlementAmountRefund(bookingDetails);
// if (!refundSuccess) {
// bookIds.add(bookingIdStr); // Add ID to error list if refund fails
// }
// } else {
// bookIds.add(bookingIdStr); // Add ID to error list if booking not found
// }
// } catch (NumberFormatException e) {
// bookIds.add(bookingIdStr); // Add ID to error list if invalid format
// } catch (Exception e) {
// e.printStackTrace();
// bookIds.add(bookingIdStr); // Add ID to error list for any other exception
// }
// }
//
// return bookIds;
// }
// private final ConcurrentHashMap<Integer, Boolean> processingMap = new ConcurrentHashMap<>();
//
// @Synchronized
public String processRefundRequest(int bookingId) {
try {
Optional<BookingDetails> bookingOptional = bookingDetailsRepository.findById(bookingId);
if (bookingOptional.isPresent()) {
BookingDetails bookingDetails = bookingOptional.get();
boolean refundSuccess = SettlementAmountRefund(bookingDetails);
if (refundSuccess) {
return "Refund successful for Booking ID: " + bookingId;
} else {
return "Refund failed for Booking ID: " + bookingId;
}
} else {
return "Booking not found for Booking ID: " + bookingId;
}
} catch (Exception e) {
e.printStackTrace();
return "An error occurred while processing Booking ID: " + bookingId + ": " + e.getMessage();
}
}
public boolean SettlementAmountRefund(BookingDetails bookingDetails) throws Exception {
BookingStatus bookingStatus = bookingDetails.getBookingStatus();
RefundStatus refunStatus = bookingDetails.getRefundStatus();
String adminname = (String) session.getAttribute("usertype");
if (bookingStatus == BookingStatus.APPROVED && !(refunStatus == RefundStatus.COMPLETED) && !(refunStatus == RefundStatus.CLOSED)) {
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.SETTLEMENT_COMPLETED.toString(), "Refund will happen shortly");
String refundThesettlementAmount = paymentGatewayService.refundTheDepositAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId(), bookingDetails.getSettlement().getRefundedAmount());
//System.out.println("refundThesettlementAmount === " + refundThesettlementAmount);
if (refundThesettlementAmount.equals("Refunded")) {
Optional<BookingDetails> book = bookingDetailsRepository.findById(bookingDetails.getBookingId());
BookingDetails bookings = book.get();
//bookinghistoty update
BookingHistory bookingHistory = new BookingHistory();
bookingHistory.setStartDate(bookingDetails.getStartDate());
bookingHistory.setEndDate(bookingDetails.getEndDate());
bookingHistory.setComments(bookingDetails.getComments());
bookingHistory.setBookingDetails(bookingDetails);
bookingHistory.setBookingStatus(bookingDetails.getBookingStatus());
bookingHistory.setUpdatedBy(adminname);
bookingHistory.setCdate(new Date());
bookingHistory.setRefundStatus(bookingDetails.getRefundStatus());
bookingDetails.setComments("Completed the Refund");
bookingHistoryRepository.save(bookingHistory);
bookings.setBookingStatus(bookingStatus.COMPLETED);
bookings.setRefundStatus(RefundStatus.COMPLETED);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = LocalDateTime.now().format(formatter);
bookings.setUpdatedDate(formattedDate);
bookings.setApprovedBy(adminname);
bookingDetailsRepository.save(bookings);
String settlementrefundsms = "Your refund amount of Rs. " + bookings.getSettlement().getRefundedAmount() + " for Booking ID " + bookings.getBookingId() + " has been initiated. The amount will be credited to your account within 3 to 15 days. Thanks for using the GCC Community Hall Booking System.";
String settlementrefundurlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookings.getUsers().getMobileNo() + "&from=GCCCRP&body=" + settlementrefundsms + "&entityid=1401572690000011081&templateid=1407172346804951524";
String settlementrefundwhatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + bookingDetails.getSettlement().getRefundedAmount() + "+for+Booking+ID+" + bookingDetails.getBookingId() + "+has+been+initiated.+%0AThe+amount+will+be+credited+to+your+account+within+3+to+15+days.";
whatsappMsgServiceImpl.sendMsg(settlementrefundwhatsupmsg);
whatsappMsgServiceImpl.sendSMS(settlementrefundurlString);
return true;
} else {
return false;
}
} else if (bookingStatus == BookingStatus.REJECTED || bookingStatus == BookingStatus.GCC_BLOCKED && !(refunStatus == RefundStatus.COMPLETED) && !(refunStatus == RefundStatus.CLOSED)) {
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.GCC_BLOCKED_DATE.toString(), "Refund will happen shortly");
String refundFullAmount = paymentGatewayService.refundTheAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId());
//System.out.println("refundTheDepositAmount === " + refundFullAmount);
if (refundFullAmount.equals("Refunded")) {
Optional<BookingDetails> book = bookingDetailsRepository.findById(bookingDetails.getBookingId());
BookingDetails rejectedbookings = book.get();
rejectedbookings.setRefundStatus(RefundStatus.COMPLETED);
bookingDetailsRepository.save(rejectedbookings);
String rejectedsms = "Your refund amount of Rs. " + rejectedbookings.getAmountReceived() + " for Booking ID " + rejectedbookings.getBookingId() + " has been initiated. The amount will be credited to your account within 3 to 15 days. Thanks for using the GCC Community Hall Booking System.";
String rejectedrefundurlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + rejectedbookings.getUsers().getMobileNo() + "&from=GCCCRP&body=" + rejectedsms + "&entityid=1401572690000011081&templateid=1407172346804951524";
String settlementrefundwhatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + bookingDetails.getAmountReceived() + "+for+Booking+ID+" + bookingDetails.getBookingId() + "+has+been+initiated.+%0AThe+amount+will+be+credited+to+your+account+within+3+to+15+days.";
whatsappMsgServiceImpl.sendMsg(settlementrefundwhatsupmsg);
whatsappMsgServiceImpl.sendSMS(rejectedrefundurlString);
return true;
} else {
return false;
}
} else if (bookingStatus == BookingStatus.CANCELED && !(refunStatus == RefundStatus.COMPLETED) && !(refunStatus == RefundStatus.CLOSED)) {
// System.out.println("Booking status is Cancelled. Booking ID: " + bookingDetails.getBookingId());
applicationLogService.saveLog(bookingDetails.getBookingId(), ApplicationLogs.logsOfMsg.USER_CANCELLED_BOOKING.toString(), "Refund will happen shortly");
String refundTheDepositAmount = paymentGatewayService.refundTheDepositAmount(bookingDetails.getBookingId(), bookingDetails.getUsers().getUserId(), bookingDetails.getDepositAmount());
//System.out.println("refundTheDepositAmount === " + refundTheDepositAmount);
if (refundTheDepositAmount.equals("Refunded")) {
Optional<BookingDetails> book = bookingDetailsRepository.findById(bookingDetails.getBookingId());
BookingDetails cancelledbookings = book.get();
cancelledbookings.setRefundStatus(RefundStatus.COMPLETED);
bookingDetailsRepository.save(cancelledbookings);
String cancelledsms = "Your refund amount of Rs. " + cancelledbookings.getDepositAmount() + " for Booking ID " + cancelledbookings.getBookingId() + " has been initiated. The amount will be credited to your account within 3 to 15 days. Thanks for using the GCC Community Hall Booking System.";
String cancelledrefundurlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + cancelledbookings.getUsers().getMobileNo() + "&from=GCCCRP&body=" + cancelledsms + "&entityid=1401572690000011081&templateid=1407172346804951524";
String settlementrefundwhatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + bookingDetails.getDepositAmount() + "+for+Booking+ID+" + bookingDetails.getBookingId() + "+has+been+initiated.+%0AThe+amount+will+be+credited+to+your+account+within+3+to+15+days.";
whatsappMsgServiceImpl.sendMsg(settlementrefundwhatsupmsg);
whatsappMsgServiceImpl.sendSMS(cancelledrefundurlString);
return true;
} else {
return false;
}
} else {
return false;
}
}
@Override
public BookingDetails updateRefundStatus(int bookingId, RefundStatus status) {
Optional<BookingDetails> booking = bookingDetailsRepository.findById(bookingId);
if (booking.isPresent()) {
String adminname = (String) session.getAttribute("usertype");
BookingDetails book = booking.get();
book.setRefundStatus(status);
BookingHistory bookingHistory = new BookingHistory();
bookingHistory.setStartDate(book.getStartDate());
bookingHistory.setEndDate(book.getEndDate());
bookingHistory.setComments(book.getComments());
bookingHistory.setBookingDetails(book);
bookingHistory.setBookingStatus(book.getBookingStatus());
bookingHistory.setUpdatedBy(adminname);
bookingHistory.setCdate(new Date());
bookingHistory.setRefundStatus(book.getRefundStatus());
bookingHistoryRepository.save(bookingHistory);
book.setComments("Refund status Updated to:-" + status);
BookingDetails bookings = bookingDetailsRepository.save(book);
return bookings;
}
return null;
}
//officer reports
@Override
public List<BookingDetails> getAllBookingDetailsByZone(String fromDate, String toDate, String zone) {
return bookingDetailsRepository.getAllBookingDetailsByZone(fromDate, toDate, zone);
}
@Override
public List<BookingDetails> getAllBookingDetailsByZoneWithStatus(String fromDate, String toDate, String zone, String bookingStatus) {
return bookingDetailsRepository.getAllBookingDetailsByZoneWithStatus(fromDate, toDate, zone, bookingStatus);
}
@Override
public List<Object[]> getAllPaymentsDetailsByZone(String fromDate, String toDate, String zone) {
return bookingDetailsRepository.getAllPaymentsDetailsByZone(fromDate, toDate, zone);
}
@Override
public List<Object[]> getBookingHallDetailsReportByZone(String fromDate, String toDate, String zone) {
return bookingDetailsRepository.getBookingHallDetailsReportByZone(fromDate, toDate, zone);
}
//R
@Transactional
public Optional<String> updateBookingDatesAndCalendar(int bookingId, String startDat, String endDat) {
Optional<BookingDetails> optionalBookingDetails = bookingDetailsRepository.findById(bookingId);
//TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
if (optionalBookingDetails.isPresent()) {
BookingDetails bookingDetails = optionalBookingDetails.get();
String starting = bookingDetails.getStartDate();
int hallId = bookingDetails.getHallDetails().getHallId();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(startDat, formatter);
LocalDate endDate = LocalDate.parse(endDat, formatter);
// Retrieve existing calendar entries where bookingId matches booking_id1 or booking_id2
List<BookingCalendar> existingCalendars = bookingCalendarRepository.getCancellingdata1(String.valueOf(bookingId));
// Empty the existing date in calendar
for (BookingCalendar calendar : existingCalendars) {
if (calendar.getBookingId_1() != null && calendar.getBookingId_1().equals(String.valueOf(bookingId))) {
calendar.setMorningSlot(false);
calendar.setBookingId_1(null);
}
if (calendar.getBookingId_2() != null && calendar.getBookingId_2().equals(String.valueOf(bookingId))) {
calendar.setEveningSlot(false);
calendar.setBookingId_2(null);
}
bookingCalendarRepository.save(calendar);
}
// Check if the dates exist and update or create new entries accordingly
String slotOccExpMsg = "Dates are already occupied. Please select another date.";
int i = 0;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
BookingCalendar bookingCalendar = bookingCalendarRepository.findByBdateAndHallId(date, hallId);
if (bookingCalendar != null) {
// Check if the slot is already occupied
if ((date.equals(startDate) && bookingDetails.getStartingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(startDate) && bookingDetails.getStartingSlot() == 2 && bookingCalendar.isEveningSlot()) ||
(date.equals(endDate) && bookingDetails.getEndingSlot() == 1 && bookingCalendar.isMorningSlot()) ||
(date.equals(endDate) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isEveningSlot())) {
// return "Slot occupied";
throw new SlotOccupiedException(slotOccExpMsg);
} else if (bookingCalendar.isMorningSlot() && bookingCalendar.isEveningSlot()) {
// return "Slot occupied";
throw new SlotOccupiedException(slotOccExpMsg);
} else if (!date.equals(endDate) && i != 0 && i != Math.round(bookingDetails.getNoOfDays() - 1)
&& (bookingCalendar.isMorningSlot() || bookingCalendar.isEveningSlot())) {
//System.out.println("booking slot occupied:- 227 :-"+Math.round(bookingDetails.getNoOfDays()-1) );
throw new SlotOccupiedException(slotOccExpMsg);
} else if (date.equals(endDate) && bookingDetails.getEndingSlot() == 2 && bookingCalendar.isMorningSlot()
&& i != 0 && i == Math.round(bookingDetails.getNoOfDays() - 1)) {
// System.out.println("booking slot occupied:- 240 :-"+Math.round(bookingDetails.getNoOfDays()-1) );
throw new SlotOccupiedException(slotOccExpMsg);
}
} else {
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
bookingCalendar = new BookingCalendar();
bookingCalendar.setBdate(date);
bookingCalendar.setHallId(hallId);
bookingCalendar.setIs_booked(0);
bookingCalendar.setIs_active(true);
bookingCalendar.setUnique_id(uniqueId);
}
// Mark the appropriate slot as booked based on starting and ending slots
if (date.equals(startDate)) {
if (bookingDetails.getStartingSlot() == 1) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
if (!date.equals(endDate)) {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
} else if (startDate.equals(endDate) && bookingDetails.getStartingSlot() == 1 && bookingDetails.getEndingSlot() == 2) {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
} else {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
} else if (date.equals(endDate)) {
if (bookingDetails.getEndingSlot() == 1) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
} else {
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
if (bookingDetails.getEndingSlot() == 2) {
bookingCalendar.setMorningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 1);
}
}
} else {
// For dates between start and end date, mark both slots as booked
bookingCalendar.setMorningSlot(true);
bookingCalendar.setEveningSlot(true);
bookingCalendar.setBookingId_1(String.valueOf(bookingId));
bookingCalendar.setBookingId_2(String.valueOf(bookingId));
bookingCalendar.setIs_booked(bookingCalendar.getIs_booked() + 2);
}
bookingCalendarRepository.save(bookingCalendar);
i++;
}
//transactionManager.rollback(status);
updateResheduledBookingDetails(bookingId, startDat, endDat);
String rescheduledmsg = "Your booking ID " + bookingId + " on " + starting + " has been successfully rescheduled to " + startDate + ". Thanks for using the GCC Community Hall Booking System.";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + bookingDetails.getUsers().getMobileNo() + "&from=GCCCRP&body=" + rescheduledmsg + "&entityid=1401572690000011081&templateid=1407172346565044999";
String rescheduleMsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + bookingDetails.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" + bookingId + "+on+" + starting + "+has+been+successfully+rescheduled+to+" + startDate + "+.+%0AThank+you+for+using+the+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(rescheduleMsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return Optional.of("Booking dates updated successfully.");
}
return Optional.of("Booking not found.");
}
private void updateResheduledBookingDetails(int bookingId, String startDate, String endDate) {
Optional<BookingDetails> book = bookingDetailsRepository.findById(bookingId);
BookingDetails bookingDetails = book.get();
bookingDetails.setScheduleCount(bookingDetails.getScheduleCount() + 1);
if (bookingDetails.getReason().equals("Commercial")) {
bookingDetails.setBookingStatus(BookingStatus.WAITING_FOR_NOC);
}
//Updating Bookinghistory startDate and End Date
BookingHistory bookingHistory = new BookingHistory();
bookingHistory.setStartDate(bookingDetails.getStartDate());
bookingHistory.setEndDate(bookingDetails.getEndDate());
bookingHistory.setComments(bookingDetails.getComments());
bookingHistory.setBookingDetails(bookingDetails);
bookingHistory.setBookingStatus(BookingStatus.APPROVED);
bookingHistory.setUpdatedBy(userSession.getDispayName());
bookingHistory.setCdate(new Date());
bookingDetails.setStartDate(startDate);
bookingDetails.setEndDate(endDate);
bookingHistory.setRefundStatus(bookingDetails.getRefundStatus());
bookingDetails.setComments("slots Resheduled the Dates");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = LocalDateTime.now().format(formatter);
bookingDetails.setUpdatedDate(formattedDate);
bookingDetailsRepository.save(bookingDetails);
bookingHistoryRepository.save(bookingHistory);
}
@Override
public List<Object[]> getBookingHallDetailsReportByZone1(String fromDate, String toDate, String zone, Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByZone1(fromDate, toDate, zone, hallId);
}
public List<Object> getGccBlockingEvents(String hallId) {
HallDetails hallDetails = hallDetailsRepository.findById(Integer.parseInt(hallId))
.orElseThrow(() -> new RuntimeException("Hall not found"));
// Fetch BookingDetails with GCC_BLOCKED status
List<BookingDetails> bookingDetails = bookingDetailsRepository.findByHallDetailsAndBookingStatus(hallDetails, BookingDetails.BookingStatus.GCC_BLOCKED);
// Fetch GccBlockingDate with BLOCKED status
List<GccBlockingDate> gccBlockingDates = gccBlockingDateRepository.findAllByHallIdAndBlockedStatus(hallId, GccBlockingDate.BlockedStatus.BLOCKED);
// Combine results into a list of Object (can be more specific if needed)
List<Object> results = new ArrayList<>();
results.addAll(bookingDetails);
results.addAll(gccBlockingDates);
return results;
}
@Override
public int getBlockedHallCount(String blockingReason, Date startDate, Date endDate) {
return gccBlockingDateRepository.countBlockedHallsInDateRange(blockingReason, startDate, endDate);
}
public boolean isBlockingRecordExists(String fromDate, String toDate, List<Long> hallIdsList) {
LocalDate fromdate = LocalDate.parse(fromDate);
LocalDate todate = LocalDate.parse(toDate);
List<GccBlockingDate> existingRecords = gccBlockingDateRepository.findByFromDateAndToDateBetweenAndHallIdIn(fromdate, todate, hallIdsList);
return !existingRecords.isEmpty();
}
@Override
public void cancelAllBookings(String fromDate, String toDate, List<Long> hallIdsList,
String reasonforblocking, List<String> selectedBookings, String updatedBy, String[] descriptions, MultipartFile[] documents) {
if (selectedBookings != null && !selectedBookings.isEmpty()) {
for (String bookingIdStr : selectedBookings) {
Integer bookingId = Integer.parseInt(bookingIdStr);
Optional<BookingDetails> optionalBooking = bookingDetailsRepository.findById(bookingId);
if (optionalBooking.isPresent()) {
BookingDetails booking = optionalBooking.get();
BookingStatus currentStatus = booking.getBookingStatus();
if (currentStatus == BookingStatus.APPROVED || currentStatus == BookingStatus.WAITING_FOR_NOC ||
currentStatus == BookingStatus.WAITING_FOR_NOC_APPROVAL) {
booking.setBookingStatus(BookingStatus.GCC_BLOCKED);
List<BookingCalendar> calendardata = getCancellingdata1(bookingId.toString());
for (BookingCalendar bb : calendardata) {
if (bookingId != 0 && bb.getBookingId_1() != null &&
bookingId.equals(Integer.valueOf(bb.getBookingId_1()))) {
bb.setBookingId_1(null);
bb.setMorningSlot(false);
}
if (bookingId != 0 && bb.getBookingId_2() != null &&
bookingId.equals(Integer.valueOf(bb.getBookingId_2()))) {
bb.setBookingId_2(null);
bb.setEveningSlot(false);
}
//bb.setIs_blocked(true);
updateBookingStatus(bb);
}
// GCC blocking entry
GccBlockingDate gcc = new GccBlockingDate();
gcc.setStartDate(convertStringToDate(fromDate));
gcc.setEndDate(convertStringToDate(toDate));
gcc.setHallId(String.join(",", hallIdsList.stream().map(String::valueOf).collect(Collectors.toList())));
gcc.setUpdatedBy(updatedBy);
gcc.setCdate(new Date());
gcc.setBlockingReason(reasonforblocking);
if (documents != null && documents.length > 0 && descriptions != null && descriptions.length > 0) {
int i = 0;
for (MultipartFile document : documents) {
String filePath = uploadDirectory + "/" + gcc.getBlockingId() + "_" + i + "_" + document.getOriginalFilename();
String documentUrl = serverPath + "gccblockingdocs/" + gcc.getBlockingId() + "_" + i + "_" + document.getOriginalFilename();
try (FileOutputStream fos = new FileOutputStream(filePath)) {
// Save document to the file system
byte[] bytes = document.getBytes();
fos.write(bytes);
// Save document details along with description in the database
GccblockingDocuments documentDetails = new GccblockingDocuments(); // Assuming you have a DocumentDetails entity
documentDetails.setBlockingDate(gcc); // Assuming hallDetails is associated with the document
documentDetails.setBlockingDocument(documentUrl); // Save the URL of the uploaded document
documentDetails.setDescription(descriptions[i]); // Save corresponding description
gccblockingDocumentsRepo.save(documentDetails); // Save the document and description in the database
} catch (IOException e) {
throw new RuntimeException("Failed to save document", e);
}
i++;
}
}
// GCC blocking History
GccBlockingHistory gccblockinghistory = new GccBlockingHistory();
gccblockinghistory.setStartDate(convertStringToDate(fromDate));
gccblockinghistory.setEndDate(convertStringToDate(toDate));
gccblockinghistory.setHallId(String.join(",", hallIdsList.stream().map(String::valueOf).collect(Collectors.toList())));
gccblockinghistory.setUpdatedBy(updatedBy);
gccblockinghistory.setCdate(new Date());
gccblockinghistory.setBlockingReason(reasonforblocking);
List<Integer> bookingIds = saveGCCBlockingDate(gcc);
gccblockinghistory.setBookingIds(bookingIds.toString());
blockingHistoryRepository.save(gccblockinghistory);
// GCC calendar
for (Long hallId : hallIdsList) {
LocalDate fDate = LocalDate.parse(fromDate);
LocalDate tDate = LocalDate.parse(toDate);
List<LocalDate> dates = getDateRange(fDate, tDate);
for (LocalDate aa : dates) {
String uniqueId = aa.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
BookingCalendar data = getbyDates(aa, hallId.toString());
int userbookingbookingId = bookingIds.get(hallIdsList.indexOf(hallId));
if (data != null) {
System.out.println("uniqueId...1"+uniqueId);
data.setBookingId_1(String.valueOf(userbookingbookingId));
data.setBookingId_2(String.valueOf(userbookingbookingId));
data.setMorningSlot(true);
data.setEveningSlot(true);
data.setIs_blocked(true);
data.setUnique_id(uniqueId);
updateBookingStatus(data);
} else {
System.out.println("uniqueId...2"+uniqueId);
BookingCalendar book = new BookingCalendar();
book.setBdate(aa);
book.setBookingId_1(String.valueOf(userbookingbookingId));
book.setBookingId_2(String.valueOf(userbookingbookingId));
book.setMorningSlot(true);
book.setEveningSlot(true);
book.setHallId(hallId.intValue());
book.setIs_active(true);
book.setIs_booked(2);
book.setIs_delete(false);
book.setIs_blocked(true);
book.setUnique_id(uniqueId);
updateBookingStatus(book);
}
}
}
updateBookingStatusById(booking.getBookingId(), booking.getBookingStatus().GCC_BLOCKED, reasonforblocking);
//whatsup msg and SMS
String gccblockedsms = "Your booking ID " + bookingId + " on " + booking.getStartDate() + " has been blocked by GCC due to " + reasonforblocking + ". The entire amount paid will be refunded to your account with in 3 to 15 days.";
String gccblockedurlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + booking.getUsers().getMobileNo() + "&from=GCCCRP&body=" + gccblockedsms + "&entityid=1401572690000011081&templateid=1407172346521513227";
//String gccblockedwhatsupmsg="https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="+booking.getUsers().getMobileNo()+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+"+booking.getBookingId()+"+on+"+booking.getBookingDate()+"+has+been+blocked+by+GCC+due+to+"+reasonforblocking+".+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
String gccblockedwhatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + booking.getUsers().getMobileNo() + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+" + booking.getBookingId() + "+on+" + booking.getStartDate() + "+has+been+blocked+by+the+GCC+due+to+Goverment+event++.+%0AThe+entire+amount+paid+will+be+refunded+to+your+account+within+3+to+15+days.";
whatsappMsgServiceImpl.sendMsg(gccblockedwhatsupmsg);
whatsappMsgServiceImpl.sendSMS(gccblockedurlString);
bookingDetailsRepository.save(booking);
}
}
}
} else {
// Create and save a new GCC blocking date record
GccBlockingDate gcc = new GccBlockingDate();
gcc.setStartDate(convertStringToDate(fromDate));
gcc.setEndDate(convertStringToDate(toDate));
gcc.setHallId(String.join(",", hallIdsList.stream().map(String::valueOf).collect(Collectors.toList())));
gcc.setUpdatedBy(updatedBy);
gcc.setCdate(new Date());
gcc.setBlockingReason(reasonforblocking);
GccBlockingHistory gccblockinghistory = new GccBlockingHistory();
gccblockinghistory.setStartDate(convertStringToDate(fromDate));
gccblockinghistory.setEndDate(convertStringToDate(toDate));
gccblockinghistory.setHallId(String.join(",", hallIdsList.stream().map(String::valueOf).collect(Collectors.toList())));
gccblockinghistory.setUpdatedBy(updatedBy);
gccblockinghistory.setCdate(new Date());
gccblockinghistory.setBlockingReason(reasonforblocking);
List<Integer> bookingIds = saveGCCBlockingDate(gcc);
String bookingIdsString = bookingIds.stream()
.map(String::valueOf)
.collect(Collectors.joining(","));
gccblockinghistory.setBookingIds(bookingIdsString);
blockingHistoryRepository.save(gccblockinghistory);
if (documents != null && documents.length > 0) {
if (descriptions != null && descriptions.length == documents.length) {
int i = 0;
for (MultipartFile document : documents) {
String filePath = uploadDirectory + "/" + gcc.getBlockingId() + "_" + i + "_" + document.getOriginalFilename();
String documentUrl = serverPath + "gccblockingdocs/" + gcc.getBlockingId() + "_" + i + "_" + document.getOriginalFilename();
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = document.getBytes();
fos.write(bytes);
GccblockingDocuments documentDetails = new GccblockingDocuments();
documentDetails.setBlockingDate(gcc);
documentDetails.setBlockingDocument(documentUrl);
documentDetails.setDescription(descriptions[i]);
gccblockingDocumentsRepo.save(documentDetails);
} catch (IOException e) {
throw new RuntimeException("Failed to save document", e);
}
i++;
}
} else {
// Handle case where descriptions array length does not match documents length
}
}
// Iterate through hall IDs and corresponding dates to update BookingCalendar
for (Long hallId : hallIdsList) {
LocalDate fDate = LocalDate.parse(fromDate);
LocalDate tDate = LocalDate.parse(toDate);
List<LocalDate> dates = getDateRange(fDate, tDate);
for (LocalDate date : dates) {
BookingCalendar data = getbyDates(date, hallId.toString());
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
int userbookingbookingId = bookingIds.get(hallIdsList.indexOf(hallId));
if (data != null) {
System.out.println("uniqueId...11"+uniqueId);
data.setBookingId_1(String.valueOf(userbookingbookingId));
data.setBookingId_2(String.valueOf(userbookingbookingId));
data.setMorningSlot(true);
data.setEveningSlot(true);
data.setIs_blocked(true);
data.setUnique_id(uniqueId);
updateBookingStatus(data);
} else {
System.out.println("uniqueId...21"+uniqueId);
BookingCalendar book = new BookingCalendar();
book.setBdate(date);
book.setBookingId_1(String.valueOf(userbookingbookingId));
book.setBookingId_2(String.valueOf(userbookingbookingId));
book.setMorningSlot(true);
book.setEveningSlot(true);
book.setHallId(hallId.intValue());
book.setIs_active(true);
book.setIs_booked(2);
book.setIs_delete(false);
book.setIs_blocked(true);
book.setUnique_id(uniqueId);
updateBookingStatus(book);
}
}
}
}
}
// Helper methods for date conversion and range calculation
public Date convertStringToDate(String dateString) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return dateFormat.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
public static List<LocalDate> getDateRange(LocalDate fDate, LocalDate tDate) {
List<LocalDate> dateRange = new ArrayList<>();
LocalDate currentDate = fDate;
while (!currentDate.isAfter(tDate)) {
dateRange.add(currentDate);
currentDate = currentDate.plusDays(1);
}
return dateRange;
}
@Override
public List<BookingDetails> findBookingDetailsByBookingId(Long bookingId) {
return bookingDetailsRepository.findBookingDetailsByBookingId(bookingId);
}
//admin dashboard
@Override
public Map<String, Map<String, Integer>> getBookingStatistics(LocalDate fromDate, LocalDate toDate, String zone, String division, Integer hallid, String userType) {
List<Map<String, Object>> rawStatistics = bookingDetailsRepository.getBookingStatistics(fromDate, toDate, zone, division, hallid, userType);
return transformData(rawStatistics);
}
private Map<String, Map<String, Integer>> transformData(List<Map<String, Object>> rawStatistics) {
Map<String, Map<String, Integer>> transformedData = new HashMap<>();
for (Map<String, Object> entry : rawStatistics) {
if (entry.isEmpty()) continue; // Skip empty entries
String category = (String) entry.get("category");
String key = entry.get("key") != null ? (String) entry.get("key") : "total";
Integer totalCount = entry.get("totalCount") != null ? ((Number) entry.get("totalCount")).intValue() : 0;
transformedData.putIfAbsent(category, new HashMap<>());
transformedData.get(category).put(key, totalCount);
if (category.equals("main")) {
Integer mainTotalAmount = entry.get("main_total_amount") != null ? ((Number) entry.get("main_total_amount")).intValue() : 0;
Integer mainRefundedAmount = entry.get("main_refunded_amount") != null ? ((Number) entry.get("main_refunded_amount")).intValue() : 0;
Integer mainNetAmount = entry.get("main_net_amount") != null ? ((Number) entry.get("main_net_amount")).intValue() : 0;
Integer mainGstAmount = entry.get("main_gst_amount") != null ? ((Number) entry.get("main_gst_amount")).intValue() : 0;
transformedData.get(category).put("main_total_amount", mainTotalAmount);
transformedData.get(category).put("main_net_amount", mainNetAmount);
transformedData.get(category).put("main_refunded_amount", mainRefundedAmount);
transformedData.get(category).put("main_gst_amount", mainGstAmount);
}
if (category.equals("past_future")) {
Integer pastbooking = entry.get("PAST_Events") != null ? ((Number) entry.get("PAST_Events")).intValue() : 0;
Integer futurebooking = entry.get("FUTURE_Events") != null ? ((Number) entry.get("FUTURE_Events")).intValue() : 0;
transformedData.get(category).put("PAST_Events", pastbooking);
transformedData.get(category).put("FUTURE_Events", futurebooking);
}
}
return transformedData;
}
public List<Map<String, Object>> getBookingDetailsByHallId(int hallId) {
return bookingDetailsRepository.getBookingDetailsByHallId(hallId);
}
//officer Dashboard
@Override
public Map<String, Map<String, Integer>> getOfficerDashboard(LocalDate fromDate, LocalDate toDate, String zone, String division, Integer hallid, String userType) {
List<Map<String, Object>> rawStatistics = bookingDetailsRepository.getOfficerDashboard(fromDate, toDate, zone, division, hallid, userType);
return transformedData(rawStatistics);
}
private Map<String, Map<String, Integer>> transformedData(List<Map<String, Object>> rawStatistics) {
Map<String, Map<String, Integer>> transformedData = new HashMap<>();
for (Map<String, Object> entry : rawStatistics) {
if (entry.isEmpty()) continue; // Skip empty entries
String category = (String) entry.get("category");
String key = entry.get("key") != null ? (String) entry.get("key") : "total";
Integer totalCount = entry.get("totalCount") != null ? ((Number) entry.get("totalCount")).intValue() : 0;
transformedData.putIfAbsent(category, new HashMap<>());
transformedData.get(category).put(key, totalCount);
if (category.equals("main")) {
Integer mainTotalAmount = entry.get("main_total_amount") != null ? ((Number) entry.get("main_total_amount")).intValue() : 0;
Integer mainNetAmount = entry.get("main_net_amount") != null ? ((Number) entry.get("main_net_amount")).intValue() : 0;
Integer mainRefundedAmount = entry.get("main_refunded_amount") != null ? ((Number) entry.get("main_refunded_amount")).intValue() : 0;
transformedData.get(category).put("main_total_amount", mainTotalAmount);
transformedData.get(category).put("main_net_amount", mainNetAmount);
transformedData.get(category).put("main_refunded_amount", mainRefundedAmount);
}
if (category.equals("past_future")) {
Integer pastbooking = entry.get("PAST_Events") != null ? ((Number) entry.get("PAST_Events")).intValue() : 0;
Integer futurebooking = entry.get("FUTURE_Events") != null ? ((Number) entry.get("FUTURE_Events")).intValue() : 0;
transformedData.get(category).put("PAST_Events", pastbooking);
transformedData.get(category).put("FUTURE_Events", futurebooking);
}
}
return transformedData;
}
@Override
public List<Map<String, Object>> getHallDetailsForOfficer(Integer hallIid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getHallDetailsForOfficer(hallIid);
}
// @Override
// public List<Object[]> getAllPaymentsDetails(String fromDate, String toDate, String paymentStatus) {
// // TODO Auto-generated method stub
// return bookingDetailsRepository.getAllPaymentsDetails(fromDate, toDate,paymentStatus);
// }
//
//admin reports
@Override
public List<Object[]> getBookingDetailsByBookingDate(String fromDate, String toDate, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingDetailsByBookingDate(fromDate, toDate, zone, division, hallid);
}
@Override
public List<Object[]> getBookingDetailsByEventDate(String fromDate, String toDate, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingDetailsByEventDate(fromDate, toDate, zone, division, hallid);
}
@Override
public List<Object[]> getBookingDetailsByBookingDateWithStatus(String fromDate, String toDate,
String bookingStatus, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingDetailsByBookingDateWithStatus(fromDate, toDate, bookingStatus, zone, division, hallid);
}
@Override
public List<Object[]> getBookingDetailsByEventDateWithStatus(String fromDate, String toDate,
String bookingStatus, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingDetailsByEventDateWithStatus(fromDate, toDate, bookingStatus, zone, division, hallid);
}
@Override
public List<Object[]> getAllPaymentsDetails(String fromDate, String toDate, String paymentStatus, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllPaymentsDetails(fromDate, toDate, paymentStatus, zone, division, hallid);
}
@Override
public List<Object[]> getAllExtraPaymentsDetails(String fromDate, String toDate, String paymentStatus, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllExtraPaymentsDetails(fromDate, toDate, paymentStatus, zone, division, hallid);
}
@Override
public List<Object[]> getBookingHallDetailsReportByBookingDate(String fromDate, String toDate, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByBookingDate(fromDate, toDate, zone, division, hallid);
}
@Override
public List<Object[]> getBookingHallDetailsReportByEventDate(String fromDate, String toDate, String zone, String division, Integer hallid) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByEventDate(fromDate, toDate, zone, division, hallid);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByBookingDate(String fromDate, String toDate) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByBookingDate(fromDate, toDate);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByBookingDateWithStatus(String fromDate,
String toDate, String refundStatus) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByBookingDateWithStatus(fromDate, toDate, refundStatus);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByEventDate(String fromDate, String toDate) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByEventDate(fromDate, toDate);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByEventDateWithStatus(String fromDate,
String toDate, String refundStatus) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByEventDateWithStatus(fromDate, toDate, refundStatus);
}
@Override
public List<BookingDetails> getAllBookingDetailsBookingDateByZone(String fromDate, String toDate,
String zone) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingDetailsBookingDateByZone(fromDate, toDate, zone);
}
@Override
public List<BookingDetails> getAllBookingDetailsEventDateByZone(String fromDate, String toDate,
String zone) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingDetailsEventDateByZone(fromDate, toDate, zone);
}
@Override
public List<BookingDetails> getAllBookingDetailsBookingDateByZoneWithStatus(String fromDate, String toDate,
String zone, String bookingStatus) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingDetailsBookingDateByZoneWithStatus(fromDate, toDate, zone, bookingStatus);
}
@Override
public List<BookingDetails> getAllBookingDetailsEventDateByZoneWithStatus(String fromDate, String toDate,
String zone, String bookingStatus) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingDetailsEventDateByZoneWithStatus(fromDate, toDate, zone, bookingStatus);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByZoneByBookingDate(String fromDate,
String toDate, String zone) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByZoneByBookingDate(fromDate, toDate, zone);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByZoneByEventDate(String fromDate, String toDate,
String zone) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByZoneByEventDate(fromDate, toDate, zone);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByZoneByBookingDateWithStatus(String fromDate,
String toDate, String zone, String refundStatus) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByZoneByBookingDateWithStatus(fromDate, toDate, zone, refundStatus);
}
@Override
public List<BookingDetails> getAllBookingsettlementDetailsByZoneByEventDateWithStatus(String fromDate,
String toDate, String zone, String refundStatus) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getAllBookingsettlementDetailsByZoneByEventDateWithStatus(fromDate, toDate, zone, refundStatus);
}
@Override
public List<Object[]> getBookingHallDetailsReportByZoneByBookingDate(String fromDate, String toDate,
String zone) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByZoneByBookingDate(fromDate, toDate, zone);
}
@Override
public List<Object[]> getBookingHallDetailsReportByZoneByEventDate(String fromDate, String toDate,
String zone) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByZoneByEventDate(fromDate, toDate, zone);
}
@Override
public List<Object[]> getBookingHallDetailsReportByZoneByBookingDateHallname(String fromDate, String toDate,
String zone, Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByZoneByBookingDateHallname(fromDate, toDate, zone, hallId);
}
@Override
public List<Object[]> getBookingHallDetailsReportByZoneByEventDateHallname(String fromDate, String toDate,
String zone, Integer hallId) {
// TODO Auto-generated method stub
return bookingDetailsRepository.getBookingHallDetailsReportByZoneByEventDateHallname(fromDate, toDate, zone, hallId);
}
//gccapps
@Override
public List<BookingDetails> getApprovedBookingDetails() {
return bookingDetailsRepository.findByBookingStatus(BookingDetails.BookingStatus.APPROVED);
}
@Override
public List<BookingDetails> getRejectedBookingDetails() {
return bookingDetailsRepository.findByBookingStatus(BookingDetails.BookingStatus.REJECTED);
}
@Override
public List<BookingDetails> getWaitingforNOCapproval() {
return bookingDetailsRepository.findByBookingStatus(BookingDetails.BookingStatus.WAITING_FOR_NOC_APPROVAL);
}
@Override
public List<Object[]> getAllPaymentsDetails(String fromDate, String toDate) {
// TODO Auto-generated method stub
//return bookingDetailsRepository.getAllPaymentsDetails(fromDate, toDate);
return null;
}
@Override
public List<BookingDetails> getPastsEvents() {
return bookingDetailsRepository.findPastsEvents();
}
@Override
public List<BookingDetails> getPresentsEvents() {
return bookingDetailsRepository.findPresentsEvents();
}
@Override
public List<BookingDetails> getFuturesEvents() {
return bookingDetailsRepository.findFuturesEvents();
}
@Override
public List<BookingDetails> getSettlementApprovedList() {
return bookingDetailsRepository.getSettlementApprovedList();
}
@Override
public List<Map<String, Object>> getHallDetails(Integer hall_id) {
// TODO Auto-generated method stub
//return bookingDetailsRepository.getHallDetails(hall_id);
return null;
}
public List<Object[]> getUserDetailsByBookingDate(String fromDate, String toDate) {
return userRepository.findUserDetailsByBookingDate(fromDate, toDate);
}
//developer
@Override
public List<Object[]> getTransactionresponse(String fromDate, String toDate, Long bookingId, Long hallId) {
return transactionResponseRepository.getTransactionResponseByBookingId(fromDate, toDate, bookingId, hallId);
}
@Override
public List<Object[]> getRefundResponse(String fromDate, String toDate, Long bookingId) {
return transRefundResRepository.getRefundResponseByBookingId(fromDate, toDate, bookingId);
}
@Override
public List<Object[]> getBookingCalendarDetails(String fromDate, String toDate, Long bookingId, String hallName) {
return bookingCalendarRepository.findBookingCalendarDetails(fromDate, toDate, bookingId, hallName);
}
@Override
public List<BookingDetails> getBookingsByDateAndHall(String bookingDate, Long hallId) {
LocalDate date = LocalDate.parse(bookingDate); // Ensure format matches yyyy-MM-dd
return bookingDetailsRepository.findByBookingDateAndHallId(date, hallId);
}
@Override
@Transactional
public BookingDetails updateRefundStatusScheduler(int bookingId, RefundStatus status) {
Optional<BookingDetails> booking = bookingDetailsRepository.findById(bookingId);
if (booking.isPresent()) {
String adminname = "Refund Scheduler";
BookingDetails book = booking.get();
book.setRefundStatus(status);
book.setComments("Refund status Updated to:-" + status);
BookingDetails bookings = bookingDetailsRepository.save(book);
BookingHistory bookingHistory = new BookingHistory();
bookingHistory.setStartDate(book.getStartDate());
bookingHistory.setEndDate(book.getEndDate());
bookingHistory.setComments(book.getComments());
bookingHistory.setBookingDetails(book);
bookingHistory.setBookingStatus(book.getBookingStatus());
bookingHistory.setUpdatedBy(adminname);
bookingHistory.setCdate(new Date());
bookingHistory.setRefundStatus(book.getRefundStatus());
bookingHistoryRepository.save(bookingHistory);
return bookings;
}
return null;
}
}