FINERACT-2107: Loan transaction Interest Refund GL Entries

This commit is contained in:
Jose Alberto Hernandez
2024-08-22 11:04:26 +02:00
committed by Adam Saghy
parent 7304af57bc
commit 5ebd3429c6
10 changed files with 359 additions and 5 deletions
@@ -0,0 +1,39 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.portfolio.loanaccount.data;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class LoanRefundRequestData {
private final BigDecimal principal;
private final BigDecimal interest;
private final BigDecimal feeCharges;
private final BigDecimal penaltyCharges;
private final BigDecimal overpayment;
public BigDecimal getTotalAmount() {
return principal.add(interest).add(feeCharges).add(penaltyCharges);
}
}
@@ -60,6 +60,7 @@ public class LoanTransactionEnumData {
private final boolean reAge;
private final boolean reAmortize;
private final boolean accrualActivity;
private final boolean interestRefund;
public LoanTransactionEnumData(final Long id, final String code, final String value) {
this.id = id;
@@ -94,6 +95,7 @@ public class LoanTransactionEnumData {
this.accrualActivity = Long.valueOf(32).equals(this.id);
this.reAge = Long.valueOf(LoanTransactionType.REAGE.getValue()).equals(this.id);
this.reAmortize = Long.valueOf(LoanTransactionType.REAMORTIZE.getValue()).equals(this.id);
this.interestRefund = Long.valueOf(LoanTransactionType.INTEREST_REFUND.getValue()).equals(this.id);
}
public boolean isRepaymentType() {
@@ -27,6 +27,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuild
import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.portfolio.delinquency.validator.LoanDelinquencyActionData;
import org.apache.fineract.portfolio.loanaccount.data.HolidayDetailDTO;
import org.apache.fineract.portfolio.loanaccount.data.LoanRefundRequestData;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
public interface LoanAccountDomainService {
@@ -93,4 +94,6 @@ public interface LoanAccountDomainService {
LoanTransaction creditBalanceRefund(Loan loan, LocalDate transactionDate, BigDecimal transactionAmount, String noteText,
ExternalId externalId, PaymentDetail paymentDetail);
LoanTransaction applyInterestRefund(Loan loan, LoanRefundRequestData loanRefundRequest);
}
@@ -323,6 +323,13 @@ public class LoanTransaction extends AbstractAuditableWithUTCDateTimeCustom<Long
externalId);
}
public static LoanTransaction interestRefund(final Loan loan, final Office office, final BigDecimal amount, final BigDecimal principal,
final BigDecimal interest, final BigDecimal feeCharges, final BigDecimal penaltyCharges, final PaymentDetail paymentDetail,
final LocalDate refundDate, final ExternalId externalId) {
return new LoanTransaction(loan, office, LoanTransactionType.INTEREST_REFUND.getValue(), refundDate, amount, principal, interest,
feeCharges, penaltyCharges, amount, false, paymentDetail, externalId);
}
public static boolean transactionAmountsMatch(final MonetaryCurrency currency, final LoanTransaction loanTransaction,
final LoanTransaction newLoanTransaction) {
return loanTransaction.getAmount(currency).isEqualTo(newLoanTransaction.getAmount(currency))