diff --git a/src/main/java/com/mfsys/uco/UCOURI.java b/src/main/java/com/mfsys/uco/UCOURI.java index 2d2e60c..03a4e48 100644 --- a/src/main/java/com/mfsys/uco/UCOURI.java +++ b/src/main/java/com/mfsys/uco/UCOURI.java @@ -25,11 +25,15 @@ public interface UCOURI { String ACCOUNT_STATEMENT = "/fetchDepositAccountStatement"; String BANKING_CASH_IN = "/deposit/transactions/uco/cash-in"; String BANKING_CASH_OUT = "/deposit/transactions/uco/cash-out"; + String BANKING_REVERSE_TRANSACTION = "/deposit/transactions/uco/reverse-transaction"; String ACCOUNT_ACTIVITY = "/account/activity/organization/{porOrgacode}/customer/{cmpCustcode}/fromdate/{fdate}/todate/{tdate}"; // product related uri String FETCH_UCO_DEPOSIT_PRODUCTS = "/deposit/fetchUcoDepositProducts"; String FETCH_UCO_ONBOARDING_DEPOSIT_PRODUCTS = "/auth/user/authenticate/onboardCutomer/fetchUcoDepositProducts"; String FETCH_UCO_GLS = "/deposit/fetchUcoGls"; + String REVERSE_TRANSACTION = "/reverseTransaction"; + String CORE_REVERSE_TRANSACTION = "/deposit/transactions/uco/reverse-transaction"; + } diff --git a/src/main/java/com/mfsys/uco/controller/TransactionController.java b/src/main/java/com/mfsys/uco/controller/TransactionController.java index 85f82f0..2dbc06b 100644 --- a/src/main/java/com/mfsys/uco/controller/TransactionController.java +++ b/src/main/java/com/mfsys/uco/controller/TransactionController.java @@ -65,5 +65,14 @@ public class TransactionController { @RequestParam double sgtGntramtfc) { return transactionService.getEvaluatedCurrency(porOrgacode, baseCurrency,targetCurrency,sgtGntramtfc); } + + @PostMapping(UCOURI.REVERSE_TRANSACTION) + public Object reverseTransaction( + @RequestParam String porOrgacode, + @RequestParam String nodeId, + @RequestParam String sgtGntrnumber + ){ + return transactionService.reverseTransacion(porOrgacode,nodeId,sgtGntrnumber); + } } diff --git a/src/main/java/com/mfsys/uco/controller/UserController.java b/src/main/java/com/mfsys/uco/controller/UserController.java index 5ee7eb2..8c73773 100644 --- a/src/main/java/com/mfsys/uco/controller/UserController.java +++ b/src/main/java/com/mfsys/uco/controller/UserController.java @@ -118,38 +118,20 @@ public class UserController { @PostMapping(UCOURI.CREATE_TRAN_PIN) public ResponseEntity createTransactionPin(@RequestBody CreateTransactionPinRequest request) { - try { transactionPinService.createTransactionPin(request); return ResponseEntity.ok(HttpStatus.OK); - } catch (Exception e) { - return ResponseEntity.ok(HttpStatus.INTERNAL_SERVER_ERROR); - } } @PostMapping(UCOURI.VERIFY_TRAN_PIN) public ResponseEntity verifyPin(@RequestBody VerifyPinRequest request) { - try { - boolean isVerified = transactionPinService.verifyOTPAndSavePin(request); - if (isVerified) { - return ResponseEntity.ok("OTP PIN verified and tran pin changed successfully."); - } else { - return ResponseEntity.badRequest().body("PIN verification failed."); - } - } catch (Exception e) { - return ResponseEntity.status(500).body("Error during PIN verification: " + e.getMessage()); - } + transactionPinService.verifyOTPAndSavePin(request); + return ResponseEntity.ok(HttpStatus.OK); } @PutMapping(UCOURI.CHANGE_TRAN_PIN) public ResponseEntity updateTransactionPin(@RequestBody ChangeTransactionPinRequest request) { - try { transactionPinService.updateTransactionPin(request); return ResponseEntity.ok("OTP sent"); - } catch (IllegalArgumentException e) { - return ResponseEntity.badRequest().body("Error: " + e.getMessage()); - } catch (Exception e) { - return ResponseEntity.internalServerError().body("An unexpected error occurred."); - } } @GetMapping(UCOURI.FETCH_EXCHANGE_RATE) diff --git a/src/main/java/com/mfsys/uco/dto/CoreReverseTransaction.java b/src/main/java/com/mfsys/uco/dto/CoreReverseTransaction.java new file mode 100644 index 0000000..0f4c041 --- /dev/null +++ b/src/main/java/com/mfsys/uco/dto/CoreReverseTransaction.java @@ -0,0 +1,19 @@ +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 CoreReverseTransaction { + private String porOrgacode; + private String sgtGntrcreateat; + private String nodeId; + private String sgtGntrtranlink; +} \ No newline at end of file diff --git a/src/main/java/com/mfsys/uco/exception/SameOldNewPinException.java b/src/main/java/com/mfsys/uco/exception/SameOldNewPinException.java new file mode 100644 index 0000000..e253e79 --- /dev/null +++ b/src/main/java/com/mfsys/uco/exception/SameOldNewPinException.java @@ -0,0 +1,11 @@ +package com.mfsys.uco.exception; + + +import com.mfsys.comm.exception.ApplicationException; +import com.mfsys.comm.exception.ERRCode; + +public class SameOldNewPinException extends ApplicationException { + public SameOldNewPinException() { + super(null, ERRCode.SAME_TRAN_PIN, null); + } +} diff --git a/src/main/java/com/mfsys/uco/model/TransactionTrail.java b/src/main/java/com/mfsys/uco/model/TransactionTrail.java index 9be6f32..d9a5fc0 100644 --- a/src/main/java/com/mfsys/uco/model/TransactionTrail.java +++ b/src/main/java/com/mfsys/uco/model/TransactionTrail.java @@ -36,8 +36,16 @@ public class TransactionTrail { protected String cmpCustcode; @Column(name = "CR_MBM_BKMSTITLE", nullable = false, updatable = true, columnDefinition = FieldNameLength.ACCOUNT_TITLE) protected String crMbmBkmstitle; + @Column(name = "SGT_SENTGNTRNUMBER", nullable = false, updatable = false, columnDefinition = FieldNameLength.CODE_500) protected String sgtSentGntrnumber; + @Column(name = "SGT_SENTNODEID", nullable = false, updatable = false, columnDefinition = FieldNameLength.CODE_500) + protected String sgtSentNodeId; + @Column(name = "SGT_RECEIVEGNTRNUMBER", nullable = true, updatable = true, columnDefinition = FieldNameLength.CODE_500) + protected String sgtReceiveGntrnumber; + @Column(name = "SGT_RECEIVENODEID", nullable = true, updatable = true, columnDefinition = FieldNameLength.CODE_500) + protected String sgtReceiveNodeId; + @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) @@ -52,8 +60,8 @@ public class TransactionTrail { protected boolean batAcnttranSend; @Column(name = "BAT_ACNTTRANRECEIVED", nullable = true, columnDefinition = FieldNameLength.BOOLEAN_BIT) protected boolean batAcnttranReceived; - @Column(name = "SGT_RECEIVEGNTRNUMBER", nullable = true, updatable = true, columnDefinition = FieldNameLength.CODE_500) - protected String sgtReceiveGntrnumber; + @Column(name = "BAT_ACNTTRANREVERSED", nullable = false, columnDefinition = FieldNameLength.BOOLEAN_BIT) + protected boolean batAcnttranReversed; @Column(name = "CMP_REFCODE", nullable = true, updatable = true, columnDefinition = FieldNameLength.CODE_500) protected String cmpRefcode; @Column(name = "EXP_SGT_GNTRDATE", nullable = true, updatable = false, columnDefinition = FieldNameLength.DATE) diff --git a/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java b/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java index c2fe86a..72a72e8 100644 --- a/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java +++ b/src/main/java/com/mfsys/uco/repository/TransactionTrailRepository.java @@ -21,4 +21,5 @@ public interface TransactionTrailRepository extends JpaRepository> fetchDepositAccountStatement(String mbmBkmsnumber); + TransactionTrail findByPorOrgacodeAndSgtSentNodeIdAndSgtSentGntrnumber(String porOrgacode, String sgtSentNodeId, String sgtSentGntrnumber); } diff --git a/src/main/java/com/mfsys/uco/service/NotificationService.java b/src/main/java/com/mfsys/uco/service/NotificationService.java index d8de98a..d9a6e41 100644 --- a/src/main/java/com/mfsys/uco/service/NotificationService.java +++ b/src/main/java/com/mfsys/uco/service/NotificationService.java @@ -62,7 +62,7 @@ public class NotificationService { public void verifyOtpViaOtpId(String id, String pinType, String obpPincode) { Pin pin = pinRepository.findsss(id, pinType, obpPincode) - .orElseThrow(() -> new IllegalArgumentException("Notification not found for ID: " + id)); + .orElseThrow(() -> new InvalidOTPException(id)); pin.setPinstatus("VERIFIED"); pinRepository.save(pin); } diff --git a/src/main/java/com/mfsys/uco/service/TransactionPinService.java b/src/main/java/com/mfsys/uco/service/TransactionPinService.java index 690e2fe..d12fc7a 100644 --- a/src/main/java/com/mfsys/uco/service/TransactionPinService.java +++ b/src/main/java/com/mfsys/uco/service/TransactionPinService.java @@ -5,6 +5,7 @@ import com.mfsys.uco.dto.CreateTransactionPinRequest; import com.mfsys.uco.dto.OTPRequest; import com.mfsys.uco.dto.VerifyPinRequest; import com.mfsys.uco.exception.OldPinIncorrectException; +import com.mfsys.uco.exception.SameOldNewPinException; import com.mfsys.uco.model.CustomerProfile; import com.mfsys.uco.model.CustomerProfileId; import com.mfsys.uco.repository.CustomerProfileRepository; @@ -50,7 +51,9 @@ public class TransactionPinService { public void updateTransactionPin(ChangeTransactionPinRequest request) { CustomerProfile profile = fetchCustomer(request.getPorOrgacode(), request.getCmpCustcode()); - + if(request.getNewTransPincode().equals(profile.getCmpTranpin())){ + throw new SameOldNewPinException(); + } validateOldPin(profile, request.getOldTransPincode()); profile.setCmpUnverifiedTranpin(request.getNewTransPincode()); customerProfileRepository.save(profile); diff --git a/src/main/java/com/mfsys/uco/service/TransactionService.java b/src/main/java/com/mfsys/uco/service/TransactionService.java index 8ca265f..46ae29a 100644 --- a/src/main/java/com/mfsys/uco/service/TransactionService.java +++ b/src/main/java/com/mfsys/uco/service/TransactionService.java @@ -1,6 +1,5 @@ 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; @@ -18,7 +17,6 @@ import com.mfsys.uco.repository.GLAccountMasterTransactionTrailRepository; import com.mfsys.uco.repository.TransactionTrailRepository; import lombok.Data; import lombok.RequiredArgsConstructor; -import org.hibernate.Transaction; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -26,10 +24,6 @@ import java.math.RoundingMode; import java.time.LocalDate; import java.time.temporal.ChronoUnit; 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 @@ -88,12 +82,11 @@ public class TransactionService { .pcaGlaccode("A01011003") .build(); Map response = (Map) webClientDepositService.postTransaction(coreCashInTransaction, UCOURI.BANKING_CASH_IN, transactionRequest.getPorOrgacode()); - Map transactionId = (Map) response.get("FuncReturnDetail"); - String tranid = extractTranNumber(List.of(transactionId.get("arguments"))); - transactionTrail.setSgtSentGntrnumber(tranid); + transactionTrail.setSgtSentGntrnumber(String.valueOf(response.get("tran_id"))); + transactionTrail.setSgtSentNodeId(String.valueOf(response.get("node_id"))); transactionTrail.setBatAcnttranSend(true); if(Objects.nonNull(transactionRequest.getCmpRefcode())) { - transactionTrail.setCmpRefcode(tranid + transactionRequest.getCmpRefcode()); + transactionTrail.setCmpRefcode(transactionTrail.getSgtSentGntrnumber() + transactionRequest.getCmpRefcode()); } transactionTrail.setDrMbmBkmsbalance(MapValueExtractorUtil.getValueAsBigDecimal(response, "mbmBkmsbalance")); transactionTrailRepository.save(transactionTrail); @@ -155,8 +148,8 @@ public class TransactionService { .build(); response = (Map) webClientDepositService.postTransaction(cashOutTransaction, UCOURI.BANKING_CASH_OUT, transactionTrail.get().getPorOrgacode()); - Map transactionId = (Map) response.get("FuncReturnDetail"); - transactionTrail.get().setSgtReceiveGntrnumber(extractTranNumber(List.of(transactionId.get("arguments")))); + transactionTrail.get().setSgtReceiveGntrnumber((String.valueOf(response.get("tran_id")))); + transactionTrail.get().setSgtSentNodeId(String.valueOf(response.get("node_id"))); transactionTrail.get().setBatAcnttranReceived(true); transactionTrail.get().setCrMbmBkmsbalance(MapValueExtractorUtil.getValueAsBigDecimal(response, "mbmBkmsbalance")); transactionTrailRepository.save(transactionTrail.get()); @@ -280,7 +273,6 @@ public class TransactionService { .build(); response = (Map) webClientDepositService.postTransaction(cashOutTransaction, UCOURI.BANKING_CASH_OUT, glAccontTranasctionRequestModel.getPorOrgacode()); - Map transactionId = (Map) response.get("FuncReturnDetail"); TransactionTrail transactionTrail = TransactionTrail.builder() .porOrgacode(glAccontTranasctionRequestModel.getPorOrgacode()) .drMbmBkmsnumber(glAccontTranasctionRequestModel.getDrPcaGlaccode()) @@ -297,12 +289,14 @@ public class TransactionService { .crPcrCurrdesc(glAccontTranasctionRequestModel.getCrPcrCurrdesc()) .crPcrCurrcode(glAccontTranasctionRequestModel.getCrPcrCurrcode()) .crPcrCurrshort(glAccontTranasctionRequestModel.getCrPcrCurrshort()) - .sgtSentGntrnumber(extractTranNumber(List.of(transactionId.get("arguments")))) + .sgtSentGntrnumber((String.valueOf(response.get("tran_id")))) + .sgtSentNodeId(String.valueOf(response.get("node_id"))) .drSgtGntrdate(LocalDate.now()) .sgtGntramt(BigDecimal.valueOf(glAccontTranasctionRequestModel.getSgtGntramtfc())) .batAcnttranSend(true) .batAcnttranReceived(true) - .sgtReceiveGntrnumber(extractTranNumber(List.of(transactionId.get("arguments")))) + .sgtReceiveGntrnumber((String.valueOf(response.get("tran_id")))) + .sgtReceiveNodeId(String.valueOf(response.get("node_id"))) .build(); transactionTrailRepository.save(transactionTrail); @@ -320,10 +314,19 @@ public class TransactionService { .sgtGntramt(BigDecimal.valueOf(glAccontTranasctionRequestModel.getSgtGntramtfc())) .drSgtGntramt(BigDecimal.valueOf(glAccontTranasctionRequestModel.getSgtGntramtfc())) .drSgtGntrdate(LocalDate.now()) - .sgtSentGntrnumber(extractTranNumber(List.of(transactionId.get("arguments")))) + .sgtSentGntrnumber(String.valueOf(response.get("node_id"))+(response.get("tran_id"))) .build(); glAccountMasterTransactionTrailRepository.save(glAccountMasterTransaction); return response; } + + public Object reverseTransacion(String porOrgacode, String nodeId, String sgtGntrnumber) { + Object reponse = webClientDepositService.postTransaction(CoreReverseTransaction.builder().sgtGntrtranlink(sgtGntrnumber).nodeId(nodeId).sgtGntrcreateat("2003").build(), UCOURI.CORE_REVERSE_TRANSACTION, porOrgacode); + TransactionTrail trail = transactionTrailRepository.findByPorOrgacodeAndSgtSentNodeIdAndSgtSentGntrnumber(porOrgacode,nodeId,sgtGntrnumber); + trail.setBatAcnttranReversed(true); + trail.setBatAcnttranReceived(true); + transactionTrailRepository.save(trail); + return reponse; + } }