diff --git a/src/main/java/com/mfsys/uco/UCOURI.java b/src/main/java/com/mfsys/uco/UCOURI.java index 99e909d..cc7712d 100644 --- a/src/main/java/com/mfsys/uco/UCOURI.java +++ b/src/main/java/com/mfsys/uco/UCOURI.java @@ -2,15 +2,20 @@ package com.mfsys.uco; public interface UCOURI { String VIEW_BALANCE = "/user/viewBalance"; - String ONBOARD_CUSTOMER = "/user/onboardCutomer"; + String ONBOARD_CUSTOMER = "/auth/user/authenticate/onboardCutomer"; String FETCH_DEPOSITACCOUNTS = "/depositAccounts"; String FETCH_ACCOUNT_STATEMENT = "/accountStatement"; String FETCH_ACCOUNT_INQUIRY = "/accountInquiry"; - String GET_TRANSACTION_PIN = "/transactionPin"; - String SUBMIT_TRANSACTION = "/submitTransaction"; String GENERATE_TRANSACTIONS_REPORT = "/generateReport"; String CREATE_TRAN_PIN = "/createTransactionPin"; String VERIFY_TRAN_PIN = "/verifyTransactionPin"; String CHANGE_TRAN_PIN = "/changeTransactionPin"; String FETCH_LOGIIN_DATA = "/fetchlogindata"; + String FETCH_EXCHANGE_RATE = "/fetchExchangeRate"; + String GET_DR_TRANSACTION_PIN = "/sendDrTranOtpAndVerifyTranPin"; + String SUBMIT_DR_TRANSACTION = "/submitDrTransaction"; + String SUBMIT_CR_TRANSACTION = "/submitCrTransaction"; + String PENDING_CR_TRANSACTION = "/fetchPendingCredittransaction"; + String BANKING_CASH_IN = "/deposit/transactions/uco/cash-in"; + String BANKING_CASH_OUT = "/deposit/transactions/uco/cash-out"; } diff --git a/src/main/java/com/mfsys/uco/config/WebClientconfiguration.java b/src/main/java/com/mfsys/uco/config/WebClientconfiguration.java index 187af9a..485431a 100644 --- a/src/main/java/com/mfsys/uco/config/WebClientconfiguration.java +++ b/src/main/java/com/mfsys/uco/config/WebClientconfiguration.java @@ -1,5 +1,6 @@ package com.mfsys.uco.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -8,6 +9,9 @@ import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientconfiguration { + @Value("${base.ciihive}") + private String ciihive; + @LoadBalanced @Bean public WebClient.Builder loadBalancedWebClientBuilder() { @@ -17,11 +21,13 @@ public class WebClientconfiguration { @Bean public WebClient webClientDeposit() { return WebClient.create("http://localhost:9095"); +// return WebClient.create(ciihive); } @Bean public WebClient webClientCrm() { - return WebClient.create("http://localhost:9096"); + return WebClient.create(ciihive); +// return WebClient.create("http://localhost:9096"); } } diff --git a/src/main/java/com/mfsys/uco/constants/UCOURI.java b/src/main/java/com/mfsys/uco/constants/UCOURI.java index 05fba01..7d0124c 100644 --- a/src/main/java/com/mfsys/uco/constants/UCOURI.java +++ b/src/main/java/com/mfsys/uco/constants/UCOURI.java @@ -4,4 +4,6 @@ public interface UCOURI { String GET_UCOACC_BALANCE = "/deposit/getUcoAccountBalance"; String CUSTOMER_ONBOARDING = "/crm/onboarding/digital/customer"; String GET_CMP_UCOACCOUNTS = "/deposit/getUcoAccounts"; + String FETCH_EXCHANGE_RATE = "/deposit/uco/fetchExchangeRate"; + } diff --git a/src/main/java/com/mfsys/uco/controller/TransactionController.java b/src/main/java/com/mfsys/uco/controller/TransactionController.java new file mode 100644 index 0000000..3d1c125 --- /dev/null +++ b/src/main/java/com/mfsys/uco/controller/TransactionController.java @@ -0,0 +1,48 @@ +package com.mfsys.uco.controller; + +import com.mfsys.comm.util.FunctionReturnDetail; +import com.mfsys.uco.UCOURI; +import com.mfsys.uco.dto.CashInTransactionRequest; +import com.mfsys.uco.dto.CashOutTransactionRequest; +import com.mfsys.uco.dto.Transaction.TransactionOtpRequestModel; +import com.mfsys.uco.dto.TransactionPinResponseModel; +import com.mfsys.uco.dto.webclientdto.AccountDetail; +import com.mfsys.uco.model.TransactionTrail; +import com.mfsys.uco.service.TransactionService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class TransactionController { + + private final TransactionService transactionService; + + @PostMapping(UCOURI.GET_DR_TRANSACTION_PIN) + public TransactionPinResponseModel submitTransaction(@RequestBody TransactionOtpRequestModel transactionOtpRequestModel) { + return transactionService.sendOtpAndValidateTranPin(transactionOtpRequestModel); + } + + @PostMapping(UCOURI.SUBMIT_DR_TRANSACTION) + public ResponseEntity> cashInTransaction(@RequestBody CashInTransactionRequest transactionRequest) { + transactionService.cashInTransaction(transactionRequest); + return null; + } + + @PostMapping(UCOURI.SUBMIT_CR_TRANSACTION) + public ResponseEntity> cashOutTransaction(@RequestBody CashOutTransactionRequest transactionRequest) { + transactionService.cashOutTransaction(transactionRequest); + return null; + } + + @GetMapping(UCOURI.PENDING_CR_TRANSACTION) + public List getDepositAccounts( + @RequestParam String porOrgacode, + @RequestParam String mbmBkmsnumber) { + return transactionService.fetchPendingCrTransactions(porOrgacode, mbmBkmsnumber); + } +} + diff --git a/src/main/java/com/mfsys/uco/controller/UserController.java b/src/main/java/com/mfsys/uco/controller/UserController.java index 72f5493..33a3307 100644 --- a/src/main/java/com/mfsys/uco/controller/UserController.java +++ b/src/main/java/com/mfsys/uco/controller/UserController.java @@ -24,6 +24,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Base64; import java.util.List; +import java.util.Map; @RestController @RequiredArgsConstructor @@ -34,11 +35,10 @@ public class UserController { private final UcoAccountService ucoAccountService; private final CustomerProfileService customerProfileService; - @PostMapping(UCOURI.ONBOARD_CUSTOMER) - public ResponseEntity customerOnBoarding(@RequestBody SignupStep3RequestModel signupStep3RequestModel) { + public ResponseEntity customerOnBoarding(@RequestBody SignupStep3RequestModel signupStep3RequestModel) { ucoAccountService.onBoardCustomer(signupStep3RequestModel); - return null; + return ResponseEntity.ok(HttpStatus.OK); } @PostMapping(UCOURI.VIEW_BALANCE) @@ -47,6 +47,7 @@ public class UserController { viewBalanceResponseModel.setMbmBkmsbalance(ucoAccountService.fetchAccountBalance(viewBalanceRequestModel.getPorOrgacode(),viewBalanceRequestModel.getMbmBkmsNumber())); return viewBalanceResponseModel; } + @GetMapping(UCOURI.FETCH_LOGIIN_DATA) public CustomerProfile fetchlogindata( @RequestParam String porOrgacode, @@ -57,9 +58,9 @@ public class UserController { @GetMapping(UCOURI.FETCH_DEPOSITACCOUNTS) public List getDepositAccounts( @RequestParam String porOrgacode, - @RequestParam String custcode, - @RequestParam String pctcstycode) { - return List.of(ucoAccountService.fetchdepositAccountFromCiihive(porOrgacode,custcode)); + @RequestParam String cmpCustcode, + @RequestParam String pctCstycode) { + return List.of(ucoAccountService.fetchdepositAccountFromCiihive(porOrgacode,cmpCustcode)); } @GetMapping(UCOURI.FETCH_ACCOUNT_STATEMENT) @@ -93,18 +94,13 @@ public class UserController { return new AccountInquiryResponse(ucoAccountService.fetchAccountTitile(porOrgacode,acntTypeCode,acntTypeValue)); } - @PostMapping(UCOURI.GET_TRANSACTION_PIN) - public TransactionPinResponseModel submitTransaction(@RequestBody TransactionPinRequestModel transactionPinRequestModel) { - TransactionPinResponseModel response = new TransactionPinResponseModel(); - response.setOtdTranrequestid(123456); - return response; - } // mine - - @PostMapping(UCOURI.SUBMIT_TRANSACTION) - public TransactionResponseModel submitTransaction(@RequestBody TransactionRequestModel transactionRequestModel) { - String mockTranID = "TRAN1234567890"; - return new TransactionResponseModel(mockTranID); - } + // mine + +// @PostMapping(UCOURI.SUBMIT_TRANSACTION) +// public TransactionResponseModel submitTransaction(@RequestBody TransactionRequestModel transactionRequestModel) { +// String mockTranID = "TRAN1234567890"; +// return new TransactionResponseModel(mockTranID); +// } @PostMapping(UCOURI.GENERATE_TRANSACTIONS_REPORT) public String generateReport(@RequestBody TransactionHistoryRequest request) { @@ -158,4 +154,10 @@ public class UserController { return ResponseEntity.internalServerError().body("An unexpected error occurred."); } } + + @GetMapping(UCOURI.FETCH_EXCHANGE_RATE) + public Object fetchExchangeRate( + @RequestParam String porOrgacode) { + return ucoAccountService.fetchExchangeRate(porOrgacode); + } } diff --git a/src/main/java/com/mfsys/uco/dto/CashInTransactionRequest.java b/src/main/java/com/mfsys/uco/dto/CashInTransactionRequest.java new file mode 100644 index 0000000..5e52aa9 --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/CashInTransactionRequest.java @@ -0,0 +1,33 @@ +package com.mfsys.uco.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CashInTransactionRequest { + private String porOrgacode; + private String pctCstycode; + private String channelCode; + private String cmpCustcode; + private String drMbmBkmsnumber; + private String drMbmBkmstitle; + private String drPcrCurrcode; + private String drPcrCurrdesc; + private String crMbmBkmsnumber; + private String crMbmBkmstitle; + private String crPcrCurrcode; + private String crPcrCurrdesc; + private String sgtGntrnarration; + private String dmpProdCode; + private String transType; + private String notificationId; + private String transMode; + private double sgtGntramtfc; + private String otdTrancomment; + private boolean isOtpRequired; +} diff --git a/src/main/java/com/mfsys/uco/dto/CashOutTransactionRequest.java b/src/main/java/com/mfsys/uco/dto/CashOutTransactionRequest.java new file mode 100644 index 0000000..76a7f89 --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/CashOutTransactionRequest.java @@ -0,0 +1,18 @@ +package com.mfsys.uco.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CashOutTransactionRequest { + private Long id; + private String cmpTranpin; + private boolean isAccepted; + private String cmpCustcode; + private String porOrgacode; +} diff --git a/src/main/java/com/mfsys/uco/dto/ChangeTransactionPinRequest.java b/src/main/java/com/mfsys/uco/dto/ChangeTransactionPinRequest.java index 006cc47..2e36803 100644 --- a/src/main/java/com/mfsys/uco/dto/ChangeTransactionPinRequest.java +++ b/src/main/java/com/mfsys/uco/dto/ChangeTransactionPinRequest.java @@ -17,4 +17,5 @@ public class ChangeTransactionPinRequest { private String porOrgacode; private String cmpCustcode; private boolean isOtpRequired; + private String pinType; } \ No newline at end of file diff --git a/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java b/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java new file mode 100644 index 0000000..3b59e5d --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/CoreCashInTransaction.java @@ -0,0 +1,18 @@ +package com.mfsys.uco.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CoreCashInTransaction { + private String porOrgacode; + private String drMbmBkmsnumber; + private double sgtGntramtfc; + private String drPcrCurrcode; + private String otdTrancomment; +} diff --git a/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java b/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java new file mode 100644 index 0000000..2cb4ad5 --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/CoreCashOutTransaction.java @@ -0,0 +1,20 @@ +package com.mfsys.uco.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CoreCashOutTransaction { + private String porOrgacode; + private String crMbmBkmsnumber; + private BigDecimal sgtGntramtfc; + private String crPcrCurrcode; + private String otdTrancomment; +} diff --git a/src/main/java/com/mfsys/uco/dto/CreateTransactionPinRequest.java b/src/main/java/com/mfsys/uco/dto/CreateTransactionPinRequest.java index ff517c9..c54d95d 100644 --- a/src/main/java/com/mfsys/uco/dto/CreateTransactionPinRequest.java +++ b/src/main/java/com/mfsys/uco/dto/CreateTransactionPinRequest.java @@ -16,6 +16,7 @@ public class CreateTransactionPinRequest { private String porOrgacode; private String cmpCustcode; private boolean isOtpRequired; + private String pinType; } diff --git a/src/main/java/com/mfsys/uco/dto/Transaction/TransactionOtpRequestModel.java b/src/main/java/com/mfsys/uco/dto/Transaction/TransactionOtpRequestModel.java new file mode 100644 index 0000000..aaf6225 --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/Transaction/TransactionOtpRequestModel.java @@ -0,0 +1,16 @@ +package com.mfsys.uco.dto.Transaction; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +public class TransactionOtpRequestModel { + private String porOrgacode; + private String pctCstycode; + private String channelCode; + private String cmpCustcode; + private String email; + private String pinType; + private String transPincode; + private boolean isOtpRequired; +} diff --git a/src/main/java/com/mfsys/uco/dto/TransactionPinResponseModel.java b/src/main/java/com/mfsys/uco/dto/TransactionPinResponseModel.java index c59efa1..ec4eef4 100644 --- a/src/main/java/com/mfsys/uco/dto/TransactionPinResponseModel.java +++ b/src/main/java/com/mfsys/uco/dto/TransactionPinResponseModel.java @@ -10,5 +10,5 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class TransactionPinResponseModel { - private double otdTranrequestid; + private Long notificationId; } diff --git a/src/main/java/com/mfsys/uco/exception/AccountDoesntExistsException.java b/src/main/java/com/mfsys/uco/exception/AccountDoesntExistsException.java new file mode 100644 index 0000000..4e3cce0 --- /dev/null +++ b/src/main/java/com/mfsys/uco/exception/AccountDoesntExistsException.java @@ -0,0 +1,11 @@ +package com.mfsys.uco.exception; + + +import com.mfsys.comm.exception.ApplicationException; +import com.mfsys.comm.exception.ERRCode; + +public class AccountDoesntExistsException extends ApplicationException { + public AccountDoesntExistsException() { + super(null, ERRCode.ACCOUNT_NOT_FOUND, null); + } +} diff --git a/src/main/java/com/mfsys/uco/model/CustomerProfile.java b/src/main/java/com/mfsys/uco/model/CustomerProfile.java index 9a82b37..592cbe9 100644 --- a/src/main/java/com/mfsys/uco/model/CustomerProfile.java +++ b/src/main/java/com/mfsys/uco/model/CustomerProfile.java @@ -55,6 +55,7 @@ public class CustomerProfile { @Column(name = "CMP_UNVERIFIED_TRAN_PIN", nullable=true, columnDefinition=FieldNameLength.PIN_VALUE) protected String cmpUnverifiedTranpin; + @Column(name = "CMP_TRAN_PIN_VERIFIED", nullable=false, columnDefinition=FieldNameLength.BOOLEAN_BIT) protected boolean cmpTranpinVerfied = false; } diff --git a/src/main/java/com/mfsys/uco/model/TransactionTrail.java b/src/main/java/com/mfsys/uco/model/TransactionTrail.java new file mode 100644 index 0000000..fdd656b --- /dev/null +++ b/src/main/java/com/mfsys/uco/model/TransactionTrail.java @@ -0,0 +1,79 @@ +package com.mfsys.uco.model; + +import com.mfsys.comm.util.FieldNameLength; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity(name = "BN_MS_UA_UCOACCOUNTTRAIL") +@Table(name = "BN_MS_UA_UCOACCOUNTTRAIL") +public class TransactionTrail { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "POR_ORGACODE", nullable = false, updatable = false, columnDefinition = FieldNameLength.POR_ORGACODE) + protected String porOrgacode; + + @Column(name = "DR_MBM_BKMSNUMBER", nullable = false, updatable = false, columnDefinition = FieldNameLength.ACCOUNT_NUMBER) + protected String drMbmBkmsnumber; + + @Column(name = "CR_MBM_BKMSNUMBER", nullable = false, updatable = false, columnDefinition = FieldNameLength.ACCOUNT_NUMBER) + protected String crMbmBkmsnumber; + + @Column(name = "DMP_PRODCODE", nullable = false, updatable = false, columnDefinition = FieldNameLength.DMP_PRODCODE) + protected String dmpProdcode; + + @Column(name = "DR_MBM_BKMSTITLE", nullable = false, updatable = true, columnDefinition = FieldNameLength.ACCOUNT_TITLE) + protected String drmbmBkmstitle; + + @Column(name = "DR_PCR_CURRDESC", nullable=false, columnDefinition=FieldNameLength.DESCRIPTION_LONG) + private String drpcrCurrdesc; + + @Column(name = "CMP_CUSTCODE", nullable = false, updatable = false, columnDefinition = FieldNameLength.CUSTOMER_CODE) + protected String cmpCustcode; + + @Column(name = "DR_PCR_CURRCODE", columnDefinition=FieldNameLength.PCR_CURRCODE) + private String drPcrCurrcode; + + @Column(name = "CR_MBM_BKMSTITLE", nullable = false, updatable = true, columnDefinition = FieldNameLength.ACCOUNT_TITLE) + protected String crMbmBkmstitle; + + @Column(name = "CR_PCR_CURRDESC", nullable=false, columnDefinition=FieldNameLength.DESCRIPTION_LONG) + private String crPcrCurrdesc; + + @Column(name = "CR_PCR_CURRCODE", columnDefinition=FieldNameLength.PCR_CURRCODE) + private String crPcrCurrcode; + + @Column(name = "SGT_SENTGNTRNUMBER", nullable = false, updatable = false, columnDefinition = FieldNameLength.CODE_500) + protected String sgtSentGntrnumber; + + @Column(name = "DR_SGT_GNTRDATE", nullable = false, updatable = false, columnDefinition = FieldNameLength.DATE) + protected LocalDate drSgtGntrdate; + + @Column(name = "CR_SGT_GNTRDATE", nullable = true, updatable = false, columnDefinition = FieldNameLength.DATE) + protected LocalDate crSgtGntrdate; + + @Column(name = "SGT_GNTRAMT", nullable = false, updatable = false, columnDefinition = FieldNameLength.AMOUNT_REAL) + protected BigDecimal sgtGntramt = 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) + protected boolean batAcnttranReceived; + + @Column(name = "SGT_RECEIVEGNTRNUMBER", nullable = true, updatable = false, columnDefinition = FieldNameLength.CODE_500) + protected String sgtReceiveGntrnumber; + +} diff --git a/src/main/java/com/mfsys/uco/repository/PinRepository.java b/src/main/java/com/mfsys/uco/repository/PinRepository.java index 43b85f8..7ef8253 100644 --- a/src/main/java/com/mfsys/uco/repository/PinRepository.java +++ b/src/main/java/com/mfsys/uco/repository/PinRepository.java @@ -9,7 +9,7 @@ import java.util.Optional; @Repository public interface PinRepository extends JpaRepository { - @Query("SELECT p FROM DG_PN_PIN p WHERE p.userName = :username AND p.pinstatus = 'Unverified' AND p.pinExpirydate > CURRENT_TIMESTAMP ORDER BY p.pinserial DESC LIMIT 1") - Optional findLatestActiveOtpByUserName(String username); + @Query("SELECT p FROM DG_PN_PIN p WHERE p.userName = :username AND p.pinstatus = 'Unverified' AND p.pinExpirydate > CURRENT_TIMESTAMP AND p.pintype=:pinType ORDER BY p.pinserial DESC LIMIT 1") + Optional findLatestActiveOtpByUserName(String username,String pinType); } diff --git a/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java b/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java new file mode 100644 index 0000000..c1e2fb5 --- /dev/null +++ b/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java @@ -0,0 +1,14 @@ +package com.mfsys.uco.repository; + +import com.mfsys.uco.model.TransactionTrail; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface TransactionTrailRepository extends JpaRepository { + + Optional> findByPorOrgacodeAndCrMbmBkmsnumberAndBatAcnttranReceivedFalse(String porOrgacode, String crMbmBkmsnumber); +} diff --git a/src/main/java/com/mfsys/uco/service/NotificationService.java b/src/main/java/com/mfsys/uco/service/NotificationService.java index 692007a..794e005 100644 --- a/src/main/java/com/mfsys/uco/service/NotificationService.java +++ b/src/main/java/com/mfsys/uco/service/NotificationService.java @@ -6,7 +6,6 @@ import com.mfsys.comm.exception.InvalidOTPException; import com.mfsys.uco.dto.OTPRequest; import com.mfsys.uco.model.Pin; import com.mfsys.uco.repository.PinRepository; -import lombok.RequiredArgsConstructor; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; @@ -29,7 +28,7 @@ public class NotificationService { this.pinRepository = pinRepository; } - public Mono sendOtp(OTPRequest otpRequest) { + public Long sendOtp(OTPRequest otpRequest) { String otp = otpRequest.isOtpRequired() ? otpService.generateOtp() : "123456"; Pin pin = new Pin(); final LocalDateTime createDate = LocalDateTime.now(); @@ -48,11 +47,11 @@ public class NotificationService { webClient.post().uri("/notification/otp/email").bodyValue(Map.of("email", otpRequest.getEmail(), "subject", otpRequest.getSubject(), "otp", otp, "userName", otpRequest.getUsername())).retrieve() .onStatus(status -> status.is4xxClientError() || status.is5xxServerError(), clientResponse -> Mono.error(new RuntimeException("Response has error status."))).bodyToMono(String.class).block(); - return null; + return pin.getPinserial(); } - public void verifyOtp(String porOrgacode, String email, String obpPincode) { - Optional pin = pinRepository.findLatestActiveOtpByUserName(email); + public void verifyOtp(String porOrgacode, String email, String obpPincode,String pinType) { + Optional pin = pinRepository.findLatestActiveOtpByUserName(email,pinType); if (pin.isPresent() && pin.get().getPincode().equals(obpPincode) && pin.get().getPorOrgacode().equals(porOrgacode)) { pin.get().setPinstatus("VERIFIED"); pinRepository.save(pin.get()); diff --git a/src/main/java/com/mfsys/uco/service/TransactionPinService.java b/src/main/java/com/mfsys/uco/service/TransactionPinService.java index 8f5e2b9..7e7f027 100644 --- a/src/main/java/com/mfsys/uco/service/TransactionPinService.java +++ b/src/main/java/com/mfsys/uco/service/TransactionPinService.java @@ -25,13 +25,13 @@ public class TransactionPinService { public void createTransactionPin(CreateTransactionPinRequest request) { CustomerProfile profile = fetchCustomer(request.getPorOrgacode(), request.getCmpCustcode()); profile.setCmpTranpin(request.getNewTransPincode()); - sendOtp(profile, request.getChannelCode(), "C_PIN", "Create Transaction Pin Verification OTP", request.isOtpRequired()); + sendOtp(profile, request.getChannelCode(), request.getPinType(), "Create Transaction Pin Verification OTP", request.isOtpRequired()); customerProfileRepository.save(profile); } public boolean verifyOTPAndSavePin(VerifyPinRequest request) { - notificationService.verifyOtp(request.getPorOrgacode(), request.getEmail(), request.getObpPincode()); + notificationService.verifyOtp(request.getPorOrgacode(), request.getEmail(), request.getObpPincode(), request.getPinType()); CustomerProfile profile = fetchCustomer(request.getPorOrgacode(), request.getCmpCustcode()); if(Objects.nonNull(profile.getCmpUnverifiedTranpin())) { profile.setCmpTranpin(profile.getCmpUnverifiedTranpin()); @@ -53,16 +53,16 @@ public class TransactionPinService { validateOldPin(profile, request.getOldTransPincode()); profile.setCmpUnverifiedTranpin(request.getNewTransPincode()); customerProfileRepository.save(profile); - sendOtp(profile, request.getChannelCode(), "U_PIN", "Change Transaction Pin Verification OTP", request.isOtpRequired()); + sendOtp(profile, request.getChannelCode(), request.getPinType(), "Change Transaction Pin Verification OTP", request.isOtpRequired()); } - private void validateOldPin(CustomerProfile profile, String oldPin) { + public void validateOldPin(CustomerProfile profile, String oldPin) { if (!profile.getCmpTranpin().equals(oldPin)) { throw new OldPinIncorrectException(); } } - private void sendOtp(CustomerProfile profile, String channelCode, String pinType, String subject, boolean isOtpRequired) { + public Long sendOtp(CustomerProfile profile, String channelCode, String pinType, String subject, boolean isOtpRequired) { OTPRequest otpRequest = OTPRequest.builder() .porOrgacode(profile.getPorOrgacode()) .channelCode(channelCode) @@ -73,7 +73,7 @@ public class TransactionPinService { .username(profile.getCmpUserName()) .subject(subject) .build(); - notificationService.sendOtp(otpRequest); + return notificationService.sendOtp(otpRequest); } } diff --git a/src/main/java/com/mfsys/uco/service/TransactionService.java b/src/main/java/com/mfsys/uco/service/TransactionService.java index ffdc18e..8724058 100644 --- a/src/main/java/com/mfsys/uco/service/TransactionService.java +++ b/src/main/java/com/mfsys/uco/service/TransactionService.java @@ -1,9 +1,114 @@ package com.mfsys.uco.service; +import com.mfsys.comm.util.FunctionReturnDetail; +import com.mfsys.uco.UCOURI; +import com.mfsys.uco.dto.*; +import com.mfsys.uco.dto.Transaction.TransactionOtpRequestModel; +import com.mfsys.uco.model.CustomerProfile; +import com.mfsys.uco.model.TransactionTrail; +import com.mfsys.uco.repository.CustomerProfileRepository; +import com.mfsys.uco.repository.TransactionTrailRepository; +import lombok.Data; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + @Service +@Data +@RequiredArgsConstructor public class TransactionService { + private final CustomerProfileRepository customerProfileRepository; + private final NotificationService notificationService; + private final TransactionPinService transactionPinService; + private final TransactionTrailRepository transactionTrailRepository; + private final WebClientDepositService webClientDepositService; + + public TransactionPinResponseModel sendOtpAndValidateTranPin(TransactionOtpRequestModel transactionOtpRequestModel){ + CustomerProfile customerProfile = verifyOldPinAndGetCmpProfile(transactionOtpRequestModel.getPorOrgacode(), + transactionOtpRequestModel.getTransPincode(),transactionOtpRequestModel.getCmpCustcode()); + return TransactionPinResponseModel.builder().notificationId(transactionPinService.sendOtp(customerProfile, transactionOtpRequestModel.getChannelCode(), + transactionOtpRequestModel.getPinType(), "Transaction Verification OTP", transactionOtpRequestModel.isOtpRequired())).build(); + } + + public FunctionReturnDetail cashInTransaction(CashInTransactionRequest transactionRequest) { + TransactionTrail transactionTrail = TransactionTrail.builder() + .porOrgacode(transactionRequest.getPorOrgacode()) + .drMbmBkmsnumber(transactionRequest.getDrMbmBkmsnumber()) + .crMbmBkmsnumber(transactionRequest.getCrMbmBkmsnumber()) + .dmpProdcode(transactionRequest.getDmpProdCode()) + .drmbmBkmstitle(transactionRequest.getDrMbmBkmstitle()) + .drpcrCurrdesc(transactionRequest.getCrPcrCurrcode()) + .cmpCustcode(transactionRequest.getCmpCustcode()) + .drPcrCurrcode(transactionRequest.getDrPcrCurrcode()) + .crMbmBkmstitle(transactionRequest.getCrMbmBkmstitle()) + .crPcrCurrdesc(transactionRequest.getCrPcrCurrdesc()) + .crPcrCurrcode(transactionRequest.getCrPcrCurrcode()) + .sgtSentGntrnumber(null) + .drSgtGntrdate(LocalDate.now()) + .sgtGntramt(BigDecimal.valueOf(transactionRequest.getSgtGntramtfc())) + .batAcnttranSend(false) + .batAcnttranReceived(false) + .sgtReceiveGntrnumber(null) + .build(); + + + CoreCashInTransaction coreCashInTransaction = CoreCashInTransaction.builder() + .drMbmBkmsnumber(transactionRequest.getDrMbmBkmsnumber()) + .drPcrCurrcode("123") + .sgtGntramtfc(transactionRequest.getSgtGntramtfc()) + .otdTrancomment(transactionRequest.getOtdTrancomment()) + .porOrgacode(transactionRequest.getPorOrgacode()) + .build(); + FunctionReturnDetail response = (FunctionReturnDetail) webClientDepositService.postTransaction(coreCashInTransaction, UCOURI.BANKING_CASH_IN,transactionRequest.getPorOrgacode()); + transactionTrail.setSgtSentGntrnumber(extractTranNumber(response)); + transactionTrail.setBatAcnttranSend(true); + transactionTrailRepository.save(transactionTrail); + return response; + } + + public List fetchPendingCrTransactions(String porOrgacode, String mbmBkmsnumber) { + Optional> optionalTransactions = transactionTrailRepository.findByPorOrgacodeAndCrMbmBkmsnumberAndBatAcnttranReceivedFalse(porOrgacode, mbmBkmsnumber); + return optionalTransactions.orElseGet(Collections::emptyList); + } + + public void cashOutTransaction(CashOutTransactionRequest cashOutTransactionRequest) { + verifyOldPinAndGetCmpProfile(cashOutTransactionRequest.getPorOrgacode(), + cashOutTransactionRequest.getCmpTranpin(),cashOutTransactionRequest.getCmpCustcode()); + Optional transactionTrail = transactionTrailRepository.findById(Math.toIntExact(cashOutTransactionRequest.getId())); + transactionTrail.ifPresent(tran -> { + CoreCashOutTransaction cashOutTransaction = CoreCashOutTransaction.builder() + .crPcrCurrcode("123") + .crMbmBkmsnumber(tran.getCrMbmBkmsnumber()) + .porOrgacode(cashOutTransactionRequest.getPorOrgacode()) + .otdTrancomment(cashOutTransactionRequest.getId()+"_Received") + .sgtGntramtfc(tran.getSgtGntramt()) + .build(); + + FunctionReturnDetail response = webClientDepositService.postTransaction(cashOutTransaction,UCOURI.BANKING_CASH_OUT,tran.getPorOrgacode()); + tran.setSgtReceiveGntrnumber(extractTranNumber(response)); + tran.setBatAcnttranReceived(true); + transactionTrailRepository.save(tran); + }); + } + + private CustomerProfile verifyOldPinAndGetCmpProfile(String porOrgacode, String transPincode,String cmpCustcode) { + CustomerProfile customerProfile = transactionPinService.fetchCustomer(porOrgacode, + cmpCustcode); + transactionPinService.validateOldPin(customerProfile,transPincode); + return customerProfile; + } + private String extractTranNumber(FunctionReturnDetail response){ + Object[] args = response.getArguments(); + if (args != null && args.length > 0 && args[0] instanceof String) { + return (String) args[0]; + } + throw new RuntimeException("may day"); + } } diff --git a/src/main/java/com/mfsys/uco/service/UcoAccountService.java b/src/main/java/com/mfsys/uco/service/UcoAccountService.java index 31ce649..d201293 100644 --- a/src/main/java/com/mfsys/uco/service/UcoAccountService.java +++ b/src/main/java/com/mfsys/uco/service/UcoAccountService.java @@ -4,18 +4,17 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.mfsys.uco.constants.UCOURI; import com.mfsys.uco.dto.SignupStep3RequestModel; import com.mfsys.uco.dto.webclientdto.AccountDetail; +import com.mfsys.uco.exception.AccountDoesntExistsException; import com.mfsys.uco.model.AccountId; import com.mfsys.uco.model.CustomerProfile; import com.mfsys.uco.model.UcoAccount; import com.mfsys.uco.repository.CustomerProfileRepository; import com.mfsys.uco.repository.UCOAccountRepository; import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; - -import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; import java.util.Map; +import java.util.Objects; @Service @@ -37,6 +36,9 @@ public class UcoAccountService { public String fetchAccountTitile(String porOrgacode, String acntTypeCode, String acntTypeValue){ if(acntTypeCode.equals("01")){ CustomerProfile customerProfile = customerProfileRepository.findProfilesByMobilePhone(porOrgacode,acntTypeValue); + if(Objects.isNull(customerProfile)){ + throw new AccountDoesntExistsException(); + } return ucoAccountRepository.findUcoAccountByCmpCustcode(porOrgacode,customerProfile.getCmpCustcode()).getMbmBkmstitle(); } return null; @@ -90,5 +92,10 @@ public class UcoAccountService { return objectMapper.convertValue(map.get(0), AccountDetail.class); } + + public Object fetchExchangeRate(String porOrgacode){ + String url= UCOURI.FETCH_EXCHANGE_RATE+"?porOrgacode="+porOrgacode; + return webClientDeposit.fetchExchangeRate(url,porOrgacode); + } } diff --git a/src/main/java/com/mfsys/uco/service/WebClientDepositService.java b/src/main/java/com/mfsys/uco/service/WebClientDepositService.java index 8379463..3a929f5 100644 --- a/src/main/java/com/mfsys/uco/service/WebClientDepositService.java +++ b/src/main/java/com/mfsys/uco/service/WebClientDepositService.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.mfsys.comm.exception.ApplicationException; import com.mfsys.comm.exception.ApplicationExceptionMapper; +import com.mfsys.comm.util.FunctionReturnDetail; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -37,6 +38,22 @@ public class WebClientDepositService { .header("POR_ORGACODE", porOrgacode).retrieve().toEntity(Object.class), null); } + public FunctionReturnDetail postTransaction(Object tranData, String url, String porOrgaCode) { + return handleResponse(webClientDeposit.post().uri(url).bodyValue(tranData).accept(MediaType.APPLICATION_JSON) + .header("SUS_USERCODE", porOrgaCode) + .header("POR_ORGACODE", porOrgaCode).retrieve() + .toEntity(FunctionReturnDetail.class), + porOrgaCode); + } + + + + public Object fetchExchangeRate(String url,String porOrgacode) { + return handleResponse(webClientDeposit.get().uri(url).accept(MediaType.APPLICATION_JSON) + .header("SUS_USERCODE", porOrgacode) + .header("POR_ORGACODE", porOrgacode).retrieve().toEntity(Object.class), + null); + } private T handleResponse(Mono> responseMono, String porgaCode) { try { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..44d8527 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,2 @@ +#base.ciihive=localhost +base.ciihive=${CIIHIVE_URL} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index df86e53..b86a227 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -29,10 +29,10 @@ eureka: service-url: defaultZone: http://localhost:8761/eureka -#application: -# security: -# jwt: -# secret-key: 404E635266556A586E3272357538782F413F4428472B4B6250645367566B5970 -# expiration: 86400000 -# refresh-token: -# expiration: 604800000 # 7 days \ No newline at end of file +application: + security: + jwt: + secret-key: 404E635266556A586E3272357538782F413F4428472B4B6250645367566B5970 + expiration: 86400000 + refresh-token: + expiration: 604800000 # 7 days \ No newline at end of file