Skip to content

Commit 4279b8a

Browse files
authored
Merge pull request #5786
FINERACT-2455: WC - Re-name delinquency and breach configuration tables, step 1: remove DelinquencyBucket mapping and explicitly fetch WC minimum payment rule
2 parents d74cdc5 + 9e642ed commit 4279b8a

8 files changed

Lines changed: 71 additions & 66 deletions

File tree

fineract-core/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyBucket.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package org.apache.fineract.portfolio.delinquency.domain;
2020

21-
import jakarta.persistence.CascadeType;
2221
import jakarta.persistence.Column;
2322
import jakarta.persistence.Entity;
2423
import jakarta.persistence.EnumType;
@@ -27,7 +26,6 @@
2726
import jakarta.persistence.JoinColumn;
2827
import jakarta.persistence.JoinTable;
2928
import jakarta.persistence.ManyToMany;
30-
import jakarta.persistence.OneToOne;
3129
import jakarta.persistence.Table;
3230
import jakarta.persistence.UniqueConstraint;
3331
import jakarta.persistence.Version;
@@ -52,9 +50,6 @@ public class DelinquencyBucket extends AbstractAuditableWithUTCDateTimeCustom<Lo
5250
@JoinTable(name = "m_delinquency_bucket_mappings", joinColumns = @JoinColumn(name = "delinquency_bucket_id"), inverseJoinColumns = @JoinColumn(name = "delinquency_range_id"))
5351
private List<DelinquencyRange> ranges;
5452

55-
@OneToOne(mappedBy = "bucket", cascade = CascadeType.ALL, orphanRemoval = true)
56-
private DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule;
57-
5853
@Enumerated(EnumType.STRING)
5954
@Column(name = "bucket_type")
6055
private DelinquencyBucketType bucketType;

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyMinimumPaymentPeriodAndRuleRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919

2020
package org.apache.fineract.portfolio.delinquency.domain;
2121

22+
import java.util.Optional;
2223
import org.springframework.data.jpa.repository.JpaRepository;
2324
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
24-
import org.springframework.data.repository.CrudRepository;
2525

2626
public interface DelinquencyMinimumPaymentPeriodAndRuleRepository extends JpaRepository<DelinquencyMinimumPaymentPeriodAndRule, Long>,
27-
JpaSpecificationExecutor<DelinquencyMinimumPaymentPeriodAndRule>, CrudRepository<DelinquencyMinimumPaymentPeriodAndRule, Long> {
27+
JpaSpecificationExecutor<DelinquencyMinimumPaymentPeriodAndRule> {
2828

29+
Optional<DelinquencyMinimumPaymentPeriodAndRule> findByBucketId(Long bucketId);
2930
}

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyBucketMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket;
2525
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketType;
2626
import org.mapstruct.Mapper;
27+
import org.mapstruct.Mapping;
2728

2829
@Mapper(config = MapstructMapperConfig.class)
2930
public interface DelinquencyBucketMapper extends DelinquencyMinimumPaymentPeriodAndRuleMapper {
3031

32+
@Mapping(target = "minimumPaymentPeriodAndRule", ignore = true)
3133
DelinquencyBucketData map(DelinquencyBucket source);
3234

3335
List<DelinquencyBucketData> map(List<DelinquencyBucket> sources);

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformServiceImpl.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.apache.fineract.portfolio.delinquency.data.LoanInstallmentDelinquencyTagData;
4040
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket;
4141
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketRepository;
42+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketType;
43+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyMinimumPaymentPeriodAndRuleRepository;
4244
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyRange;
4345
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyRangeRepository;
4446
import org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyAction;
@@ -74,6 +76,7 @@ public class DelinquencyReadPlatformServiceImpl implements DelinquencyReadPlatfo
7476

7577
private final DelinquencyRangeRepository repositoryRange;
7678
private final DelinquencyBucketRepository repositoryBucket;
79+
private final DelinquencyMinimumPaymentPeriodAndRuleRepository minimumPaymentPeriodAndRuleRepository;
7780
private final LoanDelinquencyTagHistoryRepository repositoryLoanDelinquencyTagHistory;
7881
private final DelinquencyRangeMapper mapperRange;
7982
private final DelinquencyBucketMapper mapperBucket;
@@ -102,7 +105,9 @@ public DelinquencyRangeData retrieveDelinquencyRange(Long delinquencyRangeId) {
102105
@Override
103106
public List<DelinquencyBucketData> retrieveAllDelinquencyBuckets() {
104107
final List<DelinquencyBucket> delinquencyRangeList = repositoryBucket.findAll();
105-
return mapperBucket.map(delinquencyRangeList);
108+
final List<DelinquencyBucketData> result = mapperBucket.map(delinquencyRangeList);
109+
result.forEach(this::enrichWorkingCapitalConfiguration);
110+
return result;
106111
}
107112

108113
@Override
@@ -113,9 +118,17 @@ public DelinquencyBucketData retrieveDelinquencyBucket(Long delinquencyBucketId)
113118
final DelinquencyBucket delinquencyBucket = repositoryBucket.getReferenceById(delinquencyBucketId);
114119
final DelinquencyBucketData delinquencyBucketData = mapperBucket.map(delinquencyBucket);
115120
delinquencyBucketData.setRanges(mapperRange.map(delinquencyBucket.getRanges()));
121+
enrichWorkingCapitalConfiguration(delinquencyBucketData);
116122
return delinquencyBucketData;
117123
}
118124

125+
private void enrichWorkingCapitalConfiguration(DelinquencyBucketData bucketData) {
126+
if (bucketData != null && DelinquencyBucketType.WORKING_CAPITAL.equals(bucketData.getBucketType()) && bucketData.getId() != null) {
127+
minimumPaymentPeriodAndRuleRepository.findByBucketId(bucketData.getId())
128+
.ifPresent(rule -> bucketData.setMinimumPaymentPeriodAndRule(mapperBucket.map(rule)));
129+
}
130+
}
131+
119132
@Override
120133
public DelinquencyRangeData retrieveCurrentDelinquencyTag(Long loanId) {
121134
final Loan loan = this.loanRepository.getReferenceById(loanId);

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyWritePlatformServiceImpl.java

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.HashMap;
2424
import java.util.List;
2525
import java.util.Map;
26+
import java.util.Objects;
2627
import java.util.Optional;
2728
import lombok.RequiredArgsConstructor;
2829
import lombok.extern.slf4j.Slf4j;
@@ -31,6 +32,7 @@
3132
import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
3233
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
3334
import org.apache.fineract.infrastructure.core.service.DateUtils;
35+
import org.apache.fineract.infrastructure.core.service.MathUtil;
3436
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAccountDelinquencyPauseChangedBusinessEvent;
3537
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanDelinquencyRangeChangeBusinessEvent;
3638
import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
@@ -172,11 +174,8 @@ public CommandProcessingResult deleteDelinquencyBucket(Long delinquencyBucketId,
172174
"Data integrity issue with resource: " + delinquencyBucket.getId());
173175
}
174176

175-
// Explicitly handle the minimum payment period and rule relationship
176-
if (delinquencyBucket.getMinimumPaymentPeriodAndRule() != null) {
177-
DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = delinquencyBucket.getMinimumPaymentPeriodAndRule();
178-
delinquencyMinimumPaymentPeriodAndRuleRepository.delete(minimumPaymentPeriodAndRule);
179-
}
177+
delinquencyMinimumPaymentPeriodAndRuleRepository.findByBucketId(delinquencyBucket.getId())
178+
.ifPresent(delinquencyMinimumPaymentPeriodAndRuleRepository::delete);
180179

181180
repositoryBucket.delete(delinquencyBucket);
182181
} else {
@@ -375,18 +374,16 @@ private DelinquencyBucket createDelinquencyBucket(DelinquencyBucketData data, Ma
375374
if (delinquencyBucket.isEmpty()) {
376375
DelinquencyBucket newDelinquencyBucket = new DelinquencyBucket(data.getName());
377376
newDelinquencyBucket.setBucketType(data.getBucketType() != null ? data.getBucketType() : DelinquencyBucketType.REGULAR);
377+
repositoryBucket.saveAndFlush(newDelinquencyBucket);
378378
if (DelinquencyBucketType.WORKING_CAPITAL.equals(newDelinquencyBucket.getBucketType())) {
379-
newDelinquencyBucket.setMinimumPaymentPeriodAndRule(new DelinquencyMinimumPaymentPeriodAndRule());
380-
newDelinquencyBucket.getMinimumPaymentPeriodAndRule().setBucket(newDelinquencyBucket);
381-
newDelinquencyBucket.getMinimumPaymentPeriodAndRule().setFrequency(data.getMinimumPaymentPeriodAndRule().getFrequency());
382-
newDelinquencyBucket.getMinimumPaymentPeriodAndRule()
383-
.setMinimumPaymentType(data.getMinimumPaymentPeriodAndRule().getMinimumPaymentType());
384-
newDelinquencyBucket.getMinimumPaymentPeriodAndRule()
385-
.setFrequencyType(data.getMinimumPaymentPeriodAndRule().getFrequencyType());
386-
newDelinquencyBucket.getMinimumPaymentPeriodAndRule()
387-
.setMinimumPayment(data.getMinimumPaymentPeriodAndRule().getMinimumPayment());
379+
final DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = new DelinquencyMinimumPaymentPeriodAndRule();
380+
minimumPaymentPeriodAndRule.setBucket(newDelinquencyBucket);
381+
minimumPaymentPeriodAndRule.setFrequency(data.getMinimumPaymentPeriodAndRule().getFrequency());
382+
minimumPaymentPeriodAndRule.setMinimumPaymentType(data.getMinimumPaymentPeriodAndRule().getMinimumPaymentType());
383+
minimumPaymentPeriodAndRule.setFrequencyType(data.getMinimumPaymentPeriodAndRule().getFrequencyType());
384+
minimumPaymentPeriodAndRule.setMinimumPayment(data.getMinimumPaymentPeriodAndRule().getMinimumPayment());
385+
delinquencyMinimumPaymentPeriodAndRuleRepository.save(minimumPaymentPeriodAndRule);
388386
}
389-
repositoryBucket.save(newDelinquencyBucket);
390387

391388
setDelinquencyBucketMappings(newDelinquencyBucket, data);
392389
return newDelinquencyBucket;
@@ -411,46 +408,37 @@ private DelinquencyBucket updateDelinquencyBucket(DelinquencyBucket delinquencyB
411408
changes.put(DelinquencyApiConstants.BUCKET_TYPE_PARAM_NAME, data.getBucketType());
412409
delinquencyBucket.setBucketType(data.getBucketType());
413410
}
411+
final Optional<DelinquencyMinimumPaymentPeriodAndRule> existingRule = delinquencyMinimumPaymentPeriodAndRuleRepository
412+
.findByBucketId(delinquencyBucket.getId());
414413
if (delinquencyBucket.getBucketType().equals(DelinquencyBucketType.WORKING_CAPITAL)) {
415-
if (delinquencyBucket.getMinimumPaymentPeriodAndRule() == null) {
416-
delinquencyBucket.setMinimumPaymentPeriodAndRule(new DelinquencyMinimumPaymentPeriodAndRule());
417-
delinquencyBucket.getMinimumPaymentPeriodAndRule().setBucket(delinquencyBucket);
414+
DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = existingRule.orElse(null);
415+
if (minimumPaymentPeriodAndRule == null) {
416+
minimumPaymentPeriodAndRule = new DelinquencyMinimumPaymentPeriodAndRule();
417+
minimumPaymentPeriodAndRule.setBucket(delinquencyBucket);
418418
}
419-
if (!data.getMinimumPaymentPeriodAndRule().getFrequency()
420-
.equals(delinquencyBucket.getMinimumPaymentPeriodAndRule().getFrequency())) {
421-
delinquencyBucket.getMinimumPaymentPeriodAndRule().setFrequency(data.getMinimumPaymentPeriodAndRule().getFrequency());
422-
changes.put(DelinquencyApiConstants.FREQUENCY_PARAM_NAME,
423-
delinquencyBucket.getMinimumPaymentPeriodAndRule().getFrequency());
419+
if (!Objects.equals(data.getMinimumPaymentPeriodAndRule().getFrequency(), minimumPaymentPeriodAndRule.getFrequency())) {
420+
minimumPaymentPeriodAndRule.setFrequency(data.getMinimumPaymentPeriodAndRule().getFrequency());
421+
changes.put(DelinquencyApiConstants.FREQUENCY_PARAM_NAME, minimumPaymentPeriodAndRule.getFrequency());
424422
}
425-
if (!data.getMinimumPaymentPeriodAndRule().getFrequencyType()
426-
.equals(delinquencyBucket.getMinimumPaymentPeriodAndRule().getFrequencyType())) {
427-
delinquencyBucket.getMinimumPaymentPeriodAndRule()
428-
.setFrequencyType(data.getMinimumPaymentPeriodAndRule().getFrequencyType());
429-
changes.put(DelinquencyApiConstants.FREQUENCY_TYPE_PARAM_NAME,
430-
delinquencyBucket.getMinimumPaymentPeriodAndRule().getFrequencyType());
423+
if (!Objects.equals(data.getMinimumPaymentPeriodAndRule().getFrequencyType(), minimumPaymentPeriodAndRule.getFrequencyType())) {
424+
minimumPaymentPeriodAndRule.setFrequencyType(data.getMinimumPaymentPeriodAndRule().getFrequencyType());
425+
changes.put(DelinquencyApiConstants.FREQUENCY_TYPE_PARAM_NAME, minimumPaymentPeriodAndRule.getFrequencyType());
431426
}
432-
if (!data.getMinimumPaymentPeriodAndRule().getMinimumPaymentType()
433-
.equals(delinquencyBucket.getMinimumPaymentPeriodAndRule().getMinimumPaymentType())) {
434-
changes.put(DelinquencyApiConstants.MINIMUM_PAYMENT_TYPE_PARAM_NAME,
435-
delinquencyBucket.getMinimumPaymentPeriodAndRule().getMinimumPaymentType());
436-
delinquencyBucket.getMinimumPaymentPeriodAndRule()
437-
.setMinimumPaymentType(data.getMinimumPaymentPeriodAndRule().getMinimumPaymentType());
427+
if (!Objects.equals(data.getMinimumPaymentPeriodAndRule().getMinimumPaymentType(),
428+
minimumPaymentPeriodAndRule.getMinimumPaymentType())) {
429+
changes.put(DelinquencyApiConstants.MINIMUM_PAYMENT_TYPE_PARAM_NAME, minimumPaymentPeriodAndRule.getMinimumPaymentType());
430+
minimumPaymentPeriodAndRule.setMinimumPaymentType(data.getMinimumPaymentPeriodAndRule().getMinimumPaymentType());
438431
}
439-
if (data.getMinimumPaymentPeriodAndRule().getMinimumPayment()
440-
.compareTo(delinquencyBucket.getMinimumPaymentPeriodAndRule().getMinimumPayment()) != 0) {
441-
changes.put(DelinquencyApiConstants.MINIMUM_PAYMENT_PARAM_NAME,
442-
delinquencyBucket.getMinimumPaymentPeriodAndRule().getMinimumPayment());
443-
delinquencyBucket.getMinimumPaymentPeriodAndRule()
444-
.setMinimumPayment(data.getMinimumPaymentPeriodAndRule().getMinimumPayment());
432+
if (!MathUtil.isEqualTo(data.getMinimumPaymentPeriodAndRule().getMinimumPayment(),
433+
minimumPaymentPeriodAndRule.getMinimumPayment())) {
434+
changes.put(DelinquencyApiConstants.MINIMUM_PAYMENT_PARAM_NAME, minimumPaymentPeriodAndRule.getMinimumPayment());
435+
minimumPaymentPeriodAndRule.setMinimumPayment(data.getMinimumPaymentPeriodAndRule().getMinimumPayment());
445436
}
437+
delinquencyMinimumPaymentPeriodAndRuleRepository.save(minimumPaymentPeriodAndRule);
446438
} else {
447-
if (delinquencyBucket.getMinimumPaymentPeriodAndRule() != null) {
439+
if (existingRule.isPresent()) {
448440
changes.put(DelinquencyApiConstants.MINIMUM_PAYMENT_PERIOD_AND_RULE_PARAM_NAME, null);
449-
DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = delinquencyBucket.getMinimumPaymentPeriodAndRule();
450-
minimumPaymentPeriodAndRule.setBucket(null);
451-
delinquencyBucket.setMinimumPaymentPeriodAndRule(null);
452-
delinquencyMinimumPaymentPeriodAndRuleRepository.save(minimumPaymentPeriodAndRule);
453-
delinquencyMinimumPaymentPeriodAndRuleRepository.delete(minimumPaymentPeriodAndRule);
441+
delinquencyMinimumPaymentPeriodAndRuleRepository.delete(existingRule.get());
454442
}
455443
}
456444
if (!changes.isEmpty()) {

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/starter/DelinquencyConfiguration.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,19 @@ public class DelinquencyConfiguration {
5858
@ConditionalOnMissingBean(DelinquencyReadPlatformService.class)
5959
public DelinquencyReadPlatformService delinquencyReadPlatformService(DelinquencyRangeRepository repositoryRange,
6060
DelinquencyBucketRepository repositoryBucket, LoanDelinquencyTagHistoryRepository repositoryLoanDelinquencyTagHistory,
61-
DelinquencyRangeMapper mapperRange, DelinquencyBucketMapper mapperBucket,
62-
LoanDelinquencyTagMapper mapperLoanDelinquencyTagHistory, LoanRepository loanRepository,
61+
DelinquencyMinimumPaymentPeriodAndRuleRepository minimumPaymentPeriodAndRuleRepository, DelinquencyRangeMapper mapperRange,
62+
DelinquencyBucketMapper mapperBucket, LoanDelinquencyTagMapper mapperLoanDelinquencyTagHistory, LoanRepository loanRepository,
6363
LoanDelinquencyDomainService loanDelinquencyDomainService,
6464
LoanInstallmentDelinquencyTagRepository repositoryLoanInstallmentDelinquencyTag,
6565
LoanDelinquencyActionRepository loanDelinquencyActionRepository,
6666
DelinquencyEffectivePauseHelper delinquencyEffectivePauseHelper, ConfigurationDomainService configurationDomainService,
6767
LoanTransactionRepository loanTransactionRepository,
6868
PossibleNextRepaymentCalculationServiceDiscovery possibleNextRepaymentCalculationService) {
69-
return new DelinquencyReadPlatformServiceImpl(repositoryRange, repositoryBucket, repositoryLoanDelinquencyTagHistory, mapperRange,
70-
mapperBucket, mapperLoanDelinquencyTagHistory, loanRepository, loanDelinquencyDomainService,
71-
repositoryLoanInstallmentDelinquencyTag, loanDelinquencyActionRepository, delinquencyEffectivePauseHelper,
72-
configurationDomainService, loanTransactionRepository, possibleNextRepaymentCalculationService);
69+
return new DelinquencyReadPlatformServiceImpl(repositoryRange, repositoryBucket, minimumPaymentPeriodAndRuleRepository,
70+
repositoryLoanDelinquencyTagHistory, mapperRange, mapperBucket, mapperLoanDelinquencyTagHistory, loanRepository,
71+
loanDelinquencyDomainService, repositoryLoanInstallmentDelinquencyTag, loanDelinquencyActionRepository,
72+
delinquencyEffectivePauseHelper, configurationDomainService, loanTransactionRepository,
73+
possibleNextRepaymentCalculationService);
7374
}
7475

7576
@Bean

0 commit comments

Comments
 (0)