Hi,
I have a calculate balance function in the middleware service, for some reason it some times returns random results which are incorrect, even when I refresh multiple times it keeps returning different results for the same account. The only way it returns the proper result I had to restart the full application.
Here is the code
@Override
public BigDecimal calculateBalance(Account account) {
com.haulmont.cuba.core.Transaction tx = persistence.getTransaction();
EntityManager em = persistence.getEntityManager();
TypedQuery<Transaction> query = em.createQuery(
"select o from cps$Transaction o where o.account.id = :id", Transaction.class);
query.setParameter("id", account.getId());
List<Transaction> transactions = query.getResultList();
query = em.createQuery(
"select o from cps$Transaction o where o.receiver.id = :id", Transaction.class);
query.setParameter("id", account.getId());
transactions.addAll(query.getResultList());
BigDecimal balance = BigDecimal.ZERO;
for (Transaction t: transactions) {
if(t.getType() == TransactionType.DEPOSIT){
balance = balance.add(t.getAmount()).subtract(t.getFees().multiply(t.getFees_exchange_rate()));
}
if(t.getType() == TransactionType.WITHDRAW){
balance = balance.subtract(t.getAmount()).subtract(t.getFees().multiply(t.getFees_exchange_rate()));
}
if(t.getType() == TransactionType.TRANSFER){
if(t.getAccount().getId().equals(account.getId())) {
balance = balance.subtract(t.getAmount().multiply(t.getExchange_rate()))
.subtract(t.getFees().multiply(t.getFees_exchange_rate()));
}
else if(t.getReceiver().getId().equals(account.getId())) {
balance = balance.add(t.getAmount());
}
}
if(t.getType() == TransactionType.ORDER){
balance = balance.subtract(t.getAmount());
}
if(t.getType() == TransactionType.SELL){
balance = balance.add(t.getAmount());
}
if(t.getType() == TransactionType.REFUND){
balance = balance.subtract(t.getAmount());
}
}
// get all receipts to calculate balance after alteration
TypedQuery<Receipt> query2 = em.createQuery(
"select o from cps$Receipt o where o.account.id = :id", Receipt.class);
query2.setViewName("receipt-view");
query2.setParameter("id", account.getId());
List<Receipt> receipts = query2.getResultList();
for(Receipt r : receipts){
// subtract full total to show debt
balance = balance.add(r.getTotal());
for(Transaction t : r.getTransactions()){
// add balance to settle debt
if(t.getType() != TransactionType.REFUND) {
balance = balance.subtract(t.getAmount());
}else{
balance = balance.add(t.getAmount());
}
}
}
return balance;
}