Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public void validateGuarantorBusinessRules(Loan loan) {
BigDecimal minSelfAmount = principal.multiply(guaranteeData.getMinimumGuaranteeFromOwnFunds()).divide(BigDecimal.valueOf(100));
BigDecimal minExtGuarantee = principal.multiply(guaranteeData.getMinimumGuaranteeFromGuarantor())
.divide(BigDecimal.valueOf(100));

boolean hasGroupSavingsAccountGuarantor = false;
BigDecimal actualAmount = BigDecimal.ZERO;
BigDecimal actualSelfAmount = BigDecimal.ZERO;
BigDecimal actualExtGuarantee = BigDecimal.ZERO;
Expand All @@ -125,7 +125,12 @@ public void validateGuarantorBusinessRules(Loan loan) {
for (GuarantorFundingDetails guarantorFundingDetails : fundingDetails) {
if (guarantorFundingDetails.getStatus().isActive() || guarantorFundingDetails.getStatus().isWithdrawn()
|| guarantorFundingDetails.getStatus().isCompleted()) {
if (guarantor.isSelfGuarantee()) {
SavingsAccount savingsAccount = guarantorFundingDetails.getLinkedSavingsAccount();
if (savingsAccount.isGroupAccount()) {
hasGroupSavingsAccountGuarantor = true;
actualExtGuarantee = actualExtGuarantee.add(guarantorFundingDetails.getAmount())
.subtract(guarantorFundingDetails.getAmountTransfered());
} else if (guarantor.isSelfGuarantee()) {
actualSelfAmount = actualSelfAmount.add(guarantorFundingDetails.getAmount())
.subtract(guarantorFundingDetails.getAmountTransfered());
} else {
Expand All @@ -138,7 +143,7 @@ public void validateGuarantorBusinessRules(Loan loan) {

final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan.guarantor");
if (actualSelfAmount.compareTo(minSelfAmount) < 0) {
if (!hasGroupSavingsAccountGuarantor && actualSelfAmount.compareTo(minSelfAmount) < 0) {
baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode(GuarantorConstants.GUARANTOR_SELF_GUARANTEE_ERROR,
minSelfAmount);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3366,6 +3366,10 @@ public boolean isTransactionAllowed(SavingsAccountTransactionType transactionTyp
return !isAccountLocked(transactionDate);
}

public boolean isGroupAccount() {
return (this.getGroupId() != null);
}

public BigDecimal minBalanceForInterestCalculation() {
return this.minBalanceForInterestCalculation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ public class SavingsAccountHelper {
public static final String TRANSACTION_DATE_PLUS_ONE = "02 March 2013";
public static final String LAST_TRANSACTION_DATE = "01 March 2013";
public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL";
public static final String ACCOUNT_TYPE_GROUP = "GROUP";
public static final Long PAYMENT_TYPE_ID = 1L;

public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
Expand Down Expand Up @@ -1293,6 +1294,31 @@ public static Integer openSavingsAccount(final RequestSpecification requestSpec,
return savingsId;
}

// TODO: Rewrite to use fineract-client instead!
// Example: org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long,
// org.apache.fineract.client.models.PostLoansLoanIdRequest)
@Deprecated(forRemoval = true)
public static Integer openGroupSavingsAccount(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please dont introduce new functionalities which are not using the fineract-client framework!

final Integer groupId, final String minimumOpeningBalance) {
final Integer savingsProductID = createSavingsProduct(requestSpec, responseSpec, minimumOpeningBalance);
Assertions.assertNotNull(savingsProductID);

SavingsAccountHelper savingsAccountHelper = new SavingsAccountHelper(requestSpec, responseSpec);

final Integer savingsId = savingsAccountHelper.applyForSavingsApplication(groupId, savingsProductID, ACCOUNT_TYPE_GROUP);
Assertions.assertNotNull(savingsProductID);

HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(requestSpec, responseSpec, savingsId);
SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);

savingsStatusHashMap = savingsAccountHelper.approveSavings(savingsId);
SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);

savingsStatusHashMap = savingsAccountHelper.activateSavings(savingsId);
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
return savingsId;
}

// TODO: Rewrite to use fineract-client instead!
// Example: org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long,
// org.apache.fineract.client.models.PostLoansLoanIdRequest)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.CollateralManagementHelper;
import org.apache.fineract.integrationtests.common.CommonConstants;
import org.apache.fineract.integrationtests.common.GroupHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
Expand Down Expand Up @@ -238,6 +239,45 @@ public void testGuarantor() {

}

@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testGuarantor_GROUP_SAVINGS_ACCOUNT_WITH_NON_ZERO_GUARANTEE() {
Float group_hold_funds = Float.valueOf((float) 0);
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);

final Integer groupId = GroupHelper.createGroup(this.requestSpec, this.responseSpec, true);
GroupHelper.associateClient(this.requestSpec, this.responseSpec, groupId.toString(), clientID.toString());

final Integer groupSavingsId = SavingsAccountHelper.openGroupSavingsAccount(this.requestSpec, this.responseSpec, groupId, "10000");

final Integer loanProductID = createLoanProductWithHoldFunds("20", "10", "10");
DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
Calendar todaysDate = Calendar.getInstance();
todaysDate.add(Calendar.DAY_OF_MONTH, -7 * 4);
final String loanDisbursementDate = dateFormat.format(todaysDate.getTime());
final Integer loanID = applyForLoanApplication(clientID, loanProductID, loanDisbursementDate);
Assertions.assertNotNull(loanID);

ArrayList<HashMap> errorData = (ArrayList<HashMap>) this.loanTransactionHelper.approveLoan(loanDisbursementDate, null, loanID,
CommonConstants.RESPONSE_ERROR);
assertTrue(checkForErrorCode(errorData, "validation.msg.loan.guarantor.min.self.guarantee.required"));
assertTrue(checkForErrorCode(errorData, "validation.msg.loan.guarantor.min.external.guarantee.required"));
assertTrue(checkForErrorCode(errorData, "validation.msg.loan.guarantor.mandated.guarantee.required"));

String guarantorJSON = new GuarantorTestBuilder()
.existingCustomerWithGuaranteeAmount(String.valueOf(clientID), String.valueOf(groupSavingsId), "2500").build();
Integer groupGuarantee = this.guarantorHelper.createGuarantor(loanID, guarantorJSON);
Assertions.assertNotNull(groupGuarantee);
verifySavingsOnHoldBalance(groupSavingsId, null);
LOG.info("-----------------------------------APPROVE LOAN-----------------------------------------");
HashMap loanStatusHashMap = this.loanTransactionHelper.approveLoan(loanDisbursementDate, loanID);
LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
group_hold_funds += Float.valueOf((float) 2500);
verifySavingsOnHoldBalance(groupSavingsId, group_hold_funds);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testGuarantor_UNDO_DISBURSAL() {
Expand Down
Loading