ruchiD commented on code in PR #3515:
URL: https://github.com/apache/fineract/pull/3515#discussion_r1373536569
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyWritePlatformServiceImpl.java:
##########
@@ -160,6 +164,9 @@ public CommandProcessingResult
applyDelinquencyTagToLoan(Long loanId, JsonComman
if (delinquencyBucket != null) {
final CollectionData collectionData =
loanDelinquencyDomainService.getOverdueCollectionData(loan);
changes = lookUpDelinquencyRange(loan, delinquencyBucket,
collectionData.getDelinquentDays());
+ if (loan.isEnableInstallmentLevelDelinquency()) {
Review Comment:
Loan and installment delinquency calculation logic merged.
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyWritePlatformServiceImpl.java:
##########
@@ -382,4 +395,95 @@ public int compare(DelinquencyRange o1, DelinquencyRange
o2) {
return ranges;
}
+ private void applyDelinquencyDetailsForLoanInstallments(Loan loan,
DelinquencyBucket delinquencyBucket) {
+ for (LoanRepaymentScheduleInstallment installment :
loan.getRepaymentScheduleInstallments()) {
+ CollectionData installmentDelinquencyData =
loanDelinquencyDomainService.getInstallmentOverdueCollectionData(loan,
installment);
+ setInstallmentDelinquencyDetails(loan, installment,
delinquencyBucket, installmentDelinquencyData);
+ }
+ }
+
+ private void setInstallmentDelinquencyDetails(Loan loan,
LoanRepaymentScheduleInstallment installment,
+ DelinquencyBucket delinquencyBucket, CollectionData
installmentDelinquencyData) {
+ Long delinquencyRangeIdForInstallment =
getInstallmentDelinquencyRange(delinquencyBucket,
+ installmentDelinquencyData.getDelinquentDays());
+ setDelinquencyDetailsForInstallment(loan, installment,
installmentDelinquencyData, delinquencyRangeIdForInstallment);
+ }
+
+ private Long getInstallmentDelinquencyRange(DelinquencyBucket
delinquencyBucket, Long overDueDays) {
+ Long delinquencyRangeId = null;
+ if (overDueDays > 0) {
+ // Sort the ranges based on the minAgeDays
+ final List<DelinquencyRange> ranges =
sortDelinquencyRangesByMinAge(delinquencyBucket.getRanges());
+ for (final DelinquencyRange delinquencyRange : ranges) {
+ if (delinquencyRange.getMaximumAgeDays() == null) { // Last
Range in the Bucket
+ if (delinquencyRange.getMinimumAgeDays() <= overDueDays) {
+ delinquencyRangeId = delinquencyRange.getId();
+ break;
+ }
+ } else {
+ if (delinquencyRange.getMinimumAgeDays() <= overDueDays &&
delinquencyRange.getMaximumAgeDays() >= overDueDays) {
+ delinquencyRangeId = delinquencyRange.getId();
+ break;
+ }
+ }
+ }
+
+ }
+ return delinquencyRangeId;
+ }
+
+ private void setDelinquencyDetailsForInstallment(Loan loan,
LoanRepaymentScheduleInstallment installment,
+ CollectionData installmentDelinquencyData, Long
delinquencyRangeIdForInstallment) {
+ List<LoanInstallmentDelinquencyTag> installmentDelinquencyTags = new
ArrayList<>();
+ LocalDate delinquencyCalculationDate =
DateUtils.getBusinessLocalDate();
+
+ Optional<LoanInstallmentDelinquencyTag>
currentInstallmentDelinquencyTag = loanInstallmentDelinquencyTagRepository
+ .findByLoanAndInstallment(loan, installment);
+ LoanInstallmentDelinquencyTag previousInstallmentDelinquencyTag = null;
+ if (currentInstallmentDelinquencyTag.isPresent()) {
+ previousInstallmentDelinquencyTag =
currentInstallmentDelinquencyTag.get();
+ }
+
+ if (delinquencyRangeIdForInstallment == null) {
+ // if currentInstallmentDelinquencyTag exists and range is null,
installment is out of delinquency, delete
+ // delinquency details
+ if (previousInstallmentDelinquencyTag != null) {
+
loanInstallmentDelinquencyTagRepository.delete(previousInstallmentDelinquencyTag);
+ }
+ } else {
+ DelinquencyRange delinquencyRange =
repositoryRange.getReferenceById(delinquencyRangeIdForInstallment);
+ LoanInstallmentDelinquencyTag installmentDelinquency = null;
+ if (previousInstallmentDelinquencyTag != null) {
+ if
(!previousInstallmentDelinquencyTag.getDelinquencyRange().getId().equals(delinquencyRangeIdForInstallment))
{
+ // if current delinquency range exists and there is range
change, delete previous delinquency
+ // details and add new range details
+ installmentDelinquency = new
LoanInstallmentDelinquencyTag(delinquencyRange, loan, installment,
+ delinquencyCalculationDate, null,
previousInstallmentDelinquencyTag.getFirstOverdueDate(),
+ installmentDelinquencyData.getDelinquentAmount());
+
loanInstallmentDelinquencyTagRepository.delete(previousInstallmentDelinquencyTag);
+ }
+ } else {
+ // add new range, first time delinquent
+ installmentDelinquency = new
LoanInstallmentDelinquencyTag(delinquencyRange, loan, installment,
delinquencyCalculationDate,
+ null, installmentDelinquencyData.getDelinquentDate(),
installmentDelinquencyData.getDelinquentAmount());
+ }
+
+ if (installmentDelinquency != null) {
+ installmentDelinquencyTags.add(installmentDelinquency);
+ }
+
+ }
+
+ if (installmentDelinquencyTags.size() > 0) {
+
loanInstallmentDelinquencyTagRepository.saveAllAndFlush(installmentDelinquencyTags);
+ }
+
+ }
+
+ private void cleanLoanInstallmentsDelinquencyTags(Loan loan) {
+ List<LoanInstallmentDelinquencyTag> installmentDelinquencyTags =
loanInstallmentDelinquencyTagRepository.findByLoan(loan);
Review Comment:
done
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]