From 7e8a7fdd6beb4d5ff56a621a10ef121d5852e74f Mon Sep 17 00:00:00 2001 From: Mohd-Arham Date: Wed, 12 Nov 2025 17:03:07 +0530 Subject: [PATCH] 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(); + } + } + }