Accounting returns the customer loan balance as a negative number. Fixing code to deal with it properly, and adjusting component test accordingly.
diff --git a/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java b/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java
index 58a06a8..595d2b4 100644
--- a/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java
+++ b/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java
@@ -19,6 +19,7 @@
import io.mifos.accounting.api.v1.domain.*;
import io.mifos.core.api.util.NotFoundException;
import io.mifos.core.lang.DateConverter;
+import io.mifos.individuallending.api.v1.domain.workflow.Action;
import org.hamcrest.Description;
import org.mockito.AdditionalMatchers;
import org.mockito.ArgumentMatcher;
@@ -335,13 +336,18 @@
private static class JournalEntryMatcher extends ArgumentMatcher<JournalEntry> {
private final Set<Debtor> debtors;
private final Set<Creditor> creditors;
+ private final String transactionPrefix;
private JournalEntry checkedArgument;
private JournalEntryMatcher(final Set<Debtor> debtors,
- final Set<Creditor> creditors) {
+ final Set<Creditor> creditors,
+ final String productIdentifier,
+ final String caseIdentifier,
+ final Action action) {
this.debtors = debtors;
this.creditors = creditors;
this.checkedArgument = null; //Set when matches called.
+ this.transactionPrefix = "portfolio." + productIdentifier + "." + caseIdentifier + "." + action.name();
}
@Override
@@ -354,7 +360,8 @@
checkedArgument = (JournalEntry) argument;
return this.debtors.equals(checkedArgument.getDebtors()) &&
- this.creditors.equals(checkedArgument.getCreditors());
+ this.creditors.equals(checkedArgument.getCreditors()) &&
+ checkedArgument.getTransactionIdentifier().startsWith(transactionPrefix);
}
@Override
@@ -470,17 +477,24 @@
static void verifyTransfer(final LedgerManager ledgerManager,
final String fromAccountIdentifier,
final String toAccountIdentifier,
- final BigDecimal amount) {
+ final BigDecimal amount,
+ final String productIdentifier,
+ final String caseIdentifier,
+ final Action action) {
final JournalEntryMatcher specifiesCorrectJournalEntry = new JournalEntryMatcher(
- Collections.singleton(new Debtor(fromAccountIdentifier, amount.toPlainString())),
- Collections.singleton(new Creditor(toAccountIdentifier, amount.toPlainString())));
+ Collections.singleton(new Debtor(fromAccountIdentifier, amount.toPlainString())),
+ Collections.singleton(new Creditor(toAccountIdentifier, amount.toPlainString())),
+ productIdentifier, caseIdentifier, action);
Mockito.verify(ledgerManager).createJournalEntry(AdditionalMatchers.and(argThat(isValid()), argThat(specifiesCorrectJournalEntry)));
}
static void verifyTransfer(final LedgerManager ledgerManager,
final Set<Debtor> debtors,
- final Set<Creditor> creditors) {
- final JournalEntryMatcher specifiesCorrectJournalEntry = new JournalEntryMatcher(debtors, creditors);
+ final Set<Creditor> creditors,
+ final String productIdentifier,
+ final String caseIdentifier,
+ final Action action) {
+ final JournalEntryMatcher specifiesCorrectJournalEntry = new JournalEntryMatcher(debtors, creditors, productIdentifier, caseIdentifier, action);
Mockito.verify(ledgerManager).createJournalEntry(AdditionalMatchers.and(argThat(isValid()), argThat(specifiesCorrectJournalEntry)));
}
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
index 785627a..739e354 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
@@ -157,7 +157,7 @@
AccountingFixture.verifyTransfer(ledgerManager,
AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, AccountingFixture.PROCESSING_FEE_INCOME_ACCOUNT_IDENTIFIER,
- PROCESSING_FEE_AMOUNT
+ PROCESSING_FEE_AMOUNT, product.getIdentifier(), customerCase.getIdentifier(), Action.OPEN
);
}
@@ -203,7 +203,7 @@
final Set<Creditor> creditors = new HashSet<>();
creditors.add(new Creditor(pendingDisbursalAccountIdentifier, caseParameters.getMaximumBalance().toPlainString()));
creditors.add(new Creditor(AccountingFixture.LOAN_ORIGINATION_FEES_ACCOUNT_IDENTIFIER, LOAN_ORIGINATION_FEE_AMOUNT.toPlainString()));
- AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors);
+ AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors, product.getIdentifier(), customerCase.getIdentifier(), Action.APPROVE);
expectedCurrentBalance = BigDecimal.ZERO;
}
@@ -232,7 +232,7 @@
creditors.add(new Creditor(customerLoanAccountIdentifier, caseParameters.getMaximumBalance().toPlainString()));
creditors.add(new Creditor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, caseParameters.getMaximumBalance().toPlainString()));
creditors.add(new Creditor(AccountingFixture.DISBURSEMENT_FEE_INCOME_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_AMOUNT.toPlainString()));
- AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors);
+ AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors, product.getIdentifier(), customerCase.getIdentifier(), Action.DISBURSE);
expectedCurrentBalance = expectedCurrentBalance.add(caseParameters.getMaximumBalance());
}
@@ -243,7 +243,7 @@
final String beatIdentifier = "alignment0";
final String midnightTimeStamp = DateConverter.toIsoString(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
- AccountingFixture.mockBalance(customerLoanAccountIdentifier, expectedCurrentBalance);
+ AccountingFixture.mockBalance(customerLoanAccountIdentifier, expectedCurrentBalance.negate());
final BeatPublish interestBeat = new BeatPublish(beatIdentifier, midnightTimeStamp);
portfolioBeatListener.publishBeat(interestBeat);
@@ -270,7 +270,7 @@
creditors.add(new Creditor(
AccountingFixture.LOAN_INTEREST_ACCRUAL_ACCOUNT_IDENTIFIER,
calculatedInterest.toPlainString()));
- AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors);
+ AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors, product.getIdentifier(), customerCase.getIdentifier(), Action.APPLY_INTEREST);
expectedCurrentBalance = expectedCurrentBalance.add(calculatedInterest);
}
@@ -278,7 +278,7 @@
private void step7PaybackPartialAmount(final BigDecimal amount) throws InterruptedException {
logger.info("step7PaybackPartialAmount");
- AccountingFixture.mockBalance(customerLoanAccountIdentifier, expectedCurrentBalance);
+ AccountingFixture.mockBalance(customerLoanAccountIdentifier, expectedCurrentBalance.negate());
checkStateTransfer(
product.getIdentifier(),
@@ -305,7 +305,7 @@
if (interestAccrued.compareTo(BigDecimal.ZERO) != 0)
creditors.add(new Creditor(AccountingFixture.CONSUMER_LOAN_INTEREST_ACCOUNT_IDENTIFIER, interestAccrued.toPlainString()));
- AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors);
+ AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors, product.getIdentifier(), customerCase.getIdentifier(), Action.ACCEPT_PAYMENT);
expectedCurrentBalance = expectedCurrentBalance.subtract(amount);
interestAccrued = BigDecimal.ZERO;
@@ -314,7 +314,7 @@
private void step8Close() throws InterruptedException {
logger.info("step8Close");
- AccountingFixture.mockBalance(customerLoanAccountIdentifier, expectedCurrentBalance);
+ AccountingFixture.mockBalance(customerLoanAccountIdentifier, expectedCurrentBalance.negate());
checkStateTransfer(
product.getIdentifier(),
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java b/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
index d84fc63..cc20d09 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
@@ -186,7 +186,7 @@
final DesignatorToAccountIdentifierMapper designatorToAccountIdentifierMapper
= new DesignatorToAccountIdentifierMapper(dataContextOfAction);
final String customerLoanAccountIdentifier = designatorToAccountIdentifierMapper.mapOrThrow(AccountDesignators.CUSTOMER_LOAN);
- final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier);
+ final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier).negate();
if (dataContextOfAction.getCaseParameters().getMaximumBalance().compareTo(
currentBalance.add(requestedDisbursalSize)) < 0)
@@ -237,7 +237,7 @@
final DesignatorToAccountIdentifierMapper designatorToAccountIdentifierMapper
= new DesignatorToAccountIdentifierMapper(dataContextOfAction);
final String customerLoanAccountIdentifier = designatorToAccountIdentifierMapper.mapOrThrow(AccountDesignators.CUSTOMER_LOAN);
- final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier);
+ final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier).negate();
final LocalDate startOfTerm = getStartOfTermOrThrow(dataContextOfAction, customerLoanAccountIdentifier);
@@ -277,7 +277,7 @@
final DesignatorToAccountIdentifierMapper designatorToAccountIdentifierMapper
= new DesignatorToAccountIdentifierMapper(dataContextOfAction);
final String customerLoanAccountIdentifier = designatorToAccountIdentifierMapper.mapOrThrow(AccountDesignators.CUSTOMER_LOAN);
- final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier);
+ final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier).negate();
final LocalDate startOfTerm = getStartOfTermOrThrow(dataContextOfAction, customerLoanAccountIdentifier);
@@ -377,7 +377,7 @@
final DesignatorToAccountIdentifierMapper designatorToAccountIdentifierMapper
= new DesignatorToAccountIdentifierMapper(dataContextOfAction);
final String customerLoanAccountIdentifier = designatorToAccountIdentifierMapper.mapOrThrow(AccountDesignators.CUSTOMER_LOAN);
- final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier);
+ final BigDecimal currentBalance = accountingAdapter.getCurrentBalance(customerLoanAccountIdentifier).negate();
if (currentBalance.compareTo(BigDecimal.ZERO) != 0)
throw ServiceException.conflict("Cannot close loan until the balance is zero.");