From 1e7b3c8a6b1c71193a1ea889697ed269629acf82 Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Wed, 5 Nov 2025 10:45:50 +0530 Subject: [PATCH 1/6] Resolved merge conflict in BaseClass.java --- .../com/billpaymentservice/bbps/dto/request/BaseClass.java | 4 +--- .../com/billpaymentservice/bbps/entites/BBPSMastersData.java | 2 +- src/main/resources/application.properties | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) 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 f8094eb..aba2db5 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java @@ -25,11 +25,9 @@ public abstract class BaseClass { @NotBlank(message = "Request ID cannot be null or blank") private String reqId; - //private String txnId; - private DeviceDetail deviceDetial; - // ✅ 10 User Defined Fields (UDF1–UDF10) + private String udf1; @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BBPSMastersData.java b/src/main/java/com/billpaymentservice/bbps/entites/BBPSMastersData.java index 85f311e..660c166 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BBPSMastersData.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BBPSMastersData.java @@ -24,7 +24,7 @@ import lombok.Setter; public class BBPSMastersData extends Auditable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 44ff981..6294285 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,7 +13,7 @@ spring.jpa.properties.hibernate.default_schema=public # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -spring.datasource.password=thakur@123 +spring.datasource.password=himanshu@123 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource From d18caaeed9ce79c67af5895ae438538a73e35a53 Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Wed, 5 Nov 2025 13:58:53 +0530 Subject: [PATCH 2/6] solved duplicate key problem on getBillerData --- .../bbps/controller/MasterDataController.java | 1 - .../bbps/entites/BillerDetails.java | 46 +++++++----------- .../bbps/entites/PaymentMode.java | 8 ++-- .../bbps/repository/BillerDataRepository.java | 4 +- .../serviceImpl/MasterDataServiceImpl.java | 2 + .../billpaymentservice/bbps/util/Helper.java | 48 ++++++++++++++++++- 6 files changed, 71 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java index 47f83f7..1db5cc0 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java @@ -72,7 +72,6 @@ public class MasterDataController { return ResponseEntity.ok(masterDataService.getCustomerParamByBillerId(customerParamRequest)); } - /** * Get All Master Data .The parameter is different from the data we are getting * in the MasterRequest diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java index 1737bf7..9e552fb 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java @@ -28,8 +28,7 @@ public class BillerDetails { @NotBlank(message = "Biller name cannot be blank") private String billerName; - @Column(name = "biller_alias_name", nullable = false) - @NotBlank(message = "Biller alias name cannot be blank") + @Column(name = "biller_alias_name") private String billerAliasName; @Column(name = "biller_category_name", nullable = false) @@ -43,39 +42,36 @@ public class BillerDetails { @Column(name = "biller_accepts_adhoc", nullable = false) private boolean billerAcceptsAdhoc; - @Column(name = "parent_biller", nullable = false) + @Column(name = "parent_biller") private boolean parentBiller; - @Column(name = "parent_biller_id", nullable = false) - @NotBlank(message = "Parent biller ID cannot be blank") + @Column(name = "parent_biller_id") private String parentBillerId; - @Column(name = "biller_ownership", nullable = false) + @Column(name = "biller_ownership") @NotBlank(message = "Biller ownership is required (PSU or Private)") private String billerOwnerShp; - @Column(name = "biller_coverage", nullable = false) - @NotBlank(message = "Biller coverage cannot be blank") + @Column(name = "biller_coverage") private String billerCoverage; - @Column(name = "fetch_requirement", nullable = false) + @Column(name = "fetch_requirement") @NotBlank(message = "Fetch requirement is mandatory") private String fetchRequirement; - @Column(name = "payment_amount_exactness", nullable = false) + @Column(name = "payment_amount_exactness") @NotBlank(message = "Payment amount exactness is required") private String paymentAmountExactness; - @Column(name = "support_bill_validation", nullable = false) + @Column(name = "support_bill_validation") @NotBlank(message = "Support bill validation is required") private String supportBillValidation; - @Column(name = "biller_effctv_from", nullable = false) + @Column(name = "biller_effctv_from") @NotBlank(message = "Effective from date is required") private String billerEffctvFrom; - @Column(name = "biller_effctv_to", nullable = false) - @NotBlank(message = "Effective to date is required") + @Column(name = "biller_effctv_to") private String billerEffctvTo; @Column(name = "biller_temp_deactivation_start") @@ -84,32 +80,25 @@ public class BillerDetails { @Column(name = "biller_temp_deactivation_end") private String billerTempDeactivationEnd; - @Column(name = "biller_description", nullable = false, length = 500) - @NotBlank(message = "Biller description cannot be blank") + @Column(name = "biller_description", length = 500) private String billerDescription; - @Column(name = "biller_response_type", nullable = false) - @NotBlank(message = "Biller response type is required (SINGLE or SELECTIVE)") + @Column(name = "biller_response_type") private String billerResponseType; - @Column(name = "plan_mdm_requirement", nullable = false) - @NotBlank(message = "Plan MDM requirement cannot be blank") + @Column(name = "plan_mdm_requirement") private String planMDMRequirement; - @Column(name = "status", nullable = false) - @NotBlank(message = "Status must be ACTIVE or INACTIVE") + @Column(name = "status") private String status; - @Column(name = "support_deemed", nullable = false) - @NotBlank(message = "Support deemed value is required (Yes/No)") + @Column(name = "support_deemed") private String supportDeemed; - @Column(name = "support_pending_status", nullable = false) - @NotBlank(message = "Support pending status is required (Yes/No)") + @Column(name = "support_pending_status") private String supportPendingStatus; - @Column(name = "biller_time_out", nullable = false) - @NotBlank(message = "Biller timeout is required") + @Column(name = "biller_time_out") private String billerTimeOut; @Column(name = "route_url") @@ -151,7 +140,6 @@ public class BillerDetails { * @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/PaymentMode.java b/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java index 82babca..0493846 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java @@ -24,11 +24,9 @@ import lombok.ToString; @Table(name = "biller_payment_modes") @ToString public class PaymentMode { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - + + + @Id // @Column(name = "payment_model_limit_id", unique = true, length = 50) @NotBlank(message = "Payment model limit ID cannot be blank") private String paymentModelLimitId; diff --git a/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java index 0a2fe6c..458a8b1 100644 --- a/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java +++ b/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java @@ -7,9 +7,11 @@ import org.springframework.stereotype.Repository; import com.billpaymentservice.bbps.entites.BillerDetails; import java.util.List; +import java.util.Optional; @Repository public interface BillerDataRepository extends JpaRepository { - + + Optional findByBillerId(String billerId); } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index fc4e683..4442806 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -4,6 +4,7 @@ package com.billpaymentservice.bbps.serviceImpl; import java.time.LocalDateTime; 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; @@ -202,6 +203,7 @@ public class MasterDataServiceImpl implements MasterDataService { mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); BillerDetails entity = mapper.map(responseWrapper.getBillerDAO(), BillerDetails.class); EntityRelationshipUtil.linkBillerRelationships(entity); + helper.saveOrUpdateBillerData(entity); ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index 446b752..b27e8c1 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -2,6 +2,7 @@ package com.billpaymentservice.bbps.util; import java.security.SecureRandom; import java.time.LocalDateTime; +import java.util.Optional; import java.util.function.Function; import org.slf4j.Logger; @@ -12,12 +13,16 @@ import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.entites.BBPSMastersData; import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo; +import com.billpaymentservice.bbps.repository.BillerDataRepository; import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; +import com.billpaymentservice.bbps.entites.BillerDetails; import com.billpaymentservice.bbps.entites.InboundTraceLog; import com.billpaymentservice.bbps.entites.OutboundTraceLog; +import com.billpaymentservice.bbps.entites.PaymentChannel; +import com.billpaymentservice.bbps.entites.PaymentMode; import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.repository.MerchantRepository; import com.billpaymentservice.bbps.repository.OutboundTraceLogRepository; @@ -36,13 +41,15 @@ public class Helper { private final ObjectMapper objectMapper = new ObjectMapper(); private final BBPSMasterDataRepo bbpsMasterDataRepo; + private final BillerDataRepository billerDataRespository; // Constructor Injection public Helper(BBPSMasterDataRepo bbpsMasterDataRepo, InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository) { + OutboundTraceLogRepository outboundTraceLogRepository,BillerDataRepository billerDataRepository) { this.bbpsMasterDataRepo = bbpsMasterDataRepo; this.inboundTraceLogRepository = inboundTraceLogRepository; this.outboundTraceLogRepository = outboundTraceLogRepository; + this.billerDataRespository=billerDataRepository; } /** @@ -182,7 +189,44 @@ public class Helper { outboundLog.setResponseReceiveTime(LocalDateTime.now()); outboundTraceLogRepository.save(outboundLog); } - /* ---------- End helpers ---------- */ + public void saveOrUpdateBillerData(BillerDetails newEntity) { + + Optional existingOpt = billerDataRespository.findByBillerId(newEntity.getBillerId()); + + if (existingOpt.isPresent()) { + BillerDetails existing = existingOpt.get(); + + // Update base biller fields + existing.setBillerName(newEntity.getBillerName()); + existing.setBillerAliasName(newEntity.getBillerAliasName()); + existing.setBillerDescription(newEntity.getBillerDescription()); + existing.setStatus(newEntity.getStatus()); + existing.setBillerCoverage(newEntity.getBillerCoverage()); + // ... (update other simple fields as needed) + + // ✅ Clear and replace nested lists to avoid duplicate inserts + existing.getBillerPaymentModes().clear(); + if (newEntity.getBillerPaymentModes() != null) { + for (PaymentMode mode : newEntity.getBillerPaymentModes()) { + mode.setBiller(existing); + existing.getBillerPaymentModes().add(mode); + } + } + existing.getBillerPaymentChannels().clear(); + if (newEntity.getBillerPaymentChannels() != null) { + for (PaymentChannel channel : newEntity.getBillerPaymentChannels()) { + channel.setBiller(existing); + existing.getBillerPaymentChannels().add(channel); + } + } + billerDataRespository.save(existing); + } + else { + // brand new biller + billerDataRespository.save(newEntity); + } + } + } From 3497d4f288534459e80def01b9b51c761baaef0b Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Wed, 5 Nov 2025 18:45:05 +0530 Subject: [PATCH 3/6] duplicate key problem solved biller detail --- .../bbps/dto/CustomParamDTO.java | 2 + .../bbps/dto/CustomerParamGroupsDTO.java | 3 + .../bbps/dto/request/CustomParamRequest.java | 2 + .../bbps/dto/request/DispositionRequest.java | 2 +- .../bbps/dto/response/CustomParamResp.java | 2 + .../bbps/entites/CustomParam.java | 2 + .../bbps/entites/CustomerParam.java | 2 + .../repository/CustomParamRepository.java | 9 ++ .../bbps/serviceImpl/AgentServiceImpl.java | 10 +- .../serviceImpl/MasterDataServiceImpl.java | 114 +++++++----------- .../billpaymentservice/bbps/util/Helper.java | 1 + 11 files changed, 71 insertions(+), 78 deletions(-) create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/CustomParamRepository.java diff --git a/src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java index 1fa4940..5b10823 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/CustomParamDTO.java @@ -6,11 +6,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; @Getter @Setter @AllArgsConstructor @NoArgsConstructor +@ToString public class CustomParamDTO { private String customParamName; private String dataType; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java index 6588e8b..4086d95 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java @@ -1,10 +1,13 @@ package com.billpaymentservice.bbps.dto; import lombok.Getter; import lombok.Setter; +import lombok.ToString; + import java.util.List; @Getter @Setter +@ToString public class CustomerParamGroupsDTO { private List groups; } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/CustomParamRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/CustomParamRequest.java index 64010f5..8bb1e68 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/CustomParamRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/CustomParamRequest.java @@ -5,11 +5,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; @Getter @Setter @NoArgsConstructor @AllArgsConstructor +@ToString public class CustomParamRequest extends BaseClass { @NotNull diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java index 33df692..b030894 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/DispositionRequest.java @@ -1,5 +1,5 @@ package com.billpaymentservice.bbps.dto.request; public class DispositionRequest extends BaseClass { - + } 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 102b1c7..99b370b 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java @@ -11,11 +11,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; @Getter @Setter @AllArgsConstructor @NoArgsConstructor +@ToString public class CustomParamResp { @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private GeneralResp generalResp; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java index e6b782e..fe3bafe 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java @@ -3,10 +3,12 @@ package com.billpaymentservice.bbps.entites; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter @Entity +@ToString @Table(name = "custom_param") public class CustomParam { diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java index 2bc7877..b032baf 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java @@ -4,6 +4,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.*; import lombok.Getter; import lombok.Setter; +import lombok.ToString; import java.util.List; @@ -11,6 +12,7 @@ import java.util.List; @Setter @Entity @Table(name = "customer_param") +@ToString public class CustomerParam { @Id diff --git a/src/main/java/com/billpaymentservice/bbps/repository/CustomParamRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/CustomParamRepository.java new file mode 100644 index 0000000..31737e2 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/CustomParamRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.CustomParam; + +public interface CustomParamRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index facee8a..01d4bf5 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -182,7 +182,7 @@ public class AgentServiceImpl implements AgentService { if ("INPROGRESS".equalsIgnoreCase(status)) { if (System.currentTimeMillis() - startTime > maxWaitTimeMs) { helper.updateInboundLogFailure(inboundLog, "Timeout after 40 seconds", "FAILED"); - throw new CustomException("Timeout waiting for bill fetch completion", "FAILED", 408, "Bill fetch still in progress"); + throw new CustomException("Timeout", "FAILED", 408, "Bill fetch still in progress"); } Thread.sleep(intervalMs); @@ -207,13 +207,7 @@ public class AgentServiceImpl implements AgentService { Thread.currentThread().interrupt(); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); throw new CustomException("Thread interrupted during bill status check"); - } catch (CustomException ce) { - throw ce; - } catch (Exception e) { - log.error("❌ Exception in fetchBillById(): {}", e.getMessage(), e); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "EXCEPTION"); - throw new CustomException("Bill Fetch by ID failed: " + e.getMessage()); - } + } } } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index 4442806..90565ae 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -12,6 +12,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; + +import com.billpaymentservice.bbps.dto.CustomParamDTO; import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.MasterApiResponse; import com.billpaymentservice.bbps.dto.ResponseModel; @@ -33,12 +35,14 @@ import com.billpaymentservice.bbps.dto.response.PlanResponse; import com.billpaymentservice.bbps.dto.response.PlaneCategoriesResponse; import com.billpaymentservice.bbps.entites.BharatConnectMaster; import com.billpaymentservice.bbps.entites.BillerDetails; +import com.billpaymentservice.bbps.entites.CustomParam; import com.billpaymentservice.bbps.entites.DispositionDetails; 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.BillerDataRepository; +import com.billpaymentservice.bbps.repository.CustomParamRepository; import com.billpaymentservice.bbps.repository.DispositionRepository; import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; import com.billpaymentservice.bbps.repository.MerchantRepository; @@ -70,12 +74,14 @@ public class MasterDataServiceImpl implements MasterDataService { private final ObjectMapper objectMapper = new ObjectMapper(); private final InboundTraceLogRepository inboundTraceLogRepository; private final OutboundTraceLogRepository outboundTraceLogRepository; + private final CustomParamRepository customParamReposiotory; public MasterDataServiceImpl(MerchantRepository merchantRegisterRepo, HttpService httpService, HttpClientApi httpClientApi, Helper helper, BillerDataRepository billerDataRespository, DispositionRepository dispositionRepository, BharatConnectMasterRepository beneficiaryDetailsRepository, InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository) { + OutboundTraceLogRepository outboundTraceLogRepository, + CustomParamRepository customParamReposiotory) { this.merchantRegisterRepo = merchantRegisterRepo; this.httpService = httpService; this.httpClientApi = httpClientApi; @@ -85,6 +91,7 @@ public class MasterDataServiceImpl implements MasterDataService { this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; this.inboundTraceLogRepository = inboundTraceLogRepository; this.outboundTraceLogRepository = outboundTraceLogRepository; + this.customParamReposiotory=customParamReposiotory; } @@ -96,6 +103,7 @@ public class MasterDataServiceImpl implements MasterDataService { String apiName = "GetMasterData"; String requestId = masterRequest.getReqId(); String requestJson = helper.convertObjectToJson(masterRequest); + InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, masterRequest.getMid(), "POST", requestJson); @@ -126,13 +134,10 @@ public class MasterDataServiceImpl implements MasterDataService { Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); LOGGER.info("Response Data: {}", responseData); - - helper.updateOutboundLogResponse(outboundLog, responseData); - + helper.updateOutboundLogResponse(outboundLog, responseData); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); - if (!dataMap.containsKey("generalResp")) { helper.updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message @@ -156,22 +161,18 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ex) { - LOGGER.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception - } + } } @Override public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest) { - + LOGGER.info("Fetching biller data for billerId={}", billerDetailRequest.getBillerId()); helper.validateMerchant(billerDetailRequest.getMid()); String txnID = helper.generateTxnId(15); String apiName = "GetBillerByBillerId"; String requestId = billerDetailRequest.getReqId(); String billerId = billerDetailRequest.getBillerId(); String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL + billerId; - String requestJson = helper.convertObjectToJson(billerDetailRequest); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, billerDetailRequest.getMid(), "POST", requestJson); @@ -180,47 +181,40 @@ public class MasterDataServiceImpl implements MasterDataService { Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); - log.info("data is :{}", responseData); - + log.info("fetched data from api is :{}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); - try { Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); - 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"))); } - 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); - EntityRelationshipUtil.linkBillerRelationships(entity); + EntityRelationshipUtil.linkBillerRelationships(entity);// linking nesting entity foreign key helper.saveOrUpdateBillerData(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) { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } - + } } @Override public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest) { + + LOGGER.info("Fetching CustomerParam for billerId={}", customerParamRequest.getBillerId()); String txnID = helper.generateTxnId(15); String apiName = "GetCustomerParamByBillerId"; @@ -231,12 +225,6 @@ public class MasterDataServiceImpl implements MasterDataService { try { helper.validateMerchant(customerParamRequest.getMid()); - -// if (!"Valid".equalsIgnoreCase(validateMerchant)) { -// LOGGER.warn("Merchant validation failed: {}", validateMerchant); -// return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); -// } - String billerId = customerParamRequest.getBillerId(); String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMPARAM_URL + billerId; @@ -258,13 +246,29 @@ public class MasterDataServiceImpl implements MasterDataService { Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) String.valueOf(dataMap.get("remarks"))); } - + CustomParamResp responseWrapper = objectMapper.convertValue(dataMap, CustomParamResp.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); + List customParams = responseWrapper.getCustomParamResp(); + + GeneralResp generalResp = responseWrapper.getGeneralResp(); + List customParam = responseWrapper.getCustomParamResp(); + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + + // Map DTOs to entities + List entities = customParams.stream() + .map(dto -> mapper.map(dto, CustomParam.class)) + .collect(Collectors.toList()); + + // Debug print + entities.forEach(System.out::println); + + // Save all to DB + customParamReposiotory.saveAll(entities); + ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); return responseModel; @@ -272,33 +276,26 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ex) { - LOGGER.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception } - } @Override public ResponseModel getContactMaster(ContactMasterRequest contactMasterRequest) { - return new ResponseModel(); + return new ResponseModel(); //things not comming from api } @Override public ResponseModel fetchMasterDataCategoryWise(MasterCategoryRequest masterRequest) { LOGGER.info("Fetching Master Data Category-wise " + masterRequest); - String txnID = helper.generateTxnId(15); String apiName = "FetchMasterDataCategoryWise"; String requestId = masterRequest.getReqId(); String requestJson = helper.convertObjectToJson(masterRequest); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, masterRequest.getMid(), "POST", requestJson); - try { 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()); @@ -337,9 +334,6 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ex) { - LOGGER.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception } } @@ -348,7 +342,9 @@ public class MasterDataServiceImpl implements MasterDataService { String txnID = helper.generateTxnId(15); String apiName = "GetDispositionDetails"; String requestId = dispositionDetailRequest.getReqId(); - ; + helper.validateMerchant(dispositionDetailRequest.getMid()); + + InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, dispositionDetailRequest.getMid(), "GET", "N/A"); @@ -359,7 +355,7 @@ public class MasterDataServiceImpl implements MasterDataService { helper.updateOutboundLogResponse(outboundLog, responseData); try { - + ObjectMapper objectMapper = new ObjectMapper(); Map dataMap = objectMapper.readValue(responseData, @@ -399,10 +395,7 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ex) { - LOGGER.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception - } + } } @Override @@ -452,10 +445,7 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ex) { - LOGGER.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception - } + } } @@ -507,9 +497,6 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException e) { - LOGGER.error("Custom Exception: {}", e.getMessage()); - throw e; // Rethrow custom exceptions to be handled by the controller } } @@ -562,10 +549,7 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException e) { - LOGGER.error("Custom Exception: {}", e.getMessage()); - throw e; // Rethrow custom exceptions to be handled by the controller - } + } } @Override @@ -618,10 +602,7 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException e) { - LOGGER.error("Custom Exception: {}", e.getMessage()); - throw e; // Rethrow custom exceptions to be handled by the controller - } + } } public ResponseModel fetchPlanByCategories(PlanRequest requestModel) { @@ -690,11 +671,6 @@ public class MasterDataServiceImpl implements MasterDataService { log.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException e) { - - LOGGER.error("Custom Exception: {}", e.getMessage()); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "Custom_exception"); - throw e; // Rethrow for controller-level handling } } diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index b27e8c1..32b3a25 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -2,6 +2,7 @@ package com.billpaymentservice.bbps.util; import java.security.SecureRandom; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.Optional; import java.util.function.Function; From 58db98cc06750a6c1214faaf4882b326c3261fb5 Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Thu, 6 Nov 2025 18:06:12 +0530 Subject: [PATCH 4/6] added database for bill intitate and bill payment and removed the polling logic --- ...foBill.java => AdditionalInfoBillDTO.java} | 2 +- .../bbps/dto/response/BillDataResponse.java | 4 +- .../bbps/entites/AdditionalInfoBill.java | 30 ++ .../bbps/entites/BillInitiate.java | 21 + .../bbps/entites/BillMaster.java | 52 +++ .../entites/BillerPlanResponseParams.java | 2 - .../bbps/entites/BillerResponse.java | 60 +++ .../bbps/entites/BillerResponseParams.java | 2 +- .../bbps/entites/CustomerParamBill.java | 31 ++ .../repository/BillInitateRepository.java | 11 + .../bbps/repository/BillMasterRepository.java | 9 + .../bbps/serviceImpl/AgentServiceImpl.java | 406 ++++++++++-------- .../billpaymentservice/bbps/util/Helper.java | 85 +++- 13 files changed, 533 insertions(+), 182 deletions(-) rename src/main/java/com/billpaymentservice/bbps/dto/{AdditionalInfoBill.java => AdditionalInfoBillDTO.java} (88%) create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoBill.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/CustomerParamBill.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/BillInitateRepository.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/BillMasterRepository.java diff --git a/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfoBill.java b/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfoBillDTO.java similarity index 88% rename from src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfoBill.java rename to src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfoBillDTO.java index cd0d36b..488e618 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfoBill.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfoBillDTO.java @@ -9,7 +9,7 @@ import lombok.Setter; @Setter @AllArgsConstructor @NoArgsConstructor -public class AdditionalInfoBill { +public class AdditionalInfoBillDTO { private String additionalInfoId; private String name; private String value; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/BillDataResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/BillDataResponse.java index 8f6faef..42470b2 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/BillDataResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/BillDataResponse.java @@ -2,7 +2,7 @@ package com.billpaymentservice.bbps.dto.response; import java.util.List; -import com.billpaymentservice.bbps.dto.AdditionalInfoBill; +import com.billpaymentservice.bbps.dto.AdditionalInfoBillDTO; import com.billpaymentservice.bbps.dto.BillerResponseBill; import com.billpaymentservice.bbps.dto.CustomerParamDAO; import com.billpaymentservice.bbps.dto.GeneralResp; @@ -31,7 +31,7 @@ public class BillDataResponse { private String userId; private BillerResponseBill billerResponse; // nested object - private List additionalInfo; // array of objects + private List additionalInfo; // array of objects private List customerParams; // array of objects private String creationDate; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoBill.java b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoBill.java new file mode 100644 index 0000000..d80e79e --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfoBill.java @@ -0,0 +1,30 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + + + +@Entity +@Table(name = "additional_info_bill") +@Getter +@Setter +public class AdditionalInfoBill { + @Id + @GeneratedValue + private Long id; + + private String name; + private String value; + + @ManyToOne + @JoinColumn(name = "bill_master_id") + private BillMaster billMaster; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java b/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java new file mode 100644 index 0000000..c53cbe1 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java @@ -0,0 +1,21 @@ +package com.billpaymentservice.bbps.entites; +import jakarta.persistence.*; +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "bill_initiate") +public class BillInitiate { + @Id + @Column(name = "req_id") + private String reqId; + + @Column(name = "bill_id", nullable = false) + private String billId; + + @Column(name = "txn_id") + private String txnId; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java b/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java new file mode 100644 index 0000000..48d597d --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java @@ -0,0 +1,52 @@ +package com.billpaymentservice.bbps.entites; +import java.time.LocalDateTime; +import java.util.List; + +import com.billpaymentservice.bbps.dto.BillerResponseBill; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name = "bill_master") +@Builder +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class BillMaster { + + @Id + private String billId; // primary key + + private String reqId; // client se aaya hua + private String txnId; // system-generated + private String refId; + private String billerId; + private String status; + private String actionType; + private String userId; + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "biller_response_id") + private BillerResponse billerResponse; + @OneToMany(mappedBy = "billMaster", cascade = CascadeType.ALL) + private List additionalInfo; + @OneToMany(mappedBy = "billMaster", cascade = CascadeType.ALL) + private List customerParams; + private String creationDate; + private String modifiedDate; + private Long createdEpochDate; + private Long modifiedEpochDate; + + // getters and setters +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java index ac919a9..3415f7e 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java @@ -17,7 +17,6 @@ import java.util.List; @ToString @Table(name = "biller_plan_response_params") public class BillerPlanResponseParams { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // Primary Key @@ -25,7 +24,6 @@ public class BillerPlanResponseParams { @Column(name = "biller_plan_response_id", nullable = false, unique = true) @NotBlank(message = "Biller Plan Response ID cannot be blank") private String billerPlanResponseId; - // ✅ params list — since it's not a separate table, we can store as JSON or text @Column(name = "params", columnDefinition = "TEXT") private String paramsJson; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java new file mode 100644 index 0000000..4a02e35 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java @@ -0,0 +1,60 @@ +package com.billpaymentservice.bbps.entites; + +import java.time.LocalDate; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "biller_response") +@Getter +@Setter +public class BillerResponse { + + @Id + @GeneratedValue + private Long id; + + @Column(name = "amount") + private String amount; + + @Column(name = "bill_date") + private String billDate; + + @Column(name = "bill_id") + private String billId; + + @Column(name = "bill_number") + private String billNumber; + + @Column(name = "bill_period") + private String billPeriod; + + @Column(name = "cust_conv_fee") + private String custConvFee; + + @Column(name = "cou_cust_conv_fee") + private String couCustConvFee; + + @Column(name = "due_date") + private String dueDate; + + @Column(name = "customer_name") + private String customerName; + + @Column(name = "amount_option") + private Boolean amountOption; + + @ManyToOne + @JoinColumn(name = "bill_master_id") + private BillMaster billMaster; + + // getters and setters +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java index ee810da..dafef13 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java @@ -17,7 +17,7 @@ public class BillerResponseParams { @Column(name = "biller_response_id", nullable = false, unique = true) @NotBlank(message = "Biller Response ID is required") private String billerResponseId; - + // 🔗 One-to-One Relationship with BillerDAO @OneToOne @JoinColumn(name = "biller_id", nullable = false) diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamBill.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamBill.java new file mode 100644 index 0000000..870ee57 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamBill.java @@ -0,0 +1,31 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +@Table(name = "customer_param_bill") +public class CustomerParamBill { + + @Id + @GeneratedValue + private Long id; + + private String name; + private String value; + private String type; + + @ManyToOne + @JoinColumn(name = "bill_master_id") + private BillMaster billMaster; + + // getters and setters +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/BillInitateRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/BillInitateRepository.java new file mode 100644 index 0000000..3c7cd69 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/BillInitateRepository.java @@ -0,0 +1,11 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.billpaymentservice.bbps.entites.BillInitiate; + +@Repository +public interface BillInitateRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/BillMasterRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/BillMasterRepository.java new file mode 100644 index 0000000..161a85a --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/BillMasterRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.BillMaster; + +public interface BillMasterRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index 01d4bf5..d568d40 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -18,10 +18,14 @@ import com.billpaymentservice.bbps.dto.response.BillDataResponse; import com.billpaymentservice.bbps.dto.response.FetchBillResponse; import com.billpaymentservice.bbps.dto.response.FetchBillValidatestResponse; import com.billpaymentservice.bbps.entites.BharatConnectMaster; +import com.billpaymentservice.bbps.entites.BillInitiate; +import com.billpaymentservice.bbps.entites.BillMaster; 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.BillInitateRepository; +import com.billpaymentservice.bbps.repository.BillMasterRepository; import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; import com.billpaymentservice.bbps.repository.OutboundTraceLogRepository; import com.billpaymentservice.bbps.service.AgentService; @@ -45,14 +49,18 @@ public class AgentServiceImpl implements AgentService { private final HttpService httpService; private final Helper helper; private final BharatConnectMasterRepository beneficiaryDetailsRepository; + private final BillMasterRepository billMasterRepository; + private final BillInitateRepository billIntiateRepository; public AgentServiceImpl(RestClient restClient, HttpService httpService, Helper helper, BharatConnectMasterRepository beneficiaryDetailsRepository,InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository) { + OutboundTraceLogRepository outboundTraceLogRepository, BillMasterRepository billMasterRepository,BillInitateRepository billIntiateRepository) { this.restClient = restClient; this.httpService = httpService; this.helper = helper; this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; + this.billMasterRepository = billMasterRepository; + this. billIntiateRepository= billIntiateRepository; } @@ -88,41 +96,47 @@ public class AgentServiceImpl implements AgentService { log.info("📦 Bill Fetch API Response: {}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); - if (responseData == null || responseData.isEmpty()) { - helper.updateInboundLogFailure(inboundLog, "Empty response from BBPS", "FAILED"); - throw new CustomException("Empty response from BBPS server"); - } - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); if (!dataMap.containsKey("genericResponse")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_STRUCTURE"); - throw new CustomException("Invalid response structure from BBPS"); + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + 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")) + ); } - + + BillMaster billMaster = new BillMaster(); + billMaster.setBillId((String) dataMap.get("billId")); + billMaster.setReqId(fetchBillRequest.getReqId()); + billMaster.setTxnId(txnId); + billMasterRepository.save(billMaster); FetchBillResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillResponse.class); GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); - - // ✅ Directly call fetchBillById (no polling) + //save intitate bill here + BillInitiate billInitiate = new BillInitiate(); + billInitiate.setBillId((String) dataMap.get("billId")); + billInitiate.setReqId(fetchBillRequest.getReqId()); + billInitiate.setTxnId(txnId); + billIntiateRepository.save(billInitiate); BillFetchByBillIdRequest billFetchByBillIdRequest = new BillFetchByBillIdRequest(); billFetchByBillIdRequest.setBillId(fetchBillResponse.getBillId()); billFetchByBillIdRequest.setMid(fetchBillRequest.getMid()); billFetchByBillIdRequest.setReqId(requestId); - + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); // restore interrupted flag + log.warn("Thread interrupted during delay: {}", e.getMessage()); + } return fetchBillById(billFetchByBillIdRequest, inboundLog); - } catch (JsonProcessingException e) { log.error("❌ JSON Parsing Error: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ce) { - throw ce; - } catch (Exception e) { - log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "EXCEPTION"); - throw new CustomException("Bill Fetch initiation failed: " + e.getMessage()); - } + } } @@ -131,7 +145,7 @@ public class AgentServiceImpl implements AgentService { public ResponseModel fetchBillById(BillFetchByBillIdRequest billFetchByBillIdRequest, InboundTraceLog inboundLog) { String apiName = "FetchBillById"; String txnId = helper.generateTxnId(15); - String requestId = billFetchByBillIdRequest.getReqId(); + String reqId = billFetchByBillIdRequest.getReqId(); String billId = billFetchByBillIdRequest.getBillId(); String url = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; @@ -145,14 +159,9 @@ public class AgentServiceImpl implements AgentService { headers.setContentType(MediaType.APPLICATION_JSON); ObjectMapper objectMapper = new ObjectMapper(); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, url, "GET", null); - // ✅ Loop setup - long startTime = System.currentTimeMillis(); - long maxWaitTimeMs = 40000; // 40 seconds - long intervalMs = 5000; // 5 seconds - - while (true) { + try { Map responseMap = httpService.getRequest(url, headers); String responseData = responseMap.get("data"); @@ -177,66 +186,46 @@ public class AgentServiceImpl implements AgentService { String status = generalResp.getStatus(); log.info("📡 Current Bill Status: {}", status); - // ✅ Check for "INPROGRESS" or pending state - if ("INPROGRESS".equalsIgnoreCase(status)) { - if (System.currentTimeMillis() - startTime > maxWaitTimeMs) { - helper.updateInboundLogFailure(inboundLog, "Timeout after 40 seconds", "FAILED"); - throw new CustomException("Timeout", "FAILED", 408, "Bill fetch still in progress"); - } - - Thread.sleep(intervalMs); - continue; // retry again - } - + + // ✅ Final successful response helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - + helper.saveOrUpdateBillerData(responseWrapper,billFetchByBillIdRequest); + return new ResponseModel( generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper ); - } catch (JsonProcessingException e) { log.error("Error parsing BillById JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); - throw new CustomException("Thread interrupted during bill status check"); } } - } - @Override public ResponseModel fetchBillById(BillFetchByBillIdRequest billFetchByBillIdRequest) { + String apiName = "FetchBillById"; + 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"; try { - helper.validateMerchant(billFetchByBillIdRequest.getMid()); - - 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); - ObjectMapper objectMapper = new ObjectMapper(); - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); @@ -246,159 +235,226 @@ public class AgentServiceImpl implements AgentService { 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); - + + helper.saveOrUpdateBillerData(responseWrapper,billFetchByBillIdRequest); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ex) { - log.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception - } + } } - - @Override public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { - // TODO Auto-generated method stub - return null; + + ResponseModel responseModel = new ResponseModel(); + try { + + helper.validateMerchant(fetchBillValidateRequest.getMid()); + + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + + if (headersData == null) { + responseModel = new ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, headersData); + return responseModel; + } + + HttpHeaders headers = new HttpHeaders(); + headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); + headers.set("agentId", headersData.getAgentId()); + headers.set("tenantId", headersData.getTenantId()); + headers.setContentType(MediaType.APPLICATION_JSON); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + String json = objectMapper.writeValueAsString(fetchBillValidateRequest); + String url = agentDtaUrl + BBPSConstant.BILLER_VALIDATE_URL; + + Map responseMap = httpService.postRequest(url, json, headers); + String responseData = responseMap.get("data"); + + 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 + FetchBillValidatestResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillValidatestResponse.class); + GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); + + // ✅ Build final ResponseModel + responseModel = new ResponseModel( + generalResponse.getMessage(), + generalResponse.getStatus(), + Integer.parseInt(generalResponse.getStatusCode()), + fetchBillResponse + ); + + } catch (CustomException ex) { + log.warn("Merchant validation failed: {}", ex.getMessage()); + return ex.getResponseModel(); // Directly return ResponseModel from exception + } 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 initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { - // TODO Auto-generated method stub - return null; - } - /* - * @Override public ResponseModel - * initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { + ResponseModel responseModel = new ResponseModel(); + try { + helper.validateMerchant(billRequest.getMid()); + + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + + if (headersData == null) { + responseModel = new ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, headersData); + return responseModel; + } + + HttpHeaders headers = new HttpHeaders(); + headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); + headers.set("agentId", headersData.getAgentId()); + headers.set("tenantId", headersData.getTenantId()); + headers.setContentType(MediaType.APPLICATION_JSON); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + String json = objectMapper.writeValueAsString(billRequest); + String url = agentDtaUrl + BBPSConstant.BILL_ID_URL + billRequest.getBillId(); + + log.info("Full URL: {}", url); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + // ✅ Call the API using httpService + Map responseMap = httpService.getRequest(url, headers); + String responseData = responseMap.get("data"); + + 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 + BillDataResponse fetchBillResponse = objectMapper.convertValue(dataMap, BillDataResponse.class); + GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); + + // ✅ Build final ResponseModel + responseModel = new ResponseModel( + generalResponse.getRemarks(), + generalResponse.getStatus(), + Integer.parseInt(generalResponse.getStatusCode()), + fetchBillResponse + ); + + } catch (CustomException ex) { + log.warn("Merchant validation failed: {}", ex.getMessage()); + return ex.getResponseModel(); // Directly return ResponseModel from exception + } catch (Exception e) { + log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); + responseModel.setStatus("500"); + responseModel.setMessage("Exception occurred"); + responseModel.setData(e.getMessage()); + } + + return responseModel; + } + + + + /* POLLING METHOD + * public ResponseModel fetchBillById(BillFetchByBillIdRequest + * billFetchByBillIdRequest, InboundTraceLog inboundLog) { String apiName = + * "FetchBillById"; String txnId = helper.generateTxnId(15); String reqId = + * billFetchByBillIdRequest.getReqId(); String billId = + * billFetchByBillIdRequest.getBillId(); String url = agentDtaUrl + + * BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; * - * ResponseModel responseModel = new ResponseModel(); try { - * - * helper.validateMerchant(fetchBillValidateRequest.getMid()); + * helper.validateMerchant(billFetchByBillIdRequest.getMid()); * * BharatConnectMaster headersData = - * beneficiaryDetailsRepository.findByOrgId("ORG001"); - * - * if (headersData == null) { responseModel = new - * ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, - * headersData); return responseModel; } HttpHeaders headers = new + * beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new * HttpHeaders(); headers.set("x-digiledge-key", * headersData.getXDigiledgeKey()); headers.set("agentId", * headersData.getAgentId()); headers.set("tenantId", * headersData.getTenantId()); * headers.setContentType(MediaType.APPLICATION_JSON); * - * ObjectMapper objectMapper = new ObjectMapper(); - * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String - * json = objectMapper.writeValueAsString(fetchBillValidateRequest); String url - * = agentDtaUrl + BBPSConstant.BILLER_VALIDATE_URL; Map - * responseMap = httpService.postRequest(url, json, headers); String - * responseData = responseMap.get("data"); + * ObjectMapper objectMapper = new ObjectMapper(); OutboundTraceLog outboundLog + * = helper.createOutboundLog(txnId, reqId, apiName, url, "GET", null); * - * log.info("📦 Bill Fetch API Response: {}", responseData); + * // ✅ Loop setup long startTime = System.currentTimeMillis(); long + * maxWaitTimeMs = 40000; // 40 seconds long intervalMs = 5000; // 5 seconds * - * 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 FetchBillValidatestResponse fetchBillResponse - * = objectMapper.convertValue(dataMap, FetchBillValidatestResponse.class); - * GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - * - * // ✅ Build final ResponseModel responseModel = new - * ResponseModel(generalResponse.getMessage(), generalResponse.getStatus(), - * Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse); - * - * } catch (CustomException ex) { log.warn("Merchant validation failed: {}", - * ex.getMessage()); return ex.getResponseModel(); // Directly return - * ResponseModel from exception } 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 - * initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { - * - * ResponseModel responseModel = new ResponseModel(); try { - * helper.validateMerchant(billRequest.getMid()); - * - * BharatConnectMaster headersData = - * beneficiaryDetailsRepository.findByOrgId("ORG001"); - * - * if (headersData == null) { responseModel = new - * ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, - * headersData); return responseModel; } - * - * HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", - * headersData.getXDigiledgeKey()); headers.set("agentId", - * headersData.getAgentId()); headers.set("tenantId", - * headersData.getTenantId()); - * headers.setContentType(MediaType.APPLICATION_JSON); ObjectMapper objectMapper - * = new ObjectMapper(); - * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String - * json = objectMapper.writeValueAsString(billRequest); String url = agentDtaUrl - * + BBPSConstant.BILL_ID_URL + billRequest.getBillId(); - * - * log.info("Full URL" + url); - * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - * - * // ✅ Call the API using httpService Map responseMap = + * while (true) { try { Map responseMap = * httpService.getRequest(url, headers); String responseData = - * responseMap.get("data"); + * responseMap.get("data"); log.info("📦 Bill FetchById Response: {}", + * responseData); * - * log.info("📦 Bill Fetch API Response: {}", responseData); + * helper.updateOutboundLogResponse(outboundLog, responseData); * - * if (responseData == null || responseData.isEmpty()) { throw new - * CustomException("Empty response from BBPS server"); } + * Map dataMap = objectMapper.readValue(responseData, new + * TypeReference>() {}); * - * // ✅ Convert JSON string → Map Map dataMap = - * objectMapper.readValue(responseData, new TypeReference>() - * { }); + * if (!dataMap.containsKey("genericResponse")) { + * helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + * 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")) ); } * - * // ✅ Validate generalResp if (!dataMap.containsKey("genericResponse")) { - * throw new CustomException("Invalid response structure from BBPS"); } - * - * // ✅ Convert to your custom DTO BillDataResponse fetchBillResponse = - * objectMapper.convertValue(dataMap, BillDataResponse.class); GeneralResp - * generalResponse = fetchBillResponse.getGenericResponse(); - * - * // ✅ Build final ResponseModel responseModel = new - * ResponseModel(generalResponse.getRemarks(), generalResponse.getStatus(), - * Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse); - * - * } catch (CustomException ex) { log.warn("Merchant validation failed: {}", - * ex.getMessage()); return ex.getResponseModel(); // Directly return - * ResponseModel from exception } catch (Exception e) { - * log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - * responseModel.setStatus("500"); - * responseModel.setMessage("Exception occurred"); - * responseModel.setData(e.getMessage()); } - * - * return responseModel; + * BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, + * BillDataResponse.class); GeneralResp generalResp = + * responseWrapper.getGenericResponse(); * + * String status = generalResp.getStatus(); + * log.info("📡 Current Bill Status: {}", status); // ✅ Check for "INPROGRESS" + * or pending state if ("INPROGRESS".equalsIgnoreCase(status)) { if + * (System.currentTimeMillis() - startTime > maxWaitTimeMs) { + * helper.updateInboundLogFailure(inboundLog, "Timeout after 40 seconds", + * "FAILED"); throw new CustomException("Timeout", "FAILED", 408, + * "Bill fetch still in progress"); } Thread.sleep(intervalMs); continue; // + * retry again } // ✅ Final successful response + * helper.updateInboundLogSuccess(inboundLog, responseData, + * generalResp.getStatus()); return new ResponseModel( generalResp.getMessage(), + * generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), + * responseWrapper ); } catch (JsonProcessingException e) { + * log.error("Error parsing BillById JSON: {}", e.getMessage()); + * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + * throw new CustomException("Invalid JSON received from API"); } catch + * (InterruptedException e) { Thread.currentThread().interrupt(); + * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); + * throw new CustomException("Thread interrupted during bill status check"); } } * } */ diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index 32b3a25..6ce0849 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -2,24 +2,38 @@ package com.billpaymentservice.bbps.util; import java.security.SecureRandom; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Optional; import java.util.function.Function; +import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.billpaymentservice.bbps.dto.AdditionalInfoBillDTO; +import com.billpaymentservice.bbps.dto.AdditionalInfoDTO; +import com.billpaymentservice.bbps.dto.CustomerParamDAO; +import com.billpaymentservice.bbps.dto.CustomerParamDTO; import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.entites.AdditionalInfoBill; import com.billpaymentservice.bbps.entites.BBPSMastersData; import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo; +import com.billpaymentservice.bbps.repository.BillMasterRepository; import com.billpaymentservice.bbps.repository.BillerDataRepository; import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; +import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; +import com.billpaymentservice.bbps.dto.response.BillDataResponse; import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; +import com.billpaymentservice.bbps.entites.BillMaster; import com.billpaymentservice.bbps.entites.BillerDetails; +import com.billpaymentservice.bbps.entites.BillerResponse; +import com.billpaymentservice.bbps.entites.CustomerParamBill; import com.billpaymentservice.bbps.entites.InboundTraceLog; import com.billpaymentservice.bbps.entites.OutboundTraceLog; import com.billpaymentservice.bbps.entites.PaymentChannel; @@ -43,14 +57,17 @@ public class Helper { private final BBPSMasterDataRepo bbpsMasterDataRepo; private final BillerDataRepository billerDataRespository; + private final BillMasterRepository billMasterRepository; // Constructor Injection public Helper(BBPSMasterDataRepo bbpsMasterDataRepo, InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository,BillerDataRepository billerDataRepository) { + OutboundTraceLogRepository outboundTraceLogRepository,BillerDataRepository billerDataRepository, + BillMasterRepository billMasterRepository) { this.bbpsMasterDataRepo = bbpsMasterDataRepo; this.inboundTraceLogRepository = inboundTraceLogRepository; this.outboundTraceLogRepository = outboundTraceLogRepository; this.billerDataRespository=billerDataRepository; + this.billMasterRepository=billMasterRepository; } /** @@ -229,5 +246,71 @@ public class Helper { } } + public void saveOrUpdateBillerData(BillDataResponse responseWrapper, + BillFetchByBillIdRequest billFetchByBillIdRequest) { + BillMaster billMaster =new BillMaster(); + billMaster.setBillId("12333333hjsdfjsfdj"); + billMaster.setRefId(responseWrapper.getRefId()); + billMaster.setBillerId(responseWrapper.getBillerId()); + billMaster.setStatus(responseWrapper.getStatus()); + billMaster.setActionType(responseWrapper.getActionType()); + billMaster.setUserId(responseWrapper.getUserId()); + billMaster.setReqId(billFetchByBillIdRequest.getReqId()); // if available from your API request + billMaster.setTxnId("jhnjhbhj"); // give it from method + + // ---- BILLER RESPONSE ---- + BillerResponse billerResponse = new BillerResponse(); + if (responseWrapper.getBillerResponse() != null) { + billerResponse.setBillId(responseWrapper.getBillerResponse().getBillId()); + billerResponse.setAmount(responseWrapper.getBillerResponse().getAmount()); + billerResponse.setBillDate(responseWrapper.getBillerResponse().getBillDate()); + billerResponse.setBillNumber(responseWrapper.getBillerResponse().getBillNumber()); + billerResponse.setBillPeriod(responseWrapper.getBillerResponse().getBillPeriod()); + billerResponse.setCustConvFee(responseWrapper.getBillerResponse().getCustConvFee()); + billerResponse.setCouCustConvFee(responseWrapper.getBillerResponse().getCouCustConvFee()); + billerResponse.setDueDate(responseWrapper.getBillerResponse().getDueDate()); + billerResponse.setCustomerName(responseWrapper.getBillerResponse().getCustomerName()); + billerResponse.setAmountOption(responseWrapper.getBillerResponse().isAmountOption()); + billerResponse.setBillMaster(billMaster); // maintain mapping + } + billMaster.setBillerResponse(billerResponse); + // ---- ADDITIONAL INFO ---- + List additionalInfos = new ArrayList<>(); + if (responseWrapper.getAdditionalInfo() != null) { + for (AdditionalInfoBillDTO info : responseWrapper.getAdditionalInfo()) { + AdditionalInfoBill entity = new AdditionalInfoBill(); + entity.setName(info.getName()); + entity.setValue(info.getValue()); + entity.setBillMaster(billMaster); // maintain mapping + additionalInfos.add(entity); + + } + } + billMaster.setAdditionalInfo(additionalInfos); + + // ---- CUSTOMER PARAMS ---- + List customerParams = new ArrayList<>(); + if (responseWrapper.getCustomerParams() != null) { + for (CustomerParamDAO param : responseWrapper.getCustomerParams()) { + CustomerParamBill entity = new CustomerParamBill(); + entity.setName(param.getName()); + entity.setValue(param.getValue()); + entity.setType(param.getType()); + entity.setBillMaster(billMaster); + customerParams.add(entity); + } + } + billMaster.setCustomerParams(customerParams); + + // ---- DATES ---- + billMaster.setCreationDate(responseWrapper.getCreationDate()); + billMaster.setModifiedDate(responseWrapper.getModifiedDate()); + billMaster.setCreatedEpochDate(responseWrapper.getCreatedEpochDate()); + billMaster.setModifiedEpochDate(responseWrapper.getModifiedEpochDate()); + + billMasterRepository.save(billMaster); + + } + } From af7cdaf5d7e5086765ced738f6dfbf0b4845d15f Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Fri, 7 Nov 2025 18:38:09 +0530 Subject: [PATCH 5/6] saved initate payment and checktxn status --- .../bbps/dto/TransactionDTO.java | 15 +- .../response/TransactionStatusResponse.java | 2 + .../bbps/entites/AgentFundTransfer.java | 58 ++++++ .../entites/CustomerParamTransaction.java | 33 ++++ .../bbps/entites/DeviceBlockTag.java | 38 ++++ .../bbps/entites/PaymentInitiate.java | 31 ++++ .../bbps/entites/TransactionMaster.java | 163 +++++++++++++++++ .../bbps/entites/TransactionStatus.java | 66 ------- .../AgentFundTransferRepository.java | 9 + .../repository/PaymentIntiateRepository.java | 9 + .../TransactionMasterRepository.java | 9 + .../bbps/serviceImpl/AgentServiceImpl.java | 5 + .../serviceImpl/MasterDataServiceImpl.java | 1 + .../bbps/serviceImpl/PaymentServiceImpl.java | 168 ++++++++++++++---- .../bbps/util/EntityRelationshipUtil.java | 24 +++ 15 files changed, 518 insertions(+), 113 deletions(-) create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/CustomerParamTransaction.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/DeviceBlockTag.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/PaymentInitiate.java create mode 100644 src/main/java/com/billpaymentservice/bbps/entites/TransactionMaster.java delete mode 100644 src/main/java/com/billpaymentservice/bbps/entites/TransactionStatus.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/AgentFundTransferRepository.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/PaymentIntiateRepository.java create mode 100644 src/main/java/com/billpaymentservice/bbps/repository/TransactionMasterRepository.java diff --git a/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java index 34952da..d6bd669 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/TransactionDTO.java @@ -3,6 +3,7 @@ package com.billpaymentservice.bbps.dto; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -12,10 +13,10 @@ import lombok.Setter; @Getter @Setter @JsonIgnoreProperties(ignoreUnknown = true) - public class TransactionDTO { - - @NotBlank private String txnId; + + @JsonProperty("txnId") + @NotBlank private String bankTxnId; @NotBlank private String refId; private String txnNpciId; private String paymentRefId; @@ -55,12 +56,10 @@ public class TransactionDTO { private String fundTxnType; private String reason; - private List amountTags; - private List customerParamsDAOS; - private List paymentInformation; + private String amountTags; + private String customerParamsDAOS; + private String paymentInformation; private List deviceBlockTags; - - private List customerParamsDAO; private String planId; 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 27d61cc..70dbe8b 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/TransactionStatusResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/TransactionStatusResponse.java @@ -7,9 +7,11 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter +@ToString public class TransactionStatusResponse { @JsonProperty("transactionDAO") diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java b/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java new file mode 100644 index 0000000..2424a59 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java @@ -0,0 +1,58 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name = "agent_fund_transfer_Txn_Status") +@NoArgsConstructor +@Getter +@Setter +@AllArgsConstructor +public class AgentFundTransfer { + + + @Id + @Column(name = "fund_txn_reference_id") + private String fundTxnReferenceId; + + @Column(name = "transaction_master_id") + private String TransactionMasterId; //primary key from transaction master + + @Column(name = "txn_id") + private String txnId; + @Column(name = "req_id") + private String reqId; + @Column(name = "fund_txn_remarks") + private String fundTxnRemarks; + + @Column(name = "fund_txn_date") + private String fundTxnDate; + + @Column(name = "fund_txn_amt") + private Double fundTxnAmt; + + @Column(name = "fund_utr") + private String fundUTR; + + @Column(name = "fund_resp_remarks") + private String fundRespRemarks; + + @Column(name = "agent_npci_id") + private String agentNpciId; + + @Column(name = "txn_ref_id") + private String txnRefId; + + @Column(name = "fund_status") + private String fundStatus; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamTransaction.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamTransaction.java new file mode 100644 index 0000000..7a82c12 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamTransaction.java @@ -0,0 +1,33 @@ +package com.billpaymentservice.bbps.entites; + +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 lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +@Table(name = "customer_params_transaction") +public class CustomerParamTransaction { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String paramsId; + private String name; + private String value; + private String type; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "txn_id", referencedColumnName = "bank_txn_id") + private TransactionMaster transactionMaster; +} + diff --git a/src/main/java/com/billpaymentservice/bbps/entites/DeviceBlockTag.java b/src/main/java/com/billpaymentservice/bbps/entites/DeviceBlockTag.java new file mode 100644 index 0000000..56ac522 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/DeviceBlockTag.java @@ -0,0 +1,38 @@ +package com.billpaymentservice.bbps.entites; + +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 lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +@Table(name = "device_block_tag") +public class DeviceBlockTag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "tag_id") + private String tagId; + + @Column(name = "value") + private String value; + + // ✅ ManyToOne relation back to TransactionMaster + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "txn_id", referencedColumnName = "bank_txn_id") + private TransactionMaster transactionMaster; +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PaymentInitiate.java b/src/main/java/com/billpaymentservice/bbps/entites/PaymentInitiate.java new file mode 100644 index 0000000..61f92c8 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/PaymentInitiate.java @@ -0,0 +1,31 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "payment_initiate") +public class PaymentInitiate { + + @Id + @Column(name = "req_id") + private String reqId; + + @Column(name = "bank_txn_Id", nullable = false) + private String bankTxnId; + + @Column(name = "txn_id") + private String txnId; + + @Column(name = "status") + private String status; +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/TransactionMaster.java b/src/main/java/com/billpaymentservice/bbps/entites/TransactionMaster.java new file mode 100644 index 0000000..da9f9ad --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/TransactionMaster.java @@ -0,0 +1,163 @@ +package com.billpaymentservice.bbps.entites; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@Entity +@Table(name = "transaction_master") +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class TransactionMaster { + + // 👇 JSON me "txn_id" aayega, ye DB me bank_txn_id column me save hoga + @Id + @JsonProperty("txn_id") + @Column(name = "bank_txn_id", nullable = false, unique = true) + private String bankTxnId; + + // 👇 Apna internal transaction id, manually generate or system ke through + @Column(name = "txn_id") + private String txnId; + + @Column(name = "req_id") + private String reqId; + + @Column(name = "ref_id") + private String refId; + + @Column(name = "txn_npci_id") + private String txnNpciId; + + @Column(name = "payment_ref_id") + private String paymentRefId; + + @Column(name = "remitter_name") + private String remitterName; + + @Column(name = "order_id") + private String orderId; + + @Column(name = "bill_id") + private String billId; + + @Column(name = "user_type") + private String userType; + + @Column(name = "user_id") + private String userId; + + @Column(name = "txn_amount") + private Double txnAmount; + + @Column(name = "total_txn_amount") + private Double totalTxnAmount; + + @Column(name = "biller_id") + private String billerId; + + @Column(name = "biller_category") + private String billerCategory; + + @Column(name = "biller_name") + private String billerName; + + @Column(name = "client_req_id") + private String clientReqId; + + @Column(name = "off_us_pay") + private String offUsPay; + + @Column(name = "split_pay") + private String splitPay; + + @Column(name = "quick_pay") + private String quickPay; + + @Column(name = "payment_mode") + private String paymentMode; + + @Column(name = "agent_payment_information", columnDefinition = "TEXT") + private String agentPaymentInformation; + + @Column(name = "cust_conv_fee") + private Double custConvFee; + + @Column(name = "currency") + private String currency; + + @Column(name = "status") + private String status; + + @Column(name = "requested_ip") + private String requestedIp; + + @Column(name = "customer_mob_no") + private String customerMobNo; + + @Column(name = "mac_address") + private String macAddress; + + @Column(name = "split_pay_amount") + private Double splitPayAmount; + + @Column(name = "cou_cust_conv_fee") + private Double couCustConvFee; + + @Column(name = "settlement_verification") + private Boolean settlementVerification; + + @Column(name = "fund_txn_type") + private String fundTxnType; + + @Column(name = "reason", columnDefinition = "TEXT") + private String reason; + + @Column(name = "amount_tags", columnDefinition = "TEXT") + private String amountTags; + + @Column(name = "payment_information", columnDefinition = "TEXT") + private String paymentInformation; + + // ✅ Relation with DeviceBlockTagEntity + @OneToMany(mappedBy = "transactionMaster", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List deviceBlockTags; + + // ✅ Relation with CustomerParamEntity + @OneToMany(mappedBy = "transactionMaster", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List customerParams; + + @Column(name = "plan_id") + private String planId; + + @Column(name = "plan_type") + private String planType; + + @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/TransactionStatus.java b/src/main/java/com/billpaymentservice/bbps/entites/TransactionStatus.java deleted file mode 100644 index cf9a9f5..0000000 --- a/src/main/java/com/billpaymentservice/bbps/entites/TransactionStatus.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.billpaymentservice.bbps.entites; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import java.time.LocalDateTime; -import java.util.List; - - -@Entity -@Getter -@Setter -@Table(name = "transaction_status") -public class TransactionStatus { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false, unique = true) - private String txnId; - - @Column(nullable = false) - private String refId; - - private String txnNpciId; - private String orderId; - private String billId; - private String userType; - private String userId; - private Double txnAmount; - private Double totalTxnAmount; - private String billerId; - private String billerCategory; - 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 String planId; - private String planType; - private LocalDateTime creationDate; - private LocalDateTime modifiedDate; - private Long createdEpochDate; - private Long modifiedEpochDate; - - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "fund_transfer_id") - private AgentFundTransferEntity agentFundTransfer; - - @OneToMany(cascade = CascadeType.ALL) - @JoinColumn(name = "transaction_id") - private List customerParamsDAO; -} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/AgentFundTransferRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/AgentFundTransferRepository.java new file mode 100644 index 0000000..6986310 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/AgentFundTransferRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.AgentFundTransfer; + +public interface AgentFundTransferRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/PaymentIntiateRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/PaymentIntiateRepository.java new file mode 100644 index 0000000..187d29f --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/PaymentIntiateRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.PaymentInitiate; + +public interface PaymentIntiateRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/TransactionMasterRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/TransactionMasterRepository.java new file mode 100644 index 0000000..188cd27 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/TransactionMasterRepository.java @@ -0,0 +1,9 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.billpaymentservice.bbps.entites.TransactionMaster; + +public interface TransactionMasterRepository extends JpaRepository { + +} diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index d568d40..6c8c2db 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -121,16 +121,20 @@ public class AgentServiceImpl implements AgentService { billInitiate.setReqId(fetchBillRequest.getReqId()); billInitiate.setTxnId(txnId); billIntiateRepository.save(billInitiate); + + BillFetchByBillIdRequest billFetchByBillIdRequest = new BillFetchByBillIdRequest(); billFetchByBillIdRequest.setBillId(fetchBillResponse.getBillId()); billFetchByBillIdRequest.setMid(fetchBillRequest.getMid()); billFetchByBillIdRequest.setReqId(requestId); + try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // restore interrupted flag log.warn("Thread interrupted during delay: {}", e.getMessage()); } + return fetchBillById(billFetchByBillIdRequest, inboundLog); } catch (JsonProcessingException e) { log.error("❌ JSON Parsing Error: {}", e.getMessage()); @@ -251,6 +255,7 @@ public class AgentServiceImpl implements AgentService { } + @Override public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index 90565ae..773b931 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -249,6 +249,7 @@ public class MasterDataServiceImpl implements MasterDataService { CustomParamResp responseWrapper = objectMapper.convertValue(dataMap, CustomParamResp.class); List customParams = responseWrapper.getCustomParamResp(); + GeneralResp generalResp = responseWrapper.getGeneralResp(); List customParam = responseWrapper.getCustomParamResp(); diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java index 3eeb386..4f5d68d 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java @@ -22,17 +22,25 @@ import com.billpaymentservice.bbps.dto.response.BillDataResponse; import com.billpaymentservice.bbps.dto.response.BillPaymentResponse; import com.billpaymentservice.bbps.dto.response.FetchBillResponse; import com.billpaymentservice.bbps.dto.response.TransactionStatusResponse; +import com.billpaymentservice.bbps.entites.AgentFundTransfer; import com.billpaymentservice.bbps.entites.BharatConnectMaster; +import com.billpaymentservice.bbps.entites.BillInitiate; import com.billpaymentservice.bbps.entites.BillPayment; import com.billpaymentservice.bbps.entites.InboundTraceLog; import com.billpaymentservice.bbps.entites.OutboundTraceLog; +import com.billpaymentservice.bbps.entites.PaymentInitiate; +import com.billpaymentservice.bbps.entites.TransactionMaster; import com.billpaymentservice.bbps.exception.CustomException; +import com.billpaymentservice.bbps.repository.AgentFundTransferRepository; import com.billpaymentservice.bbps.repository.BharatConnectMasterRepository; import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; import com.billpaymentservice.bbps.repository.OutboundTraceLogRepository; +import com.billpaymentservice.bbps.repository.PaymentIntiateRepository; import com.billpaymentservice.bbps.repository.PaymentRepository; +import com.billpaymentservice.bbps.repository.TransactionMasterRepository; import com.billpaymentservice.bbps.service.PaymentService; import com.billpaymentservice.bbps.util.BBPSConstant; +import com.billpaymentservice.bbps.util.EntityRelationshipUtil; import com.billpaymentservice.bbps.util.Helper; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; @@ -50,20 +58,27 @@ public class PaymentServiceImpl implements PaymentService { private final PaymentRepository paymentRepository; private final InboundTraceLogRepository inboundTraceLogRepository; private final OutboundTraceLogRepository outboundTraceLogRepository; - + private final PaymentIntiateRepository paymentIntiateRepository; + private final TransactionMasterRepository transactionMasterRepository; + private final AgentFundTransferRepository agentFundTransferRepository; public PaymentServiceImpl(BharatConnectMasterRepository beneficiaryDetailsRepository, HttpService httpService, Helper helper, PaymentRepository paymentRepository, InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository) { + OutboundTraceLogRepository outboundTraceLogRepository, + PaymentIntiateRepository paymentIntiateRepository, + TransactionMasterRepository transactionMasterRepository, + AgentFundTransferRepository agentFundTransferRepository) { this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; this.httpService = httpService; this.helper = helper; this.paymentRepository = paymentRepository; this.inboundTraceLogRepository = inboundTraceLogRepository; this.outboundTraceLogRepository = outboundTraceLogRepository; + this.paymentIntiateRepository = paymentIntiateRepository; + this.transactionMasterRepository = transactionMasterRepository; + this.agentFundTransferRepository = agentFundTransferRepository; } private static final Logger LOGGER = LoggerFactory.getLogger(MasterDataServiceImpl.class); - @Override public ResponseModel initiatePayment(BillPaymentRequest billPaymentRequest) { String apiName = "InitiatePayment"; @@ -114,27 +129,35 @@ public class PaymentServiceImpl implements PaymentService { paymentRepository.save(entity); helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); - + PaymentInitiate paymentInitiate = new PaymentInitiate(); + paymentInitiate.setTxnId(txnId); + paymentInitiate.setReqId(requestId); + paymentInitiate.setBankTxnId(billPaymentResponse.getTxnId()); + paymentInitiate.setStatus(billPaymentResponse.getStatus()); + paymentIntiateRepository.save(paymentInitiate); // ✅ Trigger transaction status check TransactionStatusRequest transactionStatusRequest = new TransactionStatusRequest(); - transactionStatusRequest.setTxnId(entity.getTxnId()); + transactionStatusRequest.setTxnId(billPaymentResponse.getTxnId()); transactionStatusRequest.setReqId(requestId); - + + + try { + Thread.sleep(2000); // Initial wait before first status check + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOGGER.error("Thread interrupted: {}", e.getMessage()); + } + + //calling the method to check transaction status return checkTrasactionStatus(transactionStatusRequest, inboundLog); } catch (JsonProcessingException e) { LOGGER.error("❌ JSON Parsing Error: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (CustomException ce) { - throw ce; // will be handled by global exception handler - } catch (Exception e) { - LOGGER.error("❌ Exception in initiatePayment(): {}", e.getMessage(), e); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "EXCEPTION"); - throw new CustomException("Payment initiation failed: " + e.getMessage()); } - } + } public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest,InboundTraceLog inboundLog) { String apiName = "CheckTransactionStatus"; @@ -152,11 +175,6 @@ public class PaymentServiceImpl implements PaymentService { OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null); - long startTime = System.currentTimeMillis(); - long maxWaitTimeMs = 40000; - long intervalMs = 5000; - - while (true) { Map responseMap = httpService.getRequest(url, headers); String responseData = responseMap.get("data"); LOGGER.info("Transaction status response: {}", responseData); @@ -178,20 +196,26 @@ public class PaymentServiceImpl implements PaymentService { TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); GeneralResp generalResp = responseWrapper.getGeneralResp(); - + + System.out.println("Response Wrapper:"+responseWrapper); + + + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + TransactionMaster transactionMaster = mapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class); + transactionMaster.setTxnId(txnId); + transactionMaster.setReqId(transactionStatusRequest.getReqId()); + EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster); + transactionMasterRepository.save(transactionMaster); + + AgentFundTransfer agentFundTransfer = mapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class); + agentFundTransfer.setTxnId(txnId); + agentFundTransfer.setReqId(transactionStatusRequest.getReqId()); + agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId()); + agentFundTransferRepository.save(agentFundTransfer); String status = generalResp.getStatus(); LOGGER.info("Current transaction status: {}", status); - if ("INPROGRESS".equalsIgnoreCase(status)) { - if (System.currentTimeMillis() - startTime > maxWaitTimeMs) { - helper.updateInboundLogFailure(inboundLog, "Timeout after 40 seconds", "FAILED"); - throw new CustomException("Timeout waiting for transaction completion", "FAILED", 408, "Transaction still in progress"); - } - - Thread.sleep(intervalMs); - continue; - } - ResponseModel responseModel = new ResponseModel( generalResp.getMessage(), generalResp.getStatus(), @@ -206,14 +230,9 @@ public class PaymentServiceImpl implements PaymentService { LOGGER.error("Error parsing transaction status JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); - throw new CustomException("Thread interrupted during transaction check"); - } + } } - } - + @Override public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest) { helper.validateMerchant(transactionStatusRequest.getMid()); @@ -230,7 +249,7 @@ public class PaymentServiceImpl implements PaymentService { headers.setContentType(MediaType.APPLICATION_JSON); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null); ObjectMapper objectMapper = new ObjectMapper(); Map responseMap = httpService.getRequest(url, headers); @@ -277,7 +296,7 @@ public class PaymentServiceImpl implements PaymentService { } } - /* + /* PollBack logic for the fetchTxnByTxnId API * @Override public ResponseModel fetchTxnByTxnId(BillFetchByBillIdRequest * billFetchByBillIdRequest) { * @@ -327,4 +346,75 @@ public class PaymentServiceImpl implements PaymentService { * } */ - + /* + * public ResponseModel checkTrasactionStatus(TransactionStatusRequest + * transactionStatusRequest,InboundTraceLog inboundLog) { String apiName = + * "CheckTransactionStatus"; String txnId = helper.generateTxnId(15); //our + * genrated txnId String requestId = transactionStatusRequest.getReqId(); 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); ObjectMapper objectMapper + * = new ObjectMapper(); + * + * OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, + * apiName, url, "GET", null); + * + * long startTime = System.currentTimeMillis(); long maxWaitTimeMs = 40000; long + * intervalMs = 5000; + * + * while (true) { Map responseMap = httpService.getRequest(url, + * headers); String responseData = responseMap.get("data"); + * LOGGER.info("Transaction status response: {}", responseData); + * + * helper.updateOutboundLogResponse(outboundLog, responseData); + * + * try { Map dataMap = objectMapper.readValue(responseData, new + * TypeReference>() {}); + * + * if (!dataMap.containsKey("generalResp")) { + * helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + * 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")) ); } + * + * TransactionStatusResponse responseWrapper = + * objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + * GeneralResp generalResp = responseWrapper.getGeneralResp(); + * + * String status = generalResp.getStatus(); + * LOGGER.info("Current transaction status: {}", status); + * + * if ("INPROGRESS".equalsIgnoreCase(status)) { if (System.currentTimeMillis() - + * startTime > maxWaitTimeMs) { helper.updateInboundLogFailure(inboundLog, + * "Timeout after 40 seconds", "FAILED"); throw new + * CustomException("Timeout waiting for transaction completion", "FAILED", 408, + * "Transaction still in progress"); } + * + * Thread.sleep(intervalMs); continue; } + * + * 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 transaction status JSON: {}", e.getMessage()); + * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + * throw new CustomException("Invalid JSON received from API"); } catch + * (InterruptedException e) { Thread.currentThread().interrupt(); + * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); + * throw new CustomException("Thread interrupted during transaction check"); } } + * } + * + * + */ \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java b/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java index 86048d1..3531e69 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java +++ b/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java @@ -62,5 +62,29 @@ public class EntityRelationshipUtil { } } } + + public static void linkTransactionMasterRelationships(TransactionMaster entity) { + + if (entity == null) return; + + // ✅ DeviceBlockTag relationship link karna + if (entity.getDeviceBlockTags() != null) { + entity.getDeviceBlockTags().forEach(tag -> { + if (tag != null) { + tag.setTransactionMaster(entity); + } + }); + } + + // ✅ CustomerParamTransaction relationship link karna + if (entity.getCustomerParams() != null) { + entity.getCustomerParams().forEach(param -> { + if (param != null) { + param.setTransactionMaster(entity); + } + }); + } + } + } From 43baedfecdf5e3718ba3e8b932536b3798957d22 Mon Sep 17 00:00:00 2001 From: Lincpay Tech Date: Mon, 10 Nov 2025 10:05:43 +0530 Subject: [PATCH 6/6] improved logs --- .../bbps/audit/Auditable.java | 4 +- .../bbps/config/RestClientConfig.java | 11 +- .../bbps/controller/AgentController.java | 5 +- .../bbps/controller/PaymentController.java | 1 - .../bbps/dto/AmountOptionDTO.java | 4 +- .../bbps/dto/BillerDTO.java | 2 + .../bbps/dto/BillerResponseParamsDTO.java | 3 +- .../bbps/dto/CustomerParamDTO.java | 4 +- .../bbps/dto/CustomerParamGroupsDTO.java | 4 +- .../bbps/dto/DispositionsDTO.java | 1 - .../billpaymentservice/bbps/dto/GroupDTO.java | 3 +- .../bbps/dto/PaymentChannelDTO.java | 1 - .../bbps/dto/PaymentModeDTO.java | 4 +- .../bbps/dto/request/BillPaymentRequest.java | 1 + .../bbps/dto/request/MasterRequest.java | 1 - .../dto/response/BillPaymentResponse.java | 1 + .../bbps/dto/response/BillerDataResponse.java | 1 - .../bbps/dto/response/CustomParamResp.java | 3 +- .../bbps/entites/AdditionalInfo.java | 11 +- .../bbps/entites/AgentFundTransfer.java | 2 - .../bbps/entites/AgentFundTransferEntity.java | 7 +- .../bbps/entites/AmountOption.java | 15 +- .../bbps/entites/BharatConnectMaster.java | 5 - .../bbps/entites/BillInitiate.java | 9 +- .../bbps/entites/BillMaster.java | 3 - .../bbps/entites/BillPayment.java | 9 +- .../bbps/entites/BillerDetails.java | 19 +- .../entites/BillerPlanResponseParams.java | 16 +- .../bbps/entites/BillerResponse.java | 2 - .../bbps/entites/BillerResponseParams.java | 14 +- .../bbps/entites/CustomParam.java | 7 +- .../bbps/entites/CustomerParam.java | 19 +- .../bbps/entites/CustomerParamDAO.java | 6 +- .../bbps/entites/CustomerParamGroups.java | 16 +- .../bbps/entites/DispositionDetails.java | 6 +- .../bbps/entites/Group.java | 18 +- .../bbps/entites/InterchangeFee.java | 16 +- .../bbps/entites/InterchangeFeeConf.java | 18 +- .../bbps/entites/InterchangeFeeDetail.java | 9 +- .../bbps/entites/PaymentChannel.java | 13 +- .../bbps/entites/PaymentMode.java | 2 - .../bbps/entites/RemitterIdentity.java | 10 +- .../exception/GlobalExceptionHandler.java | 70 ++- .../BharatConnectMasterRepository.java | 1 - .../bbps/repository/BillerDataRepository.java | 5 +- .../bbps/service/MasterDataService.java | 3 - .../bbps/service/PaymentService.java | 1 - .../bbps/serviceImpl/AgentServiceImpl.java | 468 +++++++++--------- .../bbps/serviceImpl/HttpService.java | 2 - .../serviceImpl/MasterDataServiceImpl.java | 100 ++-- .../bbps/serviceImpl/PaymentServiceImpl.java | 251 +++++----- .../bbps/util/EntityRelationshipUtil.java | 5 +- .../billpaymentservice/bbps/util/Helper.java | 22 +- 53 files changed, 662 insertions(+), 572 deletions(-) diff --git a/src/main/java/com/billpaymentservice/bbps/audit/Auditable.java b/src/main/java/com/billpaymentservice/bbps/audit/Auditable.java index 2bc6544..2039a63 100644 --- a/src/main/java/com/billpaymentservice/bbps/audit/Auditable.java +++ b/src/main/java/com/billpaymentservice/bbps/audit/Auditable.java @@ -1,16 +1,14 @@ package com.billpaymentservice.bbps.audit; import java.io.Serializable; -import java.util.Date; +import java.util.Date; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; - import jakarta.persistence.Column; - import jakarta.persistence.MappedSuperclass; import jakarta.persistence.Temporal; import jakarta.persistence.TemporalType; diff --git a/src/main/java/com/billpaymentservice/bbps/config/RestClientConfig.java b/src/main/java/com/billpaymentservice/bbps/config/RestClientConfig.java index 52ef5aa..c248203 100644 --- a/src/main/java/com/billpaymentservice/bbps/config/RestClientConfig.java +++ b/src/main/java/com/billpaymentservice/bbps/config/RestClientConfig.java @@ -1,15 +1,16 @@ package com.billpaymentservice.bbps.config; +import java.security.cert.X509Certificate; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestClient; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import java.security.cert.X509Certificate; - @Configuration public class RestClientConfig { diff --git a/src/main/java/com/billpaymentservice/bbps/controller/AgentController.java b/src/main/java/com/billpaymentservice/bbps/controller/AgentController.java index 2646092..92737af 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/AgentController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/AgentController.java @@ -3,7 +3,10 @@ package com.billpaymentservice.bbps.controller; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +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.BillFetchByBillIdRequest; diff --git a/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java b/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java index 69170b4..2b091d2 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java @@ -10,7 +10,6 @@ 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.FetchBillRequest; import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest; import com.billpaymentservice.bbps.service.PaymentService; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/AmountOptionDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/AmountOptionDTO.java index a13eb04..29be206 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/AmountOptionDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/AmountOptionDTO.java @@ -1,8 +1,8 @@ package com.billpaymentservice.bbps.dto; -import jakarta.persistence.*; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/dto/BillerDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/BillerDTO.java index f2c81cd..005b1d2 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/BillerDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/BillerDTO.java @@ -1,7 +1,9 @@ package com.billpaymentservice.bbps.dto; import java.util.List; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import lombok.Getter; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/BillerResponseParamsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/BillerResponseParamsDTO.java index 7422a85..e6881b7 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/BillerResponseParamsDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/BillerResponseParamsDTO.java @@ -1,8 +1,9 @@ package com.billpaymentservice.bbps.dto; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamDTO.java index 84fbc7f..07ce7d1 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamDTO.java @@ -1,11 +1,11 @@ package com.billpaymentservice.bbps.dto; +import java.util.List; + import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; -import java.util.List; - @Getter @Setter public class CustomerParamDTO { diff --git a/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java index 4086d95..fd07abd 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/CustomerParamGroupsDTO.java @@ -1,10 +1,10 @@ package com.billpaymentservice.bbps.dto; +import java.util.List; + import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.util.List; - @Getter @Setter @ToString diff --git a/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java index 4297bd6..6c8a8a9 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/DispositionsDTO.java @@ -2,7 +2,6 @@ package com.billpaymentservice.bbps.dto; import lombok.Getter; import lombok.Setter; -import lombok.ToString; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/dto/GroupDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/GroupDTO.java index b475d22..5a80d65 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/GroupDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/GroupDTO.java @@ -1,8 +1,9 @@ package com.billpaymentservice.bbps.dto; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/dto/PaymentChannelDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/PaymentChannelDTO.java index dd8d5f1..1c6ebd2 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/PaymentChannelDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/PaymentChannelDTO.java @@ -1,6 +1,5 @@ package com.billpaymentservice.bbps.dto; -import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import lombok.Getter; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/PaymentModeDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/PaymentModeDTO.java index 1f55930..9ffaea5 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/PaymentModeDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/PaymentModeDTO.java @@ -2,7 +2,9 @@ package com.billpaymentservice.bbps.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import jakarta.validation.constraints.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.PositiveOrZero; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/BillPaymentRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/BillPaymentRequest.java index ca7b99c..2c395d2 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/BillPaymentRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/BillPaymentRequest.java @@ -1,5 +1,6 @@ package com.billpaymentservice.bbps.dto.request; import java.util.List; + import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/MasterRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/MasterRequest.java index 0998e91..bdc7714 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/MasterRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/MasterRequest.java @@ -1,7 +1,6 @@ package com.billpaymentservice.bbps.dto.request; import lombok.Getter; - import lombok.Setter; @Getter 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 1654b5f..204b86a 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/BillPaymentResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/BillPaymentResponse.java @@ -1,6 +1,7 @@ package com.billpaymentservice.bbps.dto.response; import com.billpaymentservice.bbps.dto.GeneralResp; + import lombok.Getter; import lombok.Setter; import lombok.ToString; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/BillerDataResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/BillerDataResponse.java index 647efc8..d48c12f 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/BillerDataResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/BillerDataResponse.java @@ -2,7 +2,6 @@ package com.billpaymentservice.bbps.dto.response; import com.billpaymentservice.bbps.dto.BillerDTO; import com.billpaymentservice.bbps.dto.GeneralResp; -import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; 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 99b370b..42c31fd 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/CustomParamResp.java @@ -1,10 +1,9 @@ package com.billpaymentservice.bbps.dto.response; import java.util.List; -import com.billpaymentservice.bbps.dto.ContactMaster; + import com.billpaymentservice.bbps.dto.CustomParamDTO; import com.billpaymentservice.bbps.dto.GeneralResp; -import com.billpaymentservice.bbps.entites.CustomerParam; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java index 906ac37..90ed365 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AdditionalInfo.java @@ -1,8 +1,15 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; -import jakarta.validation.constraints.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +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 lombok.Getter; import lombok.Setter; import lombok.ToString; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java b/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java index 2424a59..a227085 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransfer.java @@ -3,8 +3,6 @@ package com.billpaymentservice.bbps.entites; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransferEntity.java b/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransferEntity.java index f687f91..766def0 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransferEntity.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AgentFundTransferEntity.java @@ -1,7 +1,12 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java b/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java index d1fab78..b766930 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/AmountOption.java @@ -1,10 +1,19 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; -import java.util.List; -import com.fasterxml.jackson.annotation.JsonProperty; @Entity @Table(name = "amount_option") diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BharatConnectMaster.java b/src/main/java/com/billpaymentservice/bbps/entites/BharatConnectMaster.java index 758396c..965351f 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BharatConnectMaster.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BharatConnectMaster.java @@ -1,10 +1,5 @@ package com.billpaymentservice.bbps.entites; -import java.time.LocalDateTime; - -import org.hibernate.annotations.CreationTimestamp; -import org.hibernate.annotations.UpdateTimestamp; - import com.billpaymentservice.bbps.audit.Auditable; import jakarta.persistence.Column; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java b/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java index c53cbe1..504bbcd 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillInitiate.java @@ -1,6 +1,11 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; -import lombok.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; @Data @AllArgsConstructor diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java b/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java index 48d597d..67f70a9 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillMaster.java @@ -1,9 +1,6 @@ package com.billpaymentservice.bbps.entites; -import java.time.LocalDateTime; import java.util.List; -import com.billpaymentservice.bbps.dto.BillerResponseBill; - import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillPayment.java b/src/main/java/com/billpaymentservice/bbps/entites/BillPayment.java index c4ed1cc..9b7fdaf 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillPayment.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillPayment.java @@ -2,7 +2,14 @@ package com.billpaymentservice.bbps.entites; import java.time.LocalDateTime; import java.util.List; -import jakarta.persistence.*; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java index 9e552fb..4b6b871 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerDetails.java @@ -1,14 +1,21 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; -import jakarta.validation.constraints.*; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import java.util.List; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java index 3415f7e..b11ecc3 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerPlanResponseParams.java @@ -1,15 +1,17 @@ package com.billpaymentservice.bbps.entites; -import java.util.List; - +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import jakarta.persistence.*; -import jakarta.validation.constraints.*; -import lombok.Getter; -import lombok.Setter; -import java.util.List; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java index 4a02e35..b2608a3 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponse.java @@ -1,7 +1,5 @@ package com.billpaymentservice.bbps.entites; -import java.time.LocalDate; - import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java index dafef13..d8b1c9a 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/BillerResponseParams.java @@ -1,11 +1,21 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import java.util.List; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; -import java.util.List; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java index fe3bafe..c76e6fe 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomParam.java @@ -1,6 +1,11 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; import lombok.ToString; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java index b032baf..574da4a 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParam.java @@ -1,13 +1,24 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; -import jakarta.validation.constraints.*; +import java.util.List; + +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +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.Min; +import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.util.List; - @Getter @Setter @Entity diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamDAO.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamDAO.java index d9ce0d7..5fc6a25 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamDAO.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamDAO.java @@ -1,7 +1,11 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java index f422665..12e84ed 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/CustomerParamGroups.java @@ -1,12 +1,22 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import java.util.List; + +import jakarta.persistence.CascadeType; +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.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.util.List; - @Getter @Setter @Entity diff --git a/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java b/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java index c0cdba9..a1e2126 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/DispositionDetails.java @@ -1,7 +1,9 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; - +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; import lombok.ToString; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/Group.java b/src/main/java/com/billpaymentservice/bbps/entites/Group.java index 455fe70..34889a4 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/Group.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/Group.java @@ -1,12 +1,24 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import java.util.List; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +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.OneToMany; +import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; -import java.util.List; - @Getter @Setter @Entity diff --git a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java index 0343502..337415e 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFee.java @@ -2,14 +2,20 @@ package com.billpaymentservice.bbps.entites; import java.util.List; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import jakarta.persistence.*; -import jakarta.validation.constraints.*; -import lombok.Getter; -import lombok.Setter; -import java.util.List; @Getter @Setter diff --git a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeConf.java b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeConf.java index 789d8f8..7b9c405 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeConf.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeConf.java @@ -2,16 +2,20 @@ package com.billpaymentservice.bbps.entites; import java.util.List; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +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 lombok.Getter; import lombok.Setter; - -import jakarta.persistence.*; -import jakarta.validation.constraints.*; -import lombok.Getter; -import lombok.Setter; -import java.util.List; - @Getter @Setter @Entity diff --git a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeDetail.java b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeDetail.java index 382b2c6..08c9d14 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeDetail.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/InterchangeFeeDetail.java @@ -1,6 +1,13 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +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 lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java b/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java index 5c12b4e..f799dbd 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PaymentChannel.java @@ -1,13 +1,18 @@ 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.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import com.fasterxml.jackson.annotation.JsonProperty; - @Getter @Setter @Entity diff --git a/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java b/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java index 0493846..947af6b 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/PaymentMode.java @@ -5,8 +5,6 @@ package com.billpaymentservice.bbps.entites; 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; diff --git a/src/main/java/com/billpaymentservice/bbps/entites/RemitterIdentity.java b/src/main/java/com/billpaymentservice/bbps/entites/RemitterIdentity.java index 66d2e1b..020fa3a 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/RemitterIdentity.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/RemitterIdentity.java @@ -1,6 +1,14 @@ package com.billpaymentservice.bbps.entites; -import jakarta.persistence.*; +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 lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java b/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java index 6007b09..623c185 100644 --- a/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java @@ -1,61 +1,57 @@ package com.billpaymentservice.bbps.exception; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; +import java.util.*; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.*; +import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.*; import com.billpaymentservice.bbps.dto.ResponseModel; -import java.util.HashMap; -import java.util.Map; - @ControllerAdvice public class GlobalExceptionHandler { - // ✅ Handle CustomException - @ExceptionHandler(CustomException.class) - public ResponseEntity> handleCustomException(CustomException ex) { - return new ResponseEntity<>(ex.getResponseModel(), HttpStatus.BAD_REQUEST); - } + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); - // ✅ Handle validation errors @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) { + public ResponseEntity> handleValidation(MethodArgumentNotValidException ex) { + List> fieldErrors = ex.getBindingResult().getFieldErrors() + .stream() + .map(fe -> Map.of("field", fe.getField(), "message", fe.getDefaultMessage())) + .collect(Collectors.toList()); - Map errors = new HashMap<>(); - - ex.getBindingResult().getFieldErrors().forEach(error -> { - errors.put(error.getField(), error.getDefaultMessage()); - }); - - ResponseModel response = new ResponseModel<>( - "Validation Failed", - "FAILED", - HttpStatus.BAD_REQUEST.value(), - errors + logger.warn("Validation failed: {}", fieldErrors); + ResponseModel>> resp = new ResponseModel<>( + "Validation failed for request", + "FAILED", + HttpStatus.BAD_REQUEST.value(), + null ); + // put validation errors into data or duplicate field in ResponseModel as required + resp.setData(fieldErrors); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resp); + } - return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + @ExceptionHandler(AppException.class) + public ResponseEntity> handleAppException(AppException ex) { + logger.warn("AppException: status={}, message={}", ex.getStatus(), ex.getMessage()); + ResponseModel resp = new ResponseModel<>(ex.getMessage(), ex.getStatus(), ex.getStatusCode(), ex.getData()); + return ResponseEntity.status(HttpStatus.valueOf(ex.getStatusCode())).body(resp); } - // ✅ NEW: Handle ALL other exceptions (Generic Handler) @ExceptionHandler(Exception.class) - public ResponseEntity> handleAllExceptions(Exception ex) { - - // ✅ Internal logging (tumhare system ko pata chale) - System.err.println("INTERNAL SERVER ERROR: " + ex.getMessage()); - ex.printStackTrace(); // Stack trace for debugging - - // ✅ Client ko generic message + public ResponseEntity> handleAll(Exception ex) { + logger.error("Unhandled exception", ex); ResponseModel response = new ResponseModel<>( "Service temporarily unavailable. Please try again later.", "FAILED", HttpStatus.INTERNAL_SERVER_ERROR.value(), null ); - - return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); } -} \ No newline at end of file +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/BharatConnectMasterRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/BharatConnectMasterRepository.java index 8eb7927..b04b176 100644 --- a/src/main/java/com/billpaymentservice/bbps/repository/BharatConnectMasterRepository.java +++ b/src/main/java/com/billpaymentservice/bbps/repository/BharatConnectMasterRepository.java @@ -1,7 +1,6 @@ package com.billpaymentservice.bbps.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import org.springframework.web.servlet.function.ServerRequest.Headers; import com.billpaymentservice.bbps.entites.BharatConnectMaster; diff --git a/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java index 458a8b1..f4f7b2f 100644 --- a/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java +++ b/src/main/java/com/billpaymentservice/bbps/repository/BillerDataRepository.java @@ -1,14 +1,13 @@ package com.billpaymentservice.bbps.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.billpaymentservice.bbps.entites.BillerDetails; -import java.util.List; -import java.util.Optional; - @Repository public interface BillerDataRepository 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 1430230..cd608e5 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java @@ -7,11 +7,8 @@ import com.billpaymentservice.bbps.dto.request.CustomParamRequest; import com.billpaymentservice.bbps.dto.request.DispositionRequest; import com.billpaymentservice.bbps.dto.request.MasterCategoryRequest; import com.billpaymentservice.bbps.dto.request.MasterRequest; -import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; import com.billpaymentservice.bbps.dto.request.PlanRequest; -import jakarta.servlet.http.HttpServletRequest; - public interface MasterDataService { public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest); diff --git a/src/main/java/com/billpaymentservice/bbps/service/PaymentService.java b/src/main/java/com/billpaymentservice/bbps/service/PaymentService.java index 84596f4..a25f681 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/PaymentService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/PaymentService.java @@ -2,7 +2,6 @@ package com.billpaymentservice.bbps.service; import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillPaymentRequest; -import com.billpaymentservice.bbps.dto.request.FetchBillRequest; import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest; public interface PaymentService { diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index 6c8c2db..4462d83 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -1,8 +1,9 @@ package com.billpaymentservice.bbps.serviceImpl; -import java.time.LocalDateTime; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -39,7 +40,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; @Service -@Slf4j public class AgentServiceImpl implements AgentService { @Value("${agent.data.url}") @@ -51,7 +51,7 @@ public class AgentServiceImpl implements AgentService { private final BharatConnectMasterRepository beneficiaryDetailsRepository; private final BillMasterRepository billMasterRepository; private final BillInitateRepository billIntiateRepository; - + private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); public AgentServiceImpl(RestClient restClient, HttpService httpService, Helper helper, BharatConnectMasterRepository beneficiaryDetailsRepository,InboundTraceLogRepository inboundTraceLogRepository, OutboundTraceLogRepository outboundTraceLogRepository, BillMasterRepository billMasterRepository,BillInitateRepository billIntiateRepository) { @@ -64,13 +64,13 @@ public class AgentServiceImpl implements AgentService { } - @Override public ResponseModel initiateBillFetch(FetchBillRequest fetchBillRequest) { + LOGGER.info("Initiating bill fetch for request ID: {} and MID", fetchBillRequest.getReqId(), fetchBillRequest.getMid()); String apiName = "InitiateBillFetch"; String txnId = helper.generateTxnId(15); String requestId = fetchBillRequest.getReqId(); - String url = agentDtaUrl + BBPSConstant.BILL_FETCH_INTI; + String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_INTI; helper.validateMerchant(fetchBillRequest.getMid()); @@ -87,71 +87,74 @@ public class AgentServiceImpl implements AgentService { // ✅ Create inbound & outbound logs InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, fetchBillRequest.getMid(), "POST", requestJson); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "POST", requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, fullUrl, "POST", requestJson); + LOGGER.debug("Outbound log created successfully for txnId: {} and reqId: {}", txnId, requestId); try { - Map responseMap = httpService.postRequest(url, requestJson, headers); + LOGGER.info("Calling external API: {}", fullUrl); + Map responseMap = httpService.postRequest(fullUrl, requestJson, headers); String responseData = responseMap.get("data"); - log.info("📦 Bill Fetch API Response: {}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); + LOGGER.debug("Response received from BBPS: {}", responseData); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); if (!dataMap.containsKey("genericResponse")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - 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")) - ); + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + LOGGER.warn("Invalid response received for txnId: {}", txnId); + throw new CustomException( + String.valueOf(dataMap.get("message")), + String.valueOf(dataMap.get("status")), + Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), + String.valueOf(dataMap.get("remarks")) + ); } - + BillMaster billMaster = new BillMaster(); billMaster.setBillId((String) dataMap.get("billId")); billMaster.setReqId(fetchBillRequest.getReqId()); billMaster.setTxnId(txnId); billMasterRepository.save(billMaster); + LOGGER.info("BillMaster saved for billId: {}", billMaster.getBillId()); + FetchBillResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillResponse.class); GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); - //save intitate bill here + BillInitiate billInitiate = new BillInitiate(); billInitiate.setBillId((String) dataMap.get("billId")); billInitiate.setReqId(fetchBillRequest.getReqId()); billInitiate.setTxnId(txnId); billIntiateRepository.save(billInitiate); - - + LOGGER.info("BillInitiate entry saved for billId: {}", billInitiate.getBillId()); + BillFetchByBillIdRequest billFetchByBillIdRequest = new BillFetchByBillIdRequest(); billFetchByBillIdRequest.setBillId(fetchBillResponse.getBillId()); billFetchByBillIdRequest.setMid(fetchBillRequest.getMid()); billFetchByBillIdRequest.setReqId(requestId); - + LOGGER.info("Waiting for 2 seconds before fetching bill by ID..."); try { Thread.sleep(2000); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); // restore interrupted flag - log.warn("Thread interrupted during delay: {}", e.getMessage()); + Thread.currentThread().interrupt(); + LOGGER.warn("Thread interrupted during delay: {}", e.getMessage()); } - + LOGGER.info("Calling internal method Fetching bill by ID: {}", billFetchByBillIdRequest.getBillId()); return fetchBillById(billFetchByBillIdRequest, inboundLog); } catch (JsonProcessingException e) { - log.error("❌ JSON Parsing Error: {}", e.getMessage()); + LOGGER.error("JSON Parsing Error: {}", e.getMessage(), e); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } + } } - - - public ResponseModel fetchBillById(BillFetchByBillIdRequest billFetchByBillIdRequest, InboundTraceLog inboundLog) { + LOGGER.info("Fetching bill by BILLID for request ID={} and MID={}", billFetchByBillIdRequest.getReqId(), billFetchByBillIdRequest.getMid()); String apiName = "FetchBillById"; String txnId = helper.generateTxnId(15); String reqId = billFetchByBillIdRequest.getReqId(); String billId = billFetchByBillIdRequest.getBillId(); - String url = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; + String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; helper.validateMerchant(billFetchByBillIdRequest.getMid()); @@ -163,239 +166,252 @@ public class AgentServiceImpl implements AgentService { headers.setContentType(MediaType.APPLICATION_JSON); ObjectMapper objectMapper = new ObjectMapper(); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, url, "GET", null); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); + LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl); - - try { - Map responseMap = httpService.getRequest(url, headers); - String responseData = responseMap.get("data"); - log.info("📦 Bill FetchById Response: {}", responseData); + try { + LOGGER.info("Calling external API: {}", fullUrl); + Map responseMap = httpService.getRequest(fullUrl, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Bill FetchById Response: {}", responseData); - helper.updateOutboundLogResponse(outboundLog, responseData); + helper.updateOutboundLogResponse(outboundLog, responseData); - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - if (!dataMap.containsKey("genericResponse")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - 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(); - log.info("📡 Current Bill Status: {}", status); - // ✅ Check for "INPROGRESS" or pending state - - - // ✅ Final successful response - helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - helper.saveOrUpdateBillerData(responseWrapper,billFetchByBillIdRequest); - - return new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper + if (!dataMap.containsKey("genericResponse")) { + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + LOGGER.warn("Invalid response structure for txnId: {}", txnId); + throw new CustomException( + String.valueOf(dataMap.get("message")), + String.valueOf(dataMap.get("status")), + Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), + String.valueOf(dataMap.get("remarks")) ); - } catch (JsonProcessingException e) { - log.error("Error parsing BillById JSON: {}", e.getMessage()); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - throw new CustomException("Invalid JSON received from API"); - } + } + + BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class); + GeneralResp generalResp = responseWrapper.getGenericResponse(); + + String status = generalResp.getStatus(); + LOGGER.info("Current Bill Status: {}", status); + + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + helper.saveOrUpdateBillerData(responseWrapper,billFetchByBillIdRequest); + LOGGER.info("Bill data saved successfully for billId: {}", billId); + + return new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing BillById JSON: {}", e.getMessage(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); } + } @Override public ResponseModel fetchBillById(BillFetchByBillIdRequest billFetchByBillIdRequest) { - String apiName = "FetchBillById"; - 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 apiName = "FetchBillById"; + 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"; - try { - helper.validateMerchant(billFetchByBillIdRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - Map responseMap = httpService.getRequest(fullUrl, headers); - String responseData = responseMap.get("data"); - log.info("data is :{}", responseData); - ObjectMapper objectMapper = new ObjectMapper(); - 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); - - helper.saveOrUpdateBillerData(responseWrapper,billFetchByBillIdRequest); - - return responseModel; + LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId); - } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); - throw new CustomException("Invalid JSON received from API"); - } - - } - - - @Override - public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { - - ResponseModel responseModel = new ResponseModel(); try { - - helper.validateMerchant(fetchBillValidateRequest.getMid()); + helper.validateMerchant(billFetchByBillIdRequest.getMid()); + LOGGER.debug("Merchant validated successfully for MID={}", billFetchByBillIdRequest.getMid()); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - - if (headersData == null) { - responseModel = new ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, headersData); - return responseModel; - } - HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); headers.set("agentId", headersData.getAgentId()); headers.set("tenantId", headersData.getTenantId()); headers.setContentType(MediaType.APPLICATION_JSON); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - String json = objectMapper.writeValueAsString(fetchBillValidateRequest); - String url = agentDtaUrl + BBPSConstant.BILLER_VALIDATE_URL; - - Map responseMap = httpService.postRequest(url, json, headers); + LOGGER.info("Calling external BBPS API for FetchBillById, URL={}", fullUrl); + Map responseMap = httpService.getRequest(fullUrl, headers); String responseData = responseMap.get("data"); + LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData); - log.info("📦 Bill Fetch API Response: {}", responseData); + ObjectMapper objectMapper = new ObjectMapper(); + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() {}); - 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"); + LOGGER.warn("Invalid response structure received for billId={} | Response={}", billId, responseData); + 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")) + ); } - // ✅ Convert to your custom DTO - FetchBillValidatestResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillValidatestResponse.class); - GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - - // ✅ Build final ResponseModel - responseModel = new ResponseModel( - generalResponse.getMessage(), - generalResponse.getStatus(), - Integer.parseInt(generalResponse.getStatusCode()), - fetchBillResponse + BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class); + GeneralResp generalResp = responseWrapper.getGenericResponse(); + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper ); - } catch (CustomException ex) { - log.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception - } catch (Exception e) { - log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - responseModel.setStatus("500"); - responseModel.setMessage("Exception occurred"); - responseModel.setData(e.getMessage()); - } + helper.saveOrUpdateBillerData(responseWrapper, billFetchByBillIdRequest); + LOGGER.info("Bill data saved successfully for billId={} | Status={}", billId, generalResp.getStatus()); - return responseModel; + return responseModel; + + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing responseData JSON for billId={} : {}", billId, e.getMessage(), e); + throw new CustomException("Invalid JSON received from API"); + } } + + @Override + public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { + // TODO Auto-generated method stub + return null; + } + + @Override public ResponseModel initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { - - ResponseModel responseModel = new ResponseModel(); - try { - helper.validateMerchant(billRequest.getMid()); - - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - - if (headersData == null) { - responseModel = new ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, headersData); - return responseModel; - } - - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - String json = objectMapper.writeValueAsString(billRequest); - String url = agentDtaUrl + BBPSConstant.BILL_ID_URL + billRequest.getBillId(); - - log.info("Full URL: {}", url); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - // ✅ Call the API using httpService - Map responseMap = httpService.getRequest(url, headers); - String responseData = responseMap.get("data"); - - 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 - BillDataResponse fetchBillResponse = objectMapper.convertValue(dataMap, BillDataResponse.class); - GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - - // ✅ Build final ResponseModel - responseModel = new ResponseModel( - generalResponse.getRemarks(), - generalResponse.getStatus(), - Integer.parseInt(generalResponse.getStatusCode()), - fetchBillResponse - ); - - } catch (CustomException ex) { - log.warn("Merchant validation failed: {}", ex.getMessage()); - return ex.getResponseModel(); // Directly return ResponseModel from exception - } catch (Exception e) { - log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - responseModel.setStatus("500"); - responseModel.setMessage("Exception occurred"); - responseModel.setData(e.getMessage()); - } - - return responseModel; + // TODO Auto-generated method stub + return null; } + + + + /* + * @Override public ResponseModel + * initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { + * + * ResponseModel responseModel = new ResponseModel(); try { + * + * helper.validateMerchant(fetchBillValidateRequest.getMid()); + * + * BharatConnectMaster headersData = + * beneficiaryDetailsRepository.findByOrgId("ORG001"); + * + * if (headersData == null) { responseModel = new + * ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, + * headersData); return responseModel; } + * + * HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", + * headersData.getXDigiledgeKey()); headers.set("agentId", + * headersData.getAgentId()); headers.set("tenantId", + * headersData.getTenantId()); + * headers.setContentType(MediaType.APPLICATION_JSON); + * + * ObjectMapper objectMapper = new ObjectMapper(); + * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String + * json = objectMapper.writeValueAsString(fetchBillValidateRequest); String url + * = agentDtaUrl + BBPSConstant.BILLER_VALIDATE_URL; + * + * Map responseMap = httpService.postRequest(url, json, + * headers); String responseData = responseMap.get("data"); + * + * 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 FetchBillValidatestResponse fetchBillResponse + * = objectMapper.convertValue(dataMap, FetchBillValidatestResponse.class); + * GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); + * + * // ✅ Build final ResponseModel responseModel = new ResponseModel( + * generalResponse.getMessage(), generalResponse.getStatus(), + * Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse ); + * + * } catch (CustomException ex) { log.warn("Merchant validation failed: {}", + * ex.getMessage()); return ex.getResponseModel(); // Directly return + * ResponseModel from exception } 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 + * initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { + * + * ResponseModel responseModel = new ResponseModel(); try { + * helper.validateMerchant(billRequest.getMid()); + * + * BharatConnectMaster headersData = + * beneficiaryDetailsRepository.findByOrgId("ORG001"); + * + * if (headersData == null) { responseModel = new + * ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, + * headersData); return responseModel; } + * + * HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", + * headersData.getXDigiledgeKey()); headers.set("agentId", + * headersData.getAgentId()); headers.set("tenantId", + * headersData.getTenantId()); + * headers.setContentType(MediaType.APPLICATION_JSON); + * + * ObjectMapper objectMapper = new ObjectMapper(); + * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String + * json = objectMapper.writeValueAsString(billRequest); String url = agentDtaUrl + * + BBPSConstant.BILL_ID_URL + billRequest.getBillId(); + * + * log.info("Full URL: {}", url); + * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + * + * // ✅ Call the API using httpService Map responseMap = + * httpService.getRequest(url, headers); String responseData = + * responseMap.get("data"); + * + * 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 BillDataResponse fetchBillResponse = + * objectMapper.convertValue(dataMap, BillDataResponse.class); GeneralResp + * generalResponse = fetchBillResponse.getGenericResponse(); + * + * // ✅ Build final ResponseModel responseModel = new ResponseModel( + * generalResponse.getRemarks(), generalResponse.getStatus(), + * Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse ); + * + * } catch (CustomException ex) { log.warn("Merchant validation failed: {}", + * ex.getMessage()); return ex.getResponseModel(); // Directly return + * ResponseModel from exception } catch (Exception e) { + * log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); + * responseModel.setStatus("500"); + * responseModel.setMessage("Exception occurred"); + * responseModel.setData(e.getMessage()); } + * + * return responseModel; } + */ + /* POLLING METHOD * public ResponseModel fetchBillById(BillFetchByBillIdRequest diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java index 1afd2bf..0874403 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java @@ -8,13 +8,11 @@ import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.http.client.JdkClientHttpRequestFactory; import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestClient; -import com.billpaymentservice.bbps.dto.request.FetchBillRequest; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index 773b931..97ac26d 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -1,11 +1,10 @@ // java package com.billpaymentservice.bbps.serviceImpl; -import java.time.LocalDateTime; 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; @@ -69,7 +68,6 @@ public class MasterDataServiceImpl implements MasterDataService { private final DispositionRepository dispositionRepository; 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(); private final InboundTraceLogRepository inboundTraceLogRepository; @@ -97,40 +95,26 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel getMasterData(MasterRequest masterRequest) { - LOGGER.info("Request DTO: {}", masterRequest); - + LOGGER.info("Fetching Master Data for ReqId={} and MID={}", masterRequest.getReqId(), masterRequest.getMid()); String txnID = helper.generateTxnId(15); String apiName = "GetMasterData"; String requestId = masterRequest.getReqId(); String requestJson = helper.convertObjectToJson(masterRequest); - - InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, masterRequest.getMid(), "POST", requestJson); - try { // Merchant Validation helper.validateMerchant(masterRequest.getMid()); - -// if (!"Valid".equalsIgnoreCase(validateMerchant)) { -// LOGGER.warn("Merchant validation failed: {}", validateMerchant); -// return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); -// } - // check Tender Id is present DB BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - log.info("Response -: " + headersData); if (headersData == null) { - helper.updateInboundLogFailure(inboundLog, "Tenant Id Is Null", "NOT_FOUND"); - return new ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, headersData); + LOGGER.warn("header data not found for the orgID"); + throw new CustomException("Something went wrong", "FAILED", 500, ""); } - // get full url String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + headersData.getTenantId(); LOGGER.info("Calling external API: {}", fullUrl); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); LOGGER.info("Response Data: {}", responseData); @@ -158,7 +142,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -166,7 +150,8 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest) { - LOGGER.info("Fetching biller data for billerId={}", billerDetailRequest.getBillerId()); + LOGGER.info("Fetching Biller Detail By Biller Id for ReqId={} and MID={}", billerDetailRequest.getReqId(), billerDetailRequest.getMid()); + helper.validateMerchant(billerDetailRequest.getMid()); String txnID = helper.generateTxnId(15); String apiName = "GetBillerByBillerId"; @@ -178,10 +163,10 @@ public class MasterDataServiceImpl implements MasterDataService { requestJson); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - + LOGGER.info("Calling external API: {}", fullUrl); Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); - log.info("fetched data from api is :{}", responseData); + LOGGER.info("fetched data from api is :{}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); try { Map dataMap = objectMapper.readValue(responseData, @@ -205,7 +190,7 @@ public class MasterDataServiceImpl implements MasterDataService { helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -214,7 +199,7 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest) { - LOGGER.info("Fetching CustomerParam for billerId={}", customerParamRequest.getBillerId()); + LOGGER.info("Fetching Customer Param By Biller Id for ReqId={} and MID={}", customerParamRequest.getReqId(), customerParamRequest.getMid()); String txnID = helper.generateTxnId(15); String apiName = "GetCustomerParamByBillerId"; @@ -229,10 +214,10 @@ public class MasterDataServiceImpl implements MasterDataService { String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMPARAM_URL + billerId; OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - + LOGGER.info("Calling external API: {}", fullUrl); Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); - log.info("data is :{}", responseData); + LOGGER.info("data is :{}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -249,8 +234,6 @@ public class MasterDataServiceImpl implements MasterDataService { CustomParamResp responseWrapper = objectMapper.convertValue(dataMap, CustomParamResp.class); List customParams = responseWrapper.getCustomParamResp(); - - GeneralResp generalResp = responseWrapper.getGeneralResp(); List customParam = responseWrapper.getCustomParamResp(); ModelMapper mapper = new ModelMapper(); @@ -260,21 +243,16 @@ public class MasterDataServiceImpl implements MasterDataService { List entities = customParams.stream() .map(dto -> mapper.map(dto, CustomParam.class)) .collect(Collectors.toList()); - - // Debug print - entities.forEach(System.out::println); - // Save all to DB customParamReposiotory.saveAll(entities); - ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -288,7 +266,7 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchMasterDataCategoryWise(MasterCategoryRequest masterRequest) { - LOGGER.info("Fetching Master Data Category-wise " + masterRequest); + LOGGER.info("Fetching Master Data Category-wise for ReqId={} and MID={}", masterRequest.getReqId(), masterRequest.getMid()); String txnID = helper.generateTxnId(15); String apiName = "FetchMasterDataCategoryWise"; String requestId = masterRequest.getReqId(); @@ -332,7 +310,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -340,6 +318,8 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel getDispositionDetails(DispositionRequest dispositionDetailRequest) { + LOGGER.info("Fetching Disposition Details for ReqId={} and MID={}", dispositionDetailRequest.getReqId(), dispositionDetailRequest.getMid()); + String txnID = helper.generateTxnId(15); String apiName = "GetDispositionDetails"; String requestId = dispositionDetailRequest.getReqId(); @@ -351,6 +331,7 @@ public class MasterDataServiceImpl implements MasterDataService { String fullUrl = masterRegisterUrl + BBPSConstant.DISPOSTION_URL; OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); + LOGGER.info("Calling external API: {}", fullUrl); Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); @@ -393,7 +374,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -401,8 +382,7 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchCustomerParamGroup(BillerDetailRequest requestModel) { - LOGGER.info("Fetching Master Data Category-wise for MID={}", requestModel.getMid()); - + LOGGER.info("Fetching Customer Param Group for ReqId={} and MID={}", requestModel.getReqId(), requestModel.getMid()); String txnID = helper.generateTxnId(15); String apiName = "FetchCustomerParamGroup"; String requestId = requestModel.getReqId(); @@ -414,7 +394,7 @@ public class MasterDataServiceImpl implements MasterDataService { String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMER_PARAM_GROUP + requestModel.getBillerId(); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - + LOGGER.info("Calling external API: {}", fullUrl); Map apiResponse = httpService.getRequest(fullUrl); String responseData = apiResponse.get("data").toString(); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -443,7 +423,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -452,8 +432,8 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchAllMasterAmountOption(BillerDetailRequest requestModel) { - LOGGER.info("Fetching Master Data Amount List for MID={}", requestModel.getMid()); + LOGGER.info("Fetching Master Data Amount List for ReqId={} and MID={}", requestModel.getReqId(), requestModel.getMid()); String txnID = helper.generateTxnId(15); String apiName = "FetchAllMasterAmountOption"; String requestId = requestModel.getReqId(); @@ -465,9 +445,9 @@ public class MasterDataServiceImpl implements MasterDataService { String fullUrl = masterRegisterUrl + BBPSConstant.AMOUNT_OPTIONS + requestModel.getBillerId(); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - + LOGGER.info("Calling external API: {}", fullUrl); Map apiResponse = httpService.getRequest(fullUrl); - log.info("Response" + apiResponse); + LOGGER.info("Response" + apiResponse); String responseData = apiResponse.get("data").toString(); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -495,7 +475,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -504,8 +484,7 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchPlanCategorie(BillerDetailRequest requestModel) { - LOGGER.info("Fetching Master Data Amount List for MID={}", requestModel.getMid()); - + LOGGER.info("Fetching Plan Categories for ReqId={} and MID={}", requestModel.getReqId(), requestModel.getMid()); String txnID = helper.generateTxnId(15); String apiName = "FetchPlanCategorie"; String requestId = requestModel.getReqId(); @@ -517,9 +496,9 @@ public class MasterDataServiceImpl implements MasterDataService { String fullUrl = masterRegisterUrl + BBPSConstant.PLAN_CATEGORIES + requestModel.getBillerId(); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - + LOGGER.info("Calling external API: {}", fullUrl); Map apiResponse = httpService.getRequest(fullUrl); - log.info("Response" + apiResponse); + LOGGER.info("Response" + apiResponse); String responseData = apiResponse.get("data").toString(); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -547,7 +526,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -555,8 +534,7 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchInitiatingChannel(BillerDetailRequest requestModel) { - LOGGER.info("Fetching Initiating Channel List for MID={}", requestModel.getMid()); - + LOGGER.info("Fetching Initiating Channel for ReqId={} and MID={}", requestModel.getReqId(), requestModel.getMid()); String txnID = helper.generateTxnId(15); String apiName = "FetchInitiatingChannel"; String requestId = requestModel.getReqId(); @@ -567,12 +545,12 @@ public class MasterDataServiceImpl implements MasterDataService { helper.validateMerchant(requestModel.getMid()); String fullUrl = masterRegisterUrl + BBPSConstant.INITIATING_CHANNEL; - LOGGER.info("Calling Master API: {}", fullUrl); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - + LOGGER.info("Calling Master API: {}", fullUrl); Map apiResponse = httpService.getRequest(fullUrl); - log.info("Response" + apiResponse); + LOGGER.info("Response" + apiResponse); String responseData = apiResponse.get("data").toString(); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -600,15 +578,15 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } } public ResponseModel fetchPlanByCategories(PlanRequest requestModel) { - LOGGER.info("Fetching Initiating Fetch Plan Category By Biller Id for MID={}", requestModel.getMid()); + LOGGER.info("Fetching Plan By Categories for ReqId={} and MID={}", requestModel.getReqId(), requestModel.getMid()); String txnID = helper.generateTxnId(15); String apiName = "FetchPlanByCategories"; String requestId = requestModel.getReqId(); @@ -636,7 +614,7 @@ public class MasterDataServiceImpl implements MasterDataService { try { Map apiResponse = httpService.getRequest(url); String responseData = apiResponse.get("data"); - log.info("Response Data: {}", responseData); + LOGGER.info("Response Data: {}", responseData); // Update outbound log with response helper.updateOutboundLogResponse(outboundLog, responseData); @@ -669,7 +647,7 @@ public class MasterDataServiceImpl implements MasterDataService { return responseModel; } catch (JsonProcessingException e) { - log.error("Error parsing responseData JSON: {}", e.getMessage()); + 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/serviceImpl/PaymentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java index 4f5d68d..7275ad9 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java @@ -1,6 +1,5 @@ package com.billpaymentservice.bbps.serviceImpl; -import java.time.LocalDateTime; import java.util.Map; import org.modelmapper.ModelMapper; @@ -11,20 +10,14 @@ 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.BillFetchByBillIdRequest; import com.billpaymentservice.bbps.dto.request.BillPaymentRequest; -import com.billpaymentservice.bbps.dto.request.FetchBillRequest; import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest; -import com.billpaymentservice.bbps.dto.response.BillDataResponse; import com.billpaymentservice.bbps.dto.response.BillPaymentResponse; -import com.billpaymentservice.bbps.dto.response.FetchBillResponse; import com.billpaymentservice.bbps.dto.response.TransactionStatusResponse; import com.billpaymentservice.bbps.entites.AgentFundTransfer; import com.billpaymentservice.bbps.entites.BharatConnectMaster; -import com.billpaymentservice.bbps.entites.BillInitiate; import com.billpaymentservice.bbps.entites.BillPayment; import com.billpaymentservice.bbps.entites.InboundTraceLog; import com.billpaymentservice.bbps.entites.OutboundTraceLog; @@ -52,6 +45,7 @@ public class PaymentServiceImpl implements PaymentService { @Value("${payment.data.url}") private String paymentUrl; + private final BharatConnectMasterRepository beneficiaryDetailsRepository; private final HttpService httpService; private final Helper helper; @@ -59,12 +53,14 @@ public class PaymentServiceImpl implements PaymentService { private final InboundTraceLogRepository inboundTraceLogRepository; private final OutboundTraceLogRepository outboundTraceLogRepository; private final PaymentIntiateRepository paymentIntiateRepository; - private final TransactionMasterRepository transactionMasterRepository; - private final AgentFundTransferRepository agentFundTransferRepository; + private final TransactionMasterRepository transactionMasterRepository; + private final AgentFundTransferRepository agentFundTransferRepository; + + private static final Logger LOGGER = LoggerFactory.getLogger(PaymentServiceImpl.class); + public PaymentServiceImpl(BharatConnectMasterRepository beneficiaryDetailsRepository, HttpService httpService, Helper helper, PaymentRepository paymentRepository, InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository, - PaymentIntiateRepository paymentIntiateRepository, + OutboundTraceLogRepository outboundTraceLogRepository, PaymentIntiateRepository paymentIntiateRepository, TransactionMasterRepository transactionMasterRepository, AgentFundTransferRepository agentFundTransferRepository) { this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; @@ -78,7 +74,6 @@ public class PaymentServiceImpl implements PaymentService { this.agentFundTransferRepository = agentFundTransferRepository; } - private static final Logger LOGGER = LoggerFactory.getLogger(MasterDataServiceImpl.class); @Override public ResponseModel initiatePayment(BillPaymentRequest billPaymentRequest) { String apiName = "InitiatePayment"; @@ -86,6 +81,8 @@ public class PaymentServiceImpl implements PaymentService { String requestId = billPaymentRequest.getReqId(); String url = paymentUrl + BBPSConstant.PAYMENT_URL; + LOGGER.info("Initiating payment for reqId={} and txnId={}", requestId, txnId); + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); @@ -98,25 +95,27 @@ public class PaymentServiceImpl implements PaymentService { String requestJson = helper.convertObjectToJson(billPaymentRequest); - // ✅ Create inbound & outbound logs InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, billPaymentRequest.getMid(), "POST", requestJson); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "POST", requestJson); try { + LOGGER.info("Calling BBPS payment URL: {}", url); Map responseMap = httpService.postRequest(url, requestJson, headers); String responseData = responseMap.get("data"); + LOGGER.info("Payment API Response: {}", responseData); - LOGGER.info("📦 Payment API Response: {}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); if (responseData == null || responseData.isEmpty()) { helper.updateInboundLogFailure(inboundLog, "Empty response from BBPS", "FAILED"); + LOGGER.warn("Empty response received from BBPS for txnId={}", txnId); throw new CustomException("Empty response from BBPS server"); } Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); if (!dataMap.containsKey("genericResponse")) { helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_STRUCTURE"); + LOGGER.warn("Invalid response structure received for txnId={}", txnId); throw new CustomException("Invalid response structure from BBPS"); } @@ -127,43 +126,44 @@ public class PaymentServiceImpl implements PaymentService { mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); BillPayment entity = mapper.map(billPaymentResponse, BillPayment.class); paymentRepository.save(entity); + LOGGER.info("BillPayment entity saved successfully for txnId={}", txnId); helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); PaymentInitiate paymentInitiate = new PaymentInitiate(); paymentInitiate.setTxnId(txnId); paymentInitiate.setReqId(requestId); paymentInitiate.setBankTxnId(billPaymentResponse.getTxnId()); - paymentInitiate.setStatus(billPaymentResponse.getStatus()); + paymentInitiate.setStatus(billPaymentResponse.getStatus()); paymentIntiateRepository.save(paymentInitiate); - // ✅ Trigger transaction status check + LOGGER.info("PaymentInitiate entry saved successfully for txnId={}", txnId); + TransactionStatusRequest transactionStatusRequest = new TransactionStatusRequest(); - transactionStatusRequest.setTxnId(billPaymentResponse.getTxnId()); + transactionStatusRequest.setTxnId(billPaymentResponse.getTxnId()); transactionStatusRequest.setReqId(requestId); - - try { - Thread.sleep(2000); // Initial wait before first status check - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - LOGGER.error("Thread interrupted: {}", e.getMessage()); - } - - //calling the method to check transaction status + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOGGER.warn("Thread interrupted during payment delay: {}", e.getMessage()); + } + LOGGER.info("Checking transaction status for txnId={}", billPaymentResponse.getTxnId()); return checkTrasactionStatus(transactionStatusRequest, inboundLog); } catch (JsonProcessingException e) { - LOGGER.error("❌ JSON Parsing Error: {}", e.getMessage()); + LOGGER.error("JSON Parsing Error in initiatePayment: {}", e.getMessage(), e); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } - } - - public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest,InboundTraceLog inboundLog) { + + public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest, InboundTraceLog inboundLog) { String apiName = "CheckTransactionStatus"; - String txnId = helper.generateTxnId(15); //our genrated txnId + String txnId = helper.generateTxnId(15); String requestId = transactionStatusRequest.getReqId(); - String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); ; + String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); + + LOGGER.info("Checking transaction status (internal) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new HttpHeaders(); @@ -171,68 +171,66 @@ public class PaymentServiceImpl implements PaymentService { headers.set("agentId", headersData.getAgentId()); headers.set("tenantId", headersData.getTenantId()); headers.setContentType(MediaType.APPLICATION_JSON); - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = new ObjectMapper(); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null); - Map responseMap = httpService.getRequest(url, headers); - String responseData = responseMap.get("data"); - LOGGER.info("Transaction status response: {}", responseData); + Map responseMap = httpService.getRequest(url, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Transaction status response: {}", responseData); - helper.updateOutboundLogResponse(outboundLog, responseData); + helper.updateOutboundLogResponse(outboundLog, responseData); - try { - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - - if (!dataMap.containsKey("generalResp")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - 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")) - ); - } - - TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); - - System.out.println("Response Wrapper:"+responseWrapper); - - - ModelMapper mapper = new ModelMapper(); - mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - TransactionMaster transactionMaster = mapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class); - transactionMaster.setTxnId(txnId); - transactionMaster.setReqId(transactionStatusRequest.getReqId()); - EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster); - transactionMasterRepository.save(transactionMaster); - - AgentFundTransfer agentFundTransfer = mapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class); - agentFundTransfer.setTxnId(txnId); - agentFundTransfer.setReqId(transactionStatusRequest.getReqId()); - agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId()); - agentFundTransferRepository.save(agentFundTransfer); - String status = generalResp.getStatus(); - LOGGER.info("Current transaction status: {}", status); - - ResponseModel responseModel = new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper + try { + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + LOGGER.warn("Invalid transaction status response for txnId={}", transactionStatusRequest.getTxnId()); + 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")) ); + } - helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - return responseModel; + TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + LOGGER.info("Transaction status received: {}", generalResp.getStatus()); - } catch (JsonProcessingException e) { - LOGGER.error("Error parsing transaction status JSON: {}", e.getMessage()); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - throw new CustomException("Invalid JSON received from API"); - } + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + TransactionMaster transactionMaster = mapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class); + transactionMaster.setTxnId(txnId); + transactionMaster.setReqId(transactionStatusRequest.getReqId()); + EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster); + transactionMasterRepository.save(transactionMaster); + LOGGER.info("TransactionMaster saved successfully for txnId={}", txnId); + + AgentFundTransfer agentFundTransfer = mapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class); + agentFundTransfer.setTxnId(txnId); + agentFundTransfer.setReqId(transactionStatusRequest.getReqId()); + agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId()); + agentFundTransferRepository.save(agentFundTransfer); + LOGGER.info("AgentFundTransfer entry saved successfully for txnId={}", txnId); + + 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 transaction status JSON: {}", e.getMessage(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); } - + } + @Override public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest) { helper.validateMerchant(transactionStatusRequest.getMid()); @@ -241,60 +239,61 @@ public class PaymentServiceImpl implements PaymentService { String requestId = transactionStatusRequest.getReqId(); String requestJson = helper.convertObjectToJson(transactionStatusRequest); String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); + + LOGGER.info("Checking transaction status (public) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); + 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, transactionStatusRequest.getMid(), "POST", - requestJson); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null); + + InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null); ObjectMapper objectMapper = new ObjectMapper(); - Map responseMap = httpService.getRequest(url, headers); - String responseData = responseMap.get("data"); - LOGGER.info("Transaction status response data: {}", responseData); - helper.updateOutboundLogResponse(outboundLog, responseData); + Map responseMap = httpService.getRequest(url, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Transaction status response data: {}", responseData); + helper.updateOutboundLogResponse(outboundLog, responseData); - try { - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - - // If genericResponse key missing, throw exception - 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")) - ); - } - - - // 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); - ResponseModel responseModel = new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper + try { + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); + LOGGER.warn("Invalid transaction status response for txnId={} from BBPS", transactionStatusRequest.getTxnId()); + 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")) ); - 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"); } + + TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + String status = generalResp.getStatus(); + LOGGER.info("Current transaction status: {}", status); + + 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(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); } } +} /* PollBack logic for the fetchTxnByTxnId API * @Override public ResponseModel fetchTxnByTxnId(BillFetchByBillIdRequest diff --git a/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java b/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java index 3531e69..45967c4 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java +++ b/src/main/java/com/billpaymentservice/bbps/util/EntityRelationshipUtil.java @@ -1,6 +1,9 @@ package com.billpaymentservice.bbps.util; -import com.billpaymentservice.bbps.entites.*; +import com.billpaymentservice.bbps.entites.BillerDetails; +import com.billpaymentservice.bbps.entites.BillerResponseParams; +import com.billpaymentservice.bbps.entites.InterchangeFee; +import com.billpaymentservice.bbps.entites.TransactionMaster; public class EntityRelationshipUtil { diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index 6ce0849..71219cd 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -3,33 +3,21 @@ package com.billpaymentservice.bbps.util; import java.security.SecureRandom; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.function.Function; -import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.billpaymentservice.bbps.dto.AdditionalInfoBillDTO; -import com.billpaymentservice.bbps.dto.AdditionalInfoDTO; import com.billpaymentservice.bbps.dto.CustomerParamDAO; -import com.billpaymentservice.bbps.dto.CustomerParamDTO; import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest; +import com.billpaymentservice.bbps.dto.response.BillDataResponse; import com.billpaymentservice.bbps.entites.AdditionalInfoBill; import com.billpaymentservice.bbps.entites.BBPSMastersData; -import com.billpaymentservice.bbps.exception.CustomException; -import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo; -import com.billpaymentservice.bbps.repository.BillMasterRepository; -import com.billpaymentservice.bbps.repository.BillerDataRepository; -import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; -import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest; -import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; -import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; -import com.billpaymentservice.bbps.dto.response.BillDataResponse; -import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; import com.billpaymentservice.bbps.entites.BillMaster; import com.billpaymentservice.bbps.entites.BillerDetails; import com.billpaymentservice.bbps.entites.BillerResponse; @@ -39,9 +27,11 @@ import com.billpaymentservice.bbps.entites.OutboundTraceLog; import com.billpaymentservice.bbps.entites.PaymentChannel; import com.billpaymentservice.bbps.entites.PaymentMode; import com.billpaymentservice.bbps.exception.CustomException; -import com.billpaymentservice.bbps.repository.MerchantRepository; +import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo; +import com.billpaymentservice.bbps.repository.BillMasterRepository; +import com.billpaymentservice.bbps.repository.BillerDataRepository; +import com.billpaymentservice.bbps.repository.InboundTraceLogRepository; import com.billpaymentservice.bbps.repository.OutboundTraceLogRepository; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @Component