make changes for db optimise

This commit is contained in:
Lincpay Tech
2025-12-23 14:54:56 +05:30
parent 38979f0f94
commit 58b628bd39
20 changed files with 37 additions and 871 deletions
@@ -1,50 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Getter
@Setter
@Entity
@ToString
@Table(name = "bbps_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)
private String paramConfigId;
@Column(name = "param_name", nullable = false)
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 BillerDetails biller;
}
@@ -1,41 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Entity
@Table(name = "bbps_amount_option")
@Getter
@Setter
public class AmountOption extends Auditable {
@Id
@Column(name = "amount_option_id")
@JsonProperty("amountOptionId") // ✅ JSON field map karo
private String amountOptionId; // ✅ String type, manual ID
@ElementCollection
@CollectionTable(
name = "amount_option_breakup_sets",
joinColumns = @JoinColumn(name = "amount_option_id")
)
@Column(name = "amount_breakup_value")
private List<String> amountBreakupSets;
// 🔗 Relationship with BillerResponseParams
@ManyToOne
@JoinColumn(name = "biller_response_id", nullable = false)
private BillerResponseParams billerResponseParams;
}
@@ -1,45 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Getter
@Setter
@Table(name = "bbps_biller_additional_info_payment")
@Entity
public class BillerAdditionalInfoPayment extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // primary key for the table
@Column(name = "param_config_id", nullable = false)
private String paramConfigId;
@Column(name = "param_name", nullable = false)
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 BillerDetails biller;
}
@@ -21,20 +21,6 @@ import lombok.ToString;
@Getter @Getter
@Setter @Setter
@Entity @Entity
@EntityListeners(AuditListener.class)
@ToString(exclude = {
"billerPaymentModes",
"billerPaymentChannels",
"billerCustomerParams",
"customerParamGroups",
"billerResponseParams",
"billerAdditionalInfos",
"interchangeFeeConves",
"interchangeFees",
"billerPlanResponseParams",
"billerAdditionalInfoPayments"
})
@Table(name = "bbps_biller_details") @Table(name = "bbps_biller_details")
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class BillerDetails extends Auditable { public class BillerDetails extends Auditable {
@@ -44,121 +30,8 @@ public class BillerDetails extends Auditable {
@NotBlank(message = "Biller ID is mandatory") @NotBlank(message = "Biller ID is mandatory")
@Size(min = 14, max = 14, message = "Biller ID must be 14 characters long") @Size(min = 14, max = 14, message = "Biller ID must be 14 characters long")
private String billerId; private String billerId;
@Column(name = "biller_details_json", columnDefinition = "TEXT")
private String billerDetailsJson;
@Column(name = "biller_name")
private String billerName;
@Column(name = "biller_alias_name")
private String billerAliasName;
@Column(name = "biller_category_name")
private String billerCategoryName;
@Column(name = "biller_mode")
private String billerMode;
@Column(name = "biller_accepts_adhoc")
private boolean billerAcceptsAdhoc;
@Column(name = "parent_biller")
private boolean parentBiller;
@Column(name = "parent_biller_id")
private String parentBillerId;
@Column(name = "biller_ownership")
private String billerOwnerShp;
@Column(name = "biller_coverage")
private String billerCoverage;
@Column(name = "fetch_requirement")
private String fetchRequirement;
@Column(name = "payment_amount_exactness")
private String paymentAmountExactness;
@Column(name = "support_bill_validation")
private String supportBillValidation;
@Column(name = "biller_effctv_from")
private String billerEffctvFrom;
@Column(name = "biller_effctv_to")
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", length = 500)
private String billerDescription;
@Column(name = "biller_response_type")
private String billerResponseType;
@Column(name = "plan_mdm_requirement")
private String planMDMRequirement;
@Column(name = "status")
private String status;
@Column(name = "support_deemed")
private String supportDeemed;
@Column(name = "support_pending_status")
private String supportPendingStatus;
@Column(name = "biller_time_out")
private String billerTimeOut;
@Column(name = "route_url")
private String routeUrl;
@Column(name = "upms_enabled")
private String upmsEnabled;
@Column(name = "clickpay_enabled")
private String clickpayEnabled;
@Column(name = "deemed_success_enabled")
private String deemedSuccessEnabled;
@Column(name = "selection_type")
private String selectionType;
// ✅ Relationships — Each maps to its sub-arrays or objects in API
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PaymentMode> billerPaymentModes;
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PaymentChannel> billerPaymentChannels;
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true)
private List<CustomerParam> billerCustomerParams;
@OneToOne(mappedBy = "biller", cascade = CascadeType.ALL)
private CustomerParamGroups customerParamGroups;
@OneToOne(mappedBy = "biller", cascade = CascadeType.ALL)
private BillerResponseParams billerResponseParams;
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AdditionalInfo> billerAdditionalInfos;
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval=true)
private List<BillerAdditionalInfoPayment> billerAdditionalInfoPayments;
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true)
private List<InterchangeFeeConf> interchangeFeeConves;
@OneToMany(mappedBy = "biller", cascade = CascadeType.ALL, orphanRemoval = true)
private List<InterchangeFee> interchangeFees;
@OneToOne(mappedBy = "biller", cascade = CascadeType.ALL)
private BillerPlanResponseParams billerPlanResponseParams;
} }
@@ -1,40 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Getter
@Setter
@Entity
@ToString
@Table(name = "bbps_biller_plan_response_params")
public class BillerPlanResponseParams extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // Primary Key
@Column(name = "biller_plan_response_id", nullable = false, unique = true)
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;
@Column(name = "amount_options", columnDefinition = "TEXT")
private String amountOptionsJson;
// 🔗 Relationship with BillerDAO
@OneToOne
@JoinColumn(name = "biller_id", nullable = false)
private BillerDetails biller;
}
@@ -1,50 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Getter
@Setter
@Entity
@Table(name = "bbps_biller_response_params")
public class BillerResponseParams extends Auditable {
@Id
@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)
private BillerDetails biller;
// ✅ Since params and amountOptions are lists of objects,
// we can store them as JSON or in a separate table (simplified here using @ElementCollection)
@ElementCollection
@CollectionTable(
name = "biller_response_params_data",
joinColumns = @JoinColumn(name = "biller_response_id")
)
@Column(name = "param_value")
private List<String> params;
@OneToMany(mappedBy = "billerResponseParams", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AmountOption> amountOptions;
}
@@ -1,71 +0,0 @@
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.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;
@Getter
@Setter
@Entity
@Table(name = "bbps_customer_param")
@ToString
public class CustomerParam extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "param_config_id")
private Long id; // Primary key
@NotBlank(message = "Parameter name is required")
@Column(name = "param_name", nullable = false)
private String paramName;
@Column(name = "data_type_dao")
private String dataTypeDAO;
@Column(name = "data_type_model")
private String dataTypeModel;
@Column(name = "is_optional")
private boolean optional;
@Min(0)
@Column(name = "min_length")
private int minLength;
@Min(0)
@Column(name = "max_length")
private int maxLength;
@Column(name = "regex", columnDefinition = "TEXT")
private String regex;
@Column(name = "is_visible")
private boolean visibility;
// Store list of values as JSON or comma-separated string
@ElementCollection
@CollectionTable(name = "customer_param_values", joinColumns = @JoinColumn(name = "param_id"))
@Column(name = "value")
private List<String> values;
// 🔗 Many customer parameters belong to one biller
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "biller_id")
private BillerDetails biller;
}
@@ -1,41 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Getter
@Setter
@Entity
@ToString
@Table(name = "bbps_customer_param_groups")
public class CustomerParamGroups extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_container_id")
private Long id;
// 🔗 One set of groups belongs to one biller
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "biller_id")
private BillerDetails biller;
// 🔗 One CustomerParamGroups contains multiple Group objects
@OneToMany(mappedBy = "customerParamGroups", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Group> groups;
}
@@ -1,63 +0,0 @@
package com.billpaymentservice.bbps.entites;
import java.util.List;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.CascadeType;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
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;
@Getter
@Setter
@Entity
@Table(name = "bbps_biller_groups")
public class Group extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_id")
private Long id;
@Column(name = "group_name")
private String name;
@Column(name = "input")
private String input;
@CollectionTable(
name = "group_params",
joinColumns = @JoinColumn(name = "group_id"),
foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT)
)
private List<String> params;
// 🔗 Parent group relationship (for nested groups)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_group_id")
private Group parentGroup;
// 🔁 Child groups (self-reference)
@OneToMany(mappedBy = "parentGroup", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Group> groups;
// 🔗 Back reference to CustomerParamGroups
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_container_id")
private CustomerParamGroups customerParamGroups;
}
@@ -1,52 +0,0 @@
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;
@Getter
@Setter
@Entity
@ToString
@Table(name = "bbps_interchange_fee")
public class InterchangeFee extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // Primary key
@Column(name = "interchange_fee_id", nullable = false, unique = true)
private String interchangeFeeId;
@Column(name = "fee_code", nullable = false)
private String feeCode;
@Column(name = "fee_description")
private String feeDesc;
@Column(name = "fee_direction")
private String feeDirection;
// ✅ Relationship with InterchangeFeeDetail (One-to-Many)
@OneToMany(mappedBy = "interchangeFee", cascade = CascadeType.ALL, orphanRemoval = true)
private List<InterchangeFeeDetail> interchangeFeeDetails;
// 🔗 Many InterchangeFee entries belong to one Biller
@ManyToOne
@JoinColumn(name = "biller_id", nullable = false)
private BillerDetails biller;
}
@@ -1,67 +0,0 @@
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;
@Getter
@Setter
@Entity
@Table(name = "bbps_interchange_fee_conf")
public class InterchangeFeeConf extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // Primary Key for DB table
@Column(name = "interchange_fee_conf_id", nullable = false, unique = true)
private String interChangeFeeConfId;
@Column(name = "mti")
private String mti;
@Column(name = "payment_mode")
private String paymentMode;
@Column(name = "payment_channel")
private String paymentChannel;
@Column(name = "response_code")
private String responseCode;
// ⚙️ Since 'fees' is a list of simple strings, we use ElementCollection
@ElementCollection
@CollectionTable(
name = "interchange_fee_conf_fees",
joinColumns = @JoinColumn(name = "interchange_fee_conf_id_fk")
)
@Column(name = "fee_value")
private List<String> fees;
@Column(name = "default_fee")
private boolean defaultFee;
@Column(name = "effective_from")
private String effctvFrom;
@Column(name = "effective_to")
private String effctvTo;
// 🔗 Many InterchangeFeeConf records belong to one Biller
@ManyToOne
@JoinColumn(name = "biller_id", nullable = false)
private BillerDetails biller;
}
@@ -1,46 +0,0 @@
package com.billpaymentservice.bbps.entites;
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;
@Entity
@Table(name = "bbps_interchange_fee_detail")
@Getter
@Setter
public class InterchangeFeeDetail extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "interchange_fee_det_id", unique = true, nullable = false)
private String interchangeFeeDetId;
@Column(name = "tran_amt_range_max")
private long tranAmtRangeMax;
@Column(name = "tran_amt_range_min")
private long tranAmtRangeMin;
@Column(name = "percent_fee")
private double percentFee;
@Column(name = "flat_fee")
private double flatFee;
@Column(name = "effctv_from")
private String effctvFrom;
// 🔗 Many InterchangeFeeDetail belong to one InterchangeFee
@ManyToOne
@JoinColumn(name = "interchange_fee_id", nullable = false)
private InterchangeFee interchangeFee;
}
@@ -1,44 +0,0 @@
package com.billpaymentservice.bbps.entites;
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 lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@Entity
@ToString
@Table(name = "bbps_payment_channel")
public class PaymentChannel extends Auditable {
@Id
@Column(name = "payment_channel_limit_id")
private String paymentChannelLimitId; // Primary key (manual, not auto-generated)
@Column(name = "payment_channel", nullable = false)
private String paymentChannel;
@Min(value = 0, message = "Max limit cannot be negative")
@Column(name = "max_limit")
private long maxLimit;
@Min(value = 0, message = "Min limit cannot be negative")
@Column(name = "min_limit")
private long minLimit;
@Column(name = "support_pending_status")
private String supportPendingStatus;
// 🔗 Many PaymentChannels belong to one Biller
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "biller_id")
private BillerDetails biller;
}
@@ -1,49 +0,0 @@
package com.billpaymentservice.bbps.entites;
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.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.PositiveOrZero;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@Entity
@Table(name = "bbps_biller_payment_modes")
@ToString
public class PaymentMode extends Auditable {
@Id //
@Column(name = "payment_model_limit_id", unique = true, length = 50)
private String paymentModelLimitId;
@Column(name = "payment_mode", nullable = false, length = 50)
private String paymentMode;
@Column(name = "max_limit")
@PositiveOrZero(message = "Max limit must be zero or positive")
private long maxLimit;
@Column(name = "min_limit")
@PositiveOrZero(message = "Min limit must be zero or positive")
private long minLimit;
@Column(name = "support_pending_status", length = 10)
private String supportPendingStatus;
// 🔗 Many-to-One relationship with BillerDAO
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "biller_id", nullable = false)
private BillerDetails biller;
}
@@ -10,7 +10,6 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.OneToOne; import jakarta.persistence.OneToOne;
@@ -32,6 +31,7 @@ public class PaymentStartRecord extends Auditable {
@Column(name = "request_id", unique = true, nullable = false) @Column(name = "request_id", unique = true, nullable = false)
private String requestId; private String requestId;
@Column(name = "mid", nullable = false) @Column(name = "mid", nullable = false)
private String mid; private String mid;
@@ -68,7 +68,7 @@ public class PaymentStartRecord extends Auditable {
@Column(name = "callback_received_on") @Column(name = "callback_received_on")
private String callbackReceivedOn; private String callbackReceivedOn;
@OneToOne(mappedBy = "paymentStartRecord", fetch = FetchType.LAZY) @OneToOne(mappedBy = "paymentStartRecord")
@JsonIgnore @JsonIgnore
private TransactionMaster transactionMaster; private TransactionMaster transactionMaster;
} }
@@ -154,15 +154,12 @@ public class TransactionMaster extends Auditable {
@Column(name = "payment_information", columnDefinition = "TEXT") @Column(name = "payment_information", columnDefinition = "TEXT")
private String paymentInformation; private String paymentInformation;
// ✅ Relation with DeviceBlockTagEntity
@OneToMany(mappedBy = "transactionMaster", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "transactionMaster", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<DeviceBlockTag> deviceBlockTags; private List<DeviceBlockTag> deviceBlockTags;
// ✅ Relation with CustomerParamEntity
@OneToMany(mappedBy = "transactionMaster", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "transactionMaster", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<CustomerParamTransaction> customerParams; private List<CustomerParamTransaction> customerParams;
// ✅ Relation with PaymentStartRecord (one-to-one)
@OneToOne(fetch = FetchType.LAZY) @OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "payment_ref_id", referencedColumnName = "payment_ref_id", insertable = false, updatable = false) @JoinColumn(name = "payment_ref_id", referencedColumnName = "payment_ref_id", insertable = false, updatable = false)
@JsonIgnore @JsonIgnore
@@ -15,6 +15,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.billpaymentservice.bbps.config.JwtUtil; import com.billpaymentservice.bbps.config.JwtUtil;
import com.billpaymentservice.bbps.dto.BillerDTO;
import com.billpaymentservice.bbps.dto.CustomParamDTO; import com.billpaymentservice.bbps.dto.CustomParamDTO;
import com.billpaymentservice.bbps.dto.CustomerParamGroupsDTO; import com.billpaymentservice.bbps.dto.CustomerParamGroupsDTO;
import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.GeneralResp;
@@ -136,12 +137,15 @@ public class MasterDataServiceImpl implements MasterDataService {
HttpHeaders headers = helper.buildHeaders(headersData); HttpHeaders headers = helper.buildHeaders(headersData);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, headers);
String responseData = responseMap.get(BBPSConstant.RESPONSE_DATA_KEY); String responseData = responseMap.get(BBPSConstant.RESPONSE_DATA_KEY);
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
if (!dataMap.containsKey(BBPSConstant.RESPONSE_GENERAL_RESP)) { if (!dataMap.containsKey(BBPSConstant.RESPONSE_GENERAL_RESP)) {
helper.updateInboundLogFailure(inboundLog, responseData, helper.updateInboundLogFailure(inboundLog, responseData,
String.valueOf(dataMap.get(BBPSConstant.RESPONSE_STATUS_KEY))); String.valueOf(dataMap.get(BBPSConstant.RESPONSE_STATUS_KEY)));
throw new CustomException(String.valueOf(dataMap.get(BBPSConstant.RESPONSE_MESSAGE_KEY)), // message throw new CustomException(String.valueOf(dataMap.get(BBPSConstant.RESPONSE_MESSAGE_KEY)), // message
@@ -177,20 +181,14 @@ public class MasterDataServiceImpl implements MasterDataService {
String requestId = billerDetailRequest.getReqId(); String requestId = billerDetailRequest.getReqId();
String billerId = billerDetailRequest.getBillerId(); String billerId = billerDetailRequest.getBillerId();
String mid = billerDetailRequest.getMid(); String mid = billerDetailRequest.getMid();
LOGGER.info("[{}] START | reqId={} | mid={} | billerId={}", apiName, requestId, mid, billerId); LOGGER.info("[{}] START | reqId={} | mid={} | billerId={}", apiName, requestId, mid, billerId);
// 2. Transaction Id
String txnID = helper.generateTxnId(15); String txnID = helper.generateTxnId(15);
// 3. Prepare URL
String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL + billerId; String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL + billerId;
// 4. Prepare Logs
String requestJson = helper.convertObjectToJson(billerDetailRequest); String requestJson = helper.convertObjectToJson(billerDetailRequest);
InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, billerDetailRequest.getMid(), InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, billerDetailRequest.getMid(),
BBPSConstant.HTTP_POST, requestJson); BBPSConstant.HTTP_POST, requestJson);
helper.validateMerchant(mid); helper.validateMerchant(mid);
OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl,
BBPSConstant.HTTP_GET, null); BBPSConstant.HTTP_GET, null);
LOGGER.info("Calling external API: {}", fullUrl); LOGGER.info("Calling external API: {}", fullUrl);
@@ -198,12 +196,29 @@ public class MasterDataServiceImpl implements MasterDataService {
String responseData = responseMap.get(BBPSConstant.RESPONSE_DATA_KEY); String responseData = responseMap.get(BBPSConstant.RESPONSE_DATA_KEY);
LOGGER.info("fetched data from api is :{}", responseData); LOGGER.info("fetched data from api is :{}", responseData);
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
try { try {
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
if (!dataMap.containsKey(BBPSConstant.RESPONSE_GENERAL_RESP)) { if (!dataMap.containsKey(BBPSConstant.RESPONSE_GENERAL_RESP)) {
Optional<BillerDetails> optionalBiller =
billerDataRespository.findByBillerId(billerId);
if (optionalBiller.isPresent()) {
Object existingBiller = optionalBiller.get();
LOGGER.info("sending biller details from database for the billerid:{}", billerId);
return new ResponseModel(
BBPSConstant.DATA_RETRIVE_DATABASE,
BBPSConstant.SUCCESS_RESPONSE,
BBPSConstant.HTTP_OK_INT,
existingBiller
);
}
helper.updateInboundLogFailure(inboundLog, responseData, helper.updateInboundLogFailure(inboundLog, responseData,
String.valueOf(dataMap.get(BBPSConstant.RESPONSE_STATUS_KEY))); String.valueOf(dataMap.get(BBPSConstant.RESPONSE_STATUS_KEY)));
throw new CustomException(String.valueOf(dataMap.get(BBPSConstant.RESPONSE_MESSAGE_KEY)), throw new CustomException(String.valueOf(dataMap.get(BBPSConstant.RESPONSE_MESSAGE_KEY)),
@@ -214,18 +229,18 @@ public class MasterDataServiceImpl implements MasterDataService {
// Mapping to Model // Mapping to Model
BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class);
GeneralResp generalResp = responseWrapper.getGeneralResp(); GeneralResp generalResp = responseWrapper.getGeneralResp();
ModelMapper mapper = new ModelMapper(); BillerDTO billerDto = responseWrapper.getBillerDAO();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); BillerDetails billerDetails=new BillerDetails();
BillerDetails entity = mapper.map(responseWrapper.getBillerDAO(), BillerDetails.class); billerDetails.setBillerId(billerDetailRequest.getBillerId());
EntityRelationshipUtil.linkBillerRelationships(entity);// linking nesting entity foreign key billerDetails.setBillerDetailsJson(billerDto.toString());
mapperHelper.saveOrUpdateBillerData(entity);
ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(),
Integer.parseInt(generalResp.getStatusCode()), responseWrapper); Integer.parseInt(generalResp.getStatusCode()), responseWrapper);
helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus());
LOGGER.info("[{}] END | reqId={} | status={}", apiName, requestId, generalResp.getStatus()); LOGGER.info("[{}] END | reqId={} | status={}", apiName, requestId, generalResp.getStatus());
return responseModel; return responseModel;
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); LOGGER.error("Error parsing responseData JSON: {}", e.getMessage());
helper.updateInboundLogFailure(inboundLog, e.getMessage(), BBPSConstant.JSON_ERROR); helper.updateInboundLogFailure(inboundLog, e.getMessage(), BBPSConstant.JSON_ERROR);
// Unified constant for invalid JSON // Unified constant for invalid JSON
@@ -224,6 +224,7 @@ public class BBPSConstant extends BBPS_RESPONSE_COD_CONSTANT {
public static final String OK_STR = "200"; public static final String OK_STR = "200";
public static final String RESPONSE_TYPE_INTENT = "INTENT"; public static final String RESPONSE_TYPE_INTENT = "INTENT";
public static final String RESPONSE_TYPE_WEB = "WEB"; public static final String RESPONSE_TYPE_WEB = "WEB";
public static final String DATA_RETRIVE_DATABASE = "Data retrieved successfully";
// Newly added constant for invalid JSON status code // Newly added constant for invalid JSON status code
@@ -1,7 +1,5 @@
package com.billpaymentservice.bbps.util; package com.billpaymentservice.bbps.util;
import com.billpaymentservice.bbps.entites.BillerDetails; import com.billpaymentservice.bbps.entites.BillerDetails;
import com.billpaymentservice.bbps.entites.BillerResponseParams;
import com.billpaymentservice.bbps.entites.InterchangeFee;
import com.billpaymentservice.bbps.entites.TransactionMaster; import com.billpaymentservice.bbps.entites.TransactionMaster;
public class EntityRelationshipUtil { public class EntityRelationshipUtil {
@@ -10,66 +8,8 @@ public class EntityRelationshipUtil {
// prevent instantiation // prevent instantiation
} }
/**
* Links all parent-child relationships for BillerDetails and nested entities.
* Ensures bidirectional JPA relationships are correctly set before saving.
*/
public static void linkBillerRelationships(BillerDetails entity) {
if (entity == null) return;
if (entity.getBillerPaymentModes() != null) {
entity.getBillerPaymentModes().forEach(m -> m.setBiller(entity));
}
if (entity.getBillerPaymentChannels() != null) {
entity.getBillerPaymentChannels().forEach(c -> c.setBiller(entity));
}
if (entity.getBillerCustomerParams() != null) {
entity.getBillerCustomerParams().forEach(p -> p.setBiller(entity));
}
if (entity.getBillerAdditionalInfos() != null) {
entity.getBillerAdditionalInfos().forEach(a -> a.setBiller(entity));
}
if(entity.getBillerAdditionalInfoPayments() != null) {
entity.getBillerAdditionalInfoPayments().forEach(a -> a.setBiller(entity));
}
if (entity.getInterchangeFees() != null) {
for (InterchangeFee fee : entity.getInterchangeFees()) {
fee.setBiller(entity);
if (fee.getInterchangeFeeDetails() != null) {
fee.getInterchangeFeeDetails().forEach(detail -> detail.setInterchangeFee(fee));
}
}
}
if (entity.getInterchangeFeeConves() != null) {
entity.getInterchangeFeeConves().forEach(fc -> fc.setBiller(entity));
}
if (entity.getCustomerParamGroups() != null)
entity.getCustomerParamGroups().setBiller(entity);
if (entity.getBillerPlanResponseParams() != null)
entity.getBillerPlanResponseParams().setBiller(entity);
if (entity.getBillerResponseParams() != null) {
BillerResponseParams responseParams = entity.getBillerResponseParams();
responseParams.setBiller(entity);
if (responseParams.getAmountOptions() != null) {
responseParams.getAmountOptions()
.forEach(option -> option.setBillerResponseParams(responseParams));
}
}
}
public static void linkTransactionMasterRelationships(TransactionMaster entity) { public static void linkTransactionMasterRelationships(TransactionMaster entity) {
if (entity == null) return; if (entity == null) return;
@@ -20,8 +20,7 @@ swagger.server.description=Local Development Server
# DataSource # DataSource
#spring.datasource.url=jdbc:postgresql://localhost:5432/bbps_new_updated #spring.datasource.url=jdbc:postgresql://localhost:5432/bbps_new_updated
spring.datasource.url=jdbc:postgresql://localhost:5432/bbps_enhanced spring.datasource.url=jdbc:postgresql://localhost:5432/dbotimizedbbps
spring.datasource.username=postgres spring.datasource.username=postgres
#spring.datasource.password=UAT@DB_2025 #spring.datasource.password=UAT@DB_2025