Skip to content

Commit de76a07

Browse files
committed
FINERACT-2455: working capital delinquency managament range schedule
1 parent dd46316 commit de76a07

25 files changed

Lines changed: 1010 additions & 9 deletions

File tree

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import jakarta.persistence.Column;
2222
import jakarta.persistence.Entity;
23-
import jakarta.persistence.Enumerated;
2423
import jakarta.persistence.FetchType;
2524
import jakarta.persistence.JoinColumn;
2625
import jakarta.persistence.JoinTable;
@@ -50,10 +49,9 @@ public class DelinquencyBucket extends AbstractAuditableWithUTCDateTimeCustom<Lo
5049
@JoinTable(name = "m_delinquency_bucket_mappings", joinColumns = @JoinColumn(name = "delinquency_bucket_id"), inverseJoinColumns = @JoinColumn(name = "delinquency_range_id"))
5150
private List<DelinquencyRange> ranges;
5251

53-
@OneToOne(mappedBy = "bucket", fetch = FetchType.LAZY)
52+
@OneToOne(mappedBy = "bucket", fetch = FetchType.LAZY, cascade = jakarta.persistence.CascadeType.ALL, orphanRemoval = true)
5453
private DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule;
5554

56-
@Enumerated
5755
@Column(name = "bucket_type")
5856
private DelinquencyBucketType bucketType;
5957

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import jakarta.persistence.OneToOne;
2727
import jakarta.persistence.Table;
2828
import java.io.Serial;
29+
import java.math.BigDecimal;
2930
import lombok.Getter;
3031
import lombok.NoArgsConstructor;
3132
import lombok.Setter;
@@ -53,4 +54,7 @@ public class DelinquencyMinimumPaymentPeriodAndRule extends AbstractAuditableWit
5354

5455
@Column(name = "minimum_payment", nullable = false)
5556
private DelinquencyMinimumPayment minimumPayment;
57+
58+
@Column(name = "minimum_payment_value", scale = 6, precision = 19)
59+
private BigDecimal minimumPaymentValue;
5660
}

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/api/DelinquencyApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ private DelinquencyApiConstants() {
3030
public static final String FREQUENCY_PARAM_NAME = "frequency";
3131
public static final String FREQUENCY_TYPE_PARAM_NAME = "frequencyType";
3232
public static final String MINIMUM_PAYMENT_PARAM_NAME = "minimumPayment";
33+
public static final String MINIMUM_PAYMENT_VALUE_PARAM_NAME = "minimumPaymentValue";
3334
public static final String CLASSIFICATION_PARAM_NAME = "classification";
3435
public static final String RANGES_PARAM_NAME = "ranges";
3536
public static final String MINIMUMAGEDAYS_PARAM_NAME = "minimumAgeDays";

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/api/DelinquencyBucketRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class DelinquencyBucketRequest implements Serializable {
3535

3636
private String name;
3737
private List<Long> ranges;
38-
private String type;
38+
private Long bucketType;
3939
private MinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule;
4040

4141
@Setter
@@ -49,5 +49,6 @@ public static class MinimumPaymentPeriodAndRule implements Serializable {
4949
private Long frequency;
5050
private Long frequencyType;
5151
private Long minimumPayment;
52+
private java.math.BigDecimal minimumPaymentValue;
5253
}
5354
}

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/data/DelinquencyMinimumPaymentPeriodAndRuleData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

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

22+
import java.math.BigDecimal;
2223
import lombok.AllArgsConstructor;
2324
import lombok.Getter;
2425
import lombok.Setter;
@@ -33,4 +34,5 @@ public class DelinquencyMinimumPaymentPeriodAndRuleData {
3334
private Long frequency;
3435
private Integer frequencyType;
3536
private Long minimumPayment;
37+
private BigDecimal minimumPaymentValue;
3638
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketMappingsRepository;
4444
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketRepository;
4545
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketType;
46+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyFrequencyType;
47+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyMinimumPayment;
48+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyMinimumPaymentPeriodAndRule;
49+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyMinimumPaymentPeriodAndRuleRepository;
4650
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyRange;
4751
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyRangeRepository;
4852
import org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyAction;
@@ -85,6 +89,7 @@ public class DelinquencyWritePlatformServiceImpl implements DelinquencyWritePlat
8589
private final DelinquencyEffectivePauseHelper delinquencyEffectivePauseHelper;
8690
private final BusinessEventNotifierService businessEventNotifierService;
8791
private final DelinquencyWritePlatformServiceHelper delinquencyHelper;
92+
private final DelinquencyMinimumPaymentPeriodAndRuleRepository minimumPaymentPeriodAndRuleRepository;
8893

8994
@Override
9095
public CommandProcessingResult createDelinquencyRange(JsonCommand command) {
@@ -339,6 +344,7 @@ private DelinquencyBucket createDelinquencyBucket(DelinquencyBucketData data, Ma
339344

340345
if (delinquencyBucket.isEmpty()) {
341346
DelinquencyBucket newDelinquencyBucket = new DelinquencyBucket(data.getName());
347+
newDelinquencyBucket.setBucketType(DelinquencyBucketType.fromLong(data.getBucketType()));
342348
repositoryBucket.save(newDelinquencyBucket);
343349
setDelinquencyBucketMappings(newDelinquencyBucket, data);
344350
return newDelinquencyBucket;
@@ -365,6 +371,7 @@ private void setDelinquencyBucketMappings(DelinquencyBucket delinquencyBucket, D
365371
List<Long> rangeIds = new ArrayList<>();
366372
data.getRanges().forEach(dataRange -> rangeIds.add(dataRange.getId()));
367373
delinquencyBucket.setBucketType(DelinquencyBucketType.fromLong(data.getBucketType()));
374+
repositoryBucket.save(delinquencyBucket);
368375
List<DelinquencyRange> ranges = repositoryRange.findAllById(rangeIds);
369376
validateDelinquencyRanges(ranges);
370377
List<DelinquencyBucketMappings> bucketMappings = repositoryBucketMappings.findByDelinquencyBucket(delinquencyBucket);
@@ -374,6 +381,22 @@ private void setDelinquencyBucketMappings(DelinquencyBucket delinquencyBucket, D
374381
bucketMappings.add(DelinquencyBucketMappings.instance(delinquencyBucket, delinquencyRange));
375382
}
376383
repositoryBucketMappings.saveAllAndFlush(bucketMappings);
384+
setMinimumPaymentPeriodAndRule(delinquencyBucket, data);
385+
}
386+
387+
private void setMinimumPaymentPeriodAndRule(DelinquencyBucket delinquencyBucket, DelinquencyBucketData data) {
388+
if (data.getMinimumPaymentPeriodAndRule() != null) {
389+
DelinquencyMinimumPaymentPeriodAndRule rule = delinquencyBucket.getMinimumPaymentPeriodAndRule();
390+
if (rule == null) {
391+
rule = new DelinquencyMinimumPaymentPeriodAndRule();
392+
delinquencyBucket.setMinimumPaymentRule(rule);
393+
}
394+
rule.setFrequency(data.getMinimumPaymentPeriodAndRule().getFrequency());
395+
rule.setFrequencyType(DelinquencyFrequencyType.fromInt(data.getMinimumPaymentPeriodAndRule().getFrequencyType()));
396+
rule.setMinimumPayment(DelinquencyMinimumPayment.fromLong(data.getMinimumPaymentPeriodAndRule().getMinimumPayment()));
397+
rule.setMinimumPaymentValue(data.getMinimumPaymentPeriodAndRule().getMinimumPaymentValue());
398+
minimumPaymentPeriodAndRuleRepository.saveAndFlush(rule);
399+
}
377400
}
378401

379402
private void validateDelinquencyRanges(List<DelinquencyRange> ranges) {

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
2323
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketMappingsRepository;
2424
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucketRepository;
25+
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyMinimumPaymentPeriodAndRuleRepository;
2526
import org.apache.fineract.portfolio.delinquency.domain.DelinquencyRangeRepository;
2627
import org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyActionRepository;
2728
import org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyTagHistoryRepository;
@@ -83,12 +84,13 @@ public DelinquencyWritePlatformService delinquencyWritePlatformService(Delinquen
8384
DelinquencyReadPlatformService delinquencyReadPlatformService, LoanDelinquencyActionRepository loanDelinquencyActionRepository,
8485
DelinquencyActionParseAndValidator delinquencyActionParseAndValidator,
8586
DelinquencyEffectivePauseHelper delinquencyEffectivePauseHelper,
86-
DelinquencyWritePlatformServiceHelper delinquencyWritePlatformServiceHelper) {
87+
DelinquencyWritePlatformServiceHelper delinquencyWritePlatformServiceHelper,
88+
DelinquencyMinimumPaymentPeriodAndRuleRepository minimumPaymentPeriodAndRuleRepository) {
8789
return new DelinquencyWritePlatformServiceImpl(dataValidatorBucket, dataValidatorRange, repositoryRange, repositoryBucket,
8890
repositoryBucketMappings, loanDelinquencyTagRepository, loanRepository, loanProductRepository, loanDelinquencyDomainService,
8991
loanInstallmentDelinquencyTagRepository, delinquencyReadPlatformService, loanDelinquencyActionRepository,
9092
delinquencyActionParseAndValidator, delinquencyEffectivePauseHelper, businessEventNotifierService,
91-
delinquencyWritePlatformServiceHelper);
93+
delinquencyWritePlatformServiceHelper, minimumPaymentPeriodAndRuleRepository);
9294
}
9395

9496
@Bean

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyBucketParseAndValidator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import com.google.gson.JsonObject;
2222
import jakarta.validation.constraints.NotNull;
23+
import java.math.BigDecimal;
2324
import java.util.ArrayList;
2425
import java.util.List;
2526
import lombok.RequiredArgsConstructor;
@@ -109,7 +110,12 @@ private DelinquencyMinimumPaymentPeriodAndRuleData validateAndParseUpdateMinimum
109110
dataValidator.reset().parameter(DelinquencyApiConstants.MINIMUM_PAYMENT_PARAM_NAME).value(minimumPayment).notNull()
110111
.inMinMaxRange(1, 2);
111112

112-
return new DelinquencyMinimumPaymentPeriodAndRuleData(frequency, frequencyType, minimumPayment);
113+
BigDecimal minimumPaymentValue = jsonHelper
114+
.extractBigDecimalWithLocaleNamed(DelinquencyApiConstants.MINIMUM_PAYMENT_VALUE_PARAM_NAME, element);
115+
dataValidator.reset().parameter(DelinquencyApiConstants.MINIMUM_PAYMENT_VALUE_PARAM_NAME).value(minimumPaymentValue).notNull()
116+
.positiveAmount();
117+
118+
return new DelinquencyMinimumPaymentPeriodAndRuleData(frequency, frequencyType, minimumPayment, minimumPaymentValue);
113119
}
114120
return null;
115121
}

fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,5 @@
238238
<include file="parts/0217_force_withdrawal_configs.xml" relativeToChangelogFile="true" />
239239
<include file="parts/0218_standardize_character_set_and_collation.xml" relativeToChangelogFile="true" />
240240
<include file="parts/0219_delinquency_for_working_capital_loans.xml" relativeToChangelogFile="true" />
241+
<include file="parts/0220_add_minimum_payment_value.xml" relativeToChangelogFile="true" />
241242
</databaseChangeLog>

fineract-provider/src/main/resources/db/changelog/tenant/parts/0219_delinquency_for_working_capital_loans.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
<createTable tableName="m_delinquency_payment_rule">
3737

38-
<column name="id" type="BIGINT">
38+
<column name="id" type="BIGINT" autoIncrement="true">
3939
<constraints primaryKey="true"
4040
primaryKeyName="pk_m_delinquency_payment_rule"
4141
nullable="false"/>

0 commit comments

Comments
 (0)