diff --git a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java index 7024da6..e5eefee 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java @@ -1,5 +1,9 @@ package com.billpaymentservice.bbps.controller; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; + import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -9,34 +13,62 @@ 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.BillPaymentRequest; +import com.billpaymentservice.bbps.dto.request.CloseComplaintRequest; +import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; +import com.billpaymentservice.bbps.dto.request.ReOpenComplain; import com.billpaymentservice.bbps.service.ComplainService; -import com.billpaymentservice.bbps.service.PaymentService; @RestController -@RequestMapping("/complain") +@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; + this.complainService = complainService; } - - @PostMapping( - value = "/addComplain", - consumes = MediaType.APPLICATION_JSON_VALUE, - produces = MediaType.APPLICATION_JSON_VALUE - ) - public ResponseEntity addComplain( - @Validated @RequestBody ComplaintRequestDTO complainRequestDTO) { - ResponseModel response = complainService.addComplain(complainRequestDTO); - return ResponseEntity.ok(response); - } + @PostMapping(value = "/addComplain", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity addComplain(@Validated @RequestBody ComplaintRequestDTO complainRequestDTO) { + ResponseModel response = complainService.addComplain(complainRequestDTO); + return ResponseEntity.ok(response); + } + + @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); + } + + @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/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/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 new file mode 100644 index 0000000..169a3a4 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplainStatusRequest.java @@ -0,0 +1,18 @@ +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; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@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/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/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/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/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 new file mode 100644 index 0000000..3fe78e4 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ComplainStatus.java @@ -0,0 +1,106 @@ +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; + + @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/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..e2e92d1 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ReOpenComplain.java @@ -0,0 +1,106 @@ +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; + + @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/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 index 88915e1..cd0323f 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java @@ -1,10 +1,21 @@ 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; import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; public interface ComplainService { + ResponseModel getComplaintStatus(ComplainStatusRequest request); + + ResponseModel reOpenComplaint(ReOpenComplain request); + + ResponseModel viewComplaintHistory(ComplainStatusRequest request); + + ResponseModel closeComplaint(CloseComplaintRequest request); + public ResponseModel addComplain(ComplaintRequestDTO complainRequestDTO); } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java index bebe9b5..0bfdb53 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java @@ -10,6 +10,17 @@ 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.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.dto.GeneralResp; import com.billpaymentservice.bbps.dto.ResponseModel; @@ -24,6 +35,11 @@ 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.billpaymentservice.bbps.repository.ComplainRepository; import com.billpaymentservice.bbps.service.ComplainService; import com.billpaymentservice.bbps.util.BBPSConstant; @@ -35,29 +51,37 @@ import com.fasterxml.jackson.databind.ObjectMapper; @Service public class ComplainServiceImpl implements ComplainService { - @Value("${complaint.data.url}") - private String complainDataUrl; - public static final Logger LOGGER = LoggerFactory.getLogger(ComplainServiceImpl.class); - private final Helper helper; - private final ObjectMapper objectMapper = new ObjectMapper(); - private final BharatConnectMasterRepository beneficiaryDetailsRepository; - private final HttpService httpService; - private final ComplainRepository complainRepository; - - public ComplainServiceImpl(Helper helper - ,HttpService httpService, - BharatConnectMasterRepository beneficiaryDetailsRepository, - ComplainRepository complainRepository) { - this.helper=helper; - this.httpService=httpService; - this.beneficiaryDetailsRepository=beneficiaryDetailsRepository; - this.complainRepository=complainRepository; - } - + @Value("${agent.data.url}") + private String agentDtaUrl; + + @Value("${complaint.data.url}") + private String complainDataUrl; + + private final RestClient restClient; + private final HttpService httpService; + private final Helper helper; + private final BharatConnectMasterRepository beneficiaryDetailsRepository; + private final BillerMapperHelper mapperHelper; + private final ComplainRepository complainRepository; + + private final ObjectMapper objectMapper = new ObjectMapper(); + private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); + + public ComplainServiceImpl(RestClient restClient, HttpService httpService, Helper helper, + BharatConnectMasterRepository beneficiaryDetailsRepository, BillerMapperHelper mapperHelper, + ComplainRepository complainRepository) { + this.restClient = restClient; + this.httpService = httpService; + this.helper = helper; + this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; + this.mapperHelper = mapperHelper; + this.complainRepository = complainRepository; + } + @Override public ResponseModel addComplain(ComplaintRequestDTO complainRequestDTO) { - + LOGGER.info("Initiating addComplain for request ID: {} and MID", complainRequestDTO.getReqId(), complainRequestDTO.getMid()); String apiName = "ADDCOMPLAIN"; @@ -65,12 +89,12 @@ public class ComplainServiceImpl implements ComplainService { String requestId = complainRequestDTO.getReqId(); String fullUrl = complainDataUrl + BBPSConstant.ADD_COMPLAIN_ENDPOINT; String requestJson = helper.convertObjectToJson(complainRequestDTO); - 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); + 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); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, complainRequestDTO.getMid(), "POST", requestJson); @@ -93,15 +117,15 @@ public class ComplainServiceImpl implements ComplainService { Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), String.valueOf(dataMap.get("remarks"))); } - + ComplaintResponse responseWrapper = objectMapper.convertValue(dataMap, ComplaintResponse.class); GeneralResp generalResp = responseWrapper.getGeneralResp(); - ModelMapper mapper = new ModelMapper(); - mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - ComplaintDetails entity = mapper.map(responseWrapper.getComplaints(), ComplaintDetails.class); - entity.setReqId(complainRequestDTO.getReqId()); - entity.setTxnId(txnId); - complainRepository.save(entity); + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + ComplaintDetails entity = mapper.map(responseWrapper.getComplaints(), ComplaintDetails.class); + entity.setReqId(complainRequestDTO.getReqId()); + entity.setTxnId(txnId); + complainRepository.save(entity); ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); @@ -111,8 +135,272 @@ public class ComplainServiceImpl implements ComplainService { helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } - - + } + + @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, txnId); + 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, txnId); + 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"); + } + } + + @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/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 69684eb..b40f7da 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java @@ -42,7 +42,11 @@ 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 COMPLAINT_HISTORY = "/couapp/complaints/history/byId?complaintId="; + public static final String CLOSE_COMPLAINT = " /couapp/complaints/closure"; + public static final String PLANS_URL = "/plans"; public static final String ADD_COMPLAIN_ENDPOINT = "/couapp/complaints"; diff --git a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java index b7043db..5503002 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BillerMapperHelper.java @@ -6,55 +6,80 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; -import org.modelmapper.ModelMapper; +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.response.AmountOptionsResponse; -import com.billpaymentservice.bbps.dto.response.FetchBillValidateResponse; +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; 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.ComplaintHistory; 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.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; private final PlanResponseRepository planResponseRepository; private final CategoryResponseListRepository categoryResponseListRepository; private final FetchBillValidateRepository fetchBillValidateRepository; + private final ComplaintStatusRepository complaintStatusRepository; + private final ReOpenComplaintRepository reOpenComplaintRepository; + private final ComplaintHistoryRepository complaintHistoryRepository; public BillerMapperHelper(BillerCategoryWiseRepository billerRepo, CustomerParamGroupByBillerIdRepository customerParamGroupByBillerIdRepo, AmountOptionByBillerIdRepository amountOptionByBillerIdRepository, PlanResponseRepository planResponseRepository, CategoryResponseListRepository categoryResponseListRepository, - FetchBillValidateRepository fetchBillValidateRepository) { + FetchBillValidateRepository fetchBillValidateRepository, + ComplaintStatusRepository complaintStatusRepository, ReOpenComplaintRepository reOpenComplaintRepository, + ComplaintHistoryRepository complaintHistoryRepository) { this.billerRepo = billerRepo; this.customerParamGroupByBillerIdRepo = customerParamGroupByBillerIdRepo; this.amountOptionByBillerIdRepository = amountOptionByBillerIdRepository; this.planResponseRepository = planResponseRepository; this.categoryResponseListRepository = categoryResponseListRepository; this.fetchBillValidateRepository = fetchBillValidateRepository; + this.complaintStatusRepository = complaintStatusRepository; + this.reOpenComplaintRepository = reOpenComplaintRepository; + this.complaintHistoryRepository = complaintHistoryRepository; } /** @@ -273,22 +298,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<>(); + + 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); } - // 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); + plansList.setPlans(planEntities); + response.setPlansList(plansList); + + return planResponseRepository.save(response); } public String saveCategoryItems(List categoryRespList, String requestId, String txnId) { @@ -310,30 +386,152 @@ 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, String txnId) { + + 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); + entity.setSystemTxnId(txnId); + + 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, String txnId) { + + 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); + entity.setSystemTxnId(txnId); + + 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(); + } + } + + 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(); + } + } + } diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index dc3368c..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 @@ -20,9 +20,9 @@ swagger.server.description=Local Development Server # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -#spring.datasource.password= +spring.datasource.password=UAT@DB_2025 -spring.datasource.password=himanshu@123 +#spring.datasource.password=himanshu@123 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ebeace6..d9592e5 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