[FINERACT-1906] Add disbursement charge to accrual transactions
This commit is contained in:
+11
@@ -192,6 +192,7 @@ import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
|
|||||||
import org.apache.fineract.portfolio.transfer.api.TransferApiConstants;
|
import org.apache.fineract.portfolio.transfer.api.TransferApiConstants;
|
||||||
import org.apache.fineract.useradministration.domain.AppUser;
|
import org.apache.fineract.useradministration.domain.AppUser;
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
import org.springframework.dao.DataIntegrityViolationException;
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.orm.jpa.JpaSystemException;
|
import org.springframework.orm.jpa.JpaSystemException;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@@ -245,6 +246,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
private final ExternalIdFactory externalIdFactory;
|
private final ExternalIdFactory externalIdFactory;
|
||||||
private final ReplayedTransactionBusinessEventService replayedTransactionBusinessEventService;
|
private final ReplayedTransactionBusinessEventService replayedTransactionBusinessEventService;
|
||||||
private final LoanAccrualTransactionBusinessEventService loanAccrualTransactionBusinessEventService;
|
private final LoanAccrualTransactionBusinessEventService loanAccrualTransactionBusinessEventService;
|
||||||
|
private final JdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
@@ -484,6 +486,15 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
&& loanCharge.isChargePending()) {
|
&& loanCharge.isChargePending()) {
|
||||||
disBuLoanCharges.put(loanCharge.getId(), loanCharge.amountOutstanding());
|
disBuLoanCharges.put(loanCharge.getId(), loanCharge.amountOutstanding());
|
||||||
}
|
}
|
||||||
|
if (loanCharge.isDisbursementCharge()) {
|
||||||
|
String transactionSql = "INSERT INTO m_loan_transaction (loan_id,office_id,is_reversed,transaction_type_enum,transaction_date,amount,"
|
||||||
|
+ "fee_charges_portion_derived, submitted_on_date, created_by, last_modified_by, created_on_utc, last_modified_on_utc) "
|
||||||
|
+ "VALUES (?, ?, false, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||||
|
AppUser user = context.authenticatedUser();
|
||||||
|
jdbcTemplate.update(transactionSql, loanId, loan.getOfficeId(), LoanTransactionType.ACCRUAL.getValue(),
|
||||||
|
actualDisbursementDate, loanCharge.amount(), loanCharge.amount(), DateUtils.getBusinessLocalDate(), user.getId(),
|
||||||
|
user.getId(), DateUtils.getOffsetDateTimeOfTenant(), DateUtils.getOffsetDateTimeOfTenant());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final Locale locale = command.extractLocale();
|
final Locale locale = command.extractLocale();
|
||||||
|
|||||||
+13
@@ -46,6 +46,7 @@ import java.util.Arrays;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -3050,6 +3051,8 @@ public class ClientLoanIntegrationTest {
|
|||||||
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
|
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
|
||||||
LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
|
LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
|
||||||
|
|
||||||
|
ArrayList<HashMap> loanTransactionDetails = loanTransactionHelper.getLoanTransactionDetails(requestSpec, responseSpec, loanID);
|
||||||
|
validateAccrualTransactionForDisbursementCharge(loanTransactionDetails);
|
||||||
final JournalEntry[] assetAccountInitialEntry = { new JournalEntry(Float.parseFloat("120.00"), JournalEntry.TransactionType.DEBIT),
|
final JournalEntry[] assetAccountInitialEntry = { new JournalEntry(Float.parseFloat("120.00"), JournalEntry.TransactionType.DEBIT),
|
||||||
new JournalEntry(Float.parseFloat("12000.00"), JournalEntry.TransactionType.CREDIT),
|
new JournalEntry(Float.parseFloat("12000.00"), JournalEntry.TransactionType.CREDIT),
|
||||||
new JournalEntry(Float.parseFloat("12000.00"), JournalEntry.TransactionType.DEBIT) };
|
new JournalEntry(Float.parseFloat("12000.00"), JournalEntry.TransactionType.DEBIT) };
|
||||||
@@ -4744,6 +4747,16 @@ public class ClientLoanIntegrationTest {
|
|||||||
LoanStatusChecker.verifyLoanAccountIsClosed(loanStatusHashMap);
|
LoanStatusChecker.verifyLoanAccountIsClosed(loanStatusHashMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validateAccrualTransactionForDisbursementCharge(ArrayList<HashMap> loanTransactionDetails) {
|
||||||
|
List<HashMap> disbursementTransactions = loanTransactionDetails.stream()
|
||||||
|
.filter(transactionDetail -> (Boolean) ((LinkedHashMap) transactionDetail.get("type")).get("repaymentAtDisbursement"))
|
||||||
|
.toList();
|
||||||
|
List<HashMap> accrualTransactions = loanTransactionDetails.stream()
|
||||||
|
.filter(transactionDetail -> (Boolean) ((LinkedHashMap) transactionDetail.get("type")).get("accrual")).toList();
|
||||||
|
assertEquals(disbursementTransactions.size(), accrualTransactions.size(), 1);
|
||||||
|
assertEquals((Float) disbursementTransactions.get(0).get("amount"), (Float) accrualTransactions.get(0).get("amount"));
|
||||||
|
}
|
||||||
|
|
||||||
private void addRepaymentValues(List<Map<String, Object>> expectedvalues, Calendar todaysDate, int addPeriod, boolean isAddDays,
|
private void addRepaymentValues(List<Map<String, Object>> expectedvalues, Calendar todaysDate, int addPeriod, boolean isAddDays,
|
||||||
String principalDue, String interestDue, String feeChargesDue, String penaltyChargesDue) {
|
String principalDue, String interestDue, String feeChargesDue, String penaltyChargesDue) {
|
||||||
Map<String, Object> values = new HashMap<>(3);
|
Map<String, Object> values = new HashMap<>(3);
|
||||||
|
|||||||
Reference in New Issue
Block a user