diff --git a/pom.xml b/pom.xml
index efc8bc9..c73831f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -96,6 +96,12 @@
spring-boot-starter
+ org.modelmapper
+ modelmapper
+ 3.2.0
+
+
+
org.springframework.boot
spring-boot-starter-test
test
diff --git a/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java b/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java
new file mode 100644
index 0000000..69170b4
--- /dev/null
+++ b/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java
@@ -0,0 +1,55 @@
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.billpaymentservice.bbps.dto.ResponseModel;
+import com.billpaymentservice.bbps.dto.request.BillPaymentRequest;
+import com.billpaymentservice.bbps.dto.request.FetchBillRequest;
+import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest;
+import com.billpaymentservice.bbps.service.PaymentService;
+
+@RestController
+@RequestMapping("/agent/payment")
+public class PaymentController {
+
+ /**
+ * Fetches bill details from external BBPS service
+ */
+
+ private final PaymentService paymentService;
+ public PaymentController(PaymentService paymentService) {
+ this.paymentService=paymentService;
+ }
+
+ @PostMapping(
+ value = "/intiatePayment",
+ consumes = MediaType.APPLICATION_JSON_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public ResponseEntity requestBillFetch(
+ @Validated @RequestBody BillPaymentRequest billPaymentRequest) {
+
+ ResponseModel response = paymentService.initiatePayment(billPaymentRequest);
+ return ResponseEntity.ok(response);
+ }
+
+ @PostMapping(
+ value = "/checkTransactionStatus",
+ consumes = MediaType.APPLICATION_JSON_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public ResponseEntity checkTransactionStatus(
+ @Validated @RequestBody TransactionStatusRequest transactionStatusRequest) {
+
+ ResponseModel response = paymentService.checkTrasactionStatus(transactionStatusRequest);
+ return ResponseEntity.ok(response);
+ }
+
+
+}
diff --git a/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfo.java b/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfo.java
index fa1aa80..cee0dcb 100644
--- a/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfo.java
+++ b/src/main/java/com/billpaymentservice/bbps/dto/AdditionalInfo.java
@@ -1,15 +1,43 @@
package com.billpaymentservice.bbps.dto;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.*;
import lombok.Getter;
import lombok.Setter;
- @Getter
- @Setter
- public class AdditionalInfo {
- private String paramConfigId;
- private String paramName;
- private String dataTypeDAO;
- private String dataTypeModel;
- private boolean optional;
- private boolean visibility;
- }
+@Getter
+@Setter
+@Entity
+@Table(name = "additional_info")
+public class AdditionalInfo {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id; // primary key for the table
+
+ @Column(name = "param_config_id", nullable = false)
+ @NotBlank(message = "Param Config ID cannot be blank")
+ private String paramConfigId;
+
+ @Column(name = "param_name", nullable = false)
+ @NotBlank(message = "Param name cannot be blank")
+ private String paramName;
+
+ @Column(name = "data_type_dao")
+ private String dataTypeDAO;
+
+ @Column(name = "data_type_model")
+ private String dataTypeModel;
+
+ @Column(name = "optional", nullable = false)
+ private boolean optional;
+
+ @Column(name = "visibility", nullable = false)
+ private boolean visibility;
+
+ // 🔗 Many AdditionalInfos belong to one Biller
+ @ManyToOne
+ @JoinColumn(name = "biller_id", nullable = false)
+ private BillerDAO biller;
+}
diff --git a/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java b/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java
new file mode 100644
index 0000000..9c4b85a
--- /dev/null
+++ b/src/main/java/com/billpaymentservice/bbps/dto/AgentFundTransfer.java
@@ -0,0 +1,22 @@
+package com.billpaymentservice.bbps.dto;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class AgentFundTransfer {
+ @NotBlank private String fundTxnReferenceId;
+ @NotBlank private String fundTxnRemarks;
+ @NotBlank private String fundTxnDate;
+
+ @NotNull private Double fundTxnAmt;
+
+ @NotBlank private String fundUTR;
+ private String fundRespRemarks;
+ private String agentNpciId;
+ private String txnRefId;
+
+ @NotBlank private String fundStatus; // FUND_TRANSFER_SUCCESS or FUND_TRANSFER_FAILED
+}
diff --git a/src/main/java/com/billpaymentservice/bbps/dto/AmountOption.java b/src/main/java/com/billpaymentservice/bbps/dto/AmountOption.java
index 574e92d..b020587 100644
--- a/src/main/java/com/billpaymentservice/bbps/dto/AmountOption.java
+++ b/src/main/java/com/billpaymentservice/bbps/dto/AmountOption.java
@@ -1,15 +1,32 @@
package com.billpaymentservice.bbps.dto;
-import java.util.List;
+import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
+import java.util.List;
+@Entity
+@Table(name = "amount_option")
@Getter
@Setter
public class AmountOption {
- private String amountOptionId;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "amount_option_id")
+ private Long id;
+
+ @ElementCollection
+ @CollectionTable(
+ name = "amount_option_breakup_sets",
+ joinColumns = @JoinColumn(name = "amount_option_id")
+ )
+ @Column(name = "amount_breakup_value")
private List amountBreakupSets;
-
+ // 🔗 Relationship with BillerResponseParams
+ @ManyToOne
+ @JoinColumn(name = "biller_response_id", nullable = false)
+ private BillerResponseParams billerResponseParams;
}
diff --git a/src/main/java/com/billpaymentservice/bbps/dto/BillerDAO.java b/src/main/java/com/billpaymentservice/bbps/dto/BillerDAO.java
index 3892abc..6a1f64e 100644
--- a/src/main/java/com/billpaymentservice/bbps/dto/BillerDAO.java
+++ b/src/main/java/com/billpaymentservice/bbps/dto/BillerDAO.java
@@ -1,58 +1,158 @@
package com.billpaymentservice.bbps.dto;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.*;
+import lombok.Getter;
+import lombok.Setter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
import java.util.List;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import lombok.Getter;
-import lombok.Setter;
-
@Getter
@Setter
+@Entity
+@Table(name = "biller_details")
@JsonIgnoreProperties(ignoreUnknown = true)
public class BillerDAO {
- private String billerId;
- private String billerName;
- private String billerAliasName;
- private String billerCategoryName;
- private String billerMode;
- private boolean billerAcceptsAdhoc;
- private boolean parentBiller;
- private String parentBillerId;
- private String billerOwnerShp;
- private String billerCoverage;
- private String fetchRequirement;
- private String paymentAmountExactness;
- private String supportBillValidation;
- private String billerEffctvFrom;
- private String billerEffctvTo;
- private String billerTempDeactivationStart;
- private String billerTempDeactivationEnd;
-
- private List billerPaymentModes;
- private List billerPaymentChannels;
- private List billerCustomerParams;
- private CustomerParamGroups customerParamGroups;
- private BillerResponseParams billerResponseParams;
- private List billerAdditionalInfos;
- private List billerAdditionalInfoPayments;
- private List interchangeFeeConves;
- private List interchangeFees;
- private String status;
- private String billerDescription;
- private String supportDeemed;
- private String supportPendingStatus;
- private String billerTimeOut;
- private String routeUrl;
+ @Id
+ @Column(name = "biller_id", length = 14, nullable = false, unique = true)
+ @NotBlank(message = "Biller ID is mandatory")
+ @Size(min = 14, max = 14, message = "Biller ID must be 14 characters long")
+ private String billerId;
+
+ @Column(name = "biller_name", nullable = false)
+ @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")
+ private String billerAliasName;
+
+ @Column(name = "biller_category_name", nullable = false)
+ @NotBlank(message = "Biller category name cannot be blank")
+ private String billerCategoryName;
+
+ @Column(name = "biller_mode", nullable = false)
+ @NotBlank(message = "Biller mode cannot be blank")
+ private String billerMode;
+
+ @Column(name = "biller_accepts_adhoc", nullable = false)
+ private boolean billerAcceptsAdhoc;
+
+ @Column(name = "parent_biller", nullable = false)
+ private boolean parentBiller;
+
+ @Column(name = "parent_biller_id", nullable = false)
+ @NotBlank(message = "Parent biller ID cannot be blank")
+ private String parentBillerId;
+
+ @Column(name = "biller_ownership", nullable = false)
+ @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")
+ private String billerCoverage;
+
+ @Column(name = "fetch_requirement", nullable = false)
+ @NotBlank(message = "Fetch requirement is mandatory")
+ private String fetchRequirement;
+
+ @Column(name = "payment_amount_exactness", nullable = false)
+ @NotBlank(message = "Payment amount exactness is required")
+ private String paymentAmountExactness;
+
+ @Column(name = "support_bill_validation", nullable = false)
+ @NotBlank(message = "Support bill validation is required")
+ private String supportBillValidation;
+
+ @Column(name = "biller_effctv_from", nullable = false)
+ @NotBlank(message = "Effective from date is required")
+ private String billerEffctvFrom;
+
+ @Column(name = "biller_effctv_to", nullable = false)
+ @NotBlank(message = "Effective to date is required")
+ private String billerEffctvTo;
+
+ @Column(name = "biller_temp_deactivation_start")
+ private String billerTempDeactivationStart;
+
+ @Column(name = "biller_temp_deactivation_end")
+ private String billerTempDeactivationEnd;
+
+ @Column(name = "biller_description", nullable = false, length = 500)
+ @NotBlank(message = "Biller description cannot be blank")
+ private String billerDescription;
+
+ @Column(name = "biller_response_type", nullable = false)
+ @NotBlank(message = "Biller response type is required (SINGLE or SELECTIVE)")
private String billerResponseType;
- private BillerPlanResponseParams billerPlanResponseParams;
+
+ @Column(name = "plan_mdm_requirement", nullable = false)
+ @NotBlank(message = "Plan MDM requirement cannot be blank")
private String planMDMRequirement;
- private List