Skip to content
Merged
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,11 @@ public enum DefaultWorkingCapitalLoanProduct implements WorkingCapitalLoanProduc
WCLP_DUE_PRINCIPAL_FEE_PENALTY, //
WCLP_GOODWILL_CREDIT_ALLOCATION, //
WCLP_REPAYMENT_DIFF_DEFAULT, //
WCLP_365; //
WCLP_365, //
WCLP_ANNUAL_EIR_ADVANCED_ACCOUNTING, //
WCLP_ANNUAL_EIR_DUE_FEE_PENALTY_PRINCIPAL, //
WCLP_ANNUAL_EIR_BREACH_NEAR_BREACH_ACC_DEF_REV_AM, //
WCLP_ANNUAL_EIR_OVERRIDE_DISALLOWED; //

@Override
public String getName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,21 @@ public PostWorkingCapitalLoansRequest defaultWorkingCapitalLoansRequest(Long cli
.dateFormat(DATE_FORMAT);//
}

/**
* Loan application shell for ANNUAL_EIR products: no TPV / period payment rate (those fields are not allowed for
* that strategy). Caller sets productId, dates, principal, annualEir and optional discount.
*/
public PostWorkingCapitalLoansRequest defaultAnnualEirWorkingCapitalLoansRequest(final Long clientId) {
return new PostWorkingCapitalLoansRequest()//
.clientId(clientId)//
.productId(workingCapitalLoanProductResolver.resolve(DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT))//
.submittedOnDate(DATE_SUBMIT_STRING)//
.expectedDisbursementDate(DATE_SUBMIT_STRING)//
.principalAmount(DEFAULT_PRINCIPAL)//
.locale(DEFAULT_LOCALE)//
.dateFormat(DATE_FORMAT);//
}

public PutWorkingCapitalLoansLoanIdRequest defaultModifyWorkingCapitalLoansRequest() {
return new PutWorkingCapitalLoansLoanIdRequest()//
.locale(DEFAULT_LOCALE)//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ public class WorkingCapitalRequestFactory {
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 BigDecimal DEFAULT_WC_NEAR_BREACH_THRESHOLD = new BigDecimal("70.23");
public static final BigDecimal DEFAULT_WC_ANNUAL_EIR = new BigDecimal("43.7562");
public static final BigDecimal DEFAULT_WC_DISCOUNT = new BigDecimal("1000");

public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequestWithAccrualAccounting() {
return defaultWorkingCapitalLoanProductRequest()//
Expand Down Expand Up @@ -171,6 +173,19 @@ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductAll
.allowAttributeOverrides(allowAttributeOverrides);
}

/**
* Annual EIR strategy product: no period payment rate, required discount, and discount override enabled so loan
* applications may pass a discount (as in the reference EIR calculation scenarios).
*/
public PostWorkingCapitalLoanProductsRequest defaultAnnualEirWorkingCapitalLoanProductRequest(final BigDecimal annualEir,
final BigDecimal discount) {
return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest() //
.paymentAmountCalculationStrategy(PostWorkingCapitalLoanProductsRequest.PaymentAmountCalculationStrategyEnum.ANNUAL_EIR) //
.annualEir(annualEir) //
.discount(discount) //
.periodPaymentRate(null);
}

public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBreachRequest() {
String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
String shortName = loanProductsRequestFactory.generateShortNameSafely();
Expand All @@ -187,7 +202,21 @@ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBre

Long breachId = getWCBreachIdByName(DEFAULT_WC_BREACH_NAME);
Long nearBreachId = getWCNearBreachIdByName(DEFAULT_WC_NEAR_BREACH_NAME);
return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest().name(name)//
return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest()//
.name(name)//
.shortName(shortName)//
.breachId(breachId) //
.nearBreachId(nearBreachId); //
}

public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBreachNearBreachRequestWithAccrualAccounting() {
String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
String shortName = loanProductsRequestFactory.generateShortNameSafely();

Long breachId = getWCBreachIdByName(DEFAULT_WC_BREACH_NAME);
Long nearBreachId = getWCNearBreachIdByName(DEFAULT_WC_NEAR_BREACH_NAME);
return defaultWorkingCapitalLoanProductRequestWithAccrualAccounting()//
.name(name)//
.shortName(shortName)//
.breachId(breachId) //
.nearBreachId(nearBreachId); //
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,10 @@ public static String overrideDisallowedByProductFailure() {
return "Failed data validation due to: override.not.allowed.by.product.";
}

public static String overrideDisallowedByProductFailure(String disallowedOverrideSettingName) {
return String.format("validation.msg.WORKINGCAPITALLOAN.%s.override.not.allowed.by.product", disallowedOverrideSettingName);
}

public static String discountAlreadySetBeforeDisburseFailure() {
return "Discount was already set before disbursement and cannot be added again";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,19 @@ public String format() {
}
}

public record DoubleFormatterCustomPrecision(double value, String format) {

@Override
public String format() {
boolean isWholeNumber = (value % 1.0 == 0);
String result = isWholeNumber ? String.format(Locale.ROOT, "%.1f", value) : String.format(Locale.ROOT, format, value);
if (!isWholeNumber && result.endsWith("0")) {
result = result.substring(0, result.length() - 1);
}
return result;
}
}

public static boolean isEqualLists(List a, List b) {
if (a.size() != b.size()) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ public Long insertLoan(final LoanStatus status, final LocalDate lastClosedBusine
.addValue("breach_start_type", "DISBURSEMENT")//
// SimpleJdbcInsert without usingColumns() binds explicit NULL for every unmapped
// table column, which bypasses the DB default and violates the NOT NULL constraint.
.addValue("payment_amount_calculation_strategy", "TPV")//
.addValue("is_charged_off", false).addValue("is_fraud", Boolean.FALSE);
final Number key = wcLoanInsert.executeAndReturnKey(params);
return Objects.requireNonNull(key, "Generated key must not be null").longValue();
Expand Down
Loading
Loading