diff --git a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java index 0d2ae04..9d88445 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java @@ -35,7 +35,7 @@ public class ComplainController { public ComplainController(ComplainService complainService) { this.complainService = complainService; } - + @PostMapping(value = "/addComplain", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity addComplain(@Validated @RequestBody ComplaintRequestDTO complainRequestDTO) { @@ -82,5 +82,4 @@ public class ComplainController { public ResponseEntity getAllStatuses(@Validated @RequestBody AllMasterOptionsRequest request) { return ResponseEntity.ok(complainService.getAllActiveStatuses(request)); } - } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/ViewComplaintDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/ViewComplaintDTO.java index df28213..8457a7b 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/ViewComplaintDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/ViewComplaintDTO.java @@ -1,6 +1,7 @@ package com.billpaymentservice.bbps.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; @@ -24,7 +25,9 @@ public class ViewComplaintDTO { private String modifiedEpochDate; private String refId; private String status; - private String txnId; + @JsonProperty("txnId") + private String bankTxnId; + private String userId; private String category; private String billerName; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/TxnStatusRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/TxnStatusRequest.java new file mode 100644 index 0000000..6bb8b82 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/TxnStatusRequest.java @@ -0,0 +1,12 @@ +package com.billpaymentservice.bbps.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TxnStatusRequest extends BaseClass { + + private String id; + private String idType; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/TxnStatusResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/TxnStatusResponse.java new file mode 100644 index 0000000..7d733f2 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/TxnStatusResponse.java @@ -0,0 +1,24 @@ +package com.billpaymentservice.bbps.dto.response; + +import com.billpaymentservice.bbps.dto.GeneralResp; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TxnStatusResponse { + + private String txnStatusReqRefId; + private String agentId; + private String billerId; + private String approvalRefNum; + private String txnRefId; + private String mti; + private String txnDate; // RFC3339 format + private String amount; + private String txnStatus; // SUCCESS / FAILED + private String customerMobile; + + private GeneralResp generalResp; +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ComplaintStatusDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/ComplaintStatusDetails.java new file mode 100644 index 0000000..052e134 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ComplaintStatusDetails.java @@ -0,0 +1,103 @@ +package com.billpaymentservice.bbps.entites; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +@Table(name = "complaint_status_details") +public class ComplaintStatusDetails { + + + @Id + @Column(name = "req_id") + private String reqId; + + @Column(name = "txn_id") + private String txnId; + + private String complaintId; + + @Column(name = "assigned_to") + private String assignedTo; + + @Column(name = "comment") + private String comment; + + @Column(name = "complaint_descr") + private String complaintDescr; + + @Column(name = "complaint_dispos") + private String complaintDispos; + + @Column(name = "complaint_npci_id") + private String complaintNpciId; + + @Column(name = "complaint_raised_from") + private String complaintRaisedFrom; + + @Column(name = "complaint_type") + private String complaintType; + + @Column(name = "created_epoch_date") + private String createdEpochDate; + + @Column(name = "creation_date") + private String creationDate; + + @Column(name = "estimated_tat") + private String estimated_TAT; + + @Column(name = "modified_date") + private String modifiedDate; + + @Column(name = "modified_epoch_date") + private String modifiedEpochDate; + + @Column(name = "ref_id") + private String refId; + + @Column(name = "status") + private String status; + + @Column(name = "bank_txn_id") + private String bank_txnId; + + @Column(name = "user_id") + private String userId; + + @Column(name = "category") + private String category; + + @Column(name = "biller_name") + private String billerName; + + @Column(name = "txn_amount") + private String txnAmount; + + @Column(name = "total_txn_amount") + private String totalTxnAmount; + + @Column(name = "complaint_status") + private String complaintStatus; + + @Column(name = "super_level_esc") + private String superLevelEsc; + + @Column(name = "open_complaint") + private String openComplaint; + + @Column(name = "reopen_complaint") + private String reopenComplaint; + + @Column(name = "remarks") + private String remarks; + + @Column(name = "agent_id") + private String agentId; + } + diff --git a/src/main/java/com/billpaymentservice/bbps/entites/TxnStatus.java b/src/main/java/com/billpaymentservice/bbps/entites/TxnStatus.java new file mode 100644 index 0000000..f085fe1 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/TxnStatus.java @@ -0,0 +1,5 @@ +package com.billpaymentservice.bbps.entites; + +public class TxnStatus { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/ComplainDetailRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/ComplainDetailRepository.java new file mode 100644 index 0000000..6d2a28c --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/ComplainDetailRepository.java @@ -0,0 +1,11 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.billpaymentservice.bbps.entites.ComplaintStatusDetails; + +@Repository +public interface ComplainDetailRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java index 46da593..0526743 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java @@ -5,6 +5,7 @@ import com.billpaymentservice.bbps.dto.request.AllMasterOptionsRequest; import com.billpaymentservice.bbps.dto.request.CloseComplaintRequest; import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; import com.billpaymentservice.bbps.dto.request.ReOpenComplain; +import com.billpaymentservice.bbps.dto.request.TxnStatusRequest; import com.billpaymentservice.bbps.dto.request.ViewComplainByIdRequest; import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; @@ -18,10 +19,12 @@ public interface ComplainService { ResponseModel closeComplaint(CloseComplaintRequest request); - public ResponseModel addComplain(ComplaintRequestDTO complainRequestDTO); + ResponseModel addComplain(ComplaintRequestDTO complainRequestDTO); ResponseModel viewComplaintById(ViewComplainByIdRequest request); ResponseModel getAllActiveStatuses(AllMasterOptionsRequest request); + ResponseModel checkTxnStatus(TxnStatusRequest request); + } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index e399b8c..5a25314 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -141,7 +141,7 @@ public class AgentServiceImpl implements AgentService { billFetchByBillIdRequest.setReqId(requestId); LOGGER.info("Waiting for 2 seconds before fetching bill by ID..."); try { - Thread.sleep(1000); + Thread.sleep(5000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); LOGGER.warn("Thread interrupted during delay: {}", e.getMessage()); @@ -162,7 +162,7 @@ public class AgentServiceImpl implements AgentService { String txnId = helper.generateTxnId(15); String reqId = billFetchByBillIdRequest.getReqId(); String billId = billFetchByBillIdRequest.getBillId(); - String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; + String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + billFetchByBillIdRequest.getBillId(); helper.validateMerchant(billFetchByBillIdRequest.getMid()); diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java index cfc71de..7470e9e 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java @@ -20,9 +20,13 @@ import com.billpaymentservice.bbps.dto.request.CloseComplaintRequest; import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; import com.billpaymentservice.bbps.dto.request.ReOpenComplain; +import com.billpaymentservice.bbps.dto.request.TxnStatusRequest; import com.billpaymentservice.bbps.dto.request.ViewComplainByIdRequest; import com.billpaymentservice.bbps.dto.response.ComplaintHistoryStatusResponse; import com.billpaymentservice.bbps.dto.response.ComplaintResponse; + +import com.billpaymentservice.bbps.dto.response.ComplaintStatusResponse; +import com.billpaymentservice.bbps.dto.response.TxnStatusResponse; import com.billpaymentservice.bbps.dto.response.ViewComplainByIdResponse; import com.billpaymentservice.bbps.entites.BharatConnectMaster; import com.billpaymentservice.bbps.entites.ComplaintDetails; @@ -512,10 +516,14 @@ public class ComplainServiceImpl implements ComplainService { LOGGER.info("Current Complaint ReOpen Status: {}", status); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + // String saveComplaintHistory = // mapperHelper.saveComplaintHistory(responseWrapper, reqId, txnId); // LOGGER.info("Complaint ReOpen data saved successfully for Count History: {}", // saveComplaintHistory); + String saveComplaint = mapperHelper.saveComplainStatusDetail(responseWrapper, reqId, txnId); + // LOGGER.info("Complaint ReOpen data saved successfully for Count History: {}", + // saveComplaintHistory); return new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); @@ -568,6 +576,74 @@ public class ComplainServiceImpl implements ComplainService { LOGGER.error("Error while fetching master options", e); return new ResponseModel("Something went wrong", "failed", 500, null, 0); } + + } + + public ResponseModel checkTxnStatus(TxnStatusRequest request) { + LOGGER.info("Fetching TxnStatusRequest by Id={} and ReqId ={}", request.getId(), request.getReqId()); + String apiName = "CheckTxnStatus"; + String txnId = helper.generateTxnId(15); + String reqId = request.getReqId(); + String ID = request.getId(); + String fullUrl = agentDtaUrl + BBPSConstant.CHECK_TRANSACTION_URL + request.getId(); + + helper.validateMerchant(request.getMid()); + + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + HttpHeaders headers = new HttpHeaders(); + headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); + headers.set("agentId", headersData.getAgentId()); + headers.set("tenantId", headersData.getTenantId()); + headers.setContentType(MediaType.APPLICATION_JSON); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + String requestJson = helper.convertObjectToJson(request); + + InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", + requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", ID); + LOGGER.debug("Outbound log created successfully for Complaint : {}", fullUrl); + + try { + LOGGER.info("Calling external API: {}", fullUrl); + Map responseMap = httpService.getRequest(fullUrl, headers); + String responseData = responseMap.get("data"); + LOGGER.info("checkTxnStatus: {}", responseData); + + helper.updateOutboundLogResponse(outboundLog, responseData); + + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + LOGGER.warn("Invalid response structure for txnId: {}", txnId); + throw new CustomException(String.valueOf(dataMap.get("message")), String.valueOf(dataMap.get("status")), + Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), String.valueOf("")); + } + + TxnStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TxnStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + LOGGER.info("Current Complaint ReOpen Status: {}", status); + + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + // String saveComplaint = mapperHelper.saveComplainStatusDetail(responseWrapper, + // reqId, txnId); + // LOGGER.info("Complaint ReOpen data saved successfully for Count History: {}", + // saveComplaintHistory); + + return new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing Complaint Id JSON: {}", e.getMessage(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); + } + } } diff --git a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java index d62e752..fcf12d4 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java @@ -8,6 +8,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.modelmapper.ModelMapper; +import org.modelmapper.convention.MatchingStrategies; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -24,6 +26,7 @@ import com.billpaymentservice.bbps.dto.response.AmountOptionsResponse; import com.billpaymentservice.bbps.dto.response.ComplaintHistoryStatusResponse; import com.billpaymentservice.bbps.dto.response.ComplaintStatusResponse; import com.billpaymentservice.bbps.dto.response.PlanResponse; +import com.billpaymentservice.bbps.dto.response.ViewComplainByIdResponse; import com.billpaymentservice.bbps.entites.AdditionalInfoPlans; import com.billpaymentservice.bbps.entites.AmountOptionByBillerId; import com.billpaymentservice.bbps.entites.AmountOptionDetails; @@ -31,7 +34,9 @@ import com.billpaymentservice.bbps.entites.BillerCategoryIcon; import com.billpaymentservice.bbps.entites.BillerCategoryWise; import com.billpaymentservice.bbps.entites.CategoryResponseList; import com.billpaymentservice.bbps.entites.ComplainStatus; +import com.billpaymentservice.bbps.entites.ComplaintDetails; import com.billpaymentservice.bbps.entites.ComplaintHistory; +import com.billpaymentservice.bbps.entites.ComplaintStatusDetails; import com.billpaymentservice.bbps.entites.CustomerParamGroupById; import com.billpaymentservice.bbps.entites.GroupParam; import com.billpaymentservice.bbps.entites.Plan; @@ -49,6 +54,9 @@ import com.billpaymentservice.bbps.repository.FetchBillValidateRepository; import com.billpaymentservice.bbps.repository.PlanResponseRepository; import com.billpaymentservice.bbps.repository.ReOpenComplaintRepository; +import com.billpaymentservice.bbps.repository.ComplainDetailRepository; +import com.billpaymentservice.bbps.serviceImpl.AgentServiceImpl; + @Component public class BillerMapperHelper { @@ -63,6 +71,8 @@ public class BillerMapperHelper { private final ComplaintStatusRepository complaintStatusRepository; private final ReOpenComplaintRepository reOpenComplaintRepository; private final ComplaintHistoryRepository complaintHistoryRepository; + + private final ComplainDetailRepository complainDetailRepository; public BillerMapperHelper(BillerCategoryWiseRepository billerRepo, CustomerParamGroupByBillerIdRepository customerParamGroupByBillerIdRepo, @@ -71,7 +81,8 @@ public class BillerMapperHelper { CategoryResponseListRepository categoryResponseListRepository, FetchBillValidateRepository fetchBillValidateRepository, ComplaintStatusRepository complaintStatusRepository, ReOpenComplaintRepository reOpenComplaintRepository, - ComplaintHistoryRepository complaintHistoryRepository) { + ComplaintHistoryRepository complaintHistoryRepository, + ComplainDetailRepository complainDetailRepository) { this.billerRepo = billerRepo; this.customerParamGroupByBillerIdRepo = customerParamGroupByBillerIdRepo; this.amountOptionByBillerIdRepository = amountOptionByBillerIdRepository; @@ -81,6 +92,7 @@ public class BillerMapperHelper { this.complaintStatusRepository = complaintStatusRepository; this.reOpenComplaintRepository = reOpenComplaintRepository; this.complaintHistoryRepository = complaintHistoryRepository; + this.complainDetailRepository = complainDetailRepository; } /** @@ -619,4 +631,31 @@ public class BillerMapperHelper { } + public String saveComplainStatusDetail(ViewComplainByIdResponse responseWrapper, String reqId, String txnId) { + + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + + // Map list → ComplaintStatusDetails list + List entityList = responseWrapper.getComplaintsList() + .stream() + .map(c -> mapper.map(c, ComplaintStatusDetails.class)) + .collect(Collectors.toList()); + + // Set extra fields + for (ComplaintStatusDetails entity : entityList) { + entity.setReqId(reqId); + entity.setTxnId(txnId); + } + + // Save to repository + complainDetailRepository.saveAll(entityList); + + return "SUCCESS"; + } + + + + + } diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index 624b31c..e9b9291 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -247,48 +247,6 @@ public class Helper { public void saveOrUpdateBillerData(BillDataResponse responseWrapper, BillFetchByBillIdRequest billFetchByBillIdRequest) { -// ------------------------------------------------------------ -// 🔥 1. STATIC ADDITIONAL INFO LIST (overwrite before mapping) -// ------------------------------------------------------------ -List staticAdditional = new ArrayList<>(); - -staticAdditional.add(new AdditionalInfoBillDTO("123", "Student Name", "AGAMJOT TEST ")); -staticAdditional.add(new AdditionalInfoBillDTO("333", "Father Name", "VIRENDER SINGH")); -staticAdditional.add(new AdditionalInfoBillDTO("908", "Class", "STD I")); -staticAdditional.add(new AdditionalInfoBillDTO("097", "Section", "A")); -staticAdditional.add(new AdditionalInfoBillDTO("321", "TUITION FEE", "8670")); -staticAdditional.add(new AdditionalInfoBillDTO("121", "E-CARE FEE", "900")); -staticAdditional.add(new AdditionalInfoBillDTO("111", "COMPUTER FEE", "1350")); -staticAdditional.add(new AdditionalInfoBillDTO("121", "EXAM FEE", "500")); - -// Static set (overwrite) -responseWrapper.setAdditionalInfo(staticAdditional); - - - -// ------------------------------------------------------------ -// 🔥 2. STATIC CUSTOMER PARAMS LIST (overwrite before mapping) -// ------------------------------------------------------------ -List staticCustomerParams = new ArrayList<>(); - -staticCustomerParams.add(new CustomerParamDAO( -"Admission No/Application No/GR No", "LF3130", "test" -)); - -staticCustomerParams.add(new CustomerParamDAO( -"Date Of Birth (DD-MM-YYYY)", "10/08/2000", "test" -)); - -staticCustomerParams.add(new CustomerParamDAO( -"Mobile No", "9241842248", "test" -)); - -// Static set (overwrite) -responseWrapper.setCustomerParams(staticCustomerParams); - -// ------------------------------------------------------------ -// 🔥 REST OF YOUR ORIGINAL LOGIC — NO CHANGE -// ------------------------------------------------------------ BillMaster billMaster = new BillMaster(); diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 17c421e..b9b1818 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -20,9 +20,9 @@ swagger.server.description=Local Development Server # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -spring.datasource.password=UAT@DB_2025 +#spring.datasource.password=UAT@DB_2025 -#spring.datasource.password=himanshu@123 +spring.datasource.password=himanshu@123 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d9592e5..c652768 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -22,9 +22,9 @@ spring.profiles.active=local # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -spring.datasource.password=UAT@DB_2025 +#spring.datasource.password=UAT@DB_2025 -#spring.datasource.password=himanshu@123 +spring.datasource.password=himanshu@123 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource