Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -736,47 +736,47 @@ public CommandWrapperBuilder deleteWorkingCapitalLoanProduct(final Long productI
return this;
}

public CommandWrapperBuilder createWorkingCapitalBreach() {
public CommandWrapperBuilder createWorkingCapitalLoanBreach() {
this.actionName = "CREATE";
this.entityName = "WORKINGCAPITALBREACH";
this.entityId = null;
this.href = "/working-capital-breach/breaches";
return this;
}

public CommandWrapperBuilder updateWorkingCapitalBreach(final Long breachId) {
public CommandWrapperBuilder updateWorkingCapitalLoanBreach(final Long breachId) {
this.actionName = "UPDATE";
this.entityName = "WORKINGCAPITALBREACH";
this.entityId = breachId;
this.href = "/working-capital-breach/breaches/" + breachId;
return this;
}

public CommandWrapperBuilder deleteWorkingCapitalBreach(final Long breachId) {
public CommandWrapperBuilder deleteWorkingCapitalLoanBreach(final Long breachId) {
this.actionName = "DELETE";
this.entityName = "WORKINGCAPITALBREACH";
this.entityId = breachId;
this.href = "/working-capital-breach/breaches/" + breachId;
return this;
}

public CommandWrapperBuilder createWorkingCapitalNearBreach() {
public CommandWrapperBuilder createWorkingCapitalLoanNearBreach() {
this.actionName = "CREATE";
this.entityName = "WORKINGCAPITALNEARBREACH";
this.entityId = null;
this.href = "/working-capital/near-breach";
return this;
}

public CommandWrapperBuilder updateWorkingCapitalNearBreach(final Long breachId) {
public CommandWrapperBuilder updateWorkingCapitalLoanNearBreach(final Long breachId) {
this.actionName = "UPDATE";
this.entityName = "WORKINGCAPITALNEARBREACH";
this.entityId = breachId;
this.href = "/working-capital/near-breach/" + breachId;
return this;
}

public CommandWrapperBuilder deleteWorkingCapitalNearBreach(final Long breachId) {
public CommandWrapperBuilder deleteWorkingCapitalLoanNearBreach(final Long breachId) {
this.actionName = "DELETE";
this.entityName = "WORKINGCAPITALNEARBREACH";
this.entityId = breachId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

@Getter
@RequiredArgsConstructor
public enum WorkingCapitalBreachCalculationType {
public enum WorkingCapitalLoanBreachCalculationType {

FLAT(0L, "FLAT", "Flat"), //
PERCENTAGE(1L, "PERCENTAGE", "Percentage"); //
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

@Getter
@RequiredArgsConstructor
public enum WorkingCapitalBreachFrequencyType {
public enum WorkingCapitalLoanBreachFrequencyType {

DAYS(0L, "DAYS", "Days"), //
MONTHS(1L, "MONTHS", "Months"), //
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,19 @@
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest.AccountingRuleEnum;
import org.apache.fineract.client.models.PostWorkingCapitalLoanTransactionsRequest;
import org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
import org.apache.fineract.client.models.WorkingCapitalBreachData;
import org.apache.fineract.client.models.WorkingCapitalBreachRequest;
import org.apache.fineract.client.models.WorkingCapitalNearBreachData;
import org.apache.fineract.client.models.WorkingCapitalNearBreachRequest;
import org.apache.fineract.client.models.WorkingCapitalLoanBreachData;
import org.apache.fineract.client.models.WorkingCapitalLoanBreachRequest;
import org.apache.fineract.client.models.WorkingCapitalLoanNearBreachData;
import org.apache.fineract.client.models.WorkingCapitalLoanNearBreachRequest;
import org.apache.fineract.test.data.DelinquencyBucket;
import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
import org.apache.fineract.test.data.accounttype.DefaultAccountType;
import org.apache.fineract.test.data.delinquency.DelinquencyBucketResolver;
import org.apache.fineract.test.data.delinquency.DelinquencyBucketType;
import org.apache.fineract.test.data.delinquency.DelinquencyFrequencyType;
import org.apache.fineract.test.data.delinquency.DelinquencyMinimumPayment;
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalBreachCalculationType;
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalBreachFrequencyType;
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalLoanBreachCalculationType;
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalLoanBreachFrequencyType;
import org.apache.fineract.test.helper.Utils;
import org.springframework.stereotype.Component;

Expand All @@ -79,12 +79,12 @@ public class WorkingCapitalRequestFactory {
public static final String IN_ADVANCE_PRINCIPAL = "IN_ADVANCE_PRINCIPAL";

public static final Integer DEFAULT_WC_BREACH_FREQUENCY = 2;
public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = WorkingCapitalBreachFrequencyType.MONTHS.getCode();
public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = WorkingCapitalBreachCalculationType.PERCENTAGE.getCode();
public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = WorkingCapitalLoanBreachFrequencyType.MONTHS.getCode();
public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = WorkingCapitalLoanBreachCalculationType.PERCENTAGE.getCode();
public static final BigDecimal DEFAULT_WC_BREACH_AMOUNT = new BigDecimal("1.23");
public static final String DEFAULT_WC_BREACH_NAME_PREFIX = "WCB-";
public static final Integer DEFAULT_WC_NEAR_BREACH_FREQUENCY = 12;
public static final String DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE = WorkingCapitalBreachFrequencyType.DAYS.getCode();
public static final String DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE = WorkingCapitalLoanBreachFrequencyType.DAYS.getCode();
public static final BigDecimal DEFAULT_WC_NEAR_BREACH_THRESHOLD = new BigDecimal("70.23");

public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequestWithAccrualAccounting() {
Expand Down Expand Up @@ -284,17 +284,17 @@ public DelinquencyBucketRequest defaultWorkingCapitalDelinquencyBucketRequest()
.minimumPayment(new BigDecimal("1.23")));
}

public WorkingCapitalBreachRequest defaultWorkingCapitalBreachRequest() {
return new WorkingCapitalBreachRequest() //
public WorkingCapitalLoanBreachRequest defaultWorkingCapitalLoanBreachRequest() {
return new WorkingCapitalLoanBreachRequest() //
.name(Utils.randomStringGenerator(DEFAULT_WC_BREACH_NAME_PREFIX, 12)) //
.breachFrequency(DEFAULT_WC_BREACH_FREQUENCY) //
.breachFrequencyType(DEFAULT_WC_BREACH_FREQUENCY_TYPE) //
.breachAmountCalculationType(DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE) //
.breachAmount(DEFAULT_WC_BREACH_AMOUNT);
}

public WorkingCapitalNearBreachRequest defaultWorkingCapitalNearBreachRequest() {
return new WorkingCapitalNearBreachRequest() //
public WorkingCapitalLoanNearBreachRequest defaultWorkingCapitalLoanNearBreachRequest() {
return new WorkingCapitalLoanNearBreachRequest() //
.nearBreachName("NearBreach-WCL-" + Utils.randomStringGenerator(8)) //
.nearBreachFrequency(DEFAULT_WC_NEAR_BREACH_FREQUENCY) //
.nearBreachFrequencyType(DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE) //
Expand All @@ -309,22 +309,23 @@ public PostWorkingCapitalLoanTransactionsRequest defaultWorkingCapitalLoanRepaym

private Long getWCBreachIdByName(String breachName) {
try {
List<WorkingCapitalBreachData> breaches = fineractClient.workingCapitalBreaches().retrieveAllWorkingCapitalBreaches(Map.of());
return breaches.stream().filter(b -> breachName.equals(b.getName())).findFirst().map(WorkingCapitalBreachData::getId)
List<WorkingCapitalLoanBreachData> breaches = fineractClient.workingCapitalBreaches()
.retrieveAllWorkingCapitalLoanBreaches(Map.of());
return breaches.stream().filter(b -> breachName.equals(b.getName())).findFirst().map(WorkingCapitalLoanBreachData::getId)
.orElseThrow(() -> new RuntimeException("Working Capital Breach not found with name: " + breachName));
} catch (Exception e) {
throw new RuntimeException("Failed to fetch Working Capital Breacht by name: " + breachName, e);
throw new RuntimeException("Failed to fetch Working Capital Breach by name: " + breachName, e);
}
}

private Long getWCNearBreachIdByName(String breachName) {
try {
List<WorkingCapitalNearBreachData> breaches = fineractClient.workingCapitalNearBreaches()
.retrieveAllWorkingCapitalNearBreaches(Map.of());
return breaches.stream().filter(b -> breachName.equals(b.getName())).findFirst().map(WorkingCapitalNearBreachData::getId)
List<WorkingCapitalLoanNearBreachData> breaches = fineractClient.workingCapitalNearBreaches()
.retrieveAllWorkingCapitalLoanNearBreaches(Map.of());
return breaches.stream().filter(b -> breachName.equals(b.getName())).findFirst().map(WorkingCapitalLoanNearBreachData::getId)
.orElseThrow(() -> new RuntimeException("Working Capital Breach not found with name: " + breachName));
} catch (Exception e) {
throw new RuntimeException("Failed to fetch Working Capital Breacht by name: " + breachName, e);
throw new RuntimeException("Failed to fetch Working Capital Breach by name: " + breachName, e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
import org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
import org.apache.fineract.client.models.WorkingCapitalLoanPaymentChannelToFundSourceMappings;
import org.apache.fineract.client.models.WorkingCapitalLoanPostChargeOffReasonToExpenseAccountMappings;
import org.apache.fineract.client.models.WorkingCapitalLoanPostWriteOffReasonToExpenseAccountMappings;
import org.apache.fineract.client.models.WorkingCapitalLoanProductChargeToGLAccountMapper;
import org.apache.fineract.client.models.WorkingCapitalPostChargeOffReasonToExpenseAccountMappings;
import org.apache.fineract.client.models.WorkingCapitalPostWriteOffReasonToExpenseAccountMappings;
import org.apache.fineract.test.data.ChargeCalculationType;
import org.apache.fineract.test.data.ChargePaymentMode;
import org.apache.fineract.test.data.ChargeTimeType;
Expand Down Expand Up @@ -100,8 +100,8 @@ private static AdvancedAccountingExpectation prepareAdvancedMappingsInternal(fin
final Consumer<List<WorkingCapitalLoanPaymentChannelToFundSourceMappings>> setPaymentChannelMappings,
final Consumer<List<WorkingCapitalLoanProductChargeToGLAccountMapper>> setFeeMappings,
final Consumer<List<WorkingCapitalLoanProductChargeToGLAccountMapper>> setPenaltyMappings,
final Consumer<List<WorkingCapitalPostChargeOffReasonToExpenseAccountMappings>> setChargeOffMappings,
final Consumer<List<WorkingCapitalPostWriteOffReasonToExpenseAccountMappings>> setWriteOffMappings,
final Consumer<List<WorkingCapitalLoanPostChargeOffReasonToExpenseAccountMappings>> setChargeOffMappings,
final Consumer<List<WorkingCapitalLoanPostWriteOffReasonToExpenseAccountMappings>> setWriteOffMappings,
final PaymentTypeResolver paymentTypeResolver, final FineractFeignClient fineractFeignClient) {
final Long fundSourceAccountId = resolveOrCreateGLAccount(fineractFeignClient, "WC E2E Mapping Fund Source", "WCE2EFS1",
GLAType.ASSET.value);
Expand Down Expand Up @@ -129,9 +129,9 @@ private static AdvancedAccountingExpectation prepareAdvancedMappingsInternal(fin
List.of(new WorkingCapitalLoanProductChargeToGLAccountMapper().chargeId(feeChargeId).incomeAccountId(feeIncomeAccountId)));
setPenaltyMappings.accept(List.of(
new WorkingCapitalLoanProductChargeToGLAccountMapper().chargeId(penaltyChargeId).incomeAccountId(penaltyIncomeAccountId)));
setChargeOffMappings.accept(List.of(new WorkingCapitalPostChargeOffReasonToExpenseAccountMappings()
setChargeOffMappings.accept(List.of(new WorkingCapitalLoanPostChargeOffReasonToExpenseAccountMappings()
.chargeOffReasonCodeValueId(chargeOffReasonId).expenseAccountId(writeOffExpenseAccountId)));
setWriteOffMappings.accept(List.of(new WorkingCapitalPostWriteOffReasonToExpenseAccountMappings()
setWriteOffMappings.accept(List.of(new WorkingCapitalLoanPostWriteOffReasonToExpenseAccountMappings()
.writeOffReasonCodeValueId(writeOffReasonId).expenseAccountId(writeOffExpenseAccountId)));

return buildExpectation(paymentTypeId, fundSourceAccountId, feeChargeId, feeIncomeAccountId, penaltyChargeId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
import org.apache.fineract.test.initializer.scenario.FineractScenarioInitializerStep;
import org.apache.fineract.test.initializer.suite.FineractSuiteInitializerStep;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.annotation.Order;

@Slf4j
@RequiredArgsConstructor
@Order()
public class FineractInitializer implements InitializingBean {

public static final String DATE_FORMAT = "dd MMMM yyyy";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@
import org.apache.fineract.client.models.PostLoansLoanIdResponse;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse;
import org.apache.fineract.client.models.PostLoansResponse;
import org.apache.fineract.client.models.WorkingCapitalCollection;
import org.apache.fineract.client.models.WorkingCapitalCollectionDelinquencyPausePeriod;
import org.apache.fineract.client.models.WorkingCapitalCollectionRangeScheduleDelinquency;
import org.apache.fineract.client.models.WorkingCapitalLoanCollection;
import org.apache.fineract.client.models.WorkingCapitalLoanCollectionDelinquencyPausePeriod;
import org.apache.fineract.client.models.WorkingCapitalLoanCollectionRangeScheduleDelinquency;
import org.apache.fineract.test.data.AssetExternalizationTransferStatus;
import org.apache.fineract.test.data.AssetExternalizationTransferStatusReason;
import org.apache.fineract.test.data.TransactionType;
Expand Down Expand Up @@ -753,7 +753,7 @@ public void workingCapitalLoanDelinquencyRangeChangeEventCheck(final Long loanId
assertWorkingCapitalLoanAccountData(event, body);

final WorkingCapitalLoanCollectionDataV1 eventDelinquent = event.getDelinquent();
final WorkingCapitalCollection bodyDelinquent = body.getDelinquent();
final WorkingCapitalLoanCollection bodyDelinquent = body.getDelinquent();
assertThat(eventDelinquent).isNotNull();
assertThat(bodyDelinquent).isNotNull();
assertAmountEquals("delinquent.delinquentAmount", eventDelinquent.getDelinquentAmount(), bodyDelinquent.getDelinquentAmount());
Expand All @@ -768,7 +768,7 @@ public void workingCapitalLoanDelinquencyRangeChangeEventNamesRangeCheck(final L
assertWorkingCapitalLoanAccountData(event, body);

final WorkingCapitalLoanCollectionDataV1 eventDelinquent = event.getDelinquent();
final WorkingCapitalCollection bodyDelinquent = body.getDelinquent();
final WorkingCapitalLoanCollection bodyDelinquent = body.getDelinquent();
assertThat(eventDelinquent).isNotNull();
assertThat(bodyDelinquent).isNotNull();
assertAmountEquals("delinquent.delinquentAmount", eventDelinquent.getDelinquentAmount(), bodyDelinquent.getDelinquentAmount());
Expand All @@ -787,19 +787,19 @@ public void workingCapitalLoanDelinquencyRangeChangeEventNamesRangeCheck(final L
.toList();
assertThat(eventTags).as("delinquent.delinquencySchedule[].tags").isNotEmpty();

final List<WorkingCapitalCollectionRangeScheduleDelinquency> apiTags = Optional
final List<WorkingCapitalLoanCollectionRangeScheduleDelinquency> apiTags = Optional
.ofNullable(bodyDelinquent.getInstallmentLevelDelinquency()).orElse(List.of()).stream()
.sorted(Comparator
.comparing(WorkingCapitalCollectionRangeScheduleDelinquency::getRangeId,
.comparing(WorkingCapitalLoanCollectionRangeScheduleDelinquency::getRangeId,
Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(WorkingCapitalCollectionRangeScheduleDelinquency::getDelinquentAmount,
.thenComparing(WorkingCapitalLoanCollectionRangeScheduleDelinquency::getDelinquentAmount,
Comparator.nullsFirst(Comparator.naturalOrder())))
.toList();
assertThat(eventTags).as("delinquent.delinquencySchedule[].tags vs API delinquent.installmentLevelDelinquency")
.hasSize(apiTags.size());
IntStream.range(0, eventTags.size()).forEach(i -> {
final WorkingCapitalLoanDelinquencyScheduleTagDataV1 actual = eventTags.get(i);
final WorkingCapitalCollectionRangeScheduleDelinquency expected = apiTags.get(i);
final WorkingCapitalLoanCollectionRangeScheduleDelinquency expected = apiTags.get(i);
assertThat(actual.getRangeId()).as("tags[%s].rangeId", i).isEqualTo(expected.getRangeId());
assertThat(actual.getClassification()).as("tags[%s].classification", i).isNotBlank()
.isEqualTo(expected.getClassification());
Expand Down Expand Up @@ -932,11 +932,12 @@ public void workingCapitalLoanBalanceChangedEventPausePeriodsCheck(final Long lo
final List<DelinquencyPausePeriodV1> eventPausePeriods = event.getDelinquent().getDelinquencyPausePeriods();
assertThat(eventPausePeriods).isNotNull().isNotEmpty();
assertThat(body.getDelinquent()).isNotNull();
final List<WorkingCapitalCollectionDelinquencyPausePeriod> bodyPausePeriods = body.getDelinquent().getDelinquencyPausePeriods();
final List<WorkingCapitalLoanCollectionDelinquencyPausePeriod> bodyPausePeriods = body.getDelinquent()
.getDelinquencyPausePeriods();
assertThat(bodyPausePeriods).isNotNull().hasSize(eventPausePeriods.size());
IntStream.range(0, eventPausePeriods.size()).forEach(i -> {
final DelinquencyPausePeriodV1 actual = eventPausePeriods.get(i);
final WorkingCapitalCollectionDelinquencyPausePeriod expected = bodyPausePeriods.get(i);
final WorkingCapitalLoanCollectionDelinquencyPausePeriod expected = bodyPausePeriods.get(i);
assertThat(actual.getActive()).as("delinquencyPausePeriods[%s].active", i).isEqualTo(expected.getActive());
assertEventDateEqualsApiDate("delinquencyPausePeriods[" + i + "].pausePeriodStart", actual.getPausePeriodStart(),
expected.getPausePeriodStart());
Expand Down
Loading