From 3f27b5272a06b62fb003672e56bbfa048ee9c17c Mon Sep 17 00:00:00 2001 From: himanshu Date: Sun, 2 Nov 2025 00:10:10 +0530 Subject: [PATCH 1/3] save billerdata to in database working code --- .../bbps/controller/MasterDataController.java | 8 + .../bbps/dto/AgentFundTransfer.java | 6 +- .../{CustomParam.java => CustomParamDTO.java} | 2 +- .../bbps/dto/DeviceBlockTag.java | 12 + .../bbps/dto/DispositionsDTO.java | 14 ++ .../bbps/dto/GeneralResp.java | 2 + .../bbps/dto/TransactionDAO.java | 63 ----- .../bbps/dto/TransactionDTO.java | 75 ++++++ .../bbps/dto/request/DispositionRequest.java | 5 + .../dto/response/BillPaymentResponse.java | 2 + .../bbps/dto/response/CustomParamResp.java | 5 +- .../dto/response/DispositionResponse.java | 20 ++ .../response/TransactionStatusResponse.java | 4 +- .../bbps/entites/AdditionalInfo.java | 2 + .../bbps/entites/AmountOption.java | 10 +- .../bbps/entites/BillerDetails.java | 6 +- .../entites/BillerPlanResponseParams.java | 3 +- .../bbps/entites/CustomParam.java | 39 +++ .../bbps/entites/CustomerParamGroups.java | 2 + .../bbps/entites/DispositionDetails.java | 25 ++ .../bbps/entites/InterchangeFee.java | 4 +- .../bbps/entites/PaymentChannel.java | 8 +- .../bbps/entites/PaymentMode.java | 16 +- .../repository/DispositionRepository.java | 9 + .../bbps/service/MasterDataService.java | 2 + .../bbps/serviceImpl/AgentServiceImpl.java | 237 +++++++++--------- .../serviceImpl/MasterDataServiceImpl.java | 193 ++++++++++---- .../bbps/serviceImpl/PaymentServiceImpl.java | 131 ++++++---- .../bbps/util/BBPSConstant.java | 1 + src/main/resources/application.properties | 2 + 30 files changed, 615 insertions(+), 293 deletions(-) rename src/main/java/com/billpaymentservice/bbps/dto/{CustomParam.java => CustomParamDTO.java} (94%) create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/DeviceBlockTag.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java delete mode 100644 src/main/java/com/billpaymentservice/bbps/dto/TransactionDAO.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java create mode 100644 src/main/java/com/billpaymentservice/bbps/dto/response/DispositionResponse.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/DispositionRepository.java diff --git a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java index 828a1a2..c04f7b6 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java @@ -57,6 +57,13 @@ public class MasterDataController { return ResponseEntity.ok(masterDataService.getContactMaster(contactMasterRequest)); } + @PostMapping(value = "/getDispostionDetail", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getDispostionDetail( + @Validated @RequestBody ContactMasterRequest contactMasterRequest ) { + return ResponseEntity.ok(masterDataService.getDispositionDetails()); + } + + /** Get CustomerParam by billerId.The parameter is different from the data we are getting in the billerDetail **/ @PostMapping(value = "/getCustomerParamDetails", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getBillerDetails( @@ -70,5 +77,6 @@ public class MasterDataController { public ResponseModel fetchMasterData(@Validated @RequestBody MasterRequest masterRequest) { return masterDataService.getMasterData(masterRequest); } + } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java b/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java index 9c4b85a..efda03a 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java @@ -1,4 +1,5 @@ package com.billpaymentservice.bbps.dto; + import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -10,13 +11,12 @@ public class AgentFundTransfer { @NotBlank private String fundTxnReferenceId; @NotBlank private String fundTxnRemarks; @NotBlank private String fundTxnDate; - @NotNull private Double fundTxnAmt; - @NotBlank private String fundUTR; + private String fundRespRemarks; private String agentNpciId; private String txnRefId; - + private String tenantId; @NotBlank private String fundStatus; // FUND_TRANSFER_SUCCESS or FUND_TRANSFER_FAILED } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/CustomParam.java b/src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java similarity index 94% rename from src/main/java/com/billpaymentservice/bbps/dto/CustomParam.java rename to src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java index 6229cf3..1fa4940 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/CustomParam.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java @@ -11,7 +11,7 @@ import lombok.Setter; @Setter @AllArgsConstructor @NoArgsConstructor -public class CustomParam { +public class CustomParamDTO { private String customParamName; private String dataType; private boolean optional; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/DeviceBlockTag.java b/src/main/java/com/billpaymentservice/bbps/dto/DeviceBlockTag.java new file mode 100644 index 0000000..74ded7b --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/DeviceBlockTag.java @@ -0,0 +1,12 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DeviceBlockTag { + private String name; + private String tagId; + private String value; +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java new file mode 100644 index 0000000..4297bd6 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java @@ -0,0 +1,14 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter + +public class DispositionsDTO { + private String dispositionId; + private String dispositionDescr; + private String tenantId; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/GeneralResp.java b/src/main/java/com/billpaymentservice/bbps/dto/GeneralResp.java index 495c3a0..48962aa 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/GeneralResp.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/GeneralResp.java @@ -4,11 +4,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; @Getter @Setter @AllArgsConstructor @NoArgsConstructor +@ToString public class GeneralResp { private String statusCode; private String status; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/TransactionDAO.java b/src/main/java/com/billpaymentservice/bbps/dto/TransactionDAO.java deleted file mode 100644 index 04c29e3..0000000 --- a/src/main/java/com/billpaymentservice/bbps/dto/TransactionDAO.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.billpaymentservice.bbps.dto; - -import java.time.LocalDateTime; -import java.util.List; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - public class TransactionDAO { - - @NotBlank private String txnId; - @NotBlank private String refId; - - private String txnNpciId; - - @NotBlank private String orderId; - @NotBlank private String billId; - @NotBlank private String userType; - @NotBlank private String userId; - - @NotNull private Double txnAmount; - @NotNull private Double totalTxnAmount; - - @NotBlank private String billerId; - @NotBlank private String billerCategory; - @NotBlank private String billerName; - - private String clientReqId; - private String offUsPay; - private String splitPay; - private String quickPay; - private String paymentMode; - - private Double custConvFee; - private String currency; - private String status; - private String requestedIp; - private String customerMobNo; - private String macAddress; - - private Double splitPayAmount; - private Double couCustConvFee; - - private Boolean settlementVerification; - private String fundTxnType; - private String reason; - - private List amountTags; - private List customerParamsDAOS; - private List paymentInformation; - - private List customerParamsDAO; - - private String planId; - private String planType; - - private LocalDateTime creationDate; - private LocalDateTime modifiedDate; - - private Long createdEpochDate; - private Long modifiedEpochDate; - } - - diff --git a/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java new file mode 100644 index 0000000..34952da --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java @@ -0,0 +1,75 @@ +package com.billpaymentservice.bbps.dto; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonIgnoreProperties(ignoreUnknown = true) + +public class TransactionDTO { + + @NotBlank private String txnId; + @NotBlank private String refId; + private String txnNpciId; + private String paymentRefId; + private String remitterName; + + + @NotBlank private String orderId; + @NotBlank private String billId; + @NotBlank private String userType; + @NotBlank private String userId; + + @NotNull private Double txnAmount; + @NotNull private Double totalTxnAmount; + + @NotBlank private String billerId; + @NotBlank private String billerCategory; + @NotBlank private String billerName; + + private String clientReqId; + private String offUsPay; + private String splitPay; + private String quickPay; + private String paymentMode; + private String agentPaymentInformation; + + private Double custConvFee; + private String currency; + private String status; + private String requestedIp; + private String customerMobNo; + private String macAddress; + + private Double splitPayAmount; + private Double couCustConvFee; + + private Boolean settlementVerification; + private String fundTxnType; + private String reason; + + private List amountTags; + private List customerParamsDAOS; + private List paymentInformation; + private List deviceBlockTags; + + + private List customerParamsDAO; + + private String planId; + private String planType; + + // ✅ Date fields as String (for JSON compatibility) + private String creationDate; + private String modifiedDate; + + private Long createdEpochDate; + private Long modifiedEpochDate; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java new file mode 100644 index 0000000..33df692 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java @@ -0,0 +1,5 @@ +package com.billpaymentservice.bbps.dto.request; + +public class DispositionRequest extends BaseClass { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/BillPaymentResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/BillPaymentResponse.java index 93d0fcd..1654b5f 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/BillPaymentResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/BillPaymentResponse.java @@ -3,9 +3,11 @@ package com.billpaymentservice.bbps.dto.response; import com.billpaymentservice.bbps.dto.GeneralResp; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter +@ToString public class BillPaymentResponse { private String txnId; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java b/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java index f57f510..102b1c7 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java @@ -1,9 +1,8 @@ package com.billpaymentservice.bbps.dto.response; import java.util.List; - import com.billpaymentservice.bbps.dto.ContactMaster; -import com.billpaymentservice.bbps.dto.CustomParam; +import com.billpaymentservice.bbps.dto.CustomParamDTO; import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.entites.CustomerParam; import com.fasterxml.jackson.annotation.JsonProperty; @@ -20,5 +19,5 @@ import lombok.Setter; public class CustomParamResp { @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private GeneralResp generalResp; - private List customParamResp; + private List customParamResp; } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/DispositionResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/DispositionResponse.java new file mode 100644 index 0000000..ac57782 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/DispositionResponse.java @@ -0,0 +1,20 @@ +package com.billpaymentservice.bbps.dto.response; + +import java.util.List; + +import com.billpaymentservice.bbps.dto.DispositionsDTO; +import com.billpaymentservice.bbps.dto.GeneralResp; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class DispositionResponse { + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private GeneralResp generalResp; + List dispositionsList; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/TransactionStatusResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/TransactionStatusResponse.java index 258f6bc..27d61cc 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/TransactionStatusResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/TransactionStatusResponse.java @@ -2,7 +2,7 @@ package com.billpaymentservice.bbps.dto.response; import com.billpaymentservice.bbps.dto.AgentFundTransfer; import com.billpaymentservice.bbps.dto.GeneralResp; -import com.billpaymentservice.bbps.dto.TransactionDAO; +import com.billpaymentservice.bbps.dto.TransactionDTO; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; @@ -13,7 +13,7 @@ import lombok.Setter; public class TransactionStatusResponse { @JsonProperty("transactionDAO") - private TransactionDAO transactionDAO; + private TransactionDTO transactionDAO; @JsonProperty("agentFundTransfer") private AgentFundTransfer agentFundTransfer; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java index c786030..906ac37 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java @@ -5,10 +5,12 @@ import jakarta.persistence.*; import jakarta.validation.constraints.*; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter @Entity +@ToString @Table(name = "additional_info") public class AdditionalInfo { diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java b/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java index 1b336d0..d1fab78 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java @@ -1,12 +1,10 @@ package com.billpaymentservice.bbps.entites; - import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.List; - -import com.billpaymentservice.bbps.entites.BillerResponseParams; +import com.fasterxml.jackson.annotation.JsonProperty; @Entity @Table(name = "amount_option") @@ -15,9 +13,9 @@ import com.billpaymentservice.bbps.entites.BillerResponseParams; public class AmountOption { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "amount_option_id") - private Long id; + @JsonProperty("amountOptionId") // ✅ JSON field map karo + private String amountOptionId; // ✅ String type, manual ID @ElementCollection @CollectionTable( @@ -31,4 +29,4 @@ public class AmountOption { @ManyToOne @JoinColumn(name = "biller_response_id", nullable = false) private BillerResponseParams billerResponseParams; -} +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java index 804d110..1737bf7 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java @@ -147,8 +147,10 @@ public class BillerDetails { @OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true) private List billerAdditionalInfos; - @OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true) - private List billerAdditionalInfoPayments; + /* + * @OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = + * true) private List billerAdditionalInfoPayments; + */ @OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true) private List interchangeFeeConves; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java index b5b8719..ac919a9 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java @@ -4,7 +4,7 @@ import java.util.List; import lombok.Getter; import lombok.Setter; - +import lombok.ToString; import jakarta.persistence.*; import jakarta.validation.constraints.*; import lombok.Getter; @@ -14,6 +14,7 @@ import java.util.List; @Getter @Setter @Entity +@ToString @Table(name = "biller_plan_response_params") public class BillerPlanResponseParams { diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java new file mode 100644 index 0000000..e6b782e --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java @@ -0,0 +1,39 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "custom_param") +public class CustomParam { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "custom_param_name") + private String customParamName; + + @Column(name = "data_type") + private String dataType; + + @Column(name = "optional") + private Boolean optional; + + @Column(name = "min_length") + private Integer minLength; + + @Column(name = "max_length") + private Integer maxLength; + + @Column(name = "regex") + private String regex; + + @Column(name = "visibility") + private Boolean visibility; + + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java index c99e01f..f422665 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java @@ -3,12 +3,14 @@ package com.billpaymentservice.bbps.entites; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import lombok.ToString; import java.util.List; @Getter @Setter @Entity +@ToString @Table(name = "customer_param_groups") public class CustomerParamGroups { diff --git a/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java new file mode 100644 index 0000000..c0cdba9 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java @@ -0,0 +1,25 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.*; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@Entity +@Table(name = "disposition_details") +@ToString +public class DispositionDetails { + + @Id + @Column(name = "disposition_id", nullable = false, unique = true) + private String dispositionId; // UUID type string + + @Column(name = "disposition_descr", nullable = false) + private String dispositionDescr; + + @Column(name = "tenant_id") + private String tenantId; +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java index 308c752..0343502 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java @@ -4,8 +4,7 @@ import java.util.List; import lombok.Getter; import lombok.Setter; - - +import lombok.ToString; import jakarta.persistence.*; import jakarta.validation.constraints.*; import lombok.Getter; @@ -15,6 +14,7 @@ import java.util.List; @Getter @Setter @Entity +@ToString @Table(name = "interchange_fee") public class InterchangeFee { diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java b/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java index 6f5962d..5c12b4e 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java @@ -4,18 +4,20 @@ import jakarta.persistence.*; import jakarta.validation.constraints.*; import lombok.Getter; import lombok.Setter; +import lombok.ToString; + import com.fasterxml.jackson.annotation.JsonProperty; @Getter @Setter @Entity +@ToString @Table(name = "payment_channel") public class PaymentChannel { - @Id + @Id @Column(name = "payment_channel_limit_id") - @JsonProperty("paymentChannelLimitId") // 👈 Map JSON field to this property - private String id; // Primary key (manual, not auto-generated) + private String paymentChannelLimitId; // Primary key (manual, not auto-generated) @NotBlank(message = "Payment channel is required") @Column(name = "payment_channel", nullable = false) diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java b/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java index fce2f76..82babca 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java @@ -2,15 +2,27 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; -import jakarta.validation.constraints.*; +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.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.PositiveOrZero; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter @Entity @Table(name = "biller_payment_modes") +@ToString public class PaymentMode { @Id diff --git a/src/main/java/com/billpaymentservice/bbps/repository/DispositionRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/DispositionRepository.java new file mode 100644 index 0000000..aade2b5 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/DispositionRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.DispositionDetails; + +public interface DispositionRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java index 2e3f3e6..fb497c5 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java @@ -19,4 +19,6 @@ public interface MasterDataService { public ResponseModel getContactMaster(ContactMasterRequest contactMasterRequest); + public ResponseModel getDispositionDetails(); + } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index 9c031db..9324377 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -49,132 +49,145 @@ public class AgentServiceImpl implements AgentService { this.beneficiaryDetailsRepository=beneficiaryDetailsRepository; } - @Override - public ResponseModel initiateBillFetch(FetchBillRequest fetchBillRequest) { - String url = agentDtaUrl+BBPSConstant.BILL_FETCH_INTI; - System.out.println(url); - - 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); + @Override + public ResponseModel initiateBillFetch(FetchBillRequest fetchBillRequest) { + String url = agentDtaUrl + BBPSConstant.BILL_FETCH_INTI; + System.out.println(url); + + 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); - + ResponseModel responseModel = new ResponseModel(); - ResponseModel responseModel = new ResponseModel(); + try { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - try { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + // ✅ 1st API Call + String json = objectMapper.writeValueAsString(fetchBillRequest); + Map responseMap = httpService.postRequest(url, json, headers); + String responseData = responseMap.get("data"); - // ✅ Convert request to JSON - String json = objectMapper.writeValueAsString(fetchBillRequest); + log.info("📦 1st API Response: {}", responseData); - // ✅ Call the API using httpService - Map responseMap = httpService.postRequest(url, json, headers); - String responseData = responseMap.get("data"); + if (responseData == null || responseData.isEmpty()) { + throw new CustomException("Empty response from BBPS server"); + } - log.info("📦 Bill Fetch API Response: {}", responseData); - - if (responseData == null || responseData.isEmpty()) { - throw new CustomException("Empty response from BBPS server"); - } - - // ✅ Convert JSON string → Map - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - - // ✅ Validate generalResp - if (!dataMap.containsKey("genericResponse")) { - throw new CustomException("Invalid response structure from BBPS"); - } - - // ✅ Convert to your custom DTO - FetchBillResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillResponse.class); - GeneralResponse generalResponse = fetchBillResponse.getGenericResponse(); - // - //start a new thread here - helper.startPolling(fetchBillResponse, - res -> { - BillFetchByBillIdRequest pollReq = new BillFetchByBillIdRequest(); - pollReq.setBillId(res.getBillId()); - return fetchBillById(pollReq); - }, - 3, // interval in seconds - 15 // total time in seconds - ); - + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + if (!dataMap.containsKey("genericResponse")) { + throw new CustomException("Invalid response structure from BBPS"); + } - // ✅ Build final ResponseModel - responseModel = new ResponseModel( - generalResponse.getMessage(), - generalResponse.getStatus(), - Integer.parseInt(generalResponse.getStatusCode()), - fetchBillResponse - ); + FetchBillResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillResponse.class); - } catch (Exception e) { - log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - responseModel.setStatus("500"); - responseModel.setMessage("Exception occurred"); - responseModel.setData(e.getMessage()); - } + // ✅ IMMEDIATE 2nd API CALL (SYNCHRONOUS) + BillFetchByBillIdRequest pollReq = new BillFetchByBillIdRequest(); + pollReq.setBillId(fetchBillResponse.getBillId()); + + // ✅ This will wait for the response + ResponseModel secondApiResponse = fetchBillById(pollReq); + + // ✅ Return directly the second API response + return secondApiResponse; - return responseModel; - } + } catch (Exception e) { + log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); + responseModel.setStatus("500"); + responseModel.setMessage("Exception occurred"); + responseModel.setData(e.getMessage()); + return responseModel; + } + } + + @Override + public ResponseModel fetchBillById(BillFetchByBillIdRequest billFetchByBillIdRequest) { - @Override - public ResponseModel fetchBillById(BillFetchByBillIdRequest billFetchByBillIdRequest) { - - String billId = billFetchByBillIdRequest.getBillId(); - String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID+billId; - System.out.print(fullUrl); - - 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); - - Map responseMap = httpService.getRequest(fullUrl,headers); - String responseData = responseMap.get("data"); - log.info("data is :{}", responseData); - + 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 + billId; - ObjectMapper objectMapper = new ObjectMapper(); + System.out.print(fullUrl); - try { - Map dataMap = objectMapper.readValue(responseData, - new TypeReference>() { - }); - if (!dataMap.containsKey("genericResponse")) { - throw new CustomException(String.valueOf(dataMap.get("message")), // message - String.valueOf(dataMap.get("status")), // status - Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) - String.valueOf(dataMap.get("remarks")) ); - } - - BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class); - - GeneralResp generalResp = responseWrapper.getGenericResponse(); - - ResponseModel responseModel=new ResponseModel( generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper); - - return responseModel; + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); - throw new CustomException("Invalid JSON received from API"); - } + 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(); + + int maxWaitTimeMs = 40000; // 40 seconds + int intervalMs = 6000; // 3 seconds + long startTime = System.currentTimeMillis(); + + while (true) { + Map responseMap = httpService.getRequest(fullUrl, headers); + String responseData = responseMap.get("data"); + log.info("data is :{}", responseData); + + try { + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + + if (!dataMap.containsKey("genericResponse")) { + 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")) + ); + } + + BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class); + GeneralResp generalResp = responseWrapper.getGenericResponse(); + + String status = generalResp.getStatus(); + + // ✅ Agar status "IN_PROGRESS" hai to wait and retry + if ("INPROGRESS".equalsIgnoreCase(status)) { + if (System.currentTimeMillis() - startTime > maxWaitTimeMs) { + // 40 sec ke baad bhi IN_PROGRESS -> Timeout exception + throw new CustomException("Timeout waiting for bill fetch completion", + "FAILED", 408, "Bill fetch still in progress after 40 seconds"); + } + + try { + Thread.sleep(intervalMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new CustomException("Thread interrupted during retry"); + } + + log.info("Bill still in progress... retrying after {} seconds", (intervalMs / 1000)); + continue; // retry again + } + + // ✅ Agar status IN_PROGRESS nahi hai (e.g., SUCCESS / FAILED), return result + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); + + return responseModel; + + } catch (JsonProcessingException e) { + log.error("Error parsing responseData JSON: {}", e.getMessage()); + throw new CustomException("Invalid JSON received from API"); + } + } + } - } } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index b73a993..f33fdf5 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -5,17 +5,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import org.modelmapper.ModelMapper; import org.modelmapper.convention.MatchingStrategies; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import com.billpaymentservice.bbps.dto.BillerDTO; +import com.billpaymentservice.bbps.dto.DispositionsDTO; import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.MasterApiResponse; import com.billpaymentservice.bbps.dto.ResponseModel; @@ -29,12 +28,19 @@ import com.billpaymentservice.bbps.dto.response.BillerResponse; import com.billpaymentservice.bbps.dto.response.CategoryResponse; import com.billpaymentservice.bbps.dto.response.ContactMasterResponse; import com.billpaymentservice.bbps.dto.response.CustomParamResp; +import com.billpaymentservice.bbps.dto.response.DispositionResponse; +import com.billpaymentservice.bbps.entites.AmountOption; import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; import com.billpaymentservice.bbps.entites.BillPayment; import com.billpaymentservice.bbps.entites.BillerDetails; +import com.billpaymentservice.bbps.entites.BillerResponseParams; +import com.billpaymentservice.bbps.entites.DispositionDetails; +import com.billpaymentservice.bbps.entites.InterchangeFee; +import com.billpaymentservice.bbps.entites.InterchangeFeeDetail; import com.billpaymentservice.bbps.exception.AppException; import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.repository.BillerDataRepository; +import com.billpaymentservice.bbps.repository.DispositionRepository; import com.billpaymentservice.bbps.repository.MerchantRepository; import com.billpaymentservice.bbps.service.MasterDataService; import com.billpaymentservice.bbps.util.BBPSConstant; @@ -55,6 +61,7 @@ public class MasterDataServiceImpl implements MasterDataService { private MerchantRepository merchantRegisterRepo; private HttpClientApi httpClientApi; + private final DispositionRepository dispositionRepository; private Helper helper; private final BillerDataRepository billerDataRespository; @@ -68,70 +75,109 @@ public class MasterDataServiceImpl implements MasterDataService { HttpService httpService, HttpClientApi httpClientApi, Helper helper, - BillerDataRepository billerDataRespository + BillerDataRepository billerDataRespository, + DispositionRepository dispositionRepository ) { this.merchantRegisterRepo = merchantRegisterRepo; this.httpService = httpService; this.httpClientApi = httpClientApi; this.helper = helper; this.billerDataRespository=billerDataRespository; + this.dispositionRepository=dispositionRepository; } @Override public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest) { - - String billerId = billerDetailRequest.getBillerId(); - String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL+billerId; + + String billerId = billerDetailRequest.getBillerId(); + String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL+billerId; + Map responseMap = httpService.getRequest(fullUrl); + String responseData = responseMap.get("data"); + log.info("data is :{}", responseData); - Map responseMap = httpService.getRequest(fullUrl); - String responseData = responseMap.get("data"); - log.info("data is :{}", responseData); + ObjectMapper objectMapper = new ObjectMapper(); - ObjectMapper objectMapper = new ObjectMapper(); + try { + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + if (!dataMap.containsKey("generalResp")) { + throw new CustomException(String.valueOf(dataMap.get("message")), // message + String.valueOf(dataMap.get("status")), // status + Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) + String.valueOf(dataMap.get("remarks")) ); + } - try { - Map dataMap = objectMapper.readValue(responseData, - new TypeReference>() { - }); - if (!dataMap.containsKey("generalResp")) { - throw new CustomException(String.valueOf(dataMap.get("message")), // message - String.valueOf(dataMap.get("status")), // status - Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) - String.valueOf(dataMap.get("remarks")) ); - } - - BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); - ModelMapper mapper = new ModelMapper(); - mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - BillerDetails entity = mapper.map(responseWrapper.getBillerDAO(), BillerDetails.class); + BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + BillerDetails entity = mapper.map(responseWrapper.getBillerDAO(), BillerDetails.class); + + // Manually set parent reference + if (entity.getBillerPaymentModes() != null) { + entity.getBillerPaymentModes().forEach(m -> m.setBiller(entity)); + } + if (entity.getBillerPaymentChannels() != null) { + entity.getBillerPaymentChannels().forEach(c -> c.setBiller(entity)); + } + if (entity.getBillerCustomerParams() != null) { + entity.getBillerCustomerParams().forEach(p -> p.setBiller(entity)); + } + if (entity.getBillerAdditionalInfos() != null) { + entity.getBillerAdditionalInfos().forEach(a -> a.setBiller(entity)); + } + if (entity.getInterchangeFees() != null) { + for (InterchangeFee fee : entity.getInterchangeFees()) { + fee.setBiller(entity); // link InterchangeFee → BillerDetails + + if (fee.getInterchangeFeeDetails() != null) { + for (InterchangeFeeDetail detail : fee.getInterchangeFeeDetails()) { + detail.setInterchangeFee(fee); // link InterchangeFeeDetail → InterchangeFee + } + } + } + } - System.out.println(entity); - - if (entity != null) - { - billerDataRespository.save(entity); - } - else { - LOGGER.warn("No biller found in response to save."); - } - + if (entity.getInterchangeFeeConves() != null) { + entity.getInterchangeFeeConves().forEach(fc -> fc.setBiller(entity)); + } - - ResponseModel responseModel=new ResponseModel( generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper); - - return responseModel; + // For OneToOne relationships + if (entity.getCustomerParamGroups() != null) + entity.getCustomerParamGroups().setBiller(entity); - } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); - throw new CustomException("Invalid JSON received from API"); - } + if (entity.getBillerPlanResponseParams() != null) + entity.getBillerPlanResponseParams().setBiller(entity); + // 🔥🔥🔥 YEH MISSING CODE ADD KARO 🔥🔥🔥 + if (entity.getBillerResponseParams() != null) { + BillerResponseParams responseParams = entity.getBillerResponseParams(); + responseParams.setBiller(entity); // Parent reference + + // 🔥 AMOUNT OPTIONS KE RELATIONSHIPS SET KARO + if (responseParams.getAmountOptions() != null) { + for (AmountOption option : responseParams.getAmountOptions()) { + option.setBillerResponseParams(responseParams); // YEH MISSING THA + } + } + } + billerDataRespository.save(entity); + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); + + return responseModel; + + } catch (JsonProcessingException e) { + log.error("Error parsing responseData JSON: {}", e.getMessage()); + throw new CustomException("Invalid JSON received from API"); + } } @Override @@ -274,4 +320,55 @@ public class MasterDataServiceImpl implements MasterDataService { return new ResponseModel(); } + @Override + public ResponseModel getDispositionDetails() { + String fullUrl=masterRegisterUrl+BBPSConstant.DISPOSTION_URL; + Map responseMap = httpService.getRequest(fullUrl); + String responseData = responseMap.get("data"); + + ObjectMapper objectMapper = new ObjectMapper(); + + try { + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() { + }); + if (!dataMap.containsKey("generalResp")) { + throw new CustomException(String.valueOf(dataMap.get("message")), // message + String.valueOf(dataMap.get("status")), // status + Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) + String.valueOf(dataMap.get("remarks")) ); + } + + DispositionResponse responseWrapper = objectMapper.convertValue(dataMap, DispositionResponse.class); + System.out.println(responseWrapper); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + List entities = responseWrapper.getDispositionsList() + .stream() + .map(dto -> mapper.map(dto, DispositionDetails.class)) + .collect(Collectors.toList()); + + System.out.println(entities); + + if (entities != null) + { + dispositionRepository.saveAll(entities); + } + else { + LOGGER.warn("No disposition found in response to save."); + } + + ResponseModel responseModel=new ResponseModel( generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper); + + return responseModel; + } catch (JsonProcessingException e) { + log.error("Error parsing responseData JSON: {}", e.getMessage()); + throw new CustomException("Invalid JSON received from API"); + } + + } } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java index ca93664..89c2dd8 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java @@ -100,6 +100,7 @@ public class PaymentServiceImpl implements PaymentService { // ✅ Convert to your custom DTO BillPaymentResponse billPaymentResponse = objectMapper.convertValue(dataMap, BillPaymentResponse.class); + System.out.print(billPaymentResponse); GeneralResp generalResponse = billPaymentResponse.getGenericResponse(); // // start a new thread here @@ -109,15 +110,16 @@ public class PaymentServiceImpl implements PaymentService { * return fetchBillById(pollReq); }, 3, // interval in seconds 15 // total time * in seconds ); */ + ModelMapper mapper = new ModelMapper(); mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); BillPayment entity = mapper.map(billPaymentResponse, BillPayment.class); paymentRepository.save(entity); - - // ✅ Build final ResponseModel - responseModel = new ResponseModel(generalResponse.getMessage(), generalResponse.getStatus(), - Integer.parseInt(generalResponse.getStatusCode()), billPaymentResponse); - + TransactionStatusRequest transactionStatusRequest=new TransactionStatusRequest(); + //call the checkTransactionStatus + transactionStatusRequest.setTxnId(billPaymentResponse.getTxnId()); + System.out.println(transactionStatusRequest); + responseModel= checkTrasactionStatus(transactionStatusRequest); } catch (Exception e) { LOGGER.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); responseModel.setStatus("500"); @@ -131,49 +133,88 @@ public class PaymentServiceImpl implements PaymentService { @Override public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest) { - String url=paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL+transactionStatusRequest.getTxnId(); - - 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); - - Map responseMap = httpService.getRequest(url,headers); - String responseData = responseMap.get("data"); - LOGGER.info("data is :{}", responseData); - + String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - ObjectMapper objectMapper = new ObjectMapper(); + 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); - try { - Map dataMap = objectMapper.readValue(responseData, - new TypeReference>() { - }); - if (!dataMap.containsKey("genericResponse")) { - throw new CustomException(String.valueOf(dataMap.get("message")), // message - String.valueOf(dataMap.get("status")), // status - Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) - String.valueOf(dataMap.get("remarks")) ); - } - - TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); - - GeneralResp generalResp = responseWrapper.getGeneralResp(); - - ResponseModel responseModel=new ResponseModel( generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper); - - return responseModel; + ObjectMapper objectMapper = new ObjectMapper(); - } catch (JsonProcessingException e) { - LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); - throw new CustomException("Invalid JSON received from API"); - } + // ✅ Polling configuration + long startTime = System.currentTimeMillis(); + long maxWaitTimeMs = 40000; // 40 seconds timeout + long intervalMs = 5000; // retry every 5 seconds + + while (true) { + Map responseMap = httpService.getRequest(url, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Transaction status response data: {}", responseData); + + try { + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + + // If genericResponse key missing, throw exception + if (!dataMap.containsKey("generalResp")) { + 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")) + ); + } + + + // Convert into proper DTO + TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + LOGGER.info("Current transaction status: {}", status); + + // ✅ If IN_PROGRESS → wait & retry + if ("INPROGRESS".equalsIgnoreCase(status)) { + + if (System.currentTimeMillis() - startTime > maxWaitTimeMs) { + // Timeout after 40 sec + throw new CustomException( + "Timeout waiting for transaction completion", + "FAILED", + 408, + "Transaction still in progress after 40 seconds" + ); + } + + try { + Thread.sleep(intervalMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new CustomException("Thread interrupted during retry"); + } + + LOGGER.info("Transaction still IN_PROGRESS... retrying after {} seconds", (intervalMs / 1000)); + continue; // retry + } + + // ✅ If status is SUCCESS / FAILED / etc. → return response + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); + + return responseModel; + + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); + 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 d1f0b6b..29ee0b2 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java @@ -32,5 +32,6 @@ public class BBPSConstant { public static final String BILL_FETCH_BY_ID="/couapp/bills/fetch/byId?billId="; 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"; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ddcf1e0..44ff981 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,6 +7,8 @@ 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 + # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS From 680d05b5bdd01627a08dd85561f1dc03bed5990f Mon Sep 17 00:00:00 2001 From: himanshu Date: Mon, 3 Nov 2025 10:49:04 +0530 Subject: [PATCH 2/3] merging code arham1 --- pom.xml | 157 +++++++++--------- .../bbps/serviceImpl/AgentServiceImpl.java | 1 - .../serviceImpl/MasterDataServiceImpl.java | 60 +------ .../bbps/serviceImpl/PaymentServiceImpl.java | 3 +- .../bbps/util/EntityRelationshipUtil.java | 66 ++++++++ .../bbps/BbpsApplicationTests.java | 9 +- .../controller/TestHttpControllerTest.java | 28 ---- 7 files changed, 150 insertions(+), 174 deletions(-) create mode 100644 src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java rename src/test/java/com/{lincpay => billpaymentservice}/bbps/BbpsApplicationTests.java (64%) delete mode 100644 src/test/java/com/billpaymentservice/bbps/controller/TestHttpControllerTest.java diff --git a/pom.xml b/pom.xml index c73831f..19bf1de 100644 --- a/pom.xml +++ b/pom.xml @@ -2,55 +2,38 @@ + 4.0.0 + org.springframework.boot spring-boot-starter-parent - 3.2.5 - + 3.2.7 + + com.billpaymentservice.bbps bbps 0.0.1-SNAPSHOT war bbps This is the bbps switch project - - - - - - - - - - - - - + 17 + - - io.github.resilience4j - resilience4j-spring-boot3 - 2.2.0 - + org.springframework.boot - spring-boot-starter-aop + spring-boot-starter - - org.springframework.boot - spring-boot-starter-data-jpa - org.springframework.boot spring-boot-starter-web - org.apache.httpcomponents httpclient @@ -58,59 +41,51 @@ - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - 2.13.3 - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.postgresql - postgresql - runtime - - - org.projectlombok - lombok - 1.18.30 - provided + spring-boot-starter-data-jpa - com.nimbusds - nimbus-jose-jwt - 9.37 + org.springframework.boot + spring-boot-starter-aop + + org.springframework.boot spring-boot-starter-tomcat provided - - org.springframework.boot - spring-boot-starter - - - org.modelmapper - modelmapper - 3.2.0 - + - org.springframework.boot - spring-boot-starter-test - test + org.postgresql + postgresql + runtime + + - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.5.0 + io.github.resilience4j + resilience4j-spring-boot3 + 2.2.0 + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + + com.nimbusds + nimbus-jose-jwt + 9.37 + + + org.apache.httpcomponents.client5 httpclient5 @@ -121,32 +96,56 @@ httpcore5 5.2.5 - org.apache.httpcomponents.core5 httpcore5-h2 5.2.5 + + + org.modelmapper + modelmapper + 3.2.0 + - + - org.apache.httpcomponents.client5 - httpclient5-fluent - 5.3.1 + org.projectlombok + lombok + 1.18.30 + provided + + + + + org.springframework.boot + spring-boot-devtools runtime + true + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot spring-boot-configuration-processor true - - org.springframework.boot - spring-boot-configuration-processor - true - + @@ -159,7 +158,7 @@ org.projectlombok lombok - 1.18.42 + 1.18.30 @@ -168,14 +167,6 @@ org.springframework.boot spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index 9324377..aceaffd 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -61,7 +61,6 @@ public class AgentServiceImpl implements AgentService { headers.set("agentId", headersData.getAgentId()); headers.set("tenantId", headersData.getTenantId()); headers.setContentType(MediaType.APPLICATION_JSON); - ResponseModel responseModel = new ResponseModel(); try { diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index f33fdf5..0142d2c 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -44,6 +44,7 @@ import com.billpaymentservice.bbps.repository.DispositionRepository; import com.billpaymentservice.bbps.repository.MerchantRepository; import com.billpaymentservice.bbps.service.MasterDataService; 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; @@ -62,10 +63,8 @@ public class MasterDataServiceImpl implements MasterDataService { private MerchantRepository merchantRegisterRepo; private HttpClientApi httpClientApi; private final DispositionRepository dispositionRepository; - private Helper helper; + private final Helper helper; private final BillerDataRepository billerDataRespository; - - private static final Logger log = LoggerFactory.getLogger(MasterDataServiceImpl.class); private final HttpService httpService; private final ObjectMapper objectMapper = new ObjectMapper(); @@ -109,69 +108,19 @@ public class MasterDataServiceImpl implements MasterDataService { Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) String.valueOf(dataMap.get("remarks")) ); } - BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); GeneralResp generalResp = responseWrapper.getGeneralResp(); ModelMapper mapper = new ModelMapper(); mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); BillerDetails entity = mapper.map(responseWrapper.getBillerDAO(), BillerDetails.class); - - // Manually set parent reference - if (entity.getBillerPaymentModes() != null) { - entity.getBillerPaymentModes().forEach(m -> m.setBiller(entity)); - } - if (entity.getBillerPaymentChannels() != null) { - entity.getBillerPaymentChannels().forEach(c -> c.setBiller(entity)); - } - if (entity.getBillerCustomerParams() != null) { - entity.getBillerCustomerParams().forEach(p -> p.setBiller(entity)); - } - if (entity.getBillerAdditionalInfos() != null) { - entity.getBillerAdditionalInfos().forEach(a -> a.setBiller(entity)); - } - if (entity.getInterchangeFees() != null) { - for (InterchangeFee fee : entity.getInterchangeFees()) { - fee.setBiller(entity); // link InterchangeFee → BillerDetails - - if (fee.getInterchangeFeeDetails() != null) { - for (InterchangeFeeDetail detail : fee.getInterchangeFeeDetails()) { - detail.setInterchangeFee(fee); // link InterchangeFeeDetail → InterchangeFee - } - } - } - } - - if (entity.getInterchangeFeeConves() != null) { - entity.getInterchangeFeeConves().forEach(fc -> fc.setBiller(entity)); - } - - // For OneToOne relationships - if (entity.getCustomerParamGroups() != null) - entity.getCustomerParamGroups().setBiller(entity); - - if (entity.getBillerPlanResponseParams() != null) - entity.getBillerPlanResponseParams().setBiller(entity); - - // 🔥🔥🔥 YEH MISSING CODE ADD KARO 🔥🔥🔥 - if (entity.getBillerResponseParams() != null) { - BillerResponseParams responseParams = entity.getBillerResponseParams(); - responseParams.setBiller(entity); // Parent reference - - // 🔥 AMOUNT OPTIONS KE RELATIONSHIPS SET KARO - if (responseParams.getAmountOptions() != null) { - for (AmountOption option : responseParams.getAmountOptions()) { - option.setBillerResponseParams(responseParams); // YEH MISSING THA - } - } - } - billerDataRespository.save(entity); + EntityRelationshipUtil.linkBillerRelationships(entity); + // billerDataRespository.save(entity); ResponseModel responseModel = new ResponseModel( generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper ); - return responseModel; } catch (JsonProcessingException e) { @@ -216,7 +165,6 @@ public class MasterDataServiceImpl implements MasterDataService { Integer.parseInt(generalResp.getStatusCode()), responseWrapper ); - return responseModel; } catch (JsonProcessingException e) { diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java index 89c2dd8..c98fe39 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java @@ -59,7 +59,7 @@ public class PaymentServiceImpl implements PaymentService { public ResponseModel initiatePayment(BillPaymentRequest billPaymentRequest) { String url = paymentUrl + BBPSConstant.PAYMENT_URL; - System.out.println(url); + System.out.println(url); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); @@ -102,6 +102,7 @@ public class PaymentServiceImpl implements PaymentService { BillPaymentResponse billPaymentResponse = objectMapper.convertValue(dataMap, BillPaymentResponse.class); System.out.print(billPaymentResponse); GeneralResp generalResponse = billPaymentResponse.getGenericResponse(); + // // start a new thread here /* diff --git a/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java b/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java new file mode 100644 index 0000000..86048d1 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java @@ -0,0 +1,66 @@ +package com.billpaymentservice.bbps.util; + +import com.billpaymentservice.bbps.entites.*; + +public class EntityRelationshipUtil { + + private EntityRelationshipUtil() { + // prevent instantiation + } + + /** + * Links all parent-child relationships for BillerDetails and nested entities. + * Ensures bidirectional JPA relationships are correctly set before saving. + */ + public static void linkBillerRelationships(BillerDetails entity) { + + if (entity == null) return; + + if (entity.getBillerPaymentModes() != null) { + entity.getBillerPaymentModes().forEach(m -> m.setBiller(entity)); + } + + if (entity.getBillerPaymentChannels() != null) { + entity.getBillerPaymentChannels().forEach(c -> c.setBiller(entity)); + } + + if (entity.getBillerCustomerParams() != null) { + entity.getBillerCustomerParams().forEach(p -> p.setBiller(entity)); + } + + if (entity.getBillerAdditionalInfos() != null) { + entity.getBillerAdditionalInfos().forEach(a -> a.setBiller(entity)); + } + + if (entity.getInterchangeFees() != null) { + for (InterchangeFee fee : entity.getInterchangeFees()) { + fee.setBiller(entity); + + if (fee.getInterchangeFeeDetails() != null) { + fee.getInterchangeFeeDetails().forEach(detail -> detail.setInterchangeFee(fee)); + } + } + } + + if (entity.getInterchangeFeeConves() != null) { + entity.getInterchangeFeeConves().forEach(fc -> fc.setBiller(entity)); + } + + if (entity.getCustomerParamGroups() != null) + entity.getCustomerParamGroups().setBiller(entity); + + if (entity.getBillerPlanResponseParams() != null) + entity.getBillerPlanResponseParams().setBiller(entity); + + if (entity.getBillerResponseParams() != null) { + BillerResponseParams responseParams = entity.getBillerResponseParams(); + responseParams.setBiller(entity); + + if (responseParams.getAmountOptions() != null) { + responseParams.getAmountOptions() + .forEach(option -> option.setBillerResponseParams(responseParams)); + } + } + } +} + diff --git a/src/test/java/com/lincpay/bbps/BbpsApplicationTests.java b/src/test/java/com/billpaymentservice/bbps/BbpsApplicationTests.java similarity index 64% rename from src/test/java/com/lincpay/bbps/BbpsApplicationTests.java rename to src/test/java/com/billpaymentservice/bbps/BbpsApplicationTests.java index 2068271..4d08e97 100644 --- a/src/test/java/com/lincpay/bbps/BbpsApplicationTests.java +++ b/src/test/java/com/billpaymentservice/bbps/BbpsApplicationTests.java @@ -1,4 +1,4 @@ -package com.lincpay.bbps; +package com.billpaymentservice.bbps; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -6,8 +6,7 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class BbpsApplicationTests { - @Test - void contextLoads() { - } - + @Test + void contextLoads() { + } } diff --git a/src/test/java/com/billpaymentservice/bbps/controller/TestHttpControllerTest.java b/src/test/java/com/billpaymentservice/bbps/controller/TestHttpControllerTest.java deleted file mode 100644 index 625d96d..0000000 --- a/src/test/java/com/billpaymentservice/bbps/controller/TestHttpControllerTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.billpaymentservice.bbps.controller; - -import com.billpaymentservice.bbps.serviceImpl.HttpService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.HashMap; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -public class TestHttpControllerTest { - - @Autowired - private HttpService httpService; - - @Test - void testGetRequest() { - String url = "https://bbps-staging.digiledge.in/agent/cou-master/masters/billersById?billerId=ADAN00000HAR02"; // Dummy public GET API - HashMap response = httpService.getRequest(url); - System.out.println("✅ GET Response: " + response); - - System.out.println(response); - } - - -} From d4c8b433cc5c78e5993b0b9170cd5f3f398b8fbb Mon Sep 17 00:00:00 2001 From: himanshu Date: Mon, 3 Nov 2025 11:18:24 +0530 Subject: [PATCH 3/3] himanshu clean code --- .../bbps/controller/MasterDataController.java | 7 +- .../bbps/service/MasterDataService.java | 4 - .../serviceImpl/MasterDataServiceImpl.java | 94 ------------------- 3 files changed, 2 insertions(+), 103 deletions(-) diff --git a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java index c04f7b6..ab76a47 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java @@ -66,17 +66,14 @@ public class MasterDataController { /** Get CustomerParam by billerId.The parameter is different from the data we are getting in the billerDetail **/ @PostMapping(value = "/getCustomerParamDetails", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getBillerDetails( + public ResponseEntity getCustomerParamDetails( @Validated @RequestBody CustomParamRequest customerParamRequest) { log.info("Received biller details request for billerId: {}",customerParamRequest.getBillerId() ); return ResponseEntity.ok(masterDataService.getCustomerParamByBillerId(customerParamRequest)); } - @PostMapping("/getAllMastersData") - public ResponseModel fetchMasterData(@Validated @RequestBody MasterRequest masterRequest) { - return masterDataService.getMasterData(masterRequest); - } + } diff --git a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java index fb497c5..2a71188 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java @@ -11,10 +11,6 @@ public interface MasterDataService { public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest); - public ResponseModel getMasterData(MasterRequest masterRequest); - - public ResponseModel fetchMasterDataCategoryWise(MerchantRequestModel requestModel, String category, int pageStart, int pageEnd); - public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest); public ResponseModel getContactMaster(ContactMasterRequest contactMasterRequest); diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index 0142d2c..31c863a 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -129,100 +129,6 @@ public class MasterDataServiceImpl implements MasterDataService { } } - @Override - public ResponseModel getMasterData(MasterRequest masterRequest) { - LOGGER.info("Request DTO: {}", masterRequest); - - String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + masterRequest.getTenantId(); - LOGGER.info("Calling external API: {}", fullUrl); - - Map responseMap = httpService.getRequest(fullUrl); - String responseData = responseMap.get("data"); - LOGGER.info("Response Data: {}", responseData); - - ObjectMapper objectMapper = new ObjectMapper(); - - try { - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - - // ✅ Same check as in getBillerByBillerId() - if (!dataMap.containsKey("generalResp")) { - throw new CustomException( - String.valueOf(dataMap.get("message")), // message - String.valueOf(dataMap.get("status")), // status - Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode - String.valueOf(dataMap.get("remarks")) // remarks - ); - } - - MasterApiResponse responseWrapper = objectMapper.convertValue(dataMap, MasterApiResponse.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); - - - ResponseModel responseModel = new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper - ); - return responseModel; - - } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); - throw new CustomException("Invalid JSON received from API"); - } - } - - - @Override - public ResponseModel fetchMasterDataCategoryWise(MerchantRequestModel requestModel, - String category, int pageStart, int pageEnd) { - LOGGER.info("Fetching Master Data Category-wise for MID={}, Category={}, PageStart={}, PageEnd={}", - requestModel.getMid(), category, pageStart, pageEnd); - - BBPSMerchantValidation merchantValidation = merchantRegisterRepo.findByMid(requestModel.getMid()); - BillerResponse responseModel = new BillerResponse(); - // if Start merchant validations - if (Optional.ofNullable(merchantValidation).isPresent()) { - // if Start merchant active check - if (merchantValidation.isActive()) { - - LOGGER.info("mid Value: " + requestModel.getMid() + " secret Value: " + requestModel.getSecretKey() - + "txt Value: " + requestModel); - // 2️⃣ Build API URL - String fullUrl = String.format("%s%s?category=%s&page=%d&pagesize=%d", masterRegisterUrl, - BBPSConstant.BILLER_URL, category, pageStart, pageEnd); - - LOGGER.info("Calling Master API: {}", fullUrl); - HashMap response = httpClientApi.getRequestForPaymentStatus(fullUrl); - - LOGGER.info("BBPS bank response data: " + response.get("data") + " code: " + response.get("respCode")); - // if Start merchant cehck response code - - if (response.get("respCode") != null && response.get("respCode").toString().contains("200")) { - LOGGER.info("Response -: " + response.get("data")); - String jsonData = response.get("data").toString(); - //responseModel = responseParser.billerResponse(jsonData); - - LOGGER.info("kkk" + responseModel.toString()); - // 5️⃣ Prepare API response model - - } else { - LOGGER.warn("Unexpected response code: " + response.get("respCode")); - - } - - } else { - LOGGER.info("Merchant Not Active for mid - " + requestModel.getMid()); - throw new AppException("Merchant Not Active", BBPSConstant.CODE_MERCHANT_INACTIVE); - } - } else { - LOGGER.info("Merchant Not Valid for mid - " + requestModel.getMid()); - throw new AppException("Merchant Not Valid", BBPSConstant.CODE_MERCHANT_INVALID); - } - return new ResponseModel(); - - } @Override public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest) {