From 17d9af5e4c3ffdb2f24ba19844bde22f0aca28c1 Mon Sep 17 00:00:00 2001 From: AJITHKUMAR12 Date: Wed, 26 Nov 2025 17:47:53 +0530 Subject: [PATCH] changed bookingid to referenceid in acknowledgement page --- .../configuration/EncryptionUtil.java | 41 +++ .../configuration/UuidBookingUtil.java | 78 ++++++ .../controller/UserController.java | 78 +++++- .../communityHall/entity/BookingDetails.java | 13 +- .../entity/SettlementHistory.java | 238 ++++++++++++++++++ .../controller/PaymentController.java | 125 ++++++++- .../repository/BookingDetailsRepository.java | 22 ++ .../SettlementHistoryRepository.java | 9 + .../communityHall/service/BookingService.java | 4 + .../service/Impl/BookingServiceImpl.java | 63 ++++- .../templates/admin/settlement-list.html | 4 +- .../headquarters/settlement-list.html | 4 +- .../templates/officer/settlement-list.html | 4 +- 13 files changed, 670 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/gcc/communityHall/configuration/EncryptionUtil.java create mode 100644 src/main/java/com/gcc/communityHall/configuration/UuidBookingUtil.java create mode 100644 src/main/java/com/gcc/communityHall/entity/SettlementHistory.java create mode 100644 src/main/java/com/gcc/communityHall/repository/SettlementHistoryRepository.java diff --git a/src/main/java/com/gcc/communityHall/configuration/EncryptionUtil.java b/src/main/java/com/gcc/communityHall/configuration/EncryptionUtil.java new file mode 100644 index 00000000..a4a35006 --- /dev/null +++ b/src/main/java/com/gcc/communityHall/configuration/EncryptionUtil.java @@ -0,0 +1,41 @@ +package com.gcc.communityHall.configuration; + + +import org.springframework.stereotype.Component; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; + + +@Component +public class EncryptionUtil { + + private static final String SECRET_KEY = "MySecretKey12345"; // 16 chars + private static final String ALGORITHM = "AES"; + + + public String encrypt(String value) { + try { + SecretKeySpec key = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, key); + byte[] encrypted = cipher.doFinal(value.getBytes()); + return Base64.getUrlEncoder().encodeToString(encrypted); // URL safe + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public String decrypt(String encryptedValue) { + try { + SecretKeySpec key = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, key); + byte[] decoded = Base64.getUrlDecoder().decode(encryptedValue); + return new String(cipher.doFinal(decoded)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/gcc/communityHall/configuration/UuidBookingUtil.java b/src/main/java/com/gcc/communityHall/configuration/UuidBookingUtil.java new file mode 100644 index 00000000..1ac8bb93 --- /dev/null +++ b/src/main/java/com/gcc/communityHall/configuration/UuidBookingUtil.java @@ -0,0 +1,78 @@ +package com.gcc.communityHall.configuration; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Utility class for handling UUID-based ref_id for booking verification + * This provides a secure and URL-friendly approach for booking reference IDs + */ +public class UuidBookingUtil { + + // In-memory cache to store UUID to booking ID mapping + // In production, this should be replaced with a database table or Redis + private static final Map uuidToBookingIdMap = new ConcurrentHashMap<>(); + private static final Map bookingIdToUuidMap = new ConcurrentHashMap<>(); + + /** + * Generate a UUID ref_id for a booking ID + * @param bookingId The original booking ID + * @return UUID string that can be used as ref_id + */ + public static String generateRefIdForBooking(int bookingId) { + String uuid = UUID.randomUUID().toString(); + + // Store the mapping + uuidToBookingIdMap.put(uuid, bookingId); + bookingIdToUuidMap.put(bookingId, uuid); + + return uuid; + } + + /** + * Get booking ID from ref_id UUID + * @param refId The UUID string from URL + * @return Original booking ID, or null if not found + */ + public static Integer getBookingIdFromRefId(String refId) { + return uuidToBookingIdMap.get(refId); + } + + /** + * Get ref_id UUID for existing booking ID (if already generated) + * @param bookingId The booking ID + * @return UUID string, or null if not found + */ + public static String getRefIdForBooking(int bookingId) { + return bookingIdToUuidMap.get(bookingId); + } + + /** + * Remove mapping when booking is cancelled or expired + * @param bookingId The booking ID to remove + */ + public static void removeBookingMapping(int bookingId) { + String uuid = bookingIdToUuidMap.remove(bookingId); + if (uuid != null) { + uuidToBookingIdMap.remove(uuid); + } + } + + /** + * Check if ref_id UUID is valid + * @param refId The UUID string to validate + * @return true if UUID exists in mapping + */ + public static boolean isValidRefId(String refId) { + return uuidToBookingIdMap.containsKey(refId); + } + + /** + * Get total number of active mappings (for monitoring) + * @return Number of active UUID mappings + */ + public static int getActiveMappingCount() { + return uuidToBookingIdMap.size(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gcc/communityHall/controller/UserController.java b/src/main/java/com/gcc/communityHall/controller/UserController.java index 66ceca8b..14fb7c0f 100644 --- a/src/main/java/com/gcc/communityHall/controller/UserController.java +++ b/src/main/java/com/gcc/communityHall/controller/UserController.java @@ -3,11 +3,14 @@ package com.gcc.communityHall.controller; import java.time.LocalDate; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -15,6 +18,7 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import com.gcc.communityHall.entity.BookingCalendar; import com.gcc.communityHall.entity.BookingDetails; @@ -250,14 +254,47 @@ public class UserController { return "user/hallbookingform"; } - @GetMapping("/acknowledgement") + /* @GetMapping("/acknowledgement") public String viewakowledgement(Model model, int bookingId) { BookingDetails bookingsDetails = bookingService.getBookingsById(bookingId); model.addAttribute("bookingsDetails", bookingsDetails); // Add single BookingDetails object model.addAttribute("userName", userSession.getDispayName()); return "user/acknowledgement"; + }*/ + //ak + @GetMapping("/acknowledgement") +public String viewAcknowledgement(@RequestParam("ref_id") String refId, Model model) { + + // Fetch booking using booking_ref_id + BookingDetails bookingsDetails = bookingService.getBookingByRefId(refId); + + if (bookingsDetails == null) { + model.addAttribute("errorMsg", "Invalid booking reference number."); + return "user/error"; + } + + model.addAttribute("bookingsDetails", bookingsDetails); + model.addAttribute("userName", userSession.getDispayName()); + + return "user/acknowledgement"; +} +//ak + @PostMapping("/migrate-old-bookings") + @ResponseBody + public ResponseEntity migrateOldBookings() { + try { + bookingService.migrateOldBookingsToRefId(); + return ResponseEntity.ok("Migration completed successfully. All old bookings now have ref_ids."); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Migration failed: " + e.getMessage()); + } } + + + @GetMapping("/logout") public String logout(Model model) { // Clear all login session (Check API Controller /gcc-login) @@ -268,7 +305,7 @@ public class UserController { return "redirect:/communityhall/user/dashboard"; } - @GetMapping("/viewhistory") + /*@GetMapping("/viewhistory") public String viewBookingDetails(Model model, @RequestParam(name = "bookingStatus", required = false) String bookingStatus) { // Retrieve userId from session Integer userId = userSession.getUserId(); @@ -285,7 +322,44 @@ public class UserController { model.addAttribute("serverDate", LocalDate.now().toString()); //for server date return "user/viewhistory"; + }*/ + //ak + @GetMapping("/viewhistory") +public String viewBookingDetails(Model model, + @RequestParam(name = "bookingStatus", required = false) String bookingStatus) { + + Integer userId = userSession.getUserId(); + + model.addAttribute("userName", userSession.getDispayName()); + model.addAttribute("counter", userSession.getCounter()); + model.addAttribute("counterName", userSession.getCounterName()); + + // Fetch all past bookings + List> bookingPast = bookingService.getAllBookingEventsByUserId(userId); + + // Extract booking_ref_id per booking + Map refIdMap = new HashMap<>(); + + for (Map row : bookingPast) { + + Integer bookingId = (Integer) row.get("booking_id"); + String refId = (String) row.get("booking_ref_id"); // <-- coming from SQL + + if (bookingId != null && refId != null) { + refIdMap.put(bookingId, refId); + } } + System.out.println("Row keys: " + bookingPast.get(0).keySet()); + System.out.println("RefId Map123: " + refIdMap); + + model.addAttribute("userBookingspast", bookingPast); + model.addAttribute("bookingRefIds", refIdMap); // <-- SENT TO FRONTEND + model.addAttribute("serverDate", LocalDate.now().toString()); + + return "user/viewhistory"; +} + + @GetMapping("/CommunityHallList") public String viewhalllist(Model model) { diff --git a/src/main/java/com/gcc/communityHall/entity/BookingDetails.java b/src/main/java/com/gcc/communityHall/entity/BookingDetails.java index e3794e3f..2911c1aa 100644 --- a/src/main/java/com/gcc/communityHall/entity/BookingDetails.java +++ b/src/main/java/com/gcc/communityHall/entity/BookingDetails.java @@ -61,6 +61,10 @@ public class BookingDetails { private String relationship; private String comments; + //ak + @Column(name = "booking_ref_id") +private String bookingRefId; + @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) @JoinColumn(name = "counterdetails_counter_id") private CounterDetails counterDetails; @@ -112,7 +116,14 @@ public class BookingDetails { public void setNoOfDays(double days) { this.noOfDays = days; - } + }//ak + public String getBookingRefId() { + return bookingRefId; +} + +public void setBookingRefId(String bookingRefId) { + this.bookingRefId = bookingRefId; +} public String getStartDate() { return startDate; diff --git a/src/main/java/com/gcc/communityHall/entity/SettlementHistory.java b/src/main/java/com/gcc/communityHall/entity/SettlementHistory.java new file mode 100644 index 00000000..317f0eef --- /dev/null +++ b/src/main/java/com/gcc/communityHall/entity/SettlementHistory.java @@ -0,0 +1,238 @@ +package com.gcc.communityHall.entity; + +import java.time.Instant; +import java.time.LocalDate; +import java.util.Date; + +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Transient; + +@Entity +public class SettlementHistory { + + @Id +@GeneratedValue(strategy = GenerationType.IDENTITY) +@Column(name = "history_id") +private int historyId; + + private int settlementId; + private String comments; + private LocalDate cdate; + private double damageAmount; + private double ebAmount; + private double depositAmount; + private double refundedAmount; + private Date updatedDate; + private String updatedId; + @Column(name = "challon_url") + private String challon; + private String dddate; + private long ddnumber; + private double collectionPending; + private String collectionStatus; + private long challonnumber; + private long challonamount; + private long ddamount; + //ak + @Column(name = "approved_flag") +private Integer approvedFlag = 0; + +@Column(name = "approved_flag_date") +private Date approvedFlagDate; +@Column(name = "sh_date") +private Date ShDate; + + + + + @OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL) + @JsonIgnore + private BookingDetails bookingDetails; + public int getHistoryId() { + return historyId; +} + +public void setHistoryId(int historyId) { + this.historyId = historyId; +} + + public int getSettlementId() { + return settlementId; + } + public void setSettlementId(int settlementId) { + this.settlementId = settlementId; + } + public String getComments() { + return comments; + } + public void setComments(String comments) { + this.comments = comments; + } + public LocalDate getCdate() { + return cdate; + } + public void setCdate(LocalDate cdate) { + this.cdate = cdate; + } + public double getDamageAmount() { + return damageAmount; + } + public void setDamageAmount(double damageAmount) { + this.damageAmount = damageAmount; + } + public double getEbAmount() { + return ebAmount; + } + public void setEbAmount(double ebAmount) { + this.ebAmount = ebAmount; + } + public double getDepositAmount() { + return depositAmount; + } + public void setDepositAmount(double depositAmount) { + this.depositAmount = depositAmount; + } + public double getRefundedAmount() { + return refundedAmount; + } + public void setRefundedAmount(double refundedAmount) { + this.refundedAmount = refundedAmount; + } + public Date getUpdatedDate() { + return updatedDate; + } + public void setUpdatedDate(Date updatedDate) { + this.updatedDate = updatedDate; + } + public String getUpdatedId() { + return updatedId; + } + public void setUpdatedId(String updatedId) { + this.updatedId = updatedId; + } + public BookingDetails getBookingDetails() { + return bookingDetails; + } + public void setBookingDetails(BookingDetails bookingDetails) { + this.bookingDetails = bookingDetails; + } + public String getChallon() { + return challon; + } + public void setChallon(String challon) { + this.challon = challon; + } + public String getDddate() { + return dddate; + } + public void setDddate(String dddate) { + this.dddate = dddate; + } + public long getDdnumber() { + return ddnumber; + } + public void setDdnumber(long ddnumber) { + this.ddnumber = ddnumber; + } + + public double getCollectionPending() { + return collectionPending; + } + public void setCollectionPending(double collectionPending) { + this.collectionPending = collectionPending; + } + + public long getChallonnumber() { + return challonnumber; + } + public void setChallonnumber(long challonnumber) { + this.challonnumber = challonnumber; + } + public long getDdamount() { + return ddamount; + } + public void setDdamount(long ddamount) { + this.ddamount = ddamount; + } + + public long getChallonamount() { + return challonamount; + } + public void setChallonamount(long challonamount) { + this.challonamount = challonamount; + } + public String getCollectionStatus() { + return collectionStatus; + } + + public void setCollectionStatus(String collectionStatus) { + this.collectionStatus = collectionStatus; + } + // Getter for approvedFlag +public Integer getApprovedFlag() { + return approvedFlag; +} + +// Setter for approvedFlag +public void setApprovedFlag(Integer approvedFlag) { + this.approvedFlag = approvedFlag; +} + +// Getter for approvedFlagDate +public Date getApprovedFlagDate() { + return approvedFlagDate; +} + +// Setter for approvedFlagDate +public void setApprovedFlagDate(Date approvedFlagDate) { + this.approvedFlagDate = approvedFlagDate; +} + +// Getter for ShDate +public Date getShDate() { + return ShDate; +} + +// Setter for ShDate +public void setShDate(Date shDate) { + ShDate = shDate; +} + + public SettlementHistory(int settlementId, String comments, LocalDate cdate, double damageAmount, double ebAmount, + double depositAmount, double refundedAmount, Date updatedDate, String updatedId, String challon, + String dddate, long ddnumber, BookingDetails bookingDetails,double collectionPending, long ddamount, long challonnumber, String collectionStatus) { + super(); + this.settlementId = settlementId; + this.comments = comments; + this.cdate = cdate; + this.damageAmount = damageAmount; + this.ebAmount = ebAmount; + this.depositAmount = depositAmount; + this.refundedAmount = refundedAmount; + this.updatedDate = updatedDate; + this.updatedId = updatedId; + this.challon = challon; + this.dddate = dddate; + this.ddnumber = ddnumber; + this.bookingDetails = bookingDetails; + this.collectionPending=collectionPending; + this.ddamount=ddamount; + this.challonnumber=challonnumber; + this.collectionStatus=collectionStatus; + } + public SettlementHistory() { + super(); + } + +} diff --git a/src/main/java/com/gcc/communityHall/paymentService/controller/PaymentController.java b/src/main/java/com/gcc/communityHall/paymentService/controller/PaymentController.java index c4676f18..17104a11 100644 --- a/src/main/java/com/gcc/communityHall/paymentService/controller/PaymentController.java +++ b/src/main/java/com/gcc/communityHall/paymentService/controller/PaymentController.java @@ -13,6 +13,7 @@ import java.util.*; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gcc.communityHall.configuration.EncryptionUtil; import com.gcc.communityHall.entity.*; import com.gcc.communityHall.others.AppConfig; //import com.gcc.communityHall.repository.ErpPostDataRepository; @@ -28,7 +29,6 @@ import org.springframework.web.bind.annotation.RequestParam; import com.gcc.communityHall.entity.BookingDetails.BookingStatus; import com.gcc.communityHall.entity.BookingDetails.RefundStatus; -import com.gcc.communityHall.entity.Users; import com.gcc.communityHall.paymentService.config.PaymentConfig; import com.gcc.communityHall.paymentService.entity.TransactionResponse; import com.gcc.communityHall.paymentService.repository.TransactionResponseRepository; @@ -45,6 +45,9 @@ import org.springframework.web.util.UriComponentsBuilder; @Controller @RequestMapping("/communityhall/payment") public class PaymentController { + //ak + @Autowired + private EncryptionUtil encryptionUtil; @Autowired PaymentGatewayService paymentService; @@ -76,9 +79,120 @@ public class PaymentController { @Autowired private PaymentsService paymentsService; +//ak +@PostMapping(value = "/response") +public String response(Model model, @RequestParam(required = false) String msg) throws NoSuchAlgorithmException { + + String salt = this.paymentConfig.getEncryptionKey(); + String confirmToken = ""; + String status = this.paymentConfig.getTransactionSuccessCode(); + + String[] res = msg.split("\\|"); + String c = ""; + + TransactionResponse response = this.paymentService.getTransactionResponseByTxansactionId(res[3], "temp"); + + Payments payment = new Payments(); + payment.setTransactionId(response.getTxansactionId()); + double amount = 0; + + // ------------------ PAYMENT STRING PROCESSING ------------------ + for (int i = 0; i < res.length; i++) { + + if (i == res.length - 1) { + c = c + salt; + confirmToken = res[i]; + } else if (res[i].isEmpty()) { + c = c + "|"; + } else if (res[i].equals("NA")) { + c = c + "NA|"; + } else { + c = c + res[i] + "|"; + } + + if (i == 5) { + response.setTpslTxnId(res[i]); + response.setAmount(res[6]); + response.setTxansactionId(res[3]); + response.setDate(res[8]); + } + } + int bookingId = response.getBookingId(); + + try { + amount = Double.parseDouble(response.getAmount()); + } catch (Exception e) {} + + payment.setAmountReceived(amount); + payment.setPaymentStatus("Not Completed"); + + BookingDetails bookingsDetails = bookser.getBookingsById(bookingId); // JPA fetch + payment.setBookingDetails(bookingsDetails); + response.setResponse(msg); + response.setStatusCode(res[0]); + bookingsDetails.setPayments(payment); + payment.setCdate(new Date()); + + // save transaction response + transactionResRepo.save(response); + + // ============================================================= + // CASE 1: FAILURE - AMOUNT MISMATCH + // ============================================================= + if (bookingsDetails.getAmountReceived() != amount) { + + if(paymentService.generateToken(c).equals(confirmToken) && status.equals(res[0])){ + payment.setPaymentStatus("Success"); + bookingsDetails.setPayments(payment); + paymentRepo.save(payment); + + // booking failure logic + bookser.bookingFailure(bookingsDetails, 1); + } - @PostMapping(value = "/response") + // Fetch OR Generate booking_ref_id + String refId = bookser.getBookingRefIdByBookingId(bookingId); + + // encrypt bookingId (coworkspace logic) + String encryptedId = encryptionUtil.encrypt(String.valueOf(bookingId)); + + model.addAttribute("ref_id", refId); + model.addAttribute("encryptedId", encryptedId); + + return "redirect:/communityhall/user/acknowledgement?ref_id=" + refId; + } + + // ============================================================= + // CASE 2: SUCCESS FLOW + // ============================================================= + if (paymentService.generateToken(c).equals(confirmToken) && status.equals(res[0])) { + + payment.setPaymentStatus("Success"); + bookingsDetails.setPayments(payment); + paymentRepo.save(payment); + + try { + bookser.confirmBooking(bookingId); + } catch (Exception e) { + // ignore + } + } + + // 🔥 Fetch OR Generate booking_ref_id + String refId = bookser.getBookingRefIdByBookingId(bookingId); + + // 🔐 Encrypt bookingId + String encryptedId = encryptionUtil.encrypt(String.valueOf(bookingId)); + + model.addAttribute("ref_id", refId); + model.addAttribute("encryptedId", encryptedId); + + return "redirect:/communityhall/user/acknowledgement?ref_id=" + refId; +} + + + /* @PostMapping(value = "/response") public String response(Model model, @RequestParam(required = false) String msg) throws NoSuchAlgorithmException { String salt = this.paymentConfig.getEncryptionKey(); @@ -144,6 +258,8 @@ public class PaymentController { paymentRepo.save(payment); bookser.bookingFailure(bookingsDetails, 1); } + //ak + model.addAttribute("bookingsDetails", bookingsDetails); @@ -182,7 +298,7 @@ public class PaymentController { //System.out.println(save.toString()); paymentRepo.save(payment); return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingsDetails.getBookingId(); - } + }*/ /*public void postDataToERP(Payments payment, TransactionResponse res) { RestTemplate restTemplate = new RestTemplate(); @@ -347,7 +463,8 @@ public class PaymentController { model.addAttribute("bookingsDetails", bookingsDetails); extraPaymentsRepository.save(payment); // postEPDataToERP(payment, response); //post extra payments details to ERP - return "redirect:/communityhall/user/collectionpendingacknowledgement?bookingId=" + bookingsDetails.getBookingId(); + // return "redirect:/communityhall/user/collectionpendingacknowledgement?bookingId=" + bookingsDetails.getBookingId(); + return "redirect:/communityhall/user/collectionpendingacknowledgement?bookingId=" + bookingsDetails.getBookingId(); } /*public void postEPDataToERP(ExtraPayments payment, TransactionResponse res) { diff --git a/src/main/java/com/gcc/communityHall/repository/BookingDetailsRepository.java b/src/main/java/com/gcc/communityHall/repository/BookingDetailsRepository.java index b74b71c4..4b074e2a 100644 --- a/src/main/java/com/gcc/communityHall/repository/BookingDetailsRepository.java +++ b/src/main/java/com/gcc/communityHall/repository/BookingDetailsRepository.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -38,6 +39,27 @@ public interface BookingDetailsRepository extends JpaRepository findAllOldBookingsWithoutRefId(); + + + + @Query("SELECT bd FROM BookingDetails bd JOIN bd.hallDetails hd WHERE hd.zone = :zone AND bd.bookingStatus IN ('WAITING_FOR_NOC')") List getWaitinglist(@Param("zone") String zone); diff --git a/src/main/java/com/gcc/communityHall/repository/SettlementHistoryRepository.java b/src/main/java/com/gcc/communityHall/repository/SettlementHistoryRepository.java new file mode 100644 index 00000000..3e15ce5c --- /dev/null +++ b/src/main/java/com/gcc/communityHall/repository/SettlementHistoryRepository.java @@ -0,0 +1,9 @@ +package com.gcc.communityHall.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import com.gcc.communityHall.entity.SettlementHistory; + +@Repository +public interface SettlementHistoryRepository extends JpaRepository { +} diff --git a/src/main/java/com/gcc/communityHall/service/BookingService.java b/src/main/java/com/gcc/communityHall/service/BookingService.java index 404fc709..6fd64e53 100644 --- a/src/main/java/com/gcc/communityHall/service/BookingService.java +++ b/src/main/java/com/gcc/communityHall/service/BookingService.java @@ -19,6 +19,10 @@ import com.gcc.communityHall.entity.GccBlockingDate; public interface BookingService { BookingDetails getBookingsById(int BookingId); + //ak + BookingDetails getBookingByRefId(String refId); + //ak + void migrateOldBookingsToRefId(); BookingDetails updateBookingDetails(BookingDetails bd); diff --git a/src/main/java/com/gcc/communityHall/service/Impl/BookingServiceImpl.java b/src/main/java/com/gcc/communityHall/service/Impl/BookingServiceImpl.java index c8ed9bf0..4df8ff94 100644 --- a/src/main/java/com/gcc/communityHall/service/Impl/BookingServiceImpl.java +++ b/src/main/java/com/gcc/communityHall/service/Impl/BookingServiceImpl.java @@ -28,6 +28,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import com.gcc.communityHall.configuration.UuidBookingUtil; import com.gcc.communityHall.entity.ApplicationLogs; import com.gcc.communityHall.entity.BookingCalendar; import com.gcc.communityHall.entity.BookingDetails; @@ -180,6 +181,59 @@ public class BookingServiceImpl implements BookingService { } return null; } + //ak + @Override +public BookingDetails getBookingByRefId(String refId) { + return bookingDetailsRepository.findByRefId(refId); +} +//ak +@Transactional +@Override +public void migrateOldBookingsToRefId() { + + List oldBookings = + bookingDetailsRepository.findAllOldBookingsWithoutRefId(); + + for (BookingDetails booking : oldBookings) { + + int bookingId = booking.getBookingId(); + + // Generate ref_id + String generatedRefId = UuidBookingUtil.generateRefIdForBooking(bookingId); + + // Set into entity + booking.setBookingRefId(generatedRefId); + + // Save + bookingDetailsRepository.save(booking); + + System.out.println("Migrated booking ID " + bookingId + + " → ref_id = " + generatedRefId); + } +} + + + //ak + @Transactional +public String getBookingRefIdByBookingId(int bookingId) { + + String refId = bookingDetailsRepository.getRefIdByBookingId(bookingId); + + // If missing → create new + if (refId == null || refId.trim().isEmpty()) { + + // Generate refId using coworkspace logic + refId = UuidBookingUtil.generateRefIdForBooking(bookingId); + + // Update using JPA repository + bookingDetailsRepository.updateRefId(refId, bookingId); + } + + return refId; +} + + + @Override public BookingDetails updateBookingDetails(BookingDetails bd) { @@ -364,7 +418,8 @@ public class BookingServiceImpl implements BookingService { e.printStackTrace(); bookingFailure(bookingDetails, 2); // System.out.println(bookingDetails.getBookingStatus()+","+bookingDetails.getRefundStatus()+","+bookingDetails.getComments()); - return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId(); + //return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId(); + return "redirect:/communityhall/user/acknowledgement?ref_id=" + bookingDetails.getBookingRefId(); } } @@ -537,12 +592,14 @@ public class BookingServiceImpl implements BookingService { 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(); + // return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId(); + return "redirect:/communityhall/user/acknowledgement?ref_id=" + bookingDetails.getBookingRefId(); } catch (Exception e) { bookingFailure(bookingDetails, 2); // System.out.println(bookingDetails.getBookingStatus()+","+bookingDetails.getRefundStatus()+","+bookingDetails.getComments()); - return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId(); + // return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingDetails.getBookingId(); + return "redirect:/communityhall/user/acknowledgement?ref_id=" + bookingDetails.getBookingRefId(); } } diff --git a/src/main/resources/templates/admin/settlement-list.html b/src/main/resources/templates/admin/settlement-list.html index a84a388a..a5a2614b 100644 --- a/src/main/resources/templates/admin/settlement-list.html +++ b/src/main/resources/templates/admin/settlement-list.html @@ -555,7 +555,7 @@ th:onclick="accept()">Approve - + @@ -926,8 +926,10 @@ showDamageDetails(x); if (x.settlement && x.settlement.approvedFlag === 1) { $("#approvebutton").hide(); + $("#removebutton").hide(); } else { $("#approvebutton").show(); + $("#removebutton").show(); } } }); diff --git a/src/main/resources/templates/headquarters/settlement-list.html b/src/main/resources/templates/headquarters/settlement-list.html index dd03d9ce..9042bba8 100644 --- a/src/main/resources/templates/headquarters/settlement-list.html +++ b/src/main/resources/templates/headquarters/settlement-list.html @@ -556,7 +556,7 @@ th:onclick="accept()">Approve - + @@ -928,8 +928,10 @@ //ak for headquarters if (x.settlement && x.settlement.approvedFlag === 1) { $("#approvebutton").hide(); + $("#removebutton").hide(); } else { $("#approvebutton").show(); + $("#removebutton").show(); } } diff --git a/src/main/resources/templates/officer/settlement-list.html b/src/main/resources/templates/officer/settlement-list.html index ce4451eb..c8869d17 100644 --- a/src/main/resources/templates/officer/settlement-list.html +++ b/src/main/resources/templates/officer/settlement-list.html @@ -546,7 +546,7 @@ th:onclick="accept()">Approve - + @@ -917,8 +917,10 @@ //ak for officer if (x.settlement && x.settlement.approvedFlag === 1) { $("#approvebutton").hide(); + $("#removebutton").hide(); } else { $("#approvebutton").show(); + $("#removebutton").show(); } } });