public LoanProductData()

in fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java [996:1192]


    public LoanProductData(final LoanProductData productData, final Collection<ChargeData> chargeOptions,
            final Collection<ChargeData> penaltyOptions, final Collection<PaymentTypeData> paymentTypeOptions,
            final Collection<CurrencyData> currencyOptions, final List<EnumOptionData> amortizationTypeOptions,
            final List<EnumOptionData> interestTypeOptions, final List<EnumOptionData> interestCalculationPeriodTypeOptions,
            final List<EnumOptionData> repaymentFrequencyTypeOptions, final List<EnumOptionData> interestRateFrequencyTypeOptions,
            final Collection<FundData> fundOptions, final Collection<TransactionProcessingStrategyData> transactionStrategyOptions,
            final Collection<RateData> rateOptions, final Map<String, List<GLAccountData>> accountingMappingOptions,
            final List<EnumOptionData> accountingRuleOptions, final List<EnumOptionData> valueConditionTypeOptions,
            final List<EnumOptionData> daysInMonthTypeOptions, final List<EnumOptionData> daysInYearTypeOptions,
            final List<EnumOptionData> interestRecalculationCompoundingTypeOptions,
            final List<EnumOptionData> rescheduleStrategyTypeOptions, final List<EnumOptionData> interestRecalculationFrequencyTypeOptions,
            final List<EnumOptionData> preCloseInterestCalculationStrategyOptions, final List<FloatingRateData> floatingRateOptions,
            final List<EnumOptionData> interestRecalculationNthDayTypeOptions,
            final List<EnumOptionData> interestRecalculationDayOfWeekTypeOptions, final boolean isRatesEnabled,
            final Collection<DelinquencyBucketData> delinquencyBucketOptions, final List<EnumOptionData> repaymentStartDateTypeOptions,
            final List<EnumOptionData> advancedPaymentAllocationTransactionTypes,
            final List<EnumOptionData> advancedPaymentAllocationFutureInstallmentAllocationRules,
            final List<EnumOptionData> advancedPaymentAllocationTypes, final List<EnumOptionData> loanScheduleTypeOptions,
            final List<EnumOptionData> loanScheduleProcessingTypeOptions, final List<EnumOptionData> creditAllocationTransactionTypes,
            final List<EnumOptionData> creditAllocationAllocationTypes,
            final List<StringEnumOptionData> supportedInterestRefundTypesOptions,
            final List<StringEnumOptionData> chargeOffBehaviourOptions, final List<CodeValueData> chargeOffReasonOptions,
            final List<StringEnumOptionData> daysInYearCustomStrategyOptions,
            final List<StringEnumOptionData> capitalizedIncomeCalculationTypeOptions,
            final List<StringEnumOptionData> capitalizedIncomeStrategyOptions,
            final List<StringEnumOptionData> capitalizedIncomeTypeOptions) {

        this.id = productData.id;
        this.name = productData.name;
        this.shortName = productData.shortName;
        this.description = productData.description;
        this.fundId = productData.fundId;
        this.fundName = productData.fundName;

        this.principal = productData.principal;
        this.minPrincipal = productData.minPrincipal;
        this.maxPrincipal = productData.maxPrincipal;
        this.inArrearsTolerance = productData.inArrearsTolerance;
        this.numberOfRepayments = productData.numberOfRepayments;
        this.minNumberOfRepayments = productData.minNumberOfRepayments;
        this.maxNumberOfRepayments = productData.maxNumberOfRepayments;
        this.repaymentEvery = productData.repaymentEvery;
        this.fixedLength = productData.fixedLength;
        this.interestRatePerPeriod = productData.interestRatePerPeriod;
        this.minInterestRatePerPeriod = productData.minInterestRatePerPeriod;
        this.maxInterestRatePerPeriod = productData.maxInterestRatePerPeriod;
        this.annualInterestRate = productData.annualInterestRate;
        this.isLinkedToFloatingInterestRates = productData.isLinkedToFloatingInterestRates;
        this.floatingRateId = productData.floatingRateId;
        this.floatingRateName = productData.floatingRateName;
        this.interestRateDifferential = productData.interestRateDifferential;
        this.minDifferentialLendingRate = productData.minDifferentialLendingRate;
        this.defaultDifferentialLendingRate = productData.defaultDifferentialLendingRate;
        this.maxDifferentialLendingRate = productData.maxDifferentialLendingRate;
        this.isFloatingInterestRateCalculationAllowed = productData.isFloatingInterestRateCalculationAllowed;
        this.allowVariableInstallments = productData.allowVariableInstallments;
        this.minimumGap = productData.minimumGap;
        this.maximumGap = productData.maximumGap;
        this.repaymentFrequencyType = productData.repaymentFrequencyType;
        this.interestRateFrequencyType = productData.interestRateFrequencyType;
        this.amortizationType = productData.amortizationType;
        this.interestType = productData.interestType;
        this.interestCalculationPeriodType = productData.interestCalculationPeriodType;
        this.allowPartialPeriodInterestCalculation = productData.allowPartialPeriodInterestCalculation;
        this.startDate = productData.startDate;
        this.closeDate = productData.closeDate;
        this.status = productData.status;
        this.externalId = productData.externalId;

        this.charges = nullIfEmpty(productData.charges());
        this.principalVariationsForBorrowerCycle = productData.principalVariationsForBorrowerCycle;
        this.interestRateVariationsForBorrowerCycle = productData.interestRateVariationsForBorrowerCycle;
        this.numberOfRepaymentVariationsForBorrowerCycle = productData.numberOfRepaymentVariationsForBorrowerCycle;
        this.accountingRule = productData.accountingRule;
        this.accountingMappings = productData.accountingMappings;
        this.paymentChannelToFundSourceMappings = productData.paymentChannelToFundSourceMappings;
        this.feeToIncomeAccountMappings = productData.feeToIncomeAccountMappings;
        this.penaltyToIncomeAccountMappings = productData.penaltyToIncomeAccountMappings;
        this.chargeOffReasonToExpenseAccountMappings = productData.chargeOffReasonToExpenseAccountMappings;

        this.chargeOptions = chargeOptions;
        this.penaltyOptions = penaltyOptions;
        this.paymentTypeOptions = paymentTypeOptions;
        this.currencyOptions = currencyOptions;
        this.currency = productData.currency;
        this.fundOptions = fundOptions;
        this.transactionProcessingStrategyOptions = transactionStrategyOptions;
        this.rateOptions = rateOptions;
        this.floatingRateOptions = floatingRateOptions;
        if (this.transactionProcessingStrategyOptions != null && this.transactionProcessingStrategyOptions.size() == 1) {
            final List<TransactionProcessingStrategyData> listOfOptions = new ArrayList<>(this.transactionProcessingStrategyOptions);

            this.transactionProcessingStrategyCode = listOfOptions.get(0).getCode();
            this.transactionProcessingStrategyName = listOfOptions.get(0).getName();
        } else {
            this.transactionProcessingStrategyCode = productData.transactionProcessingStrategyCode;
            this.transactionProcessingStrategyName = productData.transactionProcessingStrategyName;
        }

        this.graceOnPrincipalPayment = productData.graceOnPrincipalPayment;
        this.recurringMoratoriumOnPrincipalPeriods = productData.recurringMoratoriumOnPrincipalPeriods;
        this.graceOnInterestPayment = productData.graceOnInterestPayment;
        this.graceOnInterestCharged = productData.graceOnInterestCharged;
        this.includeInBorrowerCycle = productData.includeInBorrowerCycle;
        this.useBorrowerCycle = productData.useBorrowerCycle;
        this.multiDisburseLoan = productData.multiDisburseLoan;
        this.maxTrancheCount = productData.maxTrancheCount;
        this.outstandingLoanBalance = productData.outstandingLoanBalance;
        this.disallowExpectedDisbursements = productData.disallowExpectedDisbursements;
        this.allowApprovedDisbursedAmountsOverApplied = productData.allowApprovedDisbursedAmountsOverApplied;
        this.overAppliedCalculationType = productData.overAppliedCalculationType;
        this.overAppliedNumber = productData.overAppliedNumber;

        this.minimumDaysBetweenDisbursalAndFirstRepayment = productData.minimumDaysBetweenDisbursalAndFirstRepayment;

        this.amortizationTypeOptions = amortizationTypeOptions;
        this.interestTypeOptions = interestTypeOptions;
        this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions;
        this.interestRecalculationNthDayTypeOptions = interestRecalculationNthDayTypeOptions;
        this.interestRecalculationDayOfWeekTypeOptions = interestRecalculationDayOfWeekTypeOptions;
        this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions;
        this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions;

        this.accountingMappingOptions = accountingMappingOptions;
        this.accountingRuleOptions = accountingRuleOptions;
        this.valueConditionTypeOptions = valueConditionTypeOptions;
        this.graceOnArrearsAgeing = productData.graceOnArrearsAgeing;
        this.overdueDaysForNPA = productData.overdueDaysForNPA;

        this.daysInMonthType = productData.daysInMonthType;
        this.daysInYearType = productData.daysInYearType;
        this.isInterestRecalculationEnabled = productData.isInterestRecalculationEnabled;
        this.interestRecalculationData = productData.interestRecalculationData;
        this.holdGuaranteeFunds = productData.holdGuaranteeFunds;
        this.productGuaranteeData = productData.productGuaranteeData;
        this.principalThresholdForLastInstallment = productData.principalThresholdForLastInstallment;
        this.fixedPrincipalPercentagePerInstallment = productData.fixedPrincipalPercentagePerInstallment;
        this.accountMovesOutOfNPAOnlyOnArrearsCompletion = productData.accountMovesOutOfNPAOnlyOnArrearsCompletion;

        this.daysInMonthTypeOptions = daysInMonthTypeOptions;
        this.daysInYearTypeOptions = daysInYearTypeOptions;
        this.interestRecalculationCompoundingTypeOptions = interestRecalculationCompoundingTypeOptions;
        this.rescheduleStrategyTypeOptions = rescheduleStrategyTypeOptions;
        this.allowAttributeOverrides = productData.allowAttributeOverrides;

        if (CollectionUtils.isEmpty(interestRecalculationFrequencyTypeOptions)) {
            this.interestRecalculationFrequencyTypeOptions = null;
        } else {
            this.interestRecalculationFrequencyTypeOptions = interestRecalculationFrequencyTypeOptions;
        }

        this.canDefineInstallmentAmount = productData.canDefineInstallmentAmount;
        this.installmentAmountInMultiplesOf = productData.installmentAmountInMultiplesOf;
        this.preClosureInterestCalculationStrategyOptions = preCloseInterestCalculationStrategyOptions;
        this.syncExpectedWithDisbursementDate = productData.syncExpectedWithDisbursementDate;
        this.canUseForTopup = productData.canUseForTopup;
        this.isEqualAmortization = productData.isEqualAmortization;
        this.rates = productData.rates;
        this.isRatesEnabled = isRatesEnabled;
        this.delinquencyBucketOptions = delinquencyBucketOptions;
        this.delinquencyBucket = productData.delinquencyBucket;
        this.dueDaysForRepaymentEvent = productData.dueDaysForRepaymentEvent;
        this.overDueDaysForRepaymentEvent = productData.overDueDaysForRepaymentEvent;
        this.enableDownPayment = productData.enableDownPayment;
        this.disbursedAmountPercentageForDownPayment = productData.disbursedAmountPercentageForDownPayment;
        this.enableAutoRepaymentForDownPayment = productData.enableAutoRepaymentForDownPayment;
        this.paymentAllocation = productData.paymentAllocation;
        this.creditAllocation = productData.creditAllocation;
        this.repaymentStartDateType = productData.repaymentStartDateType;
        this.repaymentStartDateTypeOptions = repaymentStartDateTypeOptions;
        this.advancedPaymentAllocationTransactionTypes = advancedPaymentAllocationTransactionTypes;
        this.advancedPaymentAllocationFutureInstallmentAllocationRules = advancedPaymentAllocationFutureInstallmentAllocationRules;
        this.advancedPaymentAllocationTypes = advancedPaymentAllocationTypes;
        this.creditAllocationAllocationTypes = creditAllocationAllocationTypes;
        this.creditAllocationTransactionTypes = creditAllocationTransactionTypes;
        this.enableInstallmentLevelDelinquency = productData.enableInstallmentLevelDelinquency;
        this.loanScheduleType = productData.getLoanScheduleType();
        this.loanScheduleProcessingType = productData.getLoanScheduleProcessingType();
        this.loanScheduleProcessingTypeOptions = loanScheduleProcessingTypeOptions;
        this.loanScheduleTypeOptions = loanScheduleTypeOptions;
        this.enableAccrualActivityPosting = productData.enableAccrualActivityPosting;
        this.supportedInterestRefundTypesOptions = supportedInterestRefundTypesOptions;
        this.supportedInterestRefundTypes = productData.supportedInterestRefundTypes;
        this.chargeOffBehaviour = productData.chargeOffBehaviour;
        this.chargeOffBehaviourOptions = chargeOffBehaviourOptions;
        this.chargeOffReasonOptions = chargeOffReasonOptions;
        this.interestRecognitionOnDisbursementDate = productData.interestRecognitionOnDisbursementDate;
        this.daysInYearCustomStrategyOptions = daysInYearCustomStrategyOptions;
        this.daysInYearCustomStrategy = productData.daysInYearCustomStrategy;
        this.enableIncomeCapitalization = productData.enableIncomeCapitalization;
        this.capitalizedIncomeCalculationType = productData.capitalizedIncomeCalculationType;
        this.capitalizedIncomeStrategy = productData.capitalizedIncomeStrategy;
        this.capitalizedIncomeType = productData.capitalizedIncomeType;
        this.capitalizedIncomeCalculationTypeOptions = capitalizedIncomeCalculationTypeOptions;
        this.capitalizedIncomeStrategyOptions = capitalizedIncomeStrategyOptions;
        this.capitalizedIncomeTypeOptions = capitalizedIncomeTypeOptions;
    }