From 1102a58aee6f21073d64ea243ba88ab2233798db Mon Sep 17 00:00:00 2001 From: Mohd-Arham Date: Wed, 12 Nov 2025 10:34:06 +0530 Subject: [PATCH 1/2] 12-11-25 --- .../bbps/controller/ComplainController.java | 47 ++++ .../bbps/dto/ComplainDetailsDto.java | 36 +++ .../dto/request/ComplainStatusRequest.java | 15 ++ .../bbps/dto/request/ReOpenComplain.java | 14 ++ .../dto/response/ComplaintStatusResponse.java | 16 ++ .../bbps/entites/AdditionalInfoPlans.java | 8 +- .../bbps/entites/ComplainStatus.java | 103 ++++++++ .../billpaymentservice/bbps/entites/Plan.java | 10 +- .../bbps/entites/PlanResponses.java | 4 +- .../bbps/entites/PlanTag.java | 40 ++- .../bbps/entites/ReOpenComplain.java | 103 ++++++++ .../repository/ComplaintStatusRepository.java | 11 + .../repository/ReOpenComplaintRepository.java | 11 + .../bbps/service/ComplainService.java | 13 + .../bbps/serviceImpl/ComplainServiceImpl.java | 186 ++++++++++++++ .../bbps/serviceImpl/HttpService.java | 6 +- .../serviceImpl/MasterDataServiceImpl.java | 4 +- .../bbps/util/BBPSConstant.java | 4 +- .../bbps/util/BillerMapperHelper.java | 227 ++++++++++++++---- .../resources/application-local.properties | 2 +- src/main/resources/application.properties | 2 +- 21 files changed, 777 insertions(+), 85 deletions(-) create mode 100644 src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/ComplainDetailsDto.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/request/ReOpenComplain.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintStatusResponse.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/ComplaintStatusRepository.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/ReOpenComplaintRepository.java create mode 100644 src/main/java/com/billpaymentservice/bbps/service/ComplainService.java create mode 100644 src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java diff --git a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java new file mode 100644 index 0000000..0cc1d07 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java @@ -0,0 +1,47 @@ +package com.billpaymentservice.bbps.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; +import com.billpaymentservice.bbps.dto.request.ReOpenComplain; +import com.billpaymentservice.bbps.service.ComplainService; + + +@RestController +@RequestMapping("/complaints") +@Validated +@CrossOrigin(origins = "*") +public class ComplainController { + + private static final Logger log = LoggerFactory.getLogger(ComplainController.class); + + private final ComplainService complainService; + + // ✅ Constructor name fixed and variable consistent + public ComplainController(ComplainService complainService) { + this.complainService = complainService; + } + + @PostMapping("/checkComplaintStatus") + public ResponseEntity getComplaintStatus(@RequestBody ComplainStatusRequest request) { + log.info("Received complaint status request for complaintId: {}", request.getComplaintId()); + ResponseModel response = complainService.getComplaintStatus(request); + return ResponseEntity.ok(response); + } + + @PostMapping("/reOpenComplaint") + public ResponseEntity reOpenComplaint(@RequestBody ReOpenComplain request) { + log.info("Received ReOpen Complaint request for complaintId: {}", request.getComplaintId()); + ResponseModel response = complainService.reOpenComplaint(request); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/ComplainDetailsDto.java b/src/main/java/com/billpaymentservice/bbps/dto/ComplainDetailsDto.java new file mode 100644 index 0000000..f9ff26f --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/ComplainDetailsDto.java @@ -0,0 +1,36 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class ComplainDetailsDto { + + private String complaintId; + private String complaintDescr; + private String complaintDispos; + private String complaintType; + private String txnId; + private String complaintStatus; + private String assignedTo; + private String complaintNpciId; + private String complaintRaisedFrom; + private String userId; + private String status; + private String refId; + private String estimated_TAT; + private String creationDate; + private String modifiedDate; + private String billerName; + private String txnAmount; + private String superLevelEsc; + private String openComplaint; + private String reopenComplaint; + private String remarks; + private String agentId; + private String category; + private long createdEpochDate; + private long modifiedEpochDate; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java new file mode 100644 index 0000000..0811191 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java @@ -0,0 +1,15 @@ +package com.billpaymentservice.bbps.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class ComplainStatusRequest extends BaseClass { + + private String complaintId; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/ReOpenComplain.java b/src/main/java/com/billpaymentservice/bbps/dto/request/ReOpenComplain.java new file mode 100644 index 0000000..a07782c --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/ReOpenComplain.java @@ -0,0 +1,14 @@ +package com.billpaymentservice.bbps.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ReOpenComplain extends BaseClass { + + private String complaintDescr; + + private String complaintId; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintStatusResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintStatusResponse.java new file mode 100644 index 0000000..62f5cef --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintStatusResponse.java @@ -0,0 +1,16 @@ +package com.billpaymentservice.bbps.dto.response; + +import com.billpaymentservice.bbps.dto.ComplainDetailsDto; +import com.billpaymentservice.bbps.dto.GeneralResp; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ComplaintStatusResponse { + + private ComplainDetailsDto complaints; + private GeneralResp generalResp; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoPlans.java b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoPlans.java index 0bce4a9..0c9ba35 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoPlans.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoPlans.java @@ -16,18 +16,18 @@ import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "additional_info") +@Table(name = "plan_additional_info") @Getter @Setter public class AdditionalInfoPlans { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "plan_ddditional_info_id") - private Long planAdditionalInfoId; + private String planAdditionalInfoId; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "additionalInfo") private List tags; } diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java b/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java new file mode 100644 index 0000000..5a5c865 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java @@ -0,0 +1,103 @@ +package com.billpaymentservice.bbps.entites; + +import com.billpaymentservice.bbps.audit.Auditable; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "complaint_status") +@Getter +@Setter +public class ComplainStatus extends Auditable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "complaint_id") + private String complaintId; + + @Column(name = "complaint_descr") + private String complaintDescr; + + @Column(name = "complaint_dispos") + private String complaintDispos; + + @Column(name = "complaint_type") + private String complaintType; + + @Column(name = "txn_id") + private String txnId; + + @Column(name = "complaint_status") + private String complaintStatus; + + @Column(name = "assigned_to") + private String assignedTo; + + @Column(name = "complaint_npci_id") + private String complaintNpciId; + + @Column(name = "complaint_raised_from") + private String complaintRaisedFrom; + + @Column(name = "user_id") + private String userId; + + @Column(name = "status") + private String status; + + @Column(name = "ref_id") + private String refId; + + @Column(name = "estimated_tat") + private String estimatedTAT; + + @Column(name = "creation_date") + private String creationDate; + + @Column(name = "modified_date") + private String modifiedDate; + + @Column(name = "biller_name") + private String billerName; + + @Column(name = "txn_amount") + private String txnAmount; + + @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; + + @Column(name = "category") + private String category; + + @Column(name = "created_epoch_date") + private long createdEpochDate; + + @Column(name = "modified_epoch_date") + private long modifiedEpochDate; + + @Column(name = "req_id") + private String reqId; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/Plan.java b/src/main/java/com/billpaymentservice/bbps/entites/Plan.java index fa0166d..1a0e002 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/Plan.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/Plan.java @@ -30,7 +30,7 @@ public class Plan { @Column(name = "plan_id") private String planId; - @Column(name = "description") + @Column(name = "description", columnDefinition = "TEXT") private String description; @Column(name = "biller_id") @@ -51,15 +51,15 @@ public class Plan { @Column(name = "status") private String status; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "plan") - private List categorySubTypes; // List of categorySubTypes - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "plans_list_id") private PlansList plansList; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "plan") + private List categorySubTypes; // List of categorySubTypes + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) - @JoinColumn(name = "additional_info_id") + @JoinColumn(name = "additional_info_id", referencedColumnName = "id") private AdditionalInfoPlans additionalInfo; } diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PlanResponses.java b/src/main/java/com/billpaymentservice/bbps/entites/PlanResponses.java index dcae113..8fd0500 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PlanResponses.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PlanResponses.java @@ -10,7 +10,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; @@ -25,7 +25,7 @@ public class PlanResponses extends Auditable { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "plans_list_id") private PlansList plansList; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PlanTag.java b/src/main/java/com/billpaymentservice/bbps/entites/PlanTag.java index 47b9504..8f6d2c9 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PlanTag.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PlanTag.java @@ -1,16 +1,6 @@ package com.billpaymentservice.bbps.entites; -import java.util.UUID; - -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.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -20,18 +10,24 @@ import lombok.Setter; @Setter public class PlanTag { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private UUID tagId; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; - @Column(name="name") - private String name; - - @Column(name="value") - private String value; + // UUID is stored as text — perfect, no length limit + @Column(name = "tag_uuid", columnDefinition = "TEXT") + private String tagId; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "plan_id") - private Plan plan; + // Use TEXT because tag names like “Additional Benefits” may exceed 255 chars in future + @Column(name = "name", columnDefinition = "TEXT") + private String name; + // Use TEXT for large values like “Premium Customer Support and 14 OTT Apps” + @Column(name = "value", columnDefinition = "TEXT") + private String value; + + // Foreign key to additional_info table + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "additional_info_id", referencedColumnName = "id") + private AdditionalInfoPlans additionalInfo; } diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java b/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java new file mode 100644 index 0000000..5a176ad --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java @@ -0,0 +1,103 @@ +package com.billpaymentservice.bbps.entites; + +import com.billpaymentservice.bbps.audit.Auditable; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "reopen_complaint") +@Getter +@Setter +public class ReOpenComplain extends Auditable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "complaint_id") + private String complaintId; + + @Column(name = "complaint_descr") + private String complaintDescr; + + @Column(name = "complaint_dispos") + private String complaintDispos; + + @Column(name = "complaint_type") + private String complaintType; + + @Column(name = "txn_id") + private String txnId; + + @Column(name = "complaint_status") + private String complaintStatus; + + @Column(name = "assigned_to") + private String assignedTo; + + @Column(name = "complaint_npci_id") + private String complaintNpciId; + + @Column(name = "complaint_raised_from") + private String complaintRaisedFrom; + + @Column(name = "user_id") + private String userId; + + @Column(name = "status") + private String status; + + @Column(name = "ref_id") + private String refId; + + @Column(name = "estimated_tat") + private String estimatedTAT; + + @Column(name = "creation_date") + private String creationDate; + + @Column(name = "modified_date") + private String modifiedDate; + + @Column(name = "biller_name") + private String billerName; + + @Column(name = "txn_amount") + private String txnAmount; + + @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; + + @Column(name = "category") + private String category; + + @Column(name = "created_epoch_date") + private long createdEpochDate; + + @Column(name = "modified_epoch_date") + private long modifiedEpochDate; + + @Column(name = "req_id") + private String reqId; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/ComplaintStatusRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/ComplaintStatusRepository.java new file mode 100644 index 0000000..283f2fb --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/ComplaintStatusRepository.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.ComplainStatus; + +@Repository +public interface ComplaintStatusRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/ReOpenComplaintRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/ReOpenComplaintRepository.java new file mode 100644 index 0000000..7e0ffb2 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/ReOpenComplaintRepository.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.ReOpenComplain; + +@Repository +public interface ReOpenComplaintRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java new file mode 100644 index 0000000..dfd6bd5 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java @@ -0,0 +1,13 @@ +package com.billpaymentservice.bbps.service; + +import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; +import com.billpaymentservice.bbps.dto.request.ReOpenComplain; + +public interface ComplainService { + + ResponseModel getComplaintStatus(ComplainStatusRequest request); + + ResponseModel reOpenComplaint(ReOpenComplain request); + +} diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java new file mode 100644 index 0000000..37f75db --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java @@ -0,0 +1,186 @@ +package com.billpaymentservice.bbps.serviceImpl; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; + +import com.billpaymentservice.bbps.dto.GeneralResp; +import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; +import com.billpaymentservice.bbps.dto.request.ReOpenComplain; +import com.billpaymentservice.bbps.dto.response.ComplaintStatusResponse; +import com.billpaymentservice.bbps.entites.BharatConnectMaster; +import com.billpaymentservice.bbps.entites.InboundTraceLog; +import com.billpaymentservice.bbps.entites.OutboundTraceLog; +import com.billpaymentservice.bbps.exception.CustomException; +import com.billpaymentservice.bbps.repository.BharatConnectMasterRepository; +import com.billpaymentservice.bbps.service.ComplainService; +import com.billpaymentservice.bbps.util.BBPSConstant; +import com.billpaymentservice.bbps.util.BillerMapperHelper; +import com.billpaymentservice.bbps.util.Helper; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Service +public class ComplainServiceImpl implements ComplainService { + + @Value("${agent.data.url}") + private String agentDtaUrl; + + private final RestClient restClient; + private final HttpService httpService; + private final Helper helper; + private final BharatConnectMasterRepository beneficiaryDetailsRepository; + private final BillerMapperHelper mapperHelper; + private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); + + public ComplainServiceImpl(RestClient restClient, HttpService httpService, Helper helper, + BharatConnectMasterRepository beneficiaryDetailsRepository, BillerMapperHelper mapperHelper) { + this.restClient = restClient; + this.httpService = httpService; + this.helper = helper; + this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; + this.mapperHelper = mapperHelper; + } + + @Override + public ResponseModel getComplaintStatus(ComplainStatusRequest request) { + LOGGER.info("Fetching Compalint Status by Complaint Id={}", request.getComplaintId(), request.getReqId()); + String apiName = "Complaint Status"; + String txnId = helper.generateTxnId(15); + String reqId = request.getReqId(); + String complaintId = request.getComplaintId(); + String fullUrl = agentDtaUrl + BBPSConstant.COMPALINT_STATUS; + + 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(), "POST", + requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "POST", complaintId); + LOGGER.debug("Outbound log created successfully for Complaint : {}", fullUrl); + + try { + LOGGER.info("Calling external API: {}", fullUrl); + Map responseMap = httpService.postRequest(fullUrl, requestJson, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Complaint FetchById Response: {}", responseData); + + helper.updateOutboundLogResponse(outboundLog, responseData); + + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + + if (!dataMap.containsKey("genericResponse")) { + 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(dataMap.get("remarks"))); + } + + ComplaintStatusResponse responseWrapper = objectMapper.convertValue(dataMap, ComplaintStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + LOGGER.info("Current Complaint Status: {}", status); + + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + mapperHelper.saveComplaintStatus(responseWrapper, reqId); + LOGGER.info("Complaint data saved successfully for billId: {}", complaintId); + + 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"); + } + } + + @Override + public ResponseModel reOpenComplaint(ReOpenComplain request) { + LOGGER.info("Fetching ReOpen Complaint by Complaint Id={}", request.getComplaintId(), request.getReqId()); + String apiName = "Complaint Status"; + String txnId = helper.generateTxnId(15); + String reqId = request.getReqId(); + String complaintId = request.getComplaintId(); + String fullUrl = agentDtaUrl + BBPSConstant.REOPEN_COMPALINT; + + 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(), "POST", + requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "POST", complaintId); + LOGGER.debug("Outbound log created successfully for Complaint : {}", fullUrl); + + try { + LOGGER.info("Calling external API: {}", fullUrl); + Map responseMap = httpService.postRequest(fullUrl, requestJson, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Complaint ReOpen FetchById Response: {}", responseData); + + helper.updateOutboundLogResponse(outboundLog, responseData); + + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + + if (!dataMap.containsKey("genericResponse")) { + 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(dataMap.get("remarks"))); + } + + ComplaintStatusResponse responseWrapper = objectMapper.convertValue(dataMap, ComplaintStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + LOGGER.info("Current Complaint ReOpen Status: {}", status); + + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + mapperHelper.saveReOpenComplaint(responseWrapper, reqId); + LOGGER.info("Complaint ReOpen data saved successfully for billId: {}", complaintId); + + 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/serviceImpl/HttpService.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java index 8193af8..042221b 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java @@ -114,8 +114,8 @@ public class HttpService { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - log.info("🌐 Sending GET request to: {}", url); - log.info("📦 Headers: {}", headers); +// log.info("🌐 Sending GET request to: {}", url); +// log.info("📦 Headers: {}", headers); ResponseEntity restResponse = restClient.get() .uri(url) @@ -127,7 +127,7 @@ public class HttpService { response.put("respCode", String.valueOf(restResponse.getStatusCode().value())); response.put("data", restResponse.getBody()); - log.info("✅ GET Response: {}", restResponse.getBody()); + // log.info("✅ GET Response: {}", restResponse.getBody()); } catch (HttpClientErrorException | HttpServerErrorException httpException) { log.error("❌ HTTP Error: {}", httpException.getMessage(), httpException); diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index d71b5f7..c00a6d5 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -123,7 +123,7 @@ public class MasterDataServiceImpl implements MasterDataService { Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); - LOGGER.info("Response Data: {}", responseData); + //LOGGER.info("Response Data: {}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { @@ -292,7 +292,7 @@ public class MasterDataServiceImpl implements MasterDataService { Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); - LOGGER.info("Response Data: {}", responseData); + //LOGGER.info("Response Data: {}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); diff --git a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java index 5e7945f..fbce0c4 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java @@ -42,7 +42,9 @@ public class BBPSConstant { public static final String PAYMENT_URL = "/agent/bills/payment"; public static final String CHECK_TRANSACTION_URL = "/transactions/payment/byTxnId?txnId="; public static final String DISPOSTION_URL = "/disposition"; - + public static final String COMPALINT_STATUS = "/couapp/complaints/status"; + public static final String REOPEN_COMPALINT = "/couapp/complaints/reopen"; + public static final String PLANS_URL = "/plans"; } diff --git a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java index b7043db..b2a3916 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java @@ -6,32 +6,41 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; -import org.modelmapper.ModelMapper; import org.springframework.stereotype.Component; import com.billpaymentservice.bbps.dto.AmountOptionDTO; import com.billpaymentservice.bbps.dto.BillerIconDTO; +import com.billpaymentservice.bbps.dto.ComplainDetailsDto; import com.billpaymentservice.bbps.dto.CustomerParamGroupsDTO; import com.billpaymentservice.bbps.dto.GroupDTO; import com.billpaymentservice.bbps.dto.MasterCategoryBillerResponse; +import com.billpaymentservice.bbps.dto.PlanDTO; +import com.billpaymentservice.bbps.dto.PlanTag; import com.billpaymentservice.bbps.dto.response.AmountOptionsResponse; -import com.billpaymentservice.bbps.dto.response.FetchBillValidateResponse; +import com.billpaymentservice.bbps.dto.response.ComplaintStatusResponse; import com.billpaymentservice.bbps.dto.response.PlanResponse; +import com.billpaymentservice.bbps.entites.AdditionalInfoPlans; import com.billpaymentservice.bbps.entites.AmountOptionByBillerId; import com.billpaymentservice.bbps.entites.AmountOptionDetails; 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.CustomerParamGroupById; -import com.billpaymentservice.bbps.entites.FetchBillValidate; import com.billpaymentservice.bbps.entites.GroupParam; +import com.billpaymentservice.bbps.entites.Plan; +import com.billpaymentservice.bbps.entites.PlanCategorySubType; import com.billpaymentservice.bbps.entites.PlanResponses; +import com.billpaymentservice.bbps.entites.PlansList; +import com.billpaymentservice.bbps.entites.ReOpenComplain; import com.billpaymentservice.bbps.repository.AmountOptionByBillerIdRepository; import com.billpaymentservice.bbps.repository.BillerCategoryWiseRepository; import com.billpaymentservice.bbps.repository.CategoryResponseListRepository; +import com.billpaymentservice.bbps.repository.ComplaintStatusRepository; import com.billpaymentservice.bbps.repository.CustomerParamGroupByBillerIdRepository; import com.billpaymentservice.bbps.repository.FetchBillValidateRepository; import com.billpaymentservice.bbps.repository.PlanResponseRepository; +import com.billpaymentservice.bbps.repository.ReOpenComplaintRepository; @Component public class BillerMapperHelper { @@ -42,19 +51,24 @@ public class BillerMapperHelper { private final PlanResponseRepository planResponseRepository; private final CategoryResponseListRepository categoryResponseListRepository; private final FetchBillValidateRepository fetchBillValidateRepository; + private final ComplaintStatusRepository complaintStatusRepository; + private final ReOpenComplaintRepository reOpenComplaintRepository; public BillerMapperHelper(BillerCategoryWiseRepository billerRepo, CustomerParamGroupByBillerIdRepository customerParamGroupByBillerIdRepo, AmountOptionByBillerIdRepository amountOptionByBillerIdRepository, PlanResponseRepository planResponseRepository, CategoryResponseListRepository categoryResponseListRepository, - FetchBillValidateRepository fetchBillValidateRepository) { + FetchBillValidateRepository fetchBillValidateRepository, + ComplaintStatusRepository complaintStatusRepository, ReOpenComplaintRepository reOpenComplaintRepository) { this.billerRepo = billerRepo; this.customerParamGroupByBillerIdRepo = customerParamGroupByBillerIdRepo; this.amountOptionByBillerIdRepository = amountOptionByBillerIdRepository; this.planResponseRepository = planResponseRepository; this.categoryResponseListRepository = categoryResponseListRepository; this.fetchBillValidateRepository = fetchBillValidateRepository; + this.complaintStatusRepository = complaintStatusRepository; + this.reOpenComplaintRepository = reOpenComplaintRepository; } /** @@ -273,22 +287,73 @@ public class BillerMapperHelper { })).collect(Collectors.toList()); // Collect them into a list and return } - public PlanResponses savePlanResponse(PlanResponse planResponseDTO, String requestId, String txnId) { + public PlanResponses savePlanResponse(PlanResponse planResponse, String reqId, String txnId) { + PlanResponses response = new PlanResponses(); + response.setRequestId(reqId); + response.setPageNo(planResponse.getPageNo()); + response.setPageSize(planResponse.getPageSize()); + response.setTotalElements(planResponse.getTotalElements()); + response.setTotalPages(planResponse.getTotalPages()); + response.setTxnId(txnId); + response.setCreateDateTime(new Date()); - // If the list is null or empty, return an empty list of entities - if (planResponseDTO == null) { - return new PlanResponses(); // Return an empty list of AmountOptionDetails - } + PlansList plansList = new PlansList(); + List planEntities = new ArrayList<>(); - // Convert DTO to Entity using ModelMapper - ModelMapper modelMapper = new ModelMapper(); - PlanResponses planResponseEntity = modelMapper.map(planResponseDTO, PlanResponses.class); - // Save the entity to the database - // Set the requestId and txnId in the entity - planResponseEntity.setRequestId(requestId); - planResponseEntity.setTxnId(txnId); - planResponseEntity.setCreateDateTime(new Date()); - return planResponseRepository.save(planResponseEntity); + for (PlanDTO dto : planResponse.getPlansList().getPlans()) { + Plan plan = new Plan(); + plan.setPlanId(dto.getPlanId()); + plan.setDescription(dto.getDescription()); + plan.setBillerId(dto.getBillerId()); + plan.setCategoryType(dto.getCategoryType()); + plan.setAmountInRupees(dto.getAmountInRupees()); + plan.setEffctvFrom(dto.getEffctvFrom()); + plan.setEffctvTo(dto.getEffctvTo()); + plan.setStatus(dto.getStatus()); + plan.setPlansList(plansList); + + // categorySubType + List subs = new ArrayList<>(); + if (dto.getCategorySubType() != null) { + for (String s : dto.getCategorySubType()) { + PlanCategorySubType sub = new PlanCategorySubType(); + sub.setCategorySubType(s); + sub.setPlan(plan); + subs.add(sub); + } + } + plan.setCategorySubTypes(subs); + + // additionalInfo + tags + // ✅ additionalInfo + tags + if (dto.getAdditionalInfo() != null) { + AdditionalInfoPlans info = new AdditionalInfoPlans(); + info.setPlanAdditionalInfoId(dto.getAdditionalInfo().getPlanAdditionalInfoId().toString()); + + List tagEntities = new ArrayList<>(); + if (dto.getAdditionalInfo().getTags() != null && !dto.getAdditionalInfo().getTags().isEmpty()) { + for (com.billpaymentservice.bbps.dto.PlanTag tagDto : dto.getAdditionalInfo().getTags()) { + com.billpaymentservice.bbps.entites.PlanTag tagEntity = new com.billpaymentservice.bbps.entites.PlanTag(); + tagEntity.setTagId(tagDto.getTagId().toString()); + tagEntity.setName(tagDto.getName()); + tagEntity.setValue(tagDto.getValue()); + tagEntity.setAdditionalInfo(info); // ✅ maintain relationship + tagEntities.add(tagEntity); + } + } + + // ✅ Now set the entity list + info.setTags(tagEntities); + plan.setAdditionalInfo(info); + } + + planEntities.add(plan); + } + + plansList.setPlans(planEntities); + response.setPlansList(plansList); + + return planResponseRepository.save(response); } public String saveCategoryItems(List categoryRespList, String requestId, String txnId) { @@ -310,30 +375,104 @@ public class BillerMapperHelper { return savedCount + " items were successfully saved."; } - /* - * public FetchBillValidate - * saveFetchBillValidateResponse(FetchBillValidateResponse dto, String - * requestId, String txnId) { - * - * if (dto == null) { return new FetchBillValidate(); } - * - * // Convert DTO to Entity FetchBillValidate entity = new FetchBillValidate(); - * - * entity.setBillId(dto.getBillId()); entity.setRefId(dto.getRefId()); - * entity.setBillerId(dto.getBillerId()); entity.setStatus(dto.getStatus()); - * entity.setActionType(dto.getActionType()); entity.setUserId(dto.getUserId()); - * entity.setBillerResponse(dto.getBillerResponse()); - * entity.setAdditionalInfo(dto.getAdditionalInfo()); - * entity.setCustomerParams(dto.getCustomerParams()); - * entity.setPlanInfoDaos(dto.getPlanInfoDaos()); - * entity.setCreationDate(dto.getCreationDate()); - * entity.setModifiedDate(dto.getModifiedDate()); - * entity.setCreatedEpochDate(dto.getCreatedEpochDate()); - * entity.setModifiedEpochDate(dto.getModifiedEpochDate()); - * entity.setRequestId(requestId); entity.setTxnId(txnId); - * entity.setCreateDateTime(new Date()); - * - * // Save the entity in the database return - * fetchBillValidateRepository.save(entity); } - */ + public String saveComplaintStatus(ComplaintStatusResponse response, String reqId) { + + if (response == null || response.getComplaints() == null) { + throw new IllegalArgumentException("Invalid complaint response received!"); + } + + ComplainDetailsDto dto = response.getComplaints(); + + // ✅ Create and populate entity + ComplainStatus entity = new ComplainStatus(); + entity.setComplaintId(dto.getComplaintId()); + entity.setComplaintDescr(dto.getComplaintDescr()); + entity.setComplaintDispos(dto.getComplaintDispos()); + entity.setComplaintType(dto.getComplaintType()); + entity.setTxnId(dto.getTxnId()); + entity.setComplaintStatus(dto.getComplaintStatus()); + entity.setAssignedTo(dto.getAssignedTo()); + entity.setComplaintNpciId(dto.getComplaintNpciId()); + entity.setComplaintRaisedFrom(dto.getComplaintRaisedFrom()); + entity.setUserId(dto.getUserId()); + entity.setStatus(dto.getStatus()); + entity.setRefId(dto.getRefId()); + entity.setEstimatedTAT(dto.getEstimated_TAT()); // ✅ added missing field + entity.setCreationDate(dto.getCreationDate()); + entity.setModifiedDate(dto.getModifiedDate()); + entity.setBillerName(dto.getBillerName()); + entity.setTxnAmount(dto.getTxnAmount()); + entity.setSuperLevelEsc(dto.getSuperLevelEsc()); + entity.setOpenComplaint(dto.getOpenComplaint()); + entity.setReopenComplaint(dto.getReopenComplaint()); + entity.setRemarks(dto.getRemarks()); + entity.setAgentId(dto.getAgentId()); + entity.setCategory(dto.getCategory()); + entity.setCreatedEpochDate(dto.getCreatedEpochDate()); + entity.setModifiedEpochDate(dto.getModifiedEpochDate()); + entity.setRefId(reqId); + + try { + ComplainStatus savedEntity = complaintStatusRepository.save(entity); + if (savedEntity != null && savedEntity.getId() != null) { + return "Complaint saved successfully with ID: " + savedEntity.getId(); + } else { + return " Complaint not saved — unexpected error!"; + } + } catch (Exception e) { + e.printStackTrace(); + return " Error saving complaint: " + e.getMessage(); + } + } + + public String saveReOpenComplaint(ComplaintStatusResponse response, String reqId) { + + if (response == null || response.getComplaints() == null) { + throw new IllegalArgumentException("Invalid complaint response received!"); + } + + ComplainDetailsDto dto = response.getComplaints(); + + // ✅ Create and populate entity + ReOpenComplain entity = new ReOpenComplain(); + entity.setComplaintId(dto.getComplaintId()); + entity.setComplaintDescr(dto.getComplaintDescr()); + entity.setComplaintDispos(dto.getComplaintDispos()); + entity.setComplaintType(dto.getComplaintType()); + entity.setTxnId(dto.getTxnId()); + entity.setComplaintStatus(dto.getComplaintStatus()); + entity.setAssignedTo(dto.getAssignedTo()); + entity.setComplaintNpciId(dto.getComplaintNpciId()); + entity.setComplaintRaisedFrom(dto.getComplaintRaisedFrom()); + entity.setUserId(dto.getUserId()); + entity.setStatus(dto.getStatus()); + entity.setRefId(dto.getRefId()); + entity.setEstimatedTAT(dto.getEstimated_TAT()); // ✅ added missing field + entity.setCreationDate(dto.getCreationDate()); + entity.setModifiedDate(dto.getModifiedDate()); + entity.setBillerName(dto.getBillerName()); + entity.setTxnAmount(dto.getTxnAmount()); + entity.setSuperLevelEsc(dto.getSuperLevelEsc()); + entity.setOpenComplaint(dto.getOpenComplaint()); + entity.setReopenComplaint(dto.getReopenComplaint()); + entity.setRemarks(dto.getRemarks()); + entity.setAgentId(dto.getAgentId()); + entity.setCategory(dto.getCategory()); + entity.setCreatedEpochDate(dto.getCreatedEpochDate()); + entity.setModifiedEpochDate(dto.getModifiedEpochDate()); + entity.setRefId(reqId); + + try { + ReOpenComplain savedEntity = reOpenComplaintRepository.save(entity); + if (savedEntity != null && savedEntity.getId() != null) { + return "ReOpen Complaint saved successfully with ID: " + savedEntity.getId(); + } else { + return " ReOpen Complaint not saved — unexpected error!"; + } + } catch (Exception e) { + e.printStackTrace(); + return " Error saving complaint: " + e.getMessage(); + } + } + } diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 510f19a..17c421e 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -12,7 +12,7 @@ spring.jpa.properties.hibernate.default_schema=public #swagger.server.url=https://procurelinc.in/BBPS #swagger.server.description=Production Server -swagger.server.url=http://192.168.1.2:9090 +swagger.server.url=http://localhost:9090 swagger.server.description=Local Development Server diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index be00e5a..5538f4c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,7 +12,7 @@ spring.jpa.properties.hibernate.default_schema=public #swagger.server.url=https://procurelinc.in/BBPS #swagger.server.description=Production Server -swagger.server.url=http://192.168.1.24:9090 +swagger.server.url=http://localhost:9090 swagger.server.description=Local Development Server From 7e8a7fdd6beb4d5ff56a621a10ef121d5852e74f Mon Sep 17 00:00:00 2001 From: Mohd-Arham Date: Wed, 12 Nov 2025 17:03:07 +0530 Subject: [PATCH 2/2] 12-11-25 --- .../bbps/controller/ComplainController.java | 19 +- .../bbps/dto/CloseComplaintDTO.java | 36 ++++ .../bbps/dto/ComplaintHistoryDTO.java | 25 +++ .../dto/request/CloseComplaintRequest.java | 17 ++ .../dto/request/ComplainStatusRequest.java | 3 + .../CloseComplaintStatusResponse.java | 16 ++ .../ComplaintHistoryStatusResponse.java | 28 +++ .../bbps/entites/CloseComplaint.java | 107 +++++++++++ .../bbps/entites/ComplainStatus.java | 3 + .../bbps/entites/ComplaintHistory.java | 89 +++++++++ .../bbps/entites/ReOpenComplain.java | 3 + .../ComplaintHistoryRepository.java | 11 ++ .../bbps/service/ComplainService.java | 5 + .../bbps/serviceImpl/ComplainServiceImpl.java | 140 +++++++++++++- .../bbps/util/BBPSConstant.java | 2 + .../bbps/util/BillerMapperHelper.java | 181 ++++++++++++------ 16 files changed, 620 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/CloseComplaintDTO.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/ComplaintHistoryDTO.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/request/CloseComplaintRequest.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/response/CloseComplaintStatusResponse.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintHistoryStatusResponse.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/CloseComplaint.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/ComplaintHistory.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/ComplaintHistoryRepository.java diff --git a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java index 0cc1d07..aa1a11c 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java @@ -11,11 +11,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.billpaymentservice.bbps.dto.ResponseModel; +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.service.ComplainService; - @RestController @RequestMapping("/complaints") @Validated @@ -37,11 +37,26 @@ public class ComplainController { ResponseModel response = complainService.getComplaintStatus(request); return ResponseEntity.ok(response); } - + @PostMapping("/reOpenComplaint") public ResponseEntity reOpenComplaint(@RequestBody ReOpenComplain request) { log.info("Received ReOpen Complaint request for complaintId: {}", request.getComplaintId()); ResponseModel response = complainService.reOpenComplaint(request); return ResponseEntity.ok(response); } + + @PostMapping("/viewComplainsHistory") + public ResponseEntity viewComplaintHistory(@RequestBody ComplainStatusRequest request) { + log.info("Received complaint View Complaint History request for complaintId: {}", request.getComplaintId()); + ResponseModel response = complainService.viewComplaintHistory(request); + return ResponseEntity.ok(response); + } + + @PostMapping("/closeComplaint") + public ResponseEntity closeComplaint(@RequestBody CloseComplaintRequest request) { + log.info("Received complaint Close Complaint request for complaintId: {}", request.getComplaintId()); + ResponseModel response = complainService.closeComplaint(request); + return ResponseEntity.ok(response); + } + } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/CloseComplaintDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/CloseComplaintDTO.java new file mode 100644 index 0000000..b059f29 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/CloseComplaintDTO.java @@ -0,0 +1,36 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CloseComplaintDTO { + + private String complaintId; + private String complaintDescr; + private String complaintDispos; + private String complaintType; + private String txnId; + private String complaintStatus; + private String assignedTo; + private String complaintNpciId; + private String complaintRaisedFrom; + private String userId; + private String status; + private String refId; + private String estimatedTAT; + private String creationDate; // ISO 8601 format + private String modifiedDate; // ISO 8601 format + private String billerName; + private String txnAmount; + private String superLevelEsc; // True/False + private String openComplaint; // Y/N + private String reopenComplaint; // Y/N + private String remarks; + private String agentId; + private String category; + private Long createdEpochDate; // UNIX timestamp + private Long modifiedEpochDate; // UNIX timestamp + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/ComplaintHistoryDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/ComplaintHistoryDTO.java new file mode 100644 index 0000000..40fcdcd --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/ComplaintHistoryDTO.java @@ -0,0 +1,25 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ComplaintHistoryDTO { + + private String complaintHistoryId; + private String complaintId; + private String complaintDescr; + private String complaintDispos; + private String txnId; + private String assignedTo; + private String complaintNpciId; + private String complaintType; + private String complaintRaisedFrom; + private String userId; + private String status; + private String modifiedDate; // ISO 8601 Timestamp + private Long modifiedEpochDate; // UNIX Epoch + private String tenantId; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/CloseComplaintRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/CloseComplaintRequest.java new file mode 100644 index 0000000..175f563 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/CloseComplaintRequest.java @@ -0,0 +1,17 @@ +package com.billpaymentservice.bbps.dto.request; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class CloseComplaintRequest extends BaseClass { + + @NotBlank(message = "complaintDescr not be null") + private String complaintDescr; + + @NotBlank(message = "complaintId not be null") + private String complaintId; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java index 0811191..169a3a4 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java @@ -1,5 +1,7 @@ package com.billpaymentservice.bbps.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,5 +13,6 @@ import lombok.Setter; @NoArgsConstructor public class ComplainStatusRequest extends BaseClass { + @NotBlank(message = "Complaint Id cannot be null or blank") private String complaintId; } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/CloseComplaintStatusResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/CloseComplaintStatusResponse.java new file mode 100644 index 0000000..68c5ef3 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/CloseComplaintStatusResponse.java @@ -0,0 +1,16 @@ +package com.billpaymentservice.bbps.dto.response; + +import com.billpaymentservice.bbps.dto.GeneralResp; +import com.billpaymentservice.bbps.entites.CloseComplaint; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CloseComplaintStatusResponse { + + private CloseComplaint complaint; // main complaint details + private GeneralResp generalResp; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintHistoryStatusResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintHistoryStatusResponse.java new file mode 100644 index 0000000..aa4ec64 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintHistoryStatusResponse.java @@ -0,0 +1,28 @@ +package com.billpaymentservice.bbps.dto.response; + +import java.util.List; + +import com.billpaymentservice.bbps.dto.ComplaintHistoryDTO; +import com.billpaymentservice.bbps.dto.GeneralResp; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ComplaintHistoryStatusResponse { + + private List complaintsHistories; + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private GeneralResp generalResp; + private int pageNo; + private int pageSize; + private int totalPages; + private int totalElements; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CloseComplaint.java b/src/main/java/com/billpaymentservice/bbps/entites/CloseComplaint.java new file mode 100644 index 0000000..04a3487 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/CloseComplaint.java @@ -0,0 +1,107 @@ +package com.billpaymentservice.bbps.entites; + +import com.billpaymentservice.bbps.audit.Auditable; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "complaints") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CloseComplaint extends Auditable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "complaint_id") + private String complaintId; // UUID + + @Column(name = "complaint_descr") + private String complaintDescr; + + @Column(name = "complaint_dispos") + private String complaintDispos; + + @Column(name = "complaint_type") + private String complaintType; + + @Column(name = "txn_id") + private String txnId; + + @Column(name = "complaint_status") + private String complaintStatus; + + @Column(name = "assigned_to") + private String assignedTo; + + @Column(name = "complaint_npci_id") + private String complaintNpciId; + + @Column(name = "complaint_raised_from") + private String complaintRaisedFrom; + + @Column(name = "user_id") + private String userId; + + @Column(name = "status") + private String status; + + @Column(name = "ref_id") + private String refId; + + @Column(name = "estimated_tat") + private String estimatedTAT; + + @Column(name = "creation_date") + private String creationDate; // ISO 8601 format + + @Column(name = "modified_date") + private String modifiedDate; // ISO 8601 format + + @Column(name = "biller_name") + private String billerName; + + @Column(name = "txn_amount") + private String txnAmount; + + @Column(name = "super_level_esc") + private String superLevelEsc; // True/False + + @Column(name = "open_complaint") + private String openComplaint; // Y/N + + @Column(name = "reopen_complaint") + private String reopenComplaint; // Y/N + + @Column(name = "remarks", columnDefinition = "TEXT") + private String remarks; + + @Column(name = "agent_id") + private String agentId; + + @Column(name = "category") + private String category; + + @Column(name = "created_epoch_date") + private Long createdEpochDate; + + @Column(name = "modified_epoch_date") + private Long modifiedEpochDate; + + @Column(name = "req_id") + private String reqId; + + @Column(name = "system_txn_id") + private String systemTxnId; +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java b/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java index 5a5c865..3fe78e4 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java @@ -100,4 +100,7 @@ public class ComplainStatus extends Auditable { @Column(name = "req_id") private String reqId; + @Column(name = "system_txn_id") + private String systemTxnId; + } diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ComplaintHistory.java b/src/main/java/com/billpaymentservice/bbps/entites/ComplaintHistory.java new file mode 100644 index 0000000..e3df576 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ComplaintHistory.java @@ -0,0 +1,89 @@ +package com.billpaymentservice.bbps.entites; + +import com.billpaymentservice.bbps.audit.Auditable; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name = "complaints_history") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ComplaintHistory extends Auditable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "complaint_id") + private String complaintId; + + @Column(name = "complaint_descr") + private String complaintDescr; + + @Column(name = "complaint_dispos") + private String complaintDispos; + + @Column(name = "txn_id") + private String txnId; + + @Column(name = "complaint_history_id") + private String complaintHistoryId; + + @Column(name = "assigned_to") + private String assignedTo; + + @Column(name = "complaint_npci_id") + private String complaintNpciId; + + @Column(name = "complaint_raised_from") + private String complaintRaisedFrom; + + @Column(name = "user_id") + private String userId; + + @Column(name = "status") + private String status; + + @Column(name = "ref_id") + private String refId; + + @Column(name = "complaint_type") + private String complaintType; // internalComplaint or npciComplaint + + @Column(name = "modified_date") + private String modifiedDate; // ISO 8601 timestamp + + @Column(name = "modified_epoch_date") + private Long modifiedEpochDate; // UNIX epoch timestamp + + @Column(name = "page_no") + private int pageNo; + + @Column(name = "page_size") + private int pageSize; + + @Column(name = "total_pages") + private int totalPages; + + @Column(name = "total_elements") + private int totalElements; + + @Column(name = "system_txn_id") + private String systemTxnId; + + @Column(name = "req_id") + private String reqId; + + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java b/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java index 5a176ad..e2e92d1 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java @@ -100,4 +100,7 @@ public class ReOpenComplain extends Auditable { @Column(name = "req_id") private String reqId; + @Column(name = "system_txn_id") + private String systemTxnId; + } diff --git a/src/main/java/com/billpaymentservice/bbps/repository/ComplaintHistoryRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/ComplaintHistoryRepository.java new file mode 100644 index 0000000..8a3944e --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/ComplaintHistoryRepository.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.ComplaintHistory; + +@Repository +public interface ComplaintHistoryRepository 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 dfd6bd5..3ee66b9 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java @@ -1,6 +1,7 @@ package com.billpaymentservice.bbps.service; import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.CloseComplaintRequest; import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; import com.billpaymentservice.bbps.dto.request.ReOpenComplain; @@ -10,4 +11,8 @@ public interface ComplainService { ResponseModel reOpenComplaint(ReOpenComplain request); + ResponseModel viewComplaintHistory(ComplainStatusRequest request); + + ResponseModel closeComplaint(CloseComplaintRequest request); + } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java index 37f75db..dfcf483 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java @@ -12,8 +12,11 @@ import org.springframework.web.client.RestClient; import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.ResponseModel; +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.response.CloseComplaintStatusResponse; +import com.billpaymentservice.bbps.dto.response.ComplaintHistoryStatusResponse; import com.billpaymentservice.bbps.dto.response.ComplaintStatusResponse; import com.billpaymentservice.bbps.entites.BharatConnectMaster; import com.billpaymentservice.bbps.entites.InboundTraceLog; @@ -105,7 +108,7 @@ public class ComplainServiceImpl implements ComplainService { LOGGER.info("Current Complaint Status: {}", status); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - mapperHelper.saveComplaintStatus(responseWrapper, reqId); + mapperHelper.saveComplaintStatus(responseWrapper, reqId, txnId); LOGGER.info("Complaint data saved successfully for billId: {}", complaintId); return new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), @@ -171,7 +174,7 @@ public class ComplainServiceImpl implements ComplainService { LOGGER.info("Current Complaint ReOpen Status: {}", status); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - mapperHelper.saveReOpenComplaint(responseWrapper, reqId); + mapperHelper.saveReOpenComplaint(responseWrapper, reqId, txnId); LOGGER.info("Complaint ReOpen data saved successfully for billId: {}", complaintId); return new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), @@ -183,4 +186,137 @@ public class ComplainServiceImpl implements ComplainService { } } + @Override + public ResponseModel viewComplaintHistory(ComplainStatusRequest request) { + LOGGER.info("Fetching View Complaint History Complaint by Complaint Id={}", request.getComplaintId(), + request.getReqId()); + String apiName = "Complaint Status"; + String txnId = helper.generateTxnId(15); + String reqId = request.getReqId(); + String complaintId = request.getComplaintId(); + String fullUrl = agentDtaUrl + BBPSConstant.COMPLAINT_HISTORY + request.getComplaintId(); + + 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", complaintId); + 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("Complaint History Complaint FetchById Response: {}", 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("")); + } + + ComplaintHistoryStatusResponse responseWrapper = objectMapper.convertValue(dataMap, + ComplaintHistoryStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + 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); + + 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"); + } + } + + @Override + public ResponseModel closeComplaint(CloseComplaintRequest request) { + LOGGER.info("Fetching Close Complaint by Complaint Id={}", request.getComplaintId(), request.getReqId()); + String apiName = "Complaint Status"; + String txnId = helper.generateTxnId(15); + String reqId = request.getReqId(); + String complaintId = request.getComplaintId(); + String fullUrl = agentDtaUrl + BBPSConstant.CLOSE_COMPLAINT; + + 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(), "POST", + requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "POST", complaintId); + LOGGER.debug("Outbound log created successfully for Complaint : {}", fullUrl); + + try { + LOGGER.info("Calling external API: {}", fullUrl); + Map responseMap = httpService.postRequest(fullUrl, requestJson, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Complaint Close FetchById Response: {}", responseData); + + helper.updateOutboundLogResponse(outboundLog, responseData); + + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + + if (!dataMap.containsKey("genericResponse")) { + 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(dataMap.get("remarks"))); + } + + CloseComplaintStatusResponse responseWrapper = objectMapper.convertValue(dataMap, CloseComplaintStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + LOGGER.info("Current Complaint Close Status: {}", status); + + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + //mapperHelper.saveReOpenComplaint(responseWrapper, reqId, txnId); + LOGGER.info("Complaint Close data saved successfully for billId: {}", complaintId); + + 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/BBPSConstant.java b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java index fbce0c4..65d3894 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java @@ -44,6 +44,8 @@ public class BBPSConstant { public static final String DISPOSTION_URL = "/disposition"; public static final String COMPALINT_STATUS = "/couapp/complaints/status"; public static final String REOPEN_COMPALINT = "/couapp/complaints/reopen"; + public static final String COMPLAINT_HISTORY = "/couapp/complaints/history/byId?complaintId="; + public static final String CLOSE_COMPLAINT = " /couapp/complaints/closure"; public static final String PLANS_URL = "/plans"; diff --git a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java index b2a3916..5503002 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java @@ -6,17 +6,20 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.billpaymentservice.bbps.dto.AmountOptionDTO; import com.billpaymentservice.bbps.dto.BillerIconDTO; import com.billpaymentservice.bbps.dto.ComplainDetailsDto; +import com.billpaymentservice.bbps.dto.ComplaintHistoryDTO; import com.billpaymentservice.bbps.dto.CustomerParamGroupsDTO; import com.billpaymentservice.bbps.dto.GroupDTO; import com.billpaymentservice.bbps.dto.MasterCategoryBillerResponse; import com.billpaymentservice.bbps.dto.PlanDTO; -import com.billpaymentservice.bbps.dto.PlanTag; 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.entites.AdditionalInfoPlans; @@ -26,6 +29,7 @@ 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.ComplaintHistory; import com.billpaymentservice.bbps.entites.CustomerParamGroupById; import com.billpaymentservice.bbps.entites.GroupParam; import com.billpaymentservice.bbps.entites.Plan; @@ -36,15 +40,19 @@ import com.billpaymentservice.bbps.entites.ReOpenComplain; import com.billpaymentservice.bbps.repository.AmountOptionByBillerIdRepository; import com.billpaymentservice.bbps.repository.BillerCategoryWiseRepository; import com.billpaymentservice.bbps.repository.CategoryResponseListRepository; +import com.billpaymentservice.bbps.repository.ComplaintHistoryRepository; import com.billpaymentservice.bbps.repository.ComplaintStatusRepository; import com.billpaymentservice.bbps.repository.CustomerParamGroupByBillerIdRepository; import com.billpaymentservice.bbps.repository.FetchBillValidateRepository; import com.billpaymentservice.bbps.repository.PlanResponseRepository; import com.billpaymentservice.bbps.repository.ReOpenComplaintRepository; +import com.billpaymentservice.bbps.serviceImpl.AgentServiceImpl; @Component public class BillerMapperHelper { + private static final Logger LOGGER = LoggerFactory.getLogger(BillerMapperHelper.class); + private final BillerCategoryWiseRepository billerRepo; private final CustomerParamGroupByBillerIdRepository customerParamGroupByBillerIdRepo; private final AmountOptionByBillerIdRepository amountOptionByBillerIdRepository; @@ -53,6 +61,7 @@ public class BillerMapperHelper { private final FetchBillValidateRepository fetchBillValidateRepository; private final ComplaintStatusRepository complaintStatusRepository; private final ReOpenComplaintRepository reOpenComplaintRepository; + private final ComplaintHistoryRepository complaintHistoryRepository; public BillerMapperHelper(BillerCategoryWiseRepository billerRepo, CustomerParamGroupByBillerIdRepository customerParamGroupByBillerIdRepo, @@ -60,7 +69,8 @@ public class BillerMapperHelper { PlanResponseRepository planResponseRepository, CategoryResponseListRepository categoryResponseListRepository, FetchBillValidateRepository fetchBillValidateRepository, - ComplaintStatusRepository complaintStatusRepository, ReOpenComplaintRepository reOpenComplaintRepository) { + ComplaintStatusRepository complaintStatusRepository, ReOpenComplaintRepository reOpenComplaintRepository, + ComplaintHistoryRepository complaintHistoryRepository) { this.billerRepo = billerRepo; this.customerParamGroupByBillerIdRepo = customerParamGroupByBillerIdRepo; this.amountOptionByBillerIdRepository = amountOptionByBillerIdRepository; @@ -69,6 +79,7 @@ public class BillerMapperHelper { this.fetchBillValidateRepository = fetchBillValidateRepository; this.complaintStatusRepository = complaintStatusRepository; this.reOpenComplaintRepository = reOpenComplaintRepository; + this.complaintHistoryRepository = complaintHistoryRepository; } /** @@ -288,72 +299,72 @@ public class BillerMapperHelper { } public PlanResponses savePlanResponse(PlanResponse planResponse, String reqId, String txnId) { - PlanResponses response = new PlanResponses(); - response.setRequestId(reqId); - response.setPageNo(planResponse.getPageNo()); - response.setPageSize(planResponse.getPageSize()); - response.setTotalElements(planResponse.getTotalElements()); - response.setTotalPages(planResponse.getTotalPages()); - response.setTxnId(txnId); - response.setCreateDateTime(new Date()); + PlanResponses response = new PlanResponses(); + response.setRequestId(reqId); + response.setPageNo(planResponse.getPageNo()); + response.setPageSize(planResponse.getPageSize()); + response.setTotalElements(planResponse.getTotalElements()); + response.setTotalPages(planResponse.getTotalPages()); + response.setTxnId(txnId); + response.setCreateDateTime(new Date()); - PlansList plansList = new PlansList(); - List planEntities = new ArrayList<>(); + PlansList plansList = new PlansList(); + List planEntities = new ArrayList<>(); - for (PlanDTO dto : planResponse.getPlansList().getPlans()) { - Plan plan = new Plan(); - plan.setPlanId(dto.getPlanId()); - plan.setDescription(dto.getDescription()); - plan.setBillerId(dto.getBillerId()); - plan.setCategoryType(dto.getCategoryType()); - plan.setAmountInRupees(dto.getAmountInRupees()); - plan.setEffctvFrom(dto.getEffctvFrom()); - plan.setEffctvTo(dto.getEffctvTo()); - plan.setStatus(dto.getStatus()); - plan.setPlansList(plansList); + for (PlanDTO dto : planResponse.getPlansList().getPlans()) { + Plan plan = new Plan(); + plan.setPlanId(dto.getPlanId()); + plan.setDescription(dto.getDescription()); + plan.setBillerId(dto.getBillerId()); + plan.setCategoryType(dto.getCategoryType()); + plan.setAmountInRupees(dto.getAmountInRupees()); + plan.setEffctvFrom(dto.getEffctvFrom()); + plan.setEffctvTo(dto.getEffctvTo()); + plan.setStatus(dto.getStatus()); + plan.setPlansList(plansList); - // categorySubType - List subs = new ArrayList<>(); - if (dto.getCategorySubType() != null) { - for (String s : dto.getCategorySubType()) { - PlanCategorySubType sub = new PlanCategorySubType(); - sub.setCategorySubType(s); - sub.setPlan(plan); - subs.add(sub); - } - } - plan.setCategorySubTypes(subs); + // categorySubType + List subs = new ArrayList<>(); + if (dto.getCategorySubType() != null) { + for (String s : dto.getCategorySubType()) { + PlanCategorySubType sub = new PlanCategorySubType(); + sub.setCategorySubType(s); + sub.setPlan(plan); + subs.add(sub); + } + } + plan.setCategorySubTypes(subs); - // additionalInfo + tags - // ✅ additionalInfo + tags - if (dto.getAdditionalInfo() != null) { - AdditionalInfoPlans info = new AdditionalInfoPlans(); - info.setPlanAdditionalInfoId(dto.getAdditionalInfo().getPlanAdditionalInfoId().toString()); + // additionalInfo + tags + // ✅ additionalInfo + tags + if (dto.getAdditionalInfo() != null) { + AdditionalInfoPlans info = new AdditionalInfoPlans(); + info.setPlanAdditionalInfoId(dto.getAdditionalInfo().getPlanAdditionalInfoId().toString()); - List tagEntities = new ArrayList<>(); - if (dto.getAdditionalInfo().getTags() != null && !dto.getAdditionalInfo().getTags().isEmpty()) { - for (com.billpaymentservice.bbps.dto.PlanTag tagDto : dto.getAdditionalInfo().getTags()) { - com.billpaymentservice.bbps.entites.PlanTag tagEntity = new com.billpaymentservice.bbps.entites.PlanTag(); - tagEntity.setTagId(tagDto.getTagId().toString()); - tagEntity.setName(tagDto.getName()); - tagEntity.setValue(tagDto.getValue()); - tagEntity.setAdditionalInfo(info); // ✅ maintain relationship - tagEntities.add(tagEntity); - } - } + List tagEntities = new ArrayList<>(); + if (dto.getAdditionalInfo().getTags() != null && !dto.getAdditionalInfo().getTags().isEmpty()) { + for (com.billpaymentservice.bbps.dto.PlanTag tagDto : dto.getAdditionalInfo().getTags()) { + com.billpaymentservice.bbps.entites.PlanTag tagEntity = new com.billpaymentservice.bbps.entites.PlanTag(); + tagEntity.setTagId(tagDto.getTagId().toString()); + tagEntity.setName(tagDto.getName()); + tagEntity.setValue(tagDto.getValue()); + tagEntity.setAdditionalInfo(info); // ✅ maintain relationship + tagEntities.add(tagEntity); + } + } - // ✅ Now set the entity list - info.setTags(tagEntities); - plan.setAdditionalInfo(info); - } + // ✅ Now set the entity list + info.setTags(tagEntities); + plan.setAdditionalInfo(info); + } - planEntities.add(plan); - } + planEntities.add(plan); + } - plansList.setPlans(planEntities); - response.setPlansList(plansList); + plansList.setPlans(planEntities); + response.setPlansList(plansList); - return planResponseRepository.save(response); + return planResponseRepository.save(response); } public String saveCategoryItems(List categoryRespList, String requestId, String txnId) { @@ -375,7 +386,7 @@ public class BillerMapperHelper { return savedCount + " items were successfully saved."; } - public String saveComplaintStatus(ComplaintStatusResponse response, String reqId) { + public String saveComplaintStatus(ComplaintStatusResponse response, String reqId, String txnId) { if (response == null || response.getComplaints() == null) { throw new IllegalArgumentException("Invalid complaint response received!"); @@ -411,6 +422,7 @@ public class BillerMapperHelper { entity.setCreatedEpochDate(dto.getCreatedEpochDate()); entity.setModifiedEpochDate(dto.getModifiedEpochDate()); entity.setRefId(reqId); + entity.setSystemTxnId(txnId); try { ComplainStatus savedEntity = complaintStatusRepository.save(entity); @@ -425,7 +437,7 @@ public class BillerMapperHelper { } } - public String saveReOpenComplaint(ComplaintStatusResponse response, String reqId) { + public String saveReOpenComplaint(ComplaintStatusResponse response, String reqId, String txnId) { if (response == null || response.getComplaints() == null) { throw new IllegalArgumentException("Invalid complaint response received!"); @@ -461,6 +473,7 @@ public class BillerMapperHelper { entity.setCreatedEpochDate(dto.getCreatedEpochDate()); entity.setModifiedEpochDate(dto.getModifiedEpochDate()); entity.setRefId(reqId); + entity.setSystemTxnId(txnId); try { ReOpenComplain savedEntity = reOpenComplaintRepository.save(entity); @@ -475,4 +488,50 @@ public class BillerMapperHelper { } } + public String saveComplaintHistory(ComplaintHistoryStatusResponse responseWrapper, String reqId, String txnId) { + if (responseWrapper == null || responseWrapper.getComplaintsHistories() == null + || responseWrapper.getComplaintsHistories().isEmpty()) { + return "No complaint history data found to save."; + } + + try { + int savedCount = 0; + + for (ComplaintHistoryDTO dto : responseWrapper.getComplaintsHistories()) { + + ComplaintHistory entity = new ComplaintHistory(); + entity.setComplaintHistoryId(dto.getComplaintHistoryId()); + entity.setComplaintId(dto.getComplaintId()); + entity.setComplaintDescr(dto.getComplaintDescr()); + entity.setComplaintDispos(dto.getComplaintDispos()); + entity.setTxnId(dto.getTxnId()); + entity.setAssignedTo(dto.getAssignedTo()); + entity.setComplaintNpciId(dto.getComplaintNpciId()); + entity.setComplaintType(dto.getComplaintType()); + entity.setComplaintRaisedFrom(dto.getComplaintRaisedFrom()); + entity.setUserId(dto.getUserId()); + entity.setStatus(dto.getStatus()); + entity.setModifiedDate(dto.getModifiedDate()); + entity.setModifiedEpochDate(dto.getModifiedEpochDate()); + entity.setReqId(reqId); + entity.setSystemTxnId(txnId); + entity.setCreateDateTime(new Date()); + entity.setPageNo(responseWrapper.getPageNo()); + entity.setPageSize(responseWrapper.getPageSize()); + entity.setTotalElements(responseWrapper.getTotalElements()); + entity.setTotalPages(responseWrapper.getTotalPages()); + + complaintHistoryRepository.save(entity); + savedCount++; + } + + return "✅ " + savedCount + " Complaint history record(s) saved successfully."; + + } catch (Exception e) { + // Log the error for debugging + LOGGER.error("❌ Error saving complaint history data: {}", e.getMessage(), e); + return "❌ Failed to save complaint history data due to: " + e.getMessage(); + } + } + }