Repository: incubator-fineract Updated Branches: refs/heads/master 453d50a4d -> 4b1ec9ef5
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/4b1ec9ef/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java new file mode 100644 index 0000000..cfa9c39 --- /dev/null +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java @@ -0,0 +1,330 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.integrationtests.common.loans; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.gson.Gson; + +public class LoanApplicationTestBuilder { + + private static final String DAYS = "0"; + private static final String WEEKS = "1"; + private static final String MONTHS = "2"; + private static final String YEARS = "3"; + private static final String DECLINING_BALANCE = "0"; + private static final String FLAT_BALANCE = "1"; + private static final String EQUAL_PRINCIPAL_PAYMENTS = "0"; + private static final String EQUAL_INSTALLMENTS = "1"; + private static final String CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD = "1"; + public static final String DEFAULT_STRATEGY = "1"; + public static final String RBI_INDIA_STRATEGY = "4"; + + private String principal = "10,000"; + private String loanTermFrequency = ""; + private String loanTermFrequencyType = ""; + private String numberOfRepayment = "0"; + private String repaymentPeriod = "0"; + private String repaymentFrequencyType = ""; + + private String interestRate = "2"; + private String interestType = FLAT_BALANCE; + private String amortizationType = EQUAL_PRINCIPAL_PAYMENTS; + private String interestCalculationPeriodType = CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; + private String transactionProcessingID = DEFAULT_STRATEGY; + private String expectedDisbursmentDate = ""; + private String submittedOnDate = ""; + private String loanType = "individual"; + private String fixedEmiAmount = "10000"; + private String maxOutstandingLoanBalance = "36000"; + private String graceOnPrincipalPayment = null; + private String graceOnInterestPayment = null; + @SuppressWarnings("rawtypes") + private List<HashMap> disbursementData = null; + @SuppressWarnings("rawtypes") + private List<HashMap> charges = new ArrayList<>(); + private String recalculationRestFrequencyDate = null; + private String recalculationCompoundingFrequencyDate = null; + private String repaymentsStartingFromDate = null; + + private String calendarId; + private boolean syncDisbursementWithMeeting = false; + + public String build(final String clientID, final String groupID, final String loanProductId, final String savingsID) { + final HashMap<String, Object> map = new HashMap<>(); + map.put("groupId", groupID); + map.put("clientId", clientID); + if (this.loanType == "jlg") { + if (this.calendarId != null) { + map.put("calendarId", this.calendarId); + } + map.put("syncDisbursementWithMeeting", this.syncDisbursementWithMeeting); + } + return build(map, loanProductId, savingsID); + } + + public String build(final String ID, final String loanProductId, final String savingsID) { + + final HashMap<String, Object> map = new HashMap<>(); + + if (this.loanType == "group") { + map.put("groupId", ID); + } else { + map.put("clientId", ID); + } + return build(map, loanProductId, savingsID); + } + + private String build(final HashMap<String, Object> map, final String loanProductId, final String savingsID) { + map.put("dateFormat", "dd MMMM yyyy"); + map.put("locale", "en_GB"); + map.put("productId", loanProductId); + map.put("principal", this.principal); + map.put("loanTermFrequency", this.loanTermFrequency); + map.put("loanTermFrequencyType", this.loanTermFrequencyType); + map.put("numberOfRepayments", this.numberOfRepayment); + map.put("repaymentEvery", this.repaymentPeriod); + map.put("repaymentFrequencyType", this.repaymentFrequencyType); + map.put("interestRatePerPeriod", this.interestRate); + map.put("amortizationType", this.amortizationType); + map.put("interestType", this.interestType); + map.put("interestCalculationPeriodType", this.interestCalculationPeriodType); + map.put("transactionProcessingStrategyId", this.transactionProcessingID); + map.put("expectedDisbursementDate", this.expectedDisbursmentDate); + map.put("submittedOnDate", this.submittedOnDate); + map.put("loanType", this.loanType); + if (repaymentsStartingFromDate != null) { + map.put("repaymentsStartingFromDate", this.repaymentsStartingFromDate); + } + if (charges != null) { + map.put("charges", charges); + } + if (savingsID != null) { + map.put("linkAccountId", savingsID); + } + + if (graceOnPrincipalPayment != null) { + map.put("graceOnPrincipalPayment", graceOnPrincipalPayment); + } + + if (graceOnInterestPayment != null) { + map.put("graceOnInterestPayment", graceOnInterestPayment); + } + + if (disbursementData != null) { + map.put("disbursementData", disbursementData); + map.put("fixedEmiAmount", fixedEmiAmount); + map.put("maxOutstandingLoanBalance", maxOutstandingLoanBalance); + + } + if (recalculationRestFrequencyDate != null) { + map.put("recalculationRestFrequencyDate", recalculationRestFrequencyDate); + } + if (recalculationCompoundingFrequencyDate != null) { + map.put("recalculationCompoundingFrequencyDate", recalculationCompoundingFrequencyDate); + } + + System.out.println("Loan Application request : " + map); + return new Gson().toJson(map); + } + + public LoanApplicationTestBuilder withPrincipal(final String principalAmount) { + this.principal = principalAmount; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequency(final String loanToBePayedDuration) { + this.loanTermFrequency = loanToBePayedDuration; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequencyAsDays() { + this.loanTermFrequencyType = DAYS; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequencyAsMonths() { + this.loanTermFrequencyType = MONTHS; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequencyAsWeeks() { + this.loanTermFrequencyType = WEEKS; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequencyAsYears() { + this.loanTermFrequencyType = YEARS; + return this; + } + + public LoanApplicationTestBuilder withNumberOfRepayments(final String numberOfRepayments) { + this.numberOfRepayment = numberOfRepayments; + return this; + } + + public LoanApplicationTestBuilder withRepaymentEveryAfter(final String repaymentPeriod) { + this.repaymentPeriod = repaymentPeriod; + return this; + } + + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsDays() { + this.repaymentFrequencyType = DAYS; + return this; + } + + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsMonths() { + this.repaymentFrequencyType = MONTHS; + return this; + } + + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsWeeks() { + this.repaymentFrequencyType = WEEKS; + return this; + } + + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsYear() { + this.repaymentFrequencyType = YEARS; + return this; + } + + public LoanApplicationTestBuilder withInterestRatePerPeriod(final String interestRate) { + this.interestRate = interestRate; + return this; + } + + public LoanApplicationTestBuilder withInterestTypeAsFlatBalance() { + this.interestType = FLAT_BALANCE; + return this; + } + + public LoanApplicationTestBuilder withInterestTypeAsDecliningBalance() { + this.interestType = DECLINING_BALANCE; + return this; + } + + public LoanApplicationTestBuilder withAmortizationTypeAsEqualInstallments() { + this.amortizationType = EQUAL_INSTALLMENTS; + return this; + } + + public LoanApplicationTestBuilder withAmortizationTypeAsEqualPrincipalPayments() { + this.amortizationType = EQUAL_PRINCIPAL_PAYMENTS; + return this; + } + + public LoanApplicationTestBuilder withInterestCalculationPeriodTypeSameAsRepaymentPeriod() { + this.interestCalculationPeriodType = CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; + return this; + } + + public LoanApplicationTestBuilder withInterestCalculationPeriodTypeAsDays() { + this.interestCalculationPeriodType = DAYS; + return this; + } + + public LoanApplicationTestBuilder withExpectedDisbursementDate(final String expectedDisbursementDate) { + this.expectedDisbursmentDate = expectedDisbursementDate; + return this; + } + + public LoanApplicationTestBuilder withSubmittedOnDate(final String loanApplicationSubmittedDate) { + this.submittedOnDate = loanApplicationSubmittedDate; + return this; + } + + public LoanApplicationTestBuilder withCharges(final List<HashMap> charges) { + this.charges = charges; + return this; + } + + public LoanApplicationTestBuilder withLoanType(final String loanType) { + this.loanType = loanType; + return this; + } + + public LoanApplicationTestBuilder withPrincipalGrace(final String graceOnPrincipalPayment) { + this.graceOnPrincipalPayment = graceOnPrincipalPayment; + return this; + } + + public LoanApplicationTestBuilder withInterestGrace(final String graceOnInterestPayment) { + this.graceOnInterestPayment = graceOnInterestPayment; + return this; + } + + public LoanApplicationTestBuilder withTranches(final List<HashMap> disbursementData) { + this.disbursementData = disbursementData; + return this; + } + + public LoanApplicationTestBuilder withwithRepaymentStrategy(final String transactionProcessingStrategy) { + this.transactionProcessingID = transactionProcessingStrategy; + return this; + } + + public LoanApplicationTestBuilder withRestFrequencyDate(final String recalculationRestFrequencyDate) { + this.recalculationRestFrequencyDate = recalculationRestFrequencyDate; + return this; + } + + public LoanApplicationTestBuilder withCompoundingFrequencyDate(final String recalculationCompoundingFrequencyDate) { + this.recalculationCompoundingFrequencyDate = recalculationCompoundingFrequencyDate; + return this; + } + + public LoanApplicationTestBuilder withFirstRepaymentDate(final String firstRepaymentDate) { + this.repaymentsStartingFromDate = firstRepaymentDate; + return this; + } + + /** + * calendarID parameter is used to sync repayments with group meetings, + * especially when using jlg loans + * + * @param calendarId + * the id of the calender record of the group meeting from + * m_calendar table + * @return + */ + public LoanApplicationTestBuilder withCalendarID(String calendarId) { + this.calendarId = calendarId; + return this; + } + + /** + * This indicator is used mainly for jlg loans when we want to sync + * disbursement with the group meetings (it seems that if we do use this + * parameter we should also use calendarID to sync repayment with group + * meetings) + * + * @return + */ + public LoanApplicationTestBuilder withSyncDisbursementWithMeetin() { + this.syncDisbursementWithMeeting = true; + return this; + } + + public LoanApplicationTestBuilder withFixedEmiAmount(final String installmentAmount) { + this.fixedEmiAmount = installmentAmount; + return this; + } +}
