Skip to content
Snippets Groups Projects
Commit 86e6ee39 authored by Filip Kollár's avatar Filip Kollár
Browse files

fixed transaction state upon unsuccessful exchange

parent 11a173d5
No related branches found
No related tags found
1 merge request!37Etl from transaction service into analytics
......@@ -99,7 +99,7 @@ public class TransactionManagementFacadeITTest extends IntegrationTest {
Page<TransactionDbo> transactionDbos = facade.viewTransactionHistory(account1.getAccountNumber(), 0, 10);
assertThat(transactionDbos.getContent().stream()
.allMatch(trans -> trans.getTransactionState().equals(TransactionState.FAILED))).isTrue();
.allMatch(trans -> trans.getTransactionState().equals(TransactionState.INSUFFICIENT_BALANCE))).isTrue();
assertThat(facade.calculateAccountBalance(account1.getAccountNumber())).isEqualTo(BigDecimal.valueOf(0));
assertThat(facade.calculateAccountBalance(account2.getAccountNumber())).isEqualTo(BigDecimal.valueOf(0));
}
......
......@@ -330,7 +330,7 @@ class TransactionControllerITTest extends IntegrationTest {
.returns(transactionCreateDto.withdrawAmount(), TransactionDbo::getWithdrawAmount);
assertThat(transaction.get().getTransactionState()).isIn(TransactionState.SUCCESSFUL, TransactionState.FAILED);
assertThat(transaction.get().getTransactionState()).isIn(TransactionState.SUCCESSFUL, TransactionState.INSUFFICIENT_BALANCE);
transactionRepository.deleteById(transaction.get().getId());
}
......@@ -387,7 +387,7 @@ class TransactionControllerITTest extends IntegrationTest {
.toList();
assertThat(accountFiveWithdrawals.stream()
.anyMatch(transaction -> transaction.getTransactionState().equals(TransactionState.FAILED))).isTrue();
.anyMatch(transaction -> transaction.getTransactionState().equals(TransactionState.INSUFFICIENT_BALANCE))).isTrue();
}
private String buildBalancePath(String accountNumber) {
......
......@@ -4,5 +4,6 @@ public enum TransactionState {
PENDING,
SUCCESSFUL,
FAILED;
CANNOT_EXCHANGE,
INSUFFICIENT_BALANCE;
}
......@@ -22,20 +22,12 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Optional;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import static cz.muni.fi.obs.data.dbo.TransactionState.FAILED;
import static cz.muni.fi.obs.data.dbo.TransactionState.CANNOT_EXCHANGE;
import static cz.muni.fi.obs.data.dbo.TransactionState.INSUFFICIENT_BALANCE;
import static cz.muni.fi.obs.data.dbo.TransactionState.PENDING;
import static cz.muni.fi.obs.data.dbo.TransactionState.SUCCESSFUL;
......@@ -116,9 +108,16 @@ public class TransactionService {
.amount(transaction.getWithdrawAmount())
.build();
CurrencyExchangeResult exchangeResult = callCurrencyClient(request);
transaction.setConversionRate(exchangeResult.exchangeRate());
transaction.setDepositAmount(exchangeResult.destAmount());
Optional<CurrencyExchangeResult> currencyExchangeResult = callCurrencyClient(request);
if (currencyExchangeResult.isEmpty()) {
transaction.setTransactionState(CANNOT_EXCHANGE);
repository.save(transaction);
return;
} else {
CurrencyExchangeResult exchangeResult = currencyExchangeResult.get();
transaction.setConversionRate(exchangeResult.exchangeRate());
transaction.setDepositAmount(exchangeResult.destAmount());
}
} else {
transaction.setConversionRate(1d);
transaction.setDepositAmount(transaction.getWithdrawAmount());
......@@ -135,12 +134,11 @@ public class TransactionService {
}
private TransactionState computeTransactionState(String id, BigDecimal withdrawAmount) {
return calculateAccountBalance(id).compareTo(withdrawAmount) >= 0 ? SUCCESSFUL : FAILED;
return calculateAccountBalance(id).compareTo(withdrawAmount) >= 0 ? SUCCESSFUL : INSUFFICIENT_BALANCE;
}
private CurrencyExchangeResult callCurrencyClient(CurrencyExchangeRequest request) {
return client.getCurrencyExchange(request)
.orElseThrow(() -> new ResourceNotFoundException("Currency exchange rate not found"));
private Optional<CurrencyExchangeResult> callCurrencyClient(CurrencyExchangeRequest request) {
return client.getCurrencyExchange(request);
}
public Page<TransactionDbo> listByAccount(String accountId, Pageable pageable, LocalDate date) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment