This is an automated email from the ASF dual-hosted git repository.
avikg pushed a commit to branch develop
in repository
https://gitbox.apache.org/repos/asf/fineract-cn-deposit-account-management.git
The following commit(s) were added to refs/heads/develop by this push:
new 8425807 AL-52-account-transfer-txn
new a37bcca Merge pull request #23 from fynmanoj/acct-transfer
8425807 is described below
commit 8425807e50c6e17eeea4142a85d5aa12d675e393
Author: Manoj <[email protected]>
AuthorDate: Thu Aug 5 19:57:54 2021 +0530
AL-52-account-transfer-txn
---
.../domain/data/TransactionActionType.java | 2 +-
.../domain/data/TransactionRequestData.java | 26 ++++++++-
.../command/handler/TransactionCommandHandler.java | 3 +
.../internal/service/TransactionService.java | 64 +++++++++++++---------
4 files changed, 68 insertions(+), 27 deletions(-)
diff --git
a/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionActionType.java
b/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionActionType.java
index efa253d..4a689e7 100644
---
a/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionActionType.java
+++
b/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionActionType.java
@@ -22,5 +22,5 @@ public enum TransactionActionType {
WITHDRAWAL,
DEPOSIT,
- ;
+ TRANSFER;
}
diff --git
a/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionRequestData.java
b/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionRequestData.java
index deb16ae..f92a576 100644
---
a/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionRequestData.java
+++
b/api/src/main/java/org/apache/fineract/cn/deposit/api/v1/transaction/domain/data/TransactionRequestData.java
@@ -56,12 +56,19 @@ public class TransactionRequestData {
private String subTxnId;
+ @Length(max = 32)
+ private String fromAccountId;
+
+ @Length(max = 32)
+ private String toAccountId;
+
public TransactionRequestData() {
}
public TransactionRequestData(String transactionCode, String requestCode,
String routingCode, String externalId, String accountId,
String note, LocalDateTime expiration,
- MoneyData amount, String subTxnId) {
+ MoneyData amount, String subTxnId,
+ String fromAccountId, String toAccountId) {
this.transactionCode = transactionCode;
this.requestCode = requestCode;
this.routingCode = routingCode;
@@ -72,6 +79,8 @@ public class TransactionRequestData {
this.amount = amount;
//this.geoCode = geoCode;
this.subTxnId = subTxnId;
+ this.fromAccountId = fromAccountId;
+ this.toAccountId = toAccountId;
}
@NotNull
@@ -151,4 +160,19 @@ public class TransactionRequestData {
return transactionCode;
}
+ public String getFromAccountId() {
+ return fromAccountId;
+ }
+
+ public void setFromAccountId(String fromAccountId) {
+ this.fromAccountId = fromAccountId;
+ }
+
+ public String getToAccountId() {
+ return toAccountId;
+ }
+
+ public void setToAccountId(String toAccountId) {
+ this.toAccountId = toAccountId;
+ }
}
diff --git
a/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/TransactionCommandHandler.java
b/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/TransactionCommandHandler.java
index f3740ad..d9a4db0 100644
---
a/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/TransactionCommandHandler.java
+++
b/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/TransactionCommandHandler.java
@@ -63,6 +63,9 @@ public class TransactionCommandHandler {
//command = dataValidator.validateCommitTransfer(command);
return transactionService.deposit(command);
}
+ case TRANSFER: {
+ return transactionService.transfer(command);
+ }
default:
return null;
}
diff --git
a/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/service/TransactionService.java
b/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/service/TransactionService.java
index 82b0f8e..df96b58 100644
---
a/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/service/TransactionService.java
+++
b/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/service/TransactionService.java
@@ -54,10 +54,7 @@ import java.math.BigDecimal;
import java.math.MathContext;
import java.time.Clock;
import java.time.LocalDateTime;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -92,13 +89,13 @@ public class TransactionService {
@Transactional
public TransactionResponseData withdraw(TransactionCommand command) {
TransactionRequestData request = command.getTransactionRequest();
- AccountWrapper accountWrapper = validateAndGetAccount(request,
TransactionTypeEnum.WITHDRAWAL);
+ AccountWrapper accountWrapper = validateAndGetAccount(request,
request.getAccountId(), TransactionTypeEnum.WITHDRAWAL);
LocalDateTime transactionDate = getNow();
//get txntype charges
List<Charge> charges =
getCharges(accountWrapper.account.getIdentifier(),
TransactionTypeEnum.WITHDRAWAL);
//todo: get subTxnType charges
- TransactionEntity txn = doWithdraw(request, accountWrapper, charges,
getNow());
+ TransactionEntity txn = doWithdraw(request, accountWrapper, charges,
getNow(), request.getAccountId());
return TransactionResponseData.build(request.getRoutingCode(),
request.getExternalId(),
@@ -109,22 +106,40 @@ public class TransactionService {
@Transactional
public TransactionResponseData deposit(TransactionCommand command) {
TransactionRequestData request = command.getTransactionRequest();
- AccountWrapper accountWrapper = validateAndGetAccount(request,
TransactionTypeEnum.DEPOSIT);
+ AccountWrapper accountWrapper = validateAndGetAccount(request,
request.getAccountId(), TransactionTypeEnum.DEPOSIT);
LocalDateTime transactionDate = getNow();
//get txntype charges
List<Charge> charges =
getCharges(accountWrapper.account.getIdentifier(), TransactionTypeEnum.DEPOSIT);
//todo: get subTxnType charges
- TransactionEntity txn = doDeposit(request, accountWrapper, charges,
getNow());
+ TransactionEntity txn = doDeposit(request, accountWrapper, charges,
getNow(), request.getAccountId());
return TransactionResponseData.build(request.getRoutingCode(),
request.getExternalId(),
request.getRequestCode(), ActionState.ACCEPTED,
null, txn.getIdentifier(), transactionDate);
}
- private TransactionEntity doDeposit(TransactionRequestData request,
AccountWrapper accountWrapper, List<Charge> charges, LocalDateTime
transactionDate) {
+ public TransactionResponseData transfer(TransactionCommand command) {
+ TransactionRequestData request = command.getTransactionRequest();
+ AccountWrapper fromAccountWrapper = validateAndGetAccount(request,
request.getFromAccountId(), TransactionTypeEnum.WITHDRAWAL);
+ AccountWrapper toAccountWrapper = validateAndGetAccount(request,
request.getToAccountId(), TransactionTypeEnum.DEPOSIT);
+ LocalDateTime transactionDate = getNow();
+ //get txntype charges
+ List<Charge> charges =
getCharges(fromAccountWrapper.account.getIdentifier(),
TransactionTypeEnum.ACCOUNT_TRANSFER);
+ //todo: get subTxnType charges
+
+ TransactionEntity txn = doWithdraw(request, fromAccountWrapper,
charges, getNow(), request.getFromAccountId());
+ TransactionEntity txn2 = doDeposit(request, toAccountWrapper, new
ArrayList<>(), getNow(), request.getToAccountId());
+
+ return TransactionResponseData.build(request.getRoutingCode(),
request.getExternalId(),
+ request.getRequestCode(), ActionState.ACCEPTED,
+ null, txn.getIdentifier() +"_to_"+ txn2.getIdentifier(),
transactionDate);
+ }
+
+ private TransactionEntity doDeposit(TransactionRequestData request,
AccountWrapper accountWrapper,
+ List<Charge> charges, LocalDateTime
transactionDate, String accountId) {
BigDecimal amount = request.getAmount().getAmount();
- TransactionEntity txn =
createTransaction(request,TransactionTypeEnum.DEPOSIT, transactionDate, CREDIT,
null);
+ TransactionEntity txn =
createTransaction(request,TransactionTypeEnum.DEPOSIT, transactionDate, CREDIT,
null, accountId);
String debitAccountIdentifier =
accountWrapper.productDefinition.getCashAccountIdentifier();
/* if subtxn is provided and it has an account configured the do debit
that account*/
if(StringUtils.isNotBlank(request.getSubTxnId())){
@@ -146,7 +161,7 @@ public class TransactionService {
addDebtor(debitAccountIdentifier, amount.doubleValue(), debtors);
- prepareCharges(request, accountWrapper, charges, debtors, creditors,
txn);
+ prepareCharges(request, accountWrapper, charges, debtors, creditors,
txn, accountId);
if (debtors.isEmpty()) // must be same size as creditors
throw ServiceException.badRequest("Debit and Credit doesn't
match");
@@ -162,10 +177,10 @@ public class TransactionService {
private TransactionEntity doWithdraw(@NotNull TransactionRequestData
request, @NotNull AccountWrapper accountWrapper,
- List<Charge> charges, LocalDateTime
transactionDate) {
+ List<Charge> charges, LocalDateTime
transactionDate, String accountId) {
BigDecimal amount = request.getAmount().getAmount();
- TransactionEntity txn = createTransaction(request,
TransactionTypeEnum.WITHDRAWAL, transactionDate, DEBIT, null);
+ TransactionEntity txn = createTransaction(request,
TransactionTypeEnum.WITHDRAWAL, transactionDate, DEBIT, null, accountId);
String creditAccountIdentifier =
accountWrapper.productDefinition.getCashAccountIdentifier();
/* if subtxn is provided and it has an account configured the do
credit that account*/
@@ -187,7 +202,7 @@ public class TransactionService {
addCreditor(creditAccountIdentifier, amount.doubleValue(), creditors);
addDebtor(accountWrapper.account.getIdentifier(),
amount.doubleValue(), debtors);
- prepareCharges(request, accountWrapper, charges, debtors, creditors,
txn);
+ prepareCharges(request, accountWrapper, charges, debtors, creditors,
txn, accountId);
if (debtors.isEmpty()) // must be same size as creditors
throw ServiceException.badRequest("Debit and Credit doesn't
match");
@@ -203,7 +218,7 @@ public class TransactionService {
private void prepareCharges(@NotNull TransactionRequestData request,
@NotNull AccountWrapper accountWrapper,
@NotNull List<Charge> charges, HashSet<Debtor>
debtors, HashSet<Creditor> creditors,
- TransactionEntity txn) {
+ TransactionEntity txn, String accountId) {
BigDecimal amount = request.getAmount().getAmount();
@@ -224,18 +239,16 @@ public class TransactionService {
for(Charge charge : charges){
addCreditor(charge.getIncomeAccountIdentifier(),
calcChargeAmount(amount, charge).doubleValue(), creditors);
addDebtor(accountWrapper.account.getIdentifier(),
calcChargeAmount(amount, charge).doubleValue(), debtors);
- createTransaction(request,TransactionTypeEnum.CHARGES_PAYMENT,
getNow(), DEBIT, txn);
+ createTransaction(request,TransactionTypeEnum.CHARGES_PAYMENT,
getNow(), DEBIT, txn, accountId);
}
}
-
- private AccountWrapper validateAndGetAccount(@NotNull
TransactionRequestData request, TransactionTypeEnum txnType) {
+ private AccountWrapper validateAndGetAccount(@NotNull
TransactionRequestData request, String accountId, TransactionTypeEnum txnType) {
//TODO: error handling
- String accountId = request.getAccountId();
Account account = ledgerManager.findAccount(accountId);
- validateAccount(request, account);
+ validateAccount(request.getAmount(), account);
ProductInstance product =
productInstanceService.findByAccountIdentifier(accountId).get();
ProductDefinition productDefinition =
productDefinitionService.findProductDefinition(product.getProductIdentifier()).get();
@@ -259,7 +272,7 @@ public class TransactionService {
}
- private void validateAccount(@NotNull TransactionRequestData request,
Account account) {
+ private void validateAccount(MoneyData requestAmount, Account account) {
validateAccount(account);
String accountId = account.getIdentifier();
@@ -271,7 +284,7 @@ public class TransactionService {
throw new UnsupportedOperationException("Product Definition is
inactive");
Currency currency = productDefinition.getCurrency();
- if (!currency.getCode().equals(request.getAmount().getCurrency()))
+ if (!currency.getCode().equals(requestAmount.getCurrency()))
throw new UnsupportedOperationException();
}
}
@@ -361,7 +374,7 @@ public class TransactionService {
private TransactionEntity createTransaction(TransactionRequestData
request, TransactionTypeEnum txnType,
LocalDateTime transactionDate,
String tranType,
- TransactionEntity parent) {
+ TransactionEntity parent,
String accountId) {
TransactionEntity txn = new TransactionEntity();
UUID uuid=UUID.randomUUID();
@@ -383,8 +396,8 @@ public class TransactionService {
txn.setCreatedOn(getNow());
/*txn.setLastModifiedBy();
txn.setLastModifiedOn();*/
- markLastTransaction(request.getAccountId(), transactionDate);
- txn.setAccountId(request.getAccountId());
+ markLastTransaction(accountId, transactionDate);
+ txn.setAccountId(accountId);
txn.setType(tranType);
txn.setParentTransaction(parent);
transactionRepository.save(txn);
@@ -420,6 +433,7 @@ public class TransactionService {
}).collect(Collectors.toList());
}
+
public static class AccountWrapper {
@NotNull
private final Account account;