diff --git a/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java b/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java index 3b59e5d..833c45e 100644 --- a/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java +++ b/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + @Data @Builder @AllArgsConstructor @@ -12,7 +14,9 @@ import lombok.NoArgsConstructor; public class CoreCashInTransaction { private String porOrgacode; private String drMbmBkmsnumber; - private double sgtGntramtfc; + private BigDecimal sgtGntramtfc; + private double accSgtGntramtfc; private String drPcrCurrcode; private String otdTrancomment; -} + private String pcaGlaccode; +} \ No newline at end of file diff --git a/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java b/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java index 2cb4ad5..965629d 100644 --- a/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java +++ b/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java @@ -17,4 +17,7 @@ public class CoreCashOutTransaction { private BigDecimal sgtGntramtfc; private String crPcrCurrcode; private String otdTrancomment; + private String pcaGlaccode; + private BigDecimal accSgtGntramtfc; + } diff --git a/src/main/java/com/mfsys/uco/dto/ExchangeRateModel.java b/src/main/java/com/mfsys/uco/dto/ExchangeRateModel.java new file mode 100644 index 0000000..d4ff770 --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/ExchangeRateModel.java @@ -0,0 +1,22 @@ +package com.mfsys.uco.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ExchangeRateModel { + private String pcrCurrshort; + private String pcrCurrcode; + private String perEratdate; + private String petExrtcode; + private String porOrgacode; + private double perEratrateact; + private String pcrCurrdesc; + private String petExrtdesc; + private boolean pcrCurrbase; +} diff --git a/src/main/java/com/mfsys/uco/model/TransactionTrail.java b/src/main/java/com/mfsys/uco/model/TransactionTrail.java index 35b063f..41045f2 100644 --- a/src/main/java/com/mfsys/uco/model/TransactionTrail.java +++ b/src/main/java/com/mfsys/uco/model/TransactionTrail.java @@ -44,6 +44,10 @@ public class TransactionTrail { protected LocalDate crSgtGntrdate; @Column(name = "SGT_GNTRAMT", nullable = false, updatable = false, columnDefinition = FieldNameLength.AMOUNT_REAL) protected BigDecimal sgtGntramt = BigDecimal.ZERO; + @Column(name = "DR_SGT_GNTRAMT", nullable = false, updatable = false, columnDefinition = FieldNameLength.AMOUNT_REAL) + protected BigDecimal drSgtGntramt = BigDecimal.ZERO; + @Column(name = "CR_SGT_GNTRAMT", nullable = true, updatable = false, columnDefinition = FieldNameLength.AMOUNT_REAL) + protected BigDecimal crSgtGntramt = BigDecimal.ZERO; @Column(name = "BAT_ACNTTRANSENT", nullable = false, columnDefinition = FieldNameLength.BOOLEAN_BIT) protected boolean batAcnttranSend; @Column(name = "BAT_ACNTTRANRECEIVED", nullable = true, columnDefinition = FieldNameLength.BOOLEAN_BIT) diff --git a/src/main/java/com/mfsys/uco/service/TransactionService.java b/src/main/java/com/mfsys/uco/service/TransactionService.java index 9c2d939..28a40c1 100644 --- a/src/main/java/com/mfsys/uco/service/TransactionService.java +++ b/src/main/java/com/mfsys/uco/service/TransactionService.java @@ -1,5 +1,8 @@ package com.mfsys.uco.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.mfsys.comm.util.MapValueExtractorUtil; import com.mfsys.uco.UCOURI; import com.mfsys.uco.dto.*; @@ -17,6 +20,10 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import static com.itextpdf.styledxmlparser.jsoup.select.Collector.collect; @Service @Data @@ -32,7 +39,7 @@ public class TransactionService { public TransactionPinResponseModel sendOtpAndValidateTranPin(TransactionOtpRequestModel transactionOtpRequestModel, boolean isResendOtp) { CustomerProfile customerProfile = verifyOldPinAndGetCmpProfile(transactionOtpRequestModel.getPorOrgacode(), - transactionOtpRequestModel.getTransPincode(), transactionOtpRequestModel.getCmpCustcode(),isResendOtp); + transactionOtpRequestModel.getTransPincode(), transactionOtpRequestModel.getCmpCustcode(), isResendOtp); return TransactionPinResponseModel.builder().notificationId(transactionPinService.sendOtp(customerProfile, transactionOtpRequestModel.getChannelCode(), transactionOtpRequestModel.getPinType(), "Transaction Verification OTP", transactionOtpRequestModel.isOtpRequired())).build(); } @@ -50,6 +57,8 @@ public class TransactionService { .cmpCustcode(transactionRequest.getCmpCustcode()) .drPcrCurrcode(transactionRequest.getDrPcrCurrcode()) .crMbmBkmstitle(transactionRequest.getCrMbmBkmstitle()) + .drSgtGntramt(BigDecimal.valueOf(convertToPKR(transactionRequest.getDrPcrCurrcode(),transactionRequest.getSgtGntramtfc(), transactionRequest.getPorOrgacode()))) + .crSgtGntramt(null) .crPcrCurrdesc(transactionRequest.getCrPcrCurrdesc()) .crPcrCurrcode(transactionRequest.getCrPcrCurrcode()) .crPcrCurrshort(transactionRequest.getCrPcrCurrshort()) @@ -63,10 +72,12 @@ public class TransactionService { CoreCashInTransaction coreCashInTransaction = CoreCashInTransaction.builder() .drMbmBkmsnumber(transactionRequest.getDrMbmBkmsnumber()) - .drPcrCurrcode("123") - .sgtGntramtfc(transactionRequest.getSgtGntramtfc()) + .drPcrCurrcode(transactionTrail.getDrPcrCurrcode()) + .accSgtGntramtfc(transactionRequest.getSgtGntramtfc()) + .sgtGntramtfc(transactionTrail.getCrSgtGntramt()) .otdTrancomment(transactionRequest.getOtdTrancomment()) .porOrgacode(transactionRequest.getPorOrgacode()) + .pcaGlaccode("A01011003") .build(); Map response = (Map) webClientDepositService.postTransaction(coreCashInTransaction, UCOURI.BANKING_CASH_IN, transactionRequest.getPorOrgacode()); Map transactionId = (Map) response.get("FuncReturnDetail"); @@ -96,17 +107,19 @@ public class TransactionService { public Map cashOutTransaction(CashOutTransactionRequest cashOutTransactionRequest) { verifyOldPinAndGetCmpProfile(cashOutTransactionRequest.getPorOrgacode(), - cashOutTransactionRequest.getCmpTranpin(), cashOutTransactionRequest.getCmpCustcode(),true); + cashOutTransactionRequest.getCmpTranpin(), cashOutTransactionRequest.getCmpCustcode(), true); Map response = new HashMap<>(); Optional transactionTrail = transactionTrailRepository.findById(Math.toIntExact(cashOutTransactionRequest.getId())); if (transactionTrail.isPresent()) { - + transactionTrail.get().setCrSgtGntramt(BigDecimal.valueOf(convertFromPKR(transactionTrail.get().getCrPcrCurrcode(),Double.valueOf(String.valueOf(transactionTrail.get().getDrSgtGntramt())),transactionTrail.get().getPorOrgacode())));; CoreCashOutTransaction cashOutTransaction = CoreCashOutTransaction.builder() .crPcrCurrcode(transactionTrail.get().getCrPcrCurrcode()) .crMbmBkmsnumber(transactionTrail.get().getCrMbmBkmsnumber()) .porOrgacode(cashOutTransactionRequest.getPorOrgacode()) .otdTrancomment(cashOutTransactionRequest.getId() + "_Received") - .sgtGntramtfc(transactionTrail.get().getSgtGntramt()) + .sgtGntramtfc(transactionTrail.get().getDrSgtGntramt()) + .accSgtGntramtfc(transactionTrail.get().getCrSgtGntramt()) + .pcaGlaccode("A01011003") .build(); response = (Map) webClientDepositService.postTransaction(cashOutTransaction, UCOURI.BANKING_CASH_OUT, transactionTrail.get().getPorOrgacode()); @@ -122,7 +135,7 @@ public class TransactionService { private CustomerProfile verifyOldPinAndGetCmpProfile(String porOrgacode, String transPincode, String cmpCustcode, boolean isResendOtp) { CustomerProfile customerProfile = transactionPinService.fetchCustomer(porOrgacode, cmpCustcode); - if(isResendOtp) { + if (isResendOtp) { transactionPinService.validateOldPin(customerProfile, transPincode); } return customerProfile; @@ -155,7 +168,7 @@ public class TransactionService { .pcrCurrcode(targetCurrencyCode) .sgtGntramtfc(convertedAmount) .serviceCharges(0.0) - .targetPerEratrateact(targetCurrencyCode.equals("default")?(1/exchangeRates.get(baseCurrencyCode)):exchangeRates.get(targetCurrencyCode)) + .targetPerEratrateact(targetCurrencyCode.equals("default") ? (1 / exchangeRates.get(baseCurrencyCode)) : exchangeRates.get(targetCurrencyCode)) .build(); } @@ -177,4 +190,49 @@ public class TransactionService { return amountInTargetCurrency; } + + public double convertToPKR(String fromcrCurrcode, double amount, String porOrgacode) { +// List> exchangeRateList = (List>) ucoAccountService.fetchExchangeRate(porOrgacode); // Changed to List + + List exchangeRateModelList = fetchExchangeRate(porOrgacode); + String baseCurrencyCode = exchangeRateModelList.stream() + .filter(ExchangeRateModel::isPcrCurrbase) + .findFirst() + .map(ExchangeRateModel::getPcrCurrcode) + .orElse(null); + if (fromcrCurrcode.equals(baseCurrencyCode)) { + return amount; + } + + return exchangeRateModelList.stream() + .filter(k -> k.getPcrCurrcode().equals(fromcrCurrcode)) + .findFirst() + .map(k -> amount * k.getPerEratrateact()) + .orElse(0.0); + } + public List fetchExchangeRate(String porOrgacode) { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.convertValue(ucoAccountService.fetchExchangeRate(porOrgacode), + new TypeReference>() { + }); + } + public double convertFromPKR(String todrCurrcode, double amount,String porOrgacode) { + List exchangeRateModelList = fetchExchangeRate(porOrgacode); + + String baseCurrencyCode = exchangeRateModelList.stream() + .filter(ExchangeRateModel::isPcrCurrbase) + .findFirst() + .map(ExchangeRateModel::getPcrCurrcode) + .orElse(null); + if (todrCurrcode.equals(baseCurrencyCode)) { + return amount; + } + + return exchangeRateModelList.stream() + .filter(k -> k.getPcrCurrcode().equals(todrCurrcode)) + .findFirst() + .map(k -> amount / k.getPerEratrateact()) + .orElseThrow(() -> new RuntimeException("Product Not Found")); + } + }