From e724799400083b5b18b7f4b248b3d90f1f8e996a Mon Sep 17 00:00:00 2001 From: Mohd-Arham Date: Mon, 10 Nov 2025 15:40:11 +0530 Subject: [PATCH 1/3] din k code --- .../dto/request/MasterCategoryRequest.java | 4 +- .../serviceImpl/MasterDataServiceImpl.java | 2 +- .../resources/application-local.properties | 50 +++++++++++++++++++ src/main/resources/application-uat.properties | 47 +++++++++++++++++ src/main/resources/application.properties | 9 ++-- 5 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/application-local.properties create mode 100644 src/main/resources/application-uat.properties diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/MasterCategoryRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/MasterCategoryRequest.java index 0218ff4..d1816cc 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/MasterCategoryRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/MasterCategoryRequest.java @@ -18,10 +18,10 @@ public class MasterCategoryRequest extends BaseClass { @NotNull private String category; - private Integer pageStart = 0; + private Integer pageNo = 0; @NotNull(message = "pageEnd is required") @Min(value = 1, message = "pageEnd must be greater than 0") - private Integer pageEnd; + private Integer pageSize; } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index a851b0a..33af478 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -285,7 +285,7 @@ public class MasterDataServiceImpl implements MasterDataService { helper.validateMerchant(masterRequest.getMid()); String fullUrl = String.format("%s%s?billerName=%s&category=%s&page=%d&pagesize=%d", masterRegisterUrl, BBPSConstant.BILLER_URL, masterRequest.getBillerName(), masterRequest.getCategory(), - masterRequest.getPageStart(), masterRequest.getPageEnd()); + masterRequest.getPageNo(), masterRequest.getPageSize()); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..3c39389 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,50 @@ +spring.application.name=bbps + + +# Server port +server.port=9090 + +# JPA & Hibernate +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +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.description=Local Development Server + + +# DataSource +spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS +spring.datasource.username=postgres +spring.datasource.password=UAT@DB_2025 + +#spring.datasource.password=himanshu@123 +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.type=com.zaxxer.hikari.HikariDataSource + + +# HikariCP settings +spring.datasource.hikari.connection-timeout=10000 +spring.datasource.hikari.minimum-idle=10 +spring.datasource.hikari.maximum-pool-size=50 +spring.datasource.hikari.idle-timeout=2000000 +spring.datasource.hikari.max-lifetime=110000 +spring.datasource.hikari.auto-commit=true + +# Logging levels +logging.level.io.github.resilience4j.retry=DEBUG + + +# BBPS URLs +master.data.url = https://bbps-staging.digiledge.in/agent/cou-master/masters +agent.data.url=https://bbps-staging.digiledge.in/agent/bill-payment-new +payment.data.url=https://bbps-staging.digiledge.in/couapp + + +# Resilience4j Retry +resilience4j.retry.instances.callbackService.max-attempts=1 +resilience4j.retry.instances.callbackService.wait-duration=2s diff --git a/src/main/resources/application-uat.properties b/src/main/resources/application-uat.properties new file mode 100644 index 0000000..41bb455 --- /dev/null +++ b/src/main/resources/application-uat.properties @@ -0,0 +1,47 @@ +spring.application.name=bbps + + +# Server port +server.port=9090 + +# JPA & Hibernate +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.properties.hibernate.default_schema=public + +swagger.server.url=https://11.godemo.in/BBPS +swagger.server.description=Production Server + +#swagger.server.url=http://localhost:9090 +#swagger.server.description=Local Development Server + + +# DataSource +spring.datasource.url=jdbc:postgresql://localhost:5432/bbps +spring.datasource.username=postgres +spring.datasource.password=LincPay098)(* +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.type=com.zaxxer.hikari.HikariDataSource + + +# HikariCP settings +spring.datasource.hikari.connection-timeout=10000 +spring.datasource.hikari.minimum-idle=10 +spring.datasource.hikari.maximum-pool-size=50 +spring.datasource.hikari.idle-timeout=2000000 +spring.datasource.hikari.max-lifetime=110000 +spring.datasource.hikari.auto-commit=true + +# Logging levels +logging.level.io.github.resilience4j.retry=DEBUG + + +# BBPS URLs +master.data.url = https://bbps-staging.digiledge.in/agent/cou-master/masters +agent.data.url=https://bbps-staging.digiledge.in/agent/bill-payment-new +payment.data.url=https://bbps-staging.digiledge.in/couapp + + +# Resilience4j Retry +resilience4j.retry.instances.callbackService.max-attempts=1 +resilience4j.retry.instances.callbackService.wait-duration=2s \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4f044d5..be00e5a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -16,15 +16,15 @@ swagger.server.url=http://192.168.1.24:9090 swagger.server.description=Local Development Server +spring.profiles.active=local + # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -<<<<<<< HEAD spring.datasource.password=UAT@DB_2025 -======= -spring.datasource.password=himanshu@123 ->>>>>>> 43baedfecdf5e3718ba3e8b932536b3798957d22 + +#spring.datasource.password=himanshu@123 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource @@ -40,7 +40,6 @@ spring.datasource.hikari.auto-commit=true # Logging levels logging.level.io.github.resilience4j.retry=DEBUG - # BBPS URLs master.data.url = https://bbps-staging.digiledge.in/agent/cou-master/masters agent.data.url=https://bbps-staging.digiledge.in/agent/bill-payment-new From 579220f6c631ac494135be80384bcdbf36a92541 Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Tue, 11 Nov 2025 11:42:54 +0530 Subject: [PATCH 2/3] added billValidate --- .../billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index c8630dd..d001ea3 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -141,7 +141,7 @@ public class AgentServiceImpl implements AgentService { billFetchByBillIdRequest.setReqId(requestId); LOGGER.info("Waiting for 2 seconds before fetching bill by ID..."); try { - Thread.sleep(2000); + Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); LOGGER.warn("Thread interrupted during delay: {}", e.getMessage()); @@ -347,7 +347,7 @@ public class AgentServiceImpl implements AgentService { billFetchByBillIdRequest.setReqId(reqId); LOGGER.info("Waiting for 2 seconds before fetching bill by ID..."); try { - Thread.sleep(2000); + Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); LOGGER.warn("Thread interrupted during delay: {}", e.getMessage()); From 84ad9a2decb1f8c2ce99a88d641dbcb1cfc9d4e8 Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Wed, 12 Nov 2025 10:24:52 +0530 Subject: [PATCH 3/3] fixed the biller Id Saving problem added 404 not found url --- .../bbps/controller/ComplainController.java | 42 +++++++ .../bbps/dto/ComplaintDetailsDTO.java | 32 +++++ .../bbps/dto/request/BaseClass.java | 35 ++++-- .../bbps/dto/request/ComplaintRequestDTO.java | 15 +++ .../bbps/dto/response/ComplaintResponse.java | 16 +++ .../bbps/entites/ComplaintDetails.java | 71 +++++++++++ .../bbps/entites/Group.java | 12 +- .../exception/GlobalExceptionHandler.java | 13 ++ .../bbps/repository/ComplainRepository.java | 9 ++ .../bbps/service/ComplainService.java | 10 ++ .../bbps/serviceImpl/AgentServiceImpl.java | 7 +- .../bbps/serviceImpl/ComplainServiceImpl.java | 118 ++++++++++++++++++ .../bbps/util/BBPSConstant.java | 1 + .../resources/application-local.properties | 4 +- src/main/resources/application.properties | 10 ++ 15 files changed, 377 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/ComplaintDetailsDTO.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/request/ComplaintRequestDTO.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintResponse.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/ComplaintDetails.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/ComplainRepository.java create mode 100644 src/main/java/com/billpaymentservice/bbps/service/ComplainService.java create mode 100644 src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java diff --git a/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java new file mode 100644 index 0000000..7024da6 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/controller/ComplainController.java @@ -0,0 +1,42 @@ +package com.billpaymentservice.bbps.controller; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.BillPaymentRequest; +import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; +import com.billpaymentservice.bbps.service.ComplainService; +import com.billpaymentservice.bbps.service.PaymentService; + +@RestController +@RequestMapping("/complain") +@CrossOrigin(origins = "*") +public class ComplainController { + + + private final ComplainService complainService; + public ComplainController(ComplainService complainService) { + this.complainService=complainService; + } + + @PostMapping( + value = "/addComplain", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public ResponseEntity addComplain( + @Validated @RequestBody ComplaintRequestDTO complainRequestDTO) { + + ResponseModel response = complainService.addComplain(complainRequestDTO); + return ResponseEntity.ok(response); + } + + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/ComplaintDetailsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/ComplaintDetailsDTO.java new file mode 100644 index 0000000..169a5c6 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/ComplaintDetailsDTO.java @@ -0,0 +1,32 @@ +package com.billpaymentservice.bbps.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonIgnoreProperties(ignoreUnknown = true) +public class ComplaintDetailsDTO { + private String complaintId; // UUID + private String complaintDescr; // Complaint description + private String complaintDispos; // Complaint disposition + private String complaintType; + // Complaint type + @JsonProperty("txnId") + private String bankTxnId; // Transaction ID + private String txnNpciId; // Transaction NPCI ID + private String assignedTo; // Assigned person + private String complaintNpciId; // Complaint NPCI ID + private String complaintRaisedFrom; // Who raised the complaint + private String userId; // User ID + private String status; // Complaint status + private String refId; // Reference ID + private String estimated_TAT; // Estimated Turnaround Time + private String creationDate; // ISO timestamp + private String modifiedDate; // ISO timestamp + private Long createdEpochDate; // Epoch creation time + private Long modifiedEpochDate; // Epoch modified time +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java b/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java index ab7388c..78f7816 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java @@ -1,6 +1,7 @@ package com.billpaymentservice.bbps.dto.request; import com.billpaymentservice.bbps.dto.DeviceDetail; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotBlank; @@ -15,37 +16,53 @@ import lombok.ToString; @AllArgsConstructor @NoArgsConstructor @ToString +@JsonIgnoreProperties(ignoreUnknown = true) public abstract class BaseClass { + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @NotBlank(message = "MID cannot be null or blank") private String mid; + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @NotBlank(message = "Secret key cannot be null or blank") private String secretKey; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @NotBlank(message = "Request ID cannot be null or blank") private String reqId; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private DeviceDetail deviceDetial; // ✅ 10 User Defined Fields (UDF1–UDF10) + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf1; @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf2; + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf3; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf4; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf5; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf6; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf7; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf8; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf9; - + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf10; } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/ComplaintRequestDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplaintRequestDTO.java new file mode 100644 index 0000000..ab48f8f --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/ComplaintRequestDTO.java @@ -0,0 +1,15 @@ +package com.billpaymentservice.bbps.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ComplaintRequestDTO extends BaseClass { + + private String complaintDescription; // Complaint description that the user enters + private String complaintDisposition; // Complaint disposition + private String complaintType; // Type of complaint + private String txnId; // Transaction ID (optional) + private String clientReqId; // Client Req ID (optional) +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintResponse.java new file mode 100644 index 0000000..28e8041 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/ComplaintResponse.java @@ -0,0 +1,16 @@ +package com.billpaymentservice.bbps.dto.response; + +import java.util.List; + +import com.billpaymentservice.bbps.dto.ComplaintDetailsDTO; +import com.billpaymentservice.bbps.dto.GeneralResp; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ComplaintResponse { + private ComplaintDetailsDTO complaints; // multiple complaints + private GeneralResp generalResp; +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/ComplaintDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/ComplaintDetails.java new file mode 100644 index 0000000..747b266 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/ComplaintDetails.java @@ -0,0 +1,71 @@ +package com.billpaymentservice.bbps.entites; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Entity +@Table(name = "complaint_details") +@Getter +@Setter +@ToString +public class ComplaintDetails { + + @Id + @Column(name = "complaint_id", nullable = false, unique = true) + private String complaintId; // Primary key (UUID from BBPS API) + + @Column(name = "req_id") + private String reqId; + + @Column(name = "txn_id") + private String txnId; + + @Column(name = "complaint_descr") + private String complaintDescr; + + @Column(name = "complaint_dispos") + private String complaintDispos; + + @Column(name = "complaint_type") + private String complaintType; + + @Column(name = "bank_txn_id") + private String bankTxnId; + + @Column(name = "txn_npci_id") + private String txnNpciId; + + @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 estimated_TAT; + + @Column(name = "creation_date") + private String creationDate; + + @Column(name = "modified_date") + private String modifiedDate; + + @Column(name = "created_epoch_date") + private Long createdEpochDate; + + @Column(name = "modified_epoch_date") + private Long modifiedEpochDate; +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/Group.java b/src/main/java/com/billpaymentservice/bbps/entites/Group.java index 34889a4..26dd959 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/Group.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/Group.java @@ -2,10 +2,13 @@ package com.billpaymentservice.bbps.entites; import java.util.List; +import jakarta.persistence.ForeignKey; + import jakarta.persistence.CascadeType; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; +import jakarta.persistence.ConstraintMode; import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -36,10 +39,11 @@ public class Group { @Column(name = "input") private String input; - // Example: "Admission No/Application No/GR No" → stored as multiple params - @ElementCollection - @CollectionTable(name = "group_params", joinColumns = @JoinColumn(name = "group_id")) - @Column(name = "param_name") + @CollectionTable( + name = "group_params", + joinColumns = @JoinColumn(name = "group_id"), + foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT) + ) private List params; // 🔗 Parent group relationship (for nested groups) diff --git a/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java b/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java index f73aa2a..49330b4 100644 --- a/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java @@ -9,6 +9,7 @@ import org.springframework.http.*; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.NoHandlerFoundException; import com.billpaymentservice.bbps.dto.ResponseModel; @@ -36,6 +37,18 @@ public class GlobalExceptionHandler { resp.setData(fieldErrors); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resp); } + + @ExceptionHandler(NoHandlerFoundException.class) + public ResponseEntity> handleNotFound(NoHandlerFoundException ex) { + logger.warn("Endpoint not found: {}", ex.getRequestURL()); + ResponseModel resp = new ResponseModel<>( + "Endpoint not found: " + ex.getRequestURL(), + "FAILED", + HttpStatus.NOT_FOUND.value(), + null + ); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(resp); + } @ExceptionHandler(AppException.class) public ResponseEntity> handleAppException(AppException ex) { diff --git a/src/main/java/com/billpaymentservice/bbps/repository/ComplainRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/ComplainRepository.java new file mode 100644 index 0000000..d42dcc7 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/ComplainRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.ComplaintDetails; + +public interface ComplainRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java new file mode 100644 index 0000000..88915e1 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/service/ComplainService.java @@ -0,0 +1,10 @@ +package com.billpaymentservice.bbps.service; + +import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; + +public interface ComplainService { + + public ResponseModel addComplain(ComplaintRequestDTO complainRequestDTO); + +} diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index d001ea3..bf1bcf2 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -162,7 +162,7 @@ public class AgentServiceImpl implements AgentService { String txnId = helper.generateTxnId(15); String reqId = billFetchByBillIdRequest.getReqId(); String billId = billFetchByBillIdRequest.getBillId(); - String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; + String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + billFetchByBillIdRequest.getBillId(); helper.validateMerchant(billFetchByBillIdRequest.getMid()); @@ -347,7 +347,8 @@ public class AgentServiceImpl implements AgentService { billFetchByBillIdRequest.setReqId(reqId); LOGGER.info("Waiting for 2 seconds before fetching bill by ID..."); try { - Thread.sleep(1000); + + Thread.sleep(12000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); LOGGER.warn("Thread interrupted during delay: {}", e.getMessage()); @@ -370,7 +371,7 @@ public class AgentServiceImpl implements AgentService { String txnId = helper.generateTxnId(15); String reqId = billRequest.getReqId(); String billId = billRequest.getBillId(); - String fullUrl = agentDtaUrl + BBPSConstant.BILL_VALIDATE_ID_URL+ "c9670952-ebd7-487a-b6ea-49f2b4d4a718"; + String fullUrl = agentDtaUrl + BBPSConstant.BILL_VALIDATE_ID_URL+ billRequest.getBillId(); ; helper.validateMerchant(billRequest.getMid()); diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java new file mode 100644 index 0000000..bebe9b5 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java @@ -0,0 +1,118 @@ +package com.billpaymentservice.bbps.serviceImpl; + +import java.util.Map; + +import org.modelmapper.ModelMapper; +import org.modelmapper.convention.MatchingStrategies; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; + +import com.billpaymentservice.bbps.dto.GeneralResp; +import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; +import com.billpaymentservice.bbps.dto.response.BillerDataResponse; +import com.billpaymentservice.bbps.dto.response.ComplaintResponse; +import com.billpaymentservice.bbps.entites.BharatConnectMaster; +import com.billpaymentservice.bbps.entites.BillPayment; +import com.billpaymentservice.bbps.entites.BillerDetails; +import com.billpaymentservice.bbps.entites.ComplaintDetails; +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.repository.ComplainRepository; +import com.billpaymentservice.bbps.service.ComplainService; +import com.billpaymentservice.bbps.util.BBPSConstant; +import com.billpaymentservice.bbps.util.EntityRelationshipUtil; +import com.billpaymentservice.bbps.util.Helper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Service +public class ComplainServiceImpl implements ComplainService { + @Value("${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; + } + + @Override + public ResponseModel addComplain(ComplaintRequestDTO complainRequestDTO) { + + LOGGER.info("Initiating addComplain for request ID: {} and MID", complainRequestDTO.getReqId(), + complainRequestDTO.getMid()); + String apiName = "ADDCOMPLAIN"; + String txnId = helper.generateTxnId(15); + 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); + + InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, complainRequestDTO.getMid(), + "POST", requestJson); + + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, fullUrl, "POST", null); + LOGGER.info("Calling external API: {}", fullUrl); + LOGGER.info("Request payload: {}", requestJson); + Map responseMap = httpService.postRequest(fullUrl, requestJson, headers); + String responseData = responseMap.get("data"); + LOGGER.info("fetched data from api is :{}", responseData); + helper.updateOutboundLogResponse(outboundLog, responseData); + try { + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + LOGGER.info("Parsed response data: {}", dataMap); + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); + 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"))); + } + + 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); + ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); + 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 5e7945f..69684eb 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java @@ -44,5 +44,6 @@ public class BBPSConstant { public static final String DISPOSTION_URL = "/disposition"; public static final String PLANS_URL = "/plans"; + public static final String ADD_COMPLAIN_ENDPOINT = "/couapp/complaints"; } diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 510f19a..dc3368c 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -20,9 +20,9 @@ swagger.server.description=Local Development Server # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -spring.datasource.password=UAT@DB_2025 +#spring.datasource.password= -#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 be00e5a..ebeace6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -44,6 +44,16 @@ logging.level.io.github.resilience4j.retry=DEBUG master.data.url = https://bbps-staging.digiledge.in/agent/cou-master/masters agent.data.url=https://bbps-staging.digiledge.in/agent/bill-payment-new payment.data.url=https://bbps-staging.digiledge.in/couapp +complaint.data.url=https://bbps-staging.digiledge.in + +# throw NoHandlerFoundException for 404s +spring.mvc.throw-exception-if-no-handler-found=true + +# disable white-label error page +spring.web.resources.add-mappings=false + +# (optional) to avoid path match issues on Spring Boot 2.6+ +spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER # Resilience4j Retry