Created
February 23, 2022 12:44
-
-
Save peterjurkovic/ce06f60a14438f40ca8d48c491103275 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.ArrayList; | |
import java.util.List; | |
import org.joda.time.LocalDate; | |
import common.BalancesOfMonthCalculator_API; | |
import common.BalancesOfMonth_API; | |
import common.Transaction_API; | |
public class BalancesCalculator implements BalancesOfMonthCalculator_API { | |
private final List<Transaction_API> transactions; | |
public BalancesCalculator(List<Transaction_API> transactions) { | |
this.transactions = transactions; | |
} | |
@Override | |
public void fillData(List<BalancesOfMonth_API> balancesOfMonthList) { | |
int balance = 0; | |
for (BalancesOfMonth_API balancesOfMonth : balancesOfMonthList) { | |
int ultimo = balancesOfMonth.getDate().getDayOfMonth(); | |
double averageBalance = 0; | |
int dayOfLatestBalance = 1; | |
List<Transaction_API> transactionsOfMonth = transactionsOfMonth(balancesOfMonth.getDate()); | |
for (Transaction_API transaction : transactionsOfMonth) { | |
int day = transaction.getDate().getDayOfMonth(); | |
averageBalance += calculateProportionalBalance(dayOfLatestBalance, balance, day, ultimo); | |
balance += transaction.getAmount(); | |
dayOfLatestBalance = day; | |
} | |
averageBalance += calculateProportionalBalance(dayOfLatestBalance, balance, ultimo + 1, ultimo); | |
balancesOfMonth.setBalance(balance); | |
balancesOfMonth.setAverageBalance((int) averageBalance); | |
} | |
} | |
private double calculateProportionalBalance(int dayOfLatestBalance, int balance, int day, int daysInMonth) { | |
int countingDays = day - dayOfLatestBalance; | |
if (countingDays == 0) { | |
return 0; | |
} | |
double rate = (double) countingDays / daysInMonth; | |
return (balance * rate); | |
} | |
private List<Transaction_API> transactionsOfMonth(LocalDate date) { | |
List<Transaction_API> results = new ArrayList<Transaction_API>(); | |
for (Transaction_API transaction : transactions) { | |
LocalDate dateOfTransaction = transaction.getDate(); | |
if (areSameMonthAndYear(date, dateOfTransaction)) { | |
results.add(transaction); | |
} | |
} | |
return results; | |
} | |
private boolean areSameMonthAndYear(LocalDate date, LocalDate dateOfTransaction) { | |
return dateOfTransaction.getMonthOfYear() == date.getMonthOfYear() && dateOfTransaction.getYear() == date.getYear(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment