fix overdraft account balance (PR #659 for FINERACT-753)
This commit is contained in:
committed by
Michael Vorburger ⛑️
parent
26b4e0000c
commit
0474f59bcf
+71
@@ -44,6 +44,7 @@ import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
|
|||||||
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
|
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
|
||||||
import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
|
import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
|
||||||
import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
|
import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
|
||||||
|
import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
|
||||||
import org.joda.time.LocalDate;
|
import org.joda.time.LocalDate;
|
||||||
import org.joda.time.format.DateTimeFormat;
|
import org.joda.time.format.DateTimeFormat;
|
||||||
import org.joda.time.format.DateTimeFormatter;
|
import org.joda.time.format.DateTimeFormatter;
|
||||||
@@ -2233,4 +2234,74 @@ public class ClientSavingsIntegrationTest {
|
|||||||
assertEquals("Verifying Withdrawal Amount", new Float("300"), withdrawTransaction.get("amount"));
|
assertEquals("Verifying Withdrawal Amount", new Float("300"), withdrawTransaction.get("amount"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* incorrect savings account balance when charge transaction is
|
||||||
|
* reversed during an overdraft recalculate Daily Balances
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAccountBalanceAfterTransactionReversal() {
|
||||||
|
this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
|
||||||
|
SavingsAccountHelper savingsAccountHelperValidationError = new SavingsAccountHelper(this.requestSpec,
|
||||||
|
new ResponseSpecBuilder().build());
|
||||||
|
|
||||||
|
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
|
||||||
|
Assert.assertNotNull(clientID);
|
||||||
|
final String minBalanceForInterestCalculation = null;
|
||||||
|
final String minRequiredBalance = "500";
|
||||||
|
final String enforceMinRequiredBalance = "false";
|
||||||
|
final boolean allowOverdraft = true;
|
||||||
|
final String MINIMUM_OPENING_BALANCE = "0";
|
||||||
|
|
||||||
|
final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
|
||||||
|
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
|
||||||
|
Assert.assertNotNull(savingsProductID);
|
||||||
|
|
||||||
|
|
||||||
|
final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
|
||||||
|
Assert.assertNotNull(savingsId);
|
||||||
|
|
||||||
|
|
||||||
|
HashMap savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
|
||||||
|
SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
|
||||||
|
|
||||||
|
savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId);
|
||||||
|
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||||
|
|
||||||
|
|
||||||
|
Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, "500",
|
||||||
|
SavingsAccountHelper.TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
|
||||||
|
|
||||||
|
|
||||||
|
String chargeAmount = "300";
|
||||||
|
String chargeCurrency = "USD";
|
||||||
|
|
||||||
|
final Integer savingsChargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec,
|
||||||
|
ChargesHelper.getSavingsJSON(chargeAmount, chargeCurrency, ChargeTimeType.SPECIFIED_DUE_DATE));
|
||||||
|
|
||||||
|
Assert.assertNotNull(savingsChargeId);
|
||||||
|
|
||||||
|
Integer amount = 300;
|
||||||
|
|
||||||
|
|
||||||
|
final Integer chargeId = this.savingsAccountHelper.addChargesForSavingsWithDueDate(savingsId, savingsChargeId, SavingsAccountHelper.TRANSACTION_DATE,
|
||||||
|
amount);
|
||||||
|
|
||||||
|
Assert.assertNotNull(chargeId);
|
||||||
|
|
||||||
|
final Integer payChargeId = this.savingsAccountHelper.payCharge(chargeId, savingsId, chargeAmount, SavingsAccountHelper.TRANSACTION_DATE);
|
||||||
|
|
||||||
|
|
||||||
|
final Integer undoSavingsTransaction = this.savingsAccountHelper.undoSavingsAccountTransaction(savingsId, depositTransactionId);
|
||||||
|
HashMap reversedDepositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
|
||||||
|
Assert.assertTrue((Boolean) reversedDepositTransaction.get("reversed"));
|
||||||
|
|
||||||
|
HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
|
||||||
|
|
||||||
|
Float balance = new Float("-300");
|
||||||
|
|
||||||
|
assertEquals("Verifying opening Balance is -300", balance, summary.get("accountBalance"));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+16
@@ -269,6 +269,11 @@ public class SavingsAccountHelper {
|
|||||||
getPeriodChargeRequestJSON(chargeId, addDueDate, amount), CommonConstants.RESPONSE_RESOURCE_ID);
|
getPeriodChargeRequestJSON(chargeId, addDueDate, amount), CommonConstants.RESPONSE_RESOURCE_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer addChargesForSavingsWithDueDate(final Integer savingsId, final Integer chargeId, String addDueDate,Integer amount) {
|
||||||
|
return (Integer) performSavingActions(SAVINGS_ACCOUNT_URL + "/" + savingsId + "/charges?" + Utils.TENANT_IDENTIFIER,
|
||||||
|
getPeriodChargeRequestJSONWithDueDate(chargeId, addDueDate, amount), CommonConstants.RESPONSE_RESOURCE_ID);
|
||||||
|
}
|
||||||
|
|
||||||
public Integer payCharge(final Integer chargeId, final Integer savingsId, String amount, String dueDate) {
|
public Integer payCharge(final Integer chargeId, final Integer savingsId, String amount, String dueDate) {
|
||||||
return (Integer) performSavingActions(createChargesURL("paycharge", savingsId, chargeId), getSavingsPayChargeJSON(amount, dueDate),
|
return (Integer) performSavingActions(createChargesURL("paycharge", savingsId, chargeId), getSavingsPayChargeJSON(amount, dueDate),
|
||||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||||
@@ -593,6 +598,17 @@ public class SavingsAccountHelper {
|
|||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getPeriodChargeRequestJSONWithDueDate(Integer chargeId, String addDueDate, Integer amount) {
|
||||||
|
final HashMap<String, Object> map = new HashMap<>();
|
||||||
|
map.put("chargeId", chargeId);
|
||||||
|
map.put("amount", amount);
|
||||||
|
map.put("locale", CommonConstants.locale);
|
||||||
|
map.put("dateFormat", "dd MMMM yyy");
|
||||||
|
map.put("dueDate", addDueDate);
|
||||||
|
String json = new Gson().toJson(map);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
private String getAccountActivationJSON(final String activationDate) {
|
private String getAccountActivationJSON(final String activationDate) {
|
||||||
final HashMap<String, Object> map = new HashMap<>();
|
final HashMap<String, Object> map = new HashMap<>();
|
||||||
map.put("locale", CommonConstants.locale);
|
map.put("locale", CommonConstants.locale);
|
||||||
|
|||||||
+9
@@ -851,6 +851,15 @@ public class SavingsAccount extends AbstractPersistableCustom<Long> {
|
|||||||
transaction.updateOverdraftAmount(overdraftAmount.getAmount());
|
transaction.updateOverdraftAmount(overdraftAmount.getAmount());
|
||||||
} else if (overdraftAmount.isNotEqualTo(transaction.getOverdraftAmount(getCurrency()))) {
|
} else if (overdraftAmount.isNotEqualTo(transaction.getOverdraftAmount(getCurrency()))) {
|
||||||
SavingsAccountTransaction accountTransaction = SavingsAccountTransaction.copyTransaction(transaction);
|
SavingsAccountTransaction accountTransaction = SavingsAccountTransaction.copyTransaction(transaction);
|
||||||
|
if(transaction.isChargeTransaction()){
|
||||||
|
Set<SavingsAccountChargePaidBy> chargesPaidBy = transaction.getSavingsAccountChargesPaid();
|
||||||
|
final Set<SavingsAccountChargePaidBy> newChargePaidBy = new HashSet<>();
|
||||||
|
chargesPaidBy.forEach(x->
|
||||||
|
newChargePaidBy.add(SavingsAccountChargePaidBy.instance(accountTransaction,x.getSavingsAccountCharge(),
|
||||||
|
x.getAmount()))
|
||||||
|
);
|
||||||
|
accountTransaction.getSavingsAccountChargesPaid().addAll(newChargePaidBy);
|
||||||
|
}
|
||||||
transaction.reverse();
|
transaction.reverse();
|
||||||
if (overdraftAmount.isGreaterThanZero()) {
|
if (overdraftAmount.isGreaterThanZero()) {
|
||||||
accountTransaction.updateOverdraftAmount(overdraftAmount.getAmount());
|
accountTransaction.updateOverdraftAmount(overdraftAmount.getAmount());
|
||||||
|
|||||||
Reference in New Issue
Block a user