Merge pull request 'feature/id-length-fix' (#38) from feature/id-length-fix into develop
Reviewed-on: https://git.zeptic.in/himanshu/bbps/pulls/38
This commit is contained in:
@@ -147,7 +147,6 @@ public class BBPSConstant extends BBPS_RESPONSE_COD_CONSTANT {
|
||||
public static final String UAT_PAYMENT_URL_WEB = "https://uat.godemo.in/api/UATIntegration/uat/payin/paymentrequest";
|
||||
public static final String UAT_PAYMENT_URL_INTENT = "https://uat.godemo.in/api/UATIntegration/paymentrequest/seamless";
|
||||
public static final String RESP_CODE_KEY = "respCode"; // key used by HttpService responses
|
||||
|
||||
public static final String RESPONSE_TYPE_HTML = "HTML";
|
||||
public static final String RESPONSE_TYPE_QR = "QR";
|
||||
public static final String RESPONSE_TYPE_JSON = "JSON";
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.billpaymentservice.bbps.util;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
@@ -715,9 +716,9 @@ public class BillerMapperHelper {
|
||||
parent.setActionType(responseWrapper.getActionType());
|
||||
parent.setUserId(responseWrapper.getUserId());
|
||||
// Map incoming DTO date strings into Auditable LocalDateTime fields
|
||||
LocalDateTime parentCreatedOn = parseToLocalDateTime(responseWrapper.getCreationDate());
|
||||
Date parentCreatedOn = parseToDate(responseWrapper.getCreationDate());
|
||||
|
||||
LocalDateTime parentUpdatedOn = parseToLocalDateTime(responseWrapper.getModifiedDate());
|
||||
Date parentUpdatedOn = parseToDate(responseWrapper.getModifiedDate());
|
||||
parent.setCreatedEpochDate(responseWrapper.getCreatedEpochDate());
|
||||
parent.setModifiedEpochDate(responseWrapper.getModifiedEpochDate());
|
||||
parent.setReqId(reqId);
|
||||
@@ -959,9 +960,9 @@ public class BillerMapperHelper {
|
||||
|
||||
// DATES
|
||||
// Map incoming DTO date strings into Auditable LocalDateTime fields
|
||||
LocalDateTime bmCreatedOn = parseToLocalDateTime(responseWrapper.getCreationDate());
|
||||
Date bmCreatedOn = parseToDate(responseWrapper.getCreationDate());
|
||||
|
||||
LocalDateTime bmUpdatedOn = parseToLocalDateTime(responseWrapper.getModifiedDate());
|
||||
Date bmUpdatedOn = parseToDate(responseWrapper.getModifiedDate());
|
||||
if (bmUpdatedOn != null) {
|
||||
billMaster.setUpdatedDateTime(bmUpdatedOn);
|
||||
}
|
||||
@@ -973,26 +974,17 @@ public class BillerMapperHelper {
|
||||
|
||||
// Helper to parse incoming ISO date/time strings (with optional offset) into
|
||||
// LocalDateTime
|
||||
private LocalDateTime parseToLocalDateTime(String dateStr) {
|
||||
if (dateStr == null || dateStr.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
// Try parsing with offset first (e.g., 2023-04-19T17:28:05.508679Z or with
|
||||
// +05:30)
|
||||
OffsetDateTime odt = OffsetDateTime.parse(dateStr);
|
||||
return odt.toLocalDateTime();
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
// Fallback to LocalDateTime without offset
|
||||
return LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
|
||||
} catch (Exception ex) {
|
||||
LOGGER.warn("Unable to parse date string to LocalDateTime: {}", dateStr);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
private Date parseToDate(String dateStr) {
|
||||
try {
|
||||
// example format: 2025-12-17T14:30:45
|
||||
LocalDateTime ldt = LocalDateTime.parse(dateStr);
|
||||
return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Convert TransactionMaster to master DTO
|
||||
public TransactionHistoryMasterDTO toDTO(TransactionMaster transactionMaster) {
|
||||
if (transactionMaster == null)
|
||||
@@ -1082,38 +1074,76 @@ public class BillerMapperHelper {
|
||||
|
||||
// Map PaymentStartUserRequest + API response into PaymentStartRecord and
|
||||
// persist
|
||||
public void savePaymentStartRecord(PaymentStartUserRequest request, PaymentStartApiResponse apiResponse,
|
||||
String txnId, String orderNo, String requestJson, String rawResponse, String responseType) {
|
||||
PaymentStartRecord record = new PaymentStartRecord();
|
||||
record.setOrderNo(orderNo);
|
||||
record.setRequestId(request.getReqId());
|
||||
record.setClientMid(request.getMid());
|
||||
record.setClientUserId(request.getClientUserId());
|
||||
record.setInternalTxnId(txnId);
|
||||
public PaymentStartRecord savePaymentStartRecord(
|
||||
PaymentStartUserRequest request,
|
||||
PaymentStartApiResponse apiResponse,
|
||||
String txnId,
|
||||
String orderNo,
|
||||
String requestJson,
|
||||
String rawResponse,
|
||||
String responseType) {
|
||||
|
||||
if (apiResponse != null &&
|
||||
apiResponse.getResponseData() != null) {
|
||||
record.setAmount(Optional.ofNullable(apiResponse.getResponseData().getAmount(
|
||||
)).orElse("0.00"));
|
||||
|
||||
record.setTxnId(Optional.ofNullable(apiResponse.getResponseData().getTxnId())
|
||||
.orElse("DUMMY_TXN"));
|
||||
record.setQrString(Optional.ofNullable(apiResponse.getResponseData().
|
||||
getQrString()).orElse("NO_QR")); // parse createdOn string into LocalDateTime and set on Auditable
|
||||
LocalDateTime createdOn =parseToLocalDateTime(apiResponse.getResponseData().getCreatedOn());
|
||||
|
||||
record.setTxnStatus("PENDING"); } else { record.setAmount("0.00");
|
||||
record.setTxnStatus("PENDING"); }
|
||||
|
||||
|
||||
// store the original request body and raw response
|
||||
record.setRequestBody(requestJson);
|
||||
record.setResponseBody(rawResponse);
|
||||
record.setResponseType(responseType);
|
||||
PaymentStartRecord record;
|
||||
|
||||
paymentStartRecordRepository.save(record);
|
||||
boolean createNewRecord =
|
||||
apiResponse == null &&
|
||||
rawResponse == null &&
|
||||
responseType == null;
|
||||
|
||||
if (createNewRecord) {
|
||||
// 🔒 Duplicate check
|
||||
if (paymentStartRecordRepository.findByOrderNo(orderNo).isPresent()) {
|
||||
throw new CustomException(
|
||||
"Duplicate OrderNo found",
|
||||
"DUPLICATE_ORDERNO",
|
||||
400,
|
||||
"OrderNo already exists"
|
||||
);
|
||||
}
|
||||
record = new PaymentStartRecord();
|
||||
} else {
|
||||
record = paymentStartRecordRepository.findByOrderNo(orderNo)
|
||||
.orElseThrow(() -> new CustomException(
|
||||
"OrderNo not found",
|
||||
"ORDERNO_NOT_FOUND",
|
||||
404,
|
||||
"No record exists for given orderNo"
|
||||
));
|
||||
}
|
||||
|
||||
if (orderNo != null) {
|
||||
record.setOrderNo(orderNo);
|
||||
record.setRequestId(request.getReqId());
|
||||
record.setClientMid(request.getMid());
|
||||
record.setClientUserId(request.getClientUserId());
|
||||
record.setInternalTxnId(txnId);
|
||||
}
|
||||
|
||||
if (apiResponse != null && apiResponse.getResponseData() != null) {
|
||||
record.setAmount(Optional.ofNullable(
|
||||
apiResponse.getResponseData().getAmount()).orElse("0.00"));
|
||||
|
||||
record.setTxnId(Optional.ofNullable(
|
||||
apiResponse.getResponseData().getTxnId()).orElse("DUMMY_TXN"));
|
||||
|
||||
record.setQrString(Optional.ofNullable(
|
||||
apiResponse.getResponseData().getQrString()).orElse("NO_QR"));
|
||||
|
||||
Date createdOn = parseToDate(apiResponse.getResponseData().getCreatedOn());
|
||||
|
||||
record.setTxnStatus("PENDING");
|
||||
} else {
|
||||
record.setAmount("0.00");
|
||||
record.setTxnStatus("PENDING");
|
||||
}
|
||||
|
||||
|
||||
record.setResponseType(responseType);
|
||||
|
||||
return paymentStartRecordRepository.save(record);
|
||||
}
|
||||
|
||||
|
||||
// Map ComplaintRequestDTO to forward request for complaint API
|
||||
public FetchComplaintForwardRequest fetchComplaintForwardRequestMap(ComplaintRequestDTO complainRequestDTO) {
|
||||
FetchComplaintForwardRequest forward = new FetchComplaintForwardRequest();
|
||||
|
||||
@@ -29,7 +29,6 @@ public class EncryptionUtil {
|
||||
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
|
||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
|
||||
|
||||
byte[] ivBytes = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
|
||||
byte[] encryptedData = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import com.billpaymentservice.bbps.entites.BBPSMastersData;
|
||||
import com.billpaymentservice.bbps.entites.BharatConnectMaster;
|
||||
import com.billpaymentservice.bbps.entites.InboundTraceLog;
|
||||
import com.billpaymentservice.bbps.entites.OutboundTraceLog;
|
||||
import com.billpaymentservice.bbps.entites.TransactionMaster;
|
||||
import com.billpaymentservice.bbps.entites.UserEntity;
|
||||
import com.billpaymentservice.bbps.exception.CustomException;
|
||||
import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo;
|
||||
@@ -225,5 +226,63 @@ public class Helper {
|
||||
|
||||
return userId;
|
||||
}
|
||||
public void mergeNonNullFields(TransactionMaster src, TransactionMaster dest) {
|
||||
/*
|
||||
* LOGGER.info("TransactionMaster src: {}", src);
|
||||
*/ // Only copy values that are non-null (and non-blank for Strings)
|
||||
if (src.getBankTxnId() != null && !src.getBankTxnId().isBlank()) dest.setBankTxnId(src.getBankTxnId());
|
||||
if (src.getTxnId() != null && !src.getTxnId().isBlank()) dest.setTxnId(src.getTxnId());
|
||||
if (src.getInitiatorTxnId() != null && !src.getInitiatorTxnId().isBlank()) dest.setInitiatorTxnId(src.getInitiatorTxnId());
|
||||
if (src.getCheckerTxnId() != null && !src.getCheckerTxnId().isBlank()) dest.setCheckerTxnId(src.getCheckerTxnId());
|
||||
if (src.getReqId() != null && !src.getReqId().isBlank()) dest.setReqId(src.getReqId());
|
||||
if (src.getMid() != null && !src.getMid().isBlank()) dest.setMid(src.getMid());
|
||||
if (src.getClientUserId() != null && !src.getClientUserId().isBlank()) dest.setClientUserId(src.getClientUserId());
|
||||
if (src.getClientReqId() != null && !src.getClientReqId().isBlank()) dest.setClientReqId(src.getClientReqId());
|
||||
if (src.getUserId() != null && !src.getUserId().isBlank()) dest.setUserId(src.getUserId());
|
||||
if (src.getBillerId() != null && !src.getBillerId().isBlank()) dest.setBillerId(src.getBillerId());
|
||||
if (src.getTxnAmount() != null) dest.setTxnAmount(src.getTxnAmount());
|
||||
if (src.getStatus() != null && !src.getStatus().isBlank()) dest.setStatus(src.getStatus());
|
||||
if (src.getPaymentInformation() != null && !src.getPaymentInformation().isBlank()) dest.setPaymentInformation(src.getPaymentInformation());
|
||||
if (src.getCreationDateBank() != null) dest.setCreationDateBank(src.getCreationDateBank());
|
||||
if (src.getModifiedDateBank() != null) dest.setModifiedDateBank(src.getModifiedDateBank());
|
||||
if (src.getCreatedEpochDateBank() != null) dest.setCreatedEpochDateBank(src.getCreatedEpochDateBank());
|
||||
if (src.getModifiedEpochDateBank() != null) dest.setModifiedEpochDateBank(src.getModifiedEpochDateBank());
|
||||
/* ---- additional fields ---- */
|
||||
if (src.getRefId() != null && !src.getRefId().isBlank()) dest.setRefId(src.getRefId());
|
||||
if (src.getPaymentRefId() != null && !src.getPaymentRefId().isBlank()) dest.setPaymentRefId(src.getPaymentRefId());
|
||||
if (src.getRemitterName() != null && !src.getRemitterName().isBlank()) dest.setRemitterName(src.getRemitterName());
|
||||
if (src.getOrderId() != null && !src.getOrderId().isBlank()) dest.setOrderId(src.getOrderId());
|
||||
if (src.getBillId() != null && !src.getBillId().isBlank()) dest.setBillId(src.getBillId());
|
||||
if (src.getUserType() != null && !src.getUserType().isBlank()) dest.setUserType(src.getUserType());
|
||||
if (src.getTotalTxnAmount() != null) dest.setTotalTxnAmount(src.getTotalTxnAmount());
|
||||
if (src.getBillerCategory() != null && !src.getBillerCategory().isBlank()) dest.setBillerCategory(src.getBillerCategory());
|
||||
if (src.getBillerName() != null && !src.getBillerName().isBlank()) dest.setBillerName(src.getBillerName());
|
||||
if (src.getOffUsPay() != null) dest.setOffUsPay(src.getOffUsPay());
|
||||
if (src.getSplitPay() != null) dest.setSplitPay(src.getSplitPay());
|
||||
if (src.getQuickPay() != null) dest.setQuickPay(src.getQuickPay());
|
||||
if (src.getPaymentMode() != null && !src.getPaymentMode().isBlank()) dest.setPaymentMode(src.getPaymentMode());
|
||||
if (src.getAgentPaymentInformation() != null && !src.getAgentPaymentInformation().isBlank()) dest.setAgentPaymentInformation(src.getAgentPaymentInformation());
|
||||
if (src.getCustConvFee() != null) dest.setCustConvFee(src.getCustConvFee());
|
||||
if (src.getCurrency() != null && !src.getCurrency().isBlank()) dest.setCurrency(src.getCurrency());
|
||||
if (src.getRequestedIp() != null && !src.getRequestedIp().isBlank()) dest.setRequestedIp(src.getRequestedIp());
|
||||
if (src.getCustomerMobNo() != null && !src.getCustomerMobNo().isBlank()) dest.setCustomerMobNo(src.getCustomerMobNo());
|
||||
if (src.getMacAddress() != null && !src.getMacAddress().isBlank()) dest.setMacAddress(src.getMacAddress());
|
||||
if (src.getSplitPayAmount() != null) dest.setSplitPayAmount(src.getSplitPayAmount());
|
||||
if (src.getCouCustConvFee() != null) dest.setCouCustConvFee(src.getCouCustConvFee());
|
||||
if (src.getSettlementVerification() != null) dest.setSettlementVerification(src.getSettlementVerification());
|
||||
if (src.getFundTxnType() != null && !src.getFundTxnType().isBlank()) dest.setFundTxnType(src.getFundTxnType());
|
||||
if (src.getReason() != null && !src.getReason().isBlank()) dest.setReason(src.getReason());
|
||||
if (src.getAmountTags() != null && !src.getAmountTags().isBlank()) dest.setAmountTags(src.getAmountTags());
|
||||
if (src.getPlanId() != null && !src.getPlanId().isBlank()) dest.setPlanId(src.getPlanId());
|
||||
if (src.getPlanType() != null && !src.getPlanType().isBlank()) dest.setPlanType(src.getPlanType());
|
||||
if (src.getTxnNpciId() != null && !src.getTxnNpciId().isBlank()) dest.setTxnNpciId(src.getTxnNpciId());
|
||||
|
||||
/* ---- lists (direct replace when provided) ---- */
|
||||
if (src.getDeviceBlockTags() != null && !src.getDeviceBlockTags().isEmpty()) dest.setDeviceBlockTags(src.getDeviceBlockTags());
|
||||
if (src.getCustomerParams() != null && !src.getCustomerParams().isEmpty()) dest.setCustomerParams(src.getCustomerParams());
|
||||
|
||||
LOGGER.info("TransactionMaster dest after merge: {}", dest);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user