FINERACT-2090: Restructure Withdraw Loan Application Logic
This commit is contained in:
committed by
Adam Saghy
parent
0292171f6f
commit
1c53fe2136
+28
-49
@@ -26,13 +26,10 @@ import com.google.gson.JsonObject;
|
||||
import jakarta.persistence.PersistenceException;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -96,7 +93,6 @@ import org.apache.fineract.portfolio.loanaccount.serialization.LoanApplicationTr
|
||||
import org.apache.fineract.portfolio.loanaccount.serialization.LoanApplicationValidator;
|
||||
import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
|
||||
import org.apache.fineract.portfolio.loanproduct.domain.RecalculationFrequencyType;
|
||||
import org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations;
|
||||
import org.apache.fineract.portfolio.note.domain.Note;
|
||||
import org.apache.fineract.portfolio.note.domain.NoteRepository;
|
||||
import org.apache.fineract.portfolio.savings.data.GroupSavingsIndividualMonitoringAccountData;
|
||||
@@ -492,6 +488,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
|
||||
this.accountAssociationsRepository.delete(accountAssociations);
|
||||
}
|
||||
|
||||
// Note: check if releaseAttachedCollaterals method can be used here
|
||||
Set<LoanCollateralManagement> loanCollateralManagements = loan.getLoanCollateralManagements();
|
||||
for (LoanCollateralManagement loanCollateralManagement : loanCollateralManagements) {
|
||||
BigDecimal quantity = loanCollateralManagement.getQuantity();
|
||||
@@ -797,20 +794,23 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
|
||||
Loan loan = retrieveLoanBy(loanId);
|
||||
|
||||
// validate loan rejection
|
||||
loanApplicationTransitionValidator.validateRejection(command, loan, defaultLoanLifecycleStateMachine);
|
||||
loanApplicationTransitionValidator.validateRejection(command, loan);
|
||||
|
||||
// check for mandatory entities
|
||||
entityDatatableChecksWritePlatformService.runTheCheckForProduct(loanId, EntityTables.LOAN.getName(),
|
||||
StatusEnum.REJECTED.getCode().longValue(), EntityTables.LOAN.getForeignKeyColumnNameOnDatatable(), loan.productId());
|
||||
|
||||
// loan application rejection
|
||||
final Map<String, Object> changes = loanApplicationRejection(loan, command);
|
||||
final AppUser currentUser = getAppUserIfPresent();
|
||||
defaultLoanLifecycleStateMachine.transition(LoanEvent.LOAN_REJECTED, loan);
|
||||
final Map<String, Object> changes = loanAssembler.updateLoanApplicationAttributesForRejection(loan, command, currentUser);
|
||||
|
||||
if (!changes.isEmpty()) {
|
||||
loanRepositoryWrapper.saveAndFlush(loan);
|
||||
final String noteText = command.stringValueOfParameterNamed("note");
|
||||
createNote(noteText, loan);
|
||||
}
|
||||
|
||||
businessEventNotifierService.notifyPostBusinessEvent(new LoanRejectedBusinessEvent(loan));
|
||||
return new CommandProcessingResultBuilder() //
|
||||
.withCommandId(command.commandId()) //
|
||||
@@ -824,63 +824,31 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
|
||||
.build();
|
||||
}
|
||||
|
||||
private Map<String, Object> loanApplicationRejection(Loan loan, final JsonCommand command) {
|
||||
|
||||
final AppUser currentUser = getAppUserIfPresent();
|
||||
final LocalDate rejectedOn = command.localDateValueOfParameterNamed(Loan.REJECTED_ON_DATE);
|
||||
|
||||
loan.setRejectedOnDate(rejectedOn);
|
||||
loan.setRejectedBy(currentUser);
|
||||
loan.setClosedOnDate(rejectedOn);
|
||||
loan.setClosedBy(currentUser);
|
||||
|
||||
defaultLoanLifecycleStateMachine.transition(LoanEvent.LOAN_REJECTED, loan);
|
||||
|
||||
final Map<String, Object> actualChanges = new LinkedHashMap<>();
|
||||
final Locale locale = new Locale(command.locale());
|
||||
final DateTimeFormatter fmt = DateTimeFormatter.ofPattern(command.dateFormat()).withLocale(locale);
|
||||
|
||||
actualChanges.put(Loan.PARAM_STATUS, LoanEnumerations.status(loan.getStatus()));
|
||||
actualChanges.put(Loan.LOCALE, command.locale());
|
||||
actualChanges.put(Loan.DATE_FORMAT, command.dateFormat());
|
||||
actualChanges.put(Loan.REJECTED_ON_DATE, rejectedOn.format(fmt));
|
||||
actualChanges.put(Loan.CLOSED_ON_DATE, rejectedOn.format(fmt));
|
||||
|
||||
return actualChanges;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public CommandProcessingResult applicantWithdrawsFromApplication(final Long loanId, final JsonCommand command) {
|
||||
|
||||
final AppUser currentUser = getAppUserIfPresent();
|
||||
|
||||
this.loanApplicationTransitionValidator.validateApplicantWithdrawal(command.json());
|
||||
|
||||
// retrieve loan
|
||||
final Loan loan = retrieveLoanBy(loanId);
|
||||
loanApplicationTransitionValidator.checkClientOrGroupActive(loan);
|
||||
|
||||
// validate withdrawal
|
||||
loanApplicationTransitionValidator.validateApplicantWithdrawal(command, loan);
|
||||
|
||||
// check for mandatory entities
|
||||
entityDatatableChecksWritePlatformService.runTheCheckForProduct(loanId, EntityTables.LOAN.getName(),
|
||||
StatusEnum.WITHDRAWN.getCode().longValue(), EntityTables.LOAN.getForeignKeyColumnNameOnDatatable(), loan.productId());
|
||||
|
||||
final Map<String, Object> changes = loan.loanApplicationWithdrawnByApplicant(currentUser, command,
|
||||
defaultLoanLifecycleStateMachine);
|
||||
|
||||
// loan application withdrawal
|
||||
final AppUser currentUser = getAppUserIfPresent();
|
||||
defaultLoanLifecycleStateMachine.transition(LoanEvent.LOAN_WITHDRAWN, loan);
|
||||
final Map<String, Object> changes = loanAssembler.updateLoanApplicationAttributesForWithdrawal(loan, command, currentUser);
|
||||
// Release attached collaterals
|
||||
if (loan.getLoanType().isIndividualAccount()) {
|
||||
Set<LoanCollateralManagement> loanCollateralManagements = loan.getLoanCollateralManagements();
|
||||
for (LoanCollateralManagement loanCollateralManagement : loanCollateralManagements) {
|
||||
ClientCollateralManagement clientCollateralManagement = loanCollateralManagement.getClientCollateralManagement();
|
||||
clientCollateralManagement
|
||||
.updateQuantity(clientCollateralManagement.getQuantity().add(loanCollateralManagement.getQuantity()));
|
||||
loanCollateralManagement.setClientCollateralManagement(clientCollateralManagement);
|
||||
loanCollateralManagement.setIsReleased(true);
|
||||
}
|
||||
loan.updateLoanCollateral(loanCollateralManagements);
|
||||
releaseAttachedCollaterals(loan);
|
||||
}
|
||||
|
||||
if (!changes.isEmpty()) {
|
||||
this.loanRepositoryWrapper.saveAndFlush(loan);
|
||||
loanRepositoryWrapper.saveAndFlush(loan);
|
||||
|
||||
final String noteText = command.stringValueOfParameterNamed("note");
|
||||
createNote(noteText, loan);
|
||||
@@ -983,4 +951,15 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
|
||||
}
|
||||
}
|
||||
|
||||
private void releaseAttachedCollaterals(Loan loan) {
|
||||
Set<LoanCollateralManagement> loanCollateralManagements = loan.getLoanCollateralManagements();
|
||||
for (LoanCollateralManagement loanCollateralManagement : loanCollateralManagements) {
|
||||
ClientCollateralManagement clientCollateralManagement = loanCollateralManagement.getClientCollateralManagement();
|
||||
clientCollateralManagement.updateQuantity(clientCollateralManagement.getQuantity().add(loanCollateralManagement.getQuantity()));
|
||||
loanCollateralManagement.setClientCollateralManagement(clientCollateralManagement);
|
||||
loanCollateralManagement.setIsReleased(true);
|
||||
}
|
||||
loan.updateLoanCollateral(loanCollateralManagements);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+49
@@ -22,9 +22,11 @@ import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
@@ -96,8 +98,10 @@ import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
|
||||
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail;
|
||||
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRepository;
|
||||
import org.apache.fineract.portfolio.loanproduct.exception.LoanProductNotFoundException;
|
||||
import org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations;
|
||||
import org.apache.fineract.portfolio.rate.domain.Rate;
|
||||
import org.apache.fineract.portfolio.rate.service.RateAssembler;
|
||||
import org.apache.fineract.useradministration.domain.AppUser;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public class LoanAssembler {
|
||||
@@ -833,4 +837,49 @@ public class LoanAssembler {
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
public Map<String, Object> updateLoanApplicationAttributesForWithdrawal(Loan loan, JsonCommand command, AppUser currentUser) {
|
||||
final Map<String, Object> actualChanges = new LinkedHashMap<>();
|
||||
|
||||
LocalDate withdrawnOn = command.localDateValueOfParameterNamed(Loan.WITHDRAWN_ON_DATE);
|
||||
if (withdrawnOn == null) {
|
||||
withdrawnOn = command.localDateValueOfParameterNamed(Loan.EVENT_DATE);
|
||||
}
|
||||
|
||||
loan.setWithdrawnOnDate(withdrawnOn);
|
||||
loan.setWithdrawnBy(currentUser);
|
||||
loan.setClosedOnDate(withdrawnOn);
|
||||
loan.setClosedBy(currentUser);
|
||||
|
||||
final Locale locale = new Locale(command.locale());
|
||||
final DateTimeFormatter fmt = DateTimeFormatter.ofPattern(command.dateFormat()).withLocale(locale);
|
||||
|
||||
actualChanges.put(Loan.PARAM_STATUS, LoanEnumerations.status(loan.getStatus()));
|
||||
actualChanges.put(Loan.LOCALE, command.locale());
|
||||
actualChanges.put(Loan.DATE_FORMAT, command.dateFormat());
|
||||
actualChanges.put(Loan.WITHDRAWN_ON_DATE, withdrawnOn.format(fmt));
|
||||
actualChanges.put(Loan.CLOSED_ON_DATE, withdrawnOn.format(fmt));
|
||||
return actualChanges;
|
||||
}
|
||||
|
||||
public Map<String, Object> updateLoanApplicationAttributesForRejection(Loan loan, JsonCommand command, AppUser currentUser) {
|
||||
final Map<String, Object> actualChanges = new LinkedHashMap<>();
|
||||
|
||||
final LocalDate rejectedOn = command.localDateValueOfParameterNamed(Loan.REJECTED_ON_DATE);
|
||||
|
||||
loan.setRejectedOnDate(rejectedOn);
|
||||
loan.setRejectedBy(currentUser);
|
||||
loan.setClosedOnDate(rejectedOn);
|
||||
loan.setClosedBy(currentUser);
|
||||
|
||||
final Locale locale = new Locale(command.locale());
|
||||
final DateTimeFormatter fmt = DateTimeFormatter.ofPattern(command.dateFormat()).withLocale(locale);
|
||||
|
||||
actualChanges.put(Loan.PARAM_STATUS, LoanEnumerations.status(loan.getStatus()));
|
||||
actualChanges.put(Loan.LOCALE, command.locale());
|
||||
actualChanges.put(Loan.DATE_FORMAT, command.dateFormat());
|
||||
actualChanges.put(Loan.REJECTED_ON_DATE, rejectedOn.format(fmt));
|
||||
actualChanges.put(Loan.CLOSED_ON_DATE, rejectedOn.format(fmt));
|
||||
return actualChanges;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user