Search in sources :

Example 1 with LoanCreationLoanDetailsDto

use of org.mifos.dto.screen.LoanCreationLoanDetailsDto in project head by mifos.

the class LoanAccountServiceFacadeWebTier method retrieveLoanDetailsForLoanAccountCreation.

@Override
public LoanCreationLoanDetailsDto retrieveLoanDetailsForLoanAccountCreation(Integer customerId, Short productId, boolean isLoanWithBackdatedPayments) {
    try {
        List<org.mifos.dto.domain.FeeDto> additionalFees = new ArrayList<org.mifos.dto.domain.FeeDto>();
        List<org.mifos.dto.domain.FeeDto> defaultFees = new ArrayList<org.mifos.dto.domain.FeeDto>();
        List<PenaltyDto> defaultPenalties = new ArrayList<PenaltyDto>();
        LoanOfferingBO loanProduct = this.loanProductDao.findById(productId.intValue());
        MeetingBO loanProductMeeting = loanProduct.getLoanOfferingMeetingValue();
        MeetingDto loanOfferingMeetingDto = loanProductMeeting.toDto();
        List<FeeBO> fees = this.feeDao.getAllAppllicableFeeForLoanCreation();
        for (FeeBO fee : fees) {
            if (!fee.isPeriodic() || (MeetingBO.isMeetingMatched(fee.getFeeFrequency().getFeeMeetingFrequency(), loanProductMeeting))) {
                org.mifos.dto.domain.FeeDto feeDto = fee.toDto();
                FeeFrequencyType feeFrequencyType = FeeFrequencyType.getFeeFrequencyType(fee.getFeeFrequency().getFeeFrequencyType().getId());
                FeeFrequencyTypeEntity feeFrequencyEntity = this.loanProductDao.retrieveFeeFrequencyType(feeFrequencyType);
                String feeFrequencyTypeName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(feeFrequencyEntity.getLookUpValue());
                feeDto.setFeeFrequencyType(feeFrequencyTypeName);
                if (feeDto.getFeeFrequency().isOneTime()) {
                    FeePayment feePayment = FeePayment.getFeePayment(fee.getFeeFrequency().getFeePayment().getId());
                    FeePaymentEntity feePaymentEntity = this.loanProductDao.retrieveFeePaymentType(feePayment);
                    String feePaymentName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(feePaymentEntity.getLookUpValue());
                    feeDto.getFeeFrequency().setPayment(feePaymentName);
                }
                if (loanProduct.isFeePresent(fee)) {
                    defaultFees.add(feeDto);
                } else {
                    additionalFees.add(feeDto);
                }
            }
        }
        List<PenaltyBO> penalties = this.penaltyDao.getAllAppllicablePenaltyForLoanCreation();
        for (PenaltyBO penalty : penalties) {
            if (loanProduct.isPenaltyPresent(penalty)) {
                defaultPenalties.add(penalty.toDto());
            }
        }
        if (AccountingRules.isMultiCurrencyEnabled()) {
            defaultFees = getFilteredFeesByCurrency(defaultFees, loanProduct.getCurrency().getCurrencyId());
            additionalFees = getFilteredFeesByCurrency(additionalFees, loanProduct.getCurrency().getCurrencyId());
        }
        Map<String, String> defaultFeeOptions = new LinkedHashMap<String, String>();
        for (org.mifos.dto.domain.FeeDto feeDto : defaultFees) {
            defaultFeeOptions.put(feeDto.getId(), feeDto.getName());
        }
        Map<String, String> additionalFeeOptions = new LinkedHashMap<String, String>();
        for (org.mifos.dto.domain.FeeDto feeDto : additionalFees) {
            additionalFeeOptions.put(feeDto.getId(), feeDto.getName());
        }
        CustomerBO customer = this.customerDao.findCustomerById(customerId);
        boolean isRepaymentIndependentOfMeetingEnabled = new ConfigurationBusinessService().isRepaymentIndepOfMeetingEnabled();
        LoanDisbursementDateFactory loanDisbursementDateFactory = new LoanDisbursmentDateFactoryImpl();
        LoanDisbursementDateFinder loanDisbursementDateFinder = null;
        LocalDate nextPossibleDisbursementDate = null;
        MeetingBO customerMeeting = customer.getCustomerMeetingValue();
        LocalDate dateToStart = new LocalDate();
        if (customerMeeting.isWeekly()) {
            LocalDate meetingStartDate = new LocalDate(customerMeeting.getMeetingStartDate());
            if (dateToStart.isBefore(meetingStartDate)) {
                dateToStart = meetingStartDate;
                loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer, loanProduct, false, isLoanWithBackdatedPayments);
            } else {
                loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer, loanProduct, isRepaymentIndependentOfMeetingEnabled, isLoanWithBackdatedPayments);
            }
            nextPossibleDisbursementDate = loanDisbursementDateFinder.findClosestMatchingDateFromAndInclusiveOf(dateToStart);
        } else {
            loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer, loanProduct, isRepaymentIndependentOfMeetingEnabled, isLoanWithBackdatedPayments);
            nextPossibleDisbursementDate = loanDisbursementDateFinder.findClosestMatchingDateFromAndInclusiveOf(dateToStart);
        }
        LoanAmountOption eligibleLoanAmount = loanProduct.eligibleLoanAmount(customer.getMaxLoanAmount(loanProduct), customer.getMaxLoanCycleForProduct(loanProduct));
        LoanOfferingInstallmentRange eligibleNoOfInstall = loanProduct.eligibleNoOfInstall(customer.getMaxLoanAmount(loanProduct), customer.getMaxLoanCycleForProduct(loanProduct));
        Double defaultInterestRate = loanProduct.getDefInterestRate();
        Double maxInterestRate = loanProduct.getMaxInterestRate();
        Double minInterestRate = loanProduct.getMinInterestRate();
        LinkedHashMap<String, String> collateralOptions = new LinkedHashMap<String, String>();
        LinkedHashMap<String, String> purposeOfLoanOptions = new LinkedHashMap<String, String>();
        CustomValueDto customValueDto = legacyMasterDao.getLookUpEntity(MasterConstants.COLLATERAL_TYPES);
        List<CustomValueListElementDto> collateralTypes = customValueDto.getCustomValueListElements();
        for (CustomValueListElementDto element : collateralTypes) {
            collateralOptions.put(element.getId().toString(), element.getName());
        }
        // Business activities got in getPrdOfferings also but only for glim.
        List<ValueListElement> loanPurposes = legacyMasterDao.findValueListElements(MasterConstants.LOAN_PURPOSES);
        for (ValueListElement element : loanPurposes) {
            purposeOfLoanOptions.put(element.getId().toString(), element.getName());
        }
        List<FundDto> fundDtos = new ArrayList<FundDto>();
        List<FundBO> funds = getFunds(loanProduct);
        for (FundBO fund : funds) {
            FundDto fundDto = new FundDto();
            fundDto.setId(Short.toString(fund.getFundId()));
            fundDto.setCode(translateFundCodeToDto(fund.getFundCode()));
            fundDto.setName(fund.getFundName());
            fundDtos.add(fundDto);
        }
        ProductDetailsDto productDto = loanProduct.toDetailsDto();
        CustomerDetailDto customerDetailDto = customer.toCustomerDetailDto();
        Integer gracePeriodInInstallments = loanProduct.getGracePeriodDuration().intValue();
        final List<PrdOfferingDto> loanProductDtos = retrieveActiveLoanProductsApplicableForCustomer(customer, isRepaymentIndependentOfMeetingEnabled);
        InterestType interestType = InterestType.fromInt(loanProduct.getInterestTypes().getId().intValue());
        InterestTypesEntity productInterestType = this.loanProductDao.findInterestType(interestType);
        String interestTypeName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(productInterestType.getLookUpValue());
        LinkedHashMap<String, String> daysOfTheWeekOptions = new LinkedHashMap<String, String>();
        List<WeekDay> workingDays = new FiscalCalendarRules().getWorkingDays();
        for (WeekDay workDay : workingDays) {
            String weekdayName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(workDay.getPropertiesKey());
            workDay.setWeekdayName(weekdayName);
            daysOfTheWeekOptions.put(workDay.getValue().toString(), weekdayName);
        }
        LinkedHashMap<String, String> weeksOfTheMonthOptions = new LinkedHashMap<String, String>();
        for (RankOfDay weekOfMonth : RankOfDay.values()) {
            String weekOfMonthName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(weekOfMonth.getPropertiesKey());
            weeksOfTheMonthOptions.put(weekOfMonth.getValue().toString(), weekOfMonthName);
        }
        boolean variableInstallmentsAllowed = loanProduct.isVariableInstallmentsAllowed();
        boolean fixedRepaymentSchedule = loanProduct.isFixedRepaymentSchedule();
        Integer minGapInDays = Integer.valueOf(0);
        Integer maxGapInDays = Integer.valueOf(0);
        BigDecimal minInstallmentAmount = BigDecimal.ZERO;
        if (variableInstallmentsAllowed) {
            VariableInstallmentDetailsBO variableInstallmentsDetails = loanProduct.getVariableInstallmentDetails();
            minGapInDays = variableInstallmentsDetails.getMinGapInDays();
            maxGapInDays = variableInstallmentsDetails.getMaxGapInDays();
            minInstallmentAmount = variableInstallmentsDetails.getMinInstallmentAmount().getAmount();
        }
        boolean compareCashflowEnabled = loanProduct.isCashFlowCheckEnabled();
        // GLIM specific
        final boolean isGroup = customer.isGroup();
        final boolean isGlimEnabled = configurationPersistence.isGlimEnabled();
        //Group Loan Account with members specific
        final boolean isGroupLoanWithMembersEnabled = AccountingRules.isGroupLoanWithMembers();
        List<LoanAccountDetailsDto> clientDetails = new ArrayList<LoanAccountDetailsDto>();
        if (isGroup && (isGlimEnabled || isGroupLoanWithMembersEnabled)) {
            final List<ClientBO> activeClientsOfGroup = customerDao.findActiveClientsUnderGroup(customer);
            if (activeClientsOfGroup == null || activeClientsOfGroup.isEmpty()) {
                throw new BusinessRuleException(GroupConstants.IMPOSSIBLE_TO_CREATE_GROUP_LOAN);
            }
            for (ClientBO client : activeClientsOfGroup) {
                LoanAccountDetailsDto clientDetail = new LoanAccountDetailsDto();
                clientDetail.setClientId(client.getGlobalCustNum());
                clientDetail.setClientName(client.getDisplayName());
                clientDetails.add(clientDetail);
            }
        }
        // end of GLIM specific
        int digitsAfterDecimalForInterest = AccountingRules.getDigitsAfterDecimalForInterest().intValue();
        int digitsBeforeDecimalForInterest = AccountingRules.getDigitsBeforeDecimalForInterest().intValue();
        int digitsAfterDecimalForMonetaryAmounts = AccountingRules.getDigitsAfterDecimal().intValue();
        int digitsBeforeDecimalForMonetaryAmounts = AccountingRules.getDigitsBeforeDecimal().intValue();
        ApplicationConfigurationDto appConfig = new ApplicationConfigurationDto(digitsAfterDecimalForInterest, digitsBeforeDecimalForInterest, digitsAfterDecimalForMonetaryAmounts, digitsBeforeDecimalForMonetaryAmounts);
        Map<String, String> disbursalPaymentTypes = new LinkedHashMap<String, String>();
        try {
            for (PaymentTypeDto paymentTypeDto : accountService.getLoanDisbursementTypes()) {
                disbursalPaymentTypes.put(paymentTypeDto.getValue().toString(), paymentTypeDto.getName());
            }
        } catch (Exception e) {
            throw new SystemException(e);
        }
        Map<String, String> repaymentpaymentTypes = new LinkedHashMap<String, String>();
        try {
            for (PaymentTypeDto paymentTypeDto : accountService.getLoanPaymentTypes()) {
                repaymentpaymentTypes.put(paymentTypeDto.getValue().toString(), paymentTypeDto.getName());
            }
        } catch (Exception e) {
            throw new SystemException(e);
        }
        String currency = loanProduct.getCurrency().getCurrencyCode();
        return new LoanCreationLoanDetailsDto(currency, isRepaymentIndependentOfMeetingEnabled, loanOfferingMeetingDto, customer.getCustomerMeetingValue().toDto(), loanPurposes, productDto, gracePeriodInInstallments, customerDetailDto, loanProductDtos, interestTypeName, fundDtos, collateralOptions, purposeOfLoanOptions, defaultFeeOptions, additionalFeeOptions, defaultFees, additionalFees, BigDecimal.valueOf(eligibleLoanAmount.getDefaultLoanAmount()), BigDecimal.valueOf(eligibleLoanAmount.getMaxLoanAmount()), BigDecimal.valueOf(eligibleLoanAmount.getMinLoanAmount()), defaultInterestRate, maxInterestRate, minInterestRate, eligibleNoOfInstall.getDefaultNoOfInstall().intValue(), eligibleNoOfInstall.getMaxNoOfInstall().intValue(), eligibleNoOfInstall.getMinNoOfInstall().intValue(), nextPossibleDisbursementDate, daysOfTheWeekOptions, weeksOfTheMonthOptions, variableInstallmentsAllowed, fixedRepaymentSchedule, minGapInDays, maxGapInDays, minInstallmentAmount, compareCashflowEnabled, isGlimEnabled, isGroup, clientDetails, appConfig, defaultPenalties, disbursalPaymentTypes, repaymentpaymentTypes, isGroupLoanWithMembersEnabled);
    } catch (SystemException e) {
        throw new MifosRuntimeException(e);
    }
}
Also used : FeePayment(org.mifos.accounts.fees.util.helpers.FeePayment) LoanDisbursementDateFactory(org.mifos.clientportfolio.newloan.domain.LoanDisbursementDateFactory) MeetingBO(org.mifos.application.meeting.business.MeetingBO) CustomValueListElementDto(org.mifos.application.master.business.CustomValueListElementDto) ClientBO(org.mifos.customers.client.business.ClientBO) ArrayList(java.util.ArrayList) LocalDate(org.joda.time.LocalDate) LinkedHashMap(java.util.LinkedHashMap) RankOfDay(org.mifos.application.meeting.util.helpers.RankOfDay) ApplicationConfigurationDto(org.mifos.dto.domain.ApplicationConfigurationDto) FeeFrequencyTypeEntity(org.mifos.accounts.fees.business.FeeFrequencyTypeEntity) CustomerDetailDto(org.mifos.dto.domain.CustomerDetailDto) LoanDisbursmentDateFactoryImpl(org.mifos.clientportfolio.newloan.domain.LoanDisbursmentDateFactoryImpl) PenaltyBO(org.mifos.accounts.penalties.business.PenaltyBO) AmountPenaltyBO(org.mifos.accounts.penalties.business.AmountPenaltyBO) FeeFrequencyType(org.mifos.accounts.fees.util.helpers.FeeFrequencyType) CreateAccountFeeDto(org.mifos.dto.domain.CreateAccountFeeDto) FeeDto(org.mifos.dto.domain.FeeDto) WeekDay(org.mifos.application.meeting.util.helpers.WeekDay) InterestType(org.mifos.accounts.productdefinition.util.helpers.InterestType) VariableInstallmentDetailsBO(org.mifos.accounts.productdefinition.business.VariableInstallmentDetailsBO) LoanOfferingBO(org.mifos.accounts.productdefinition.business.LoanOfferingBO) LoanAmountOption(org.mifos.accounts.productdefinition.business.LoanAmountOption) FeeBO(org.mifos.accounts.fees.business.FeeBO) AmountFeeBO(org.mifos.accounts.fees.business.AmountFeeBO) LoanCreationLoanDetailsDto(org.mifos.dto.screen.LoanCreationLoanDetailsDto) LoanOfferingInstallmentRange(org.mifos.accounts.productdefinition.business.LoanOfferingInstallmentRange) InterestTypesEntity(org.mifos.application.master.business.InterestTypesEntity) LoanCreationProductDetailsDto(org.mifos.dto.screen.LoanCreationProductDetailsDto) ProductDetailsDto(org.mifos.dto.domain.ProductDetailsDto) LoanAccountDetailsDto(org.mifos.dto.domain.LoanAccountDetailsDto) MultipleLoanAccountDetailsDto(org.mifos.dto.screen.MultipleLoanAccountDetailsDto) BusinessRuleException(org.mifos.service.BusinessRuleException) SystemException(org.mifos.framework.exceptions.SystemException) MessageLookup(org.mifos.application.master.MessageLookup) ConfigurationBusinessService(org.mifos.config.business.service.ConfigurationBusinessService) CustomerBO(org.mifos.customers.business.CustomerBO) FeeDto(org.mifos.dto.domain.FeeDto) FiscalCalendarRules(org.mifos.config.FiscalCalendarRules) CreateAccountPenaltyDto(org.mifos.dto.domain.CreateAccountPenaltyDto) PenaltyDto(org.mifos.dto.domain.PenaltyDto) LoanDisbursementDateFinder(org.mifos.clientportfolio.newloan.domain.LoanDisbursementDateFinder) FundBO(org.mifos.accounts.fund.business.FundBO) FeePaymentEntity(org.mifos.accounts.fees.business.FeePaymentEntity) PaymentTypeDto(org.mifos.dto.domain.PaymentTypeDto) FundDto(org.mifos.accounts.fund.servicefacade.FundDto) BigDecimal(java.math.BigDecimal) StatesInitializationException(org.mifos.framework.exceptions.StatesInitializationException) BusinessRuleException(org.mifos.service.BusinessRuleException) PersistenceException(org.mifos.framework.exceptions.PersistenceException) ServiceException(org.mifos.framework.exceptions.ServiceException) HibernateSearchException(org.mifos.framework.exceptions.HibernateSearchException) PageExpiredException(org.mifos.framework.exceptions.PageExpiredException) SystemException(org.mifos.framework.exceptions.SystemException) MifosRuntimeException(org.mifos.core.MifosRuntimeException) AccountException(org.mifos.accounts.exceptions.AccountException) PropertyNotFoundException(org.mifos.framework.exceptions.PropertyNotFoundException) ConfigurationException(org.mifos.config.exceptions.ConfigurationException) MeetingException(org.mifos.application.meeting.exceptions.MeetingException) MeetingDto(org.mifos.dto.domain.MeetingDto) PrdOfferingDto(org.mifos.dto.domain.PrdOfferingDto) CustomValueDto(org.mifos.application.master.business.CustomValueDto) ValueListElement(org.mifos.dto.domain.ValueListElement) MifosRuntimeException(org.mifos.core.MifosRuntimeException)

Example 2 with LoanCreationLoanDetailsDto

use of org.mifos.dto.screen.LoanCreationLoanDetailsDto in project head by mifos.

the class XlsLoansAccountImporter method parse.

/**
     * Parse input stream.
     * @param is input stream containing loan accounts' data
     * @return object containing successfully parsed rows and rows with errors
     */
public ParsedLoansDto parse(InputStream is) {
    //prepare objects: result, lists for rows
    ParsedLoansDto result = null;
    List<String> errors = new ArrayList<String>();
    //temporary list for new accounts numbers, currently not used
    List<String> newAccountsNumbers = new ArrayList<String>();
    List<ImportedLoanDetail> parsedLoanDetails = new ArrayList<ImportedLoanDetail>();
    // open spreadsheet
    try {
        HSSFWorkbook workbook = new HSSFWorkbook(is);
        HSSFSheet sheet = workbook.getSheetAt(0);
        // check first row of data
        HSSFRow row = sheet.getRow(XlsLoansImportTemplateConstants.FIRST_ROW_WITH_DATA.getValue());
        if (row == null) {
            throw new XlsParsingException(getMessage(XlsMessageConstants.NOT_ENOUGH_INPUT_ROW, null));
        }
        Iterator<Row> iterator = sheet.rowIterator();
        // skip to rows with data
        while (iterator.hasNext() && (iterator.next().getRowNum() < XlsLoansImportTemplateConstants.FIRST_ROW_WITH_DATA.getValue() - 1)) ;
        // parse loan account's data
        while (iterator.hasNext()) {
            row = (HSSFRow) iterator.next();
            List<Object> params = new ArrayList<Object>();
            // setup the first cell
            XlsLoansImportTemplateConstants currentCell = XlsLoansImportTemplateConstants.ACCOUNT_NUMBER;
            try {
                // account number
                String accountNumber = getCellStringValue(row, currentCell);
                // TODO: rewrite this account number validation to more universal and extract method
                if (StringUtils.isBlank(accountNumber) && isEdit) {
                    //editing and account number is missing
                    throw new XlsParsingException(getCellError(XlsMessageConstants.MISSING_ACCOUNT_NUMBER, row, currentCell.getValue(), null));
                } else //TODO: validation if account for edition exists
                if (StringUtils.isBlank(accountNumber) && !isEdit) {
                    //not editing, adding with predefined account number and account number is not good
                    accountNumber = null;
                } else //account number is good for creating new account with predefined account number...
                if (!StringUtils.isBlank(accountNumber) && !isEdit) {
                    //...but it's duplicate
                    if (!validateAccountNumber(accountNumber, newAccountsNumbers)) {
                        params.clear();
                        params.add(accountNumber);
                        throw new XlsParsingException(getCellError(XlsMessageConstants.DUPLICATE_GLOBAL_NUM_ERROR, row, currentCell.getValue(), params));
                    }
                }
                //all good, account is either predefined from xls document or null and will be generated 
                //TODO: extract methods that can be shared between loans and savings
                // customer global id
                currentCell = XlsLoansImportTemplateConstants.CUSTOMER_GLOBAL_ID;
                String customerGlobalId = getCellStringValue(row, currentCell);
                if (customerGlobalId.isEmpty()) {
                    throw new XlsParsingException(getCellError(XlsMessageConstants.CUSTOMER_NOT_BLANK, row, currentCell.getValue(), params));
                }
                CustomerBO customerBO = null;
                customerBO = validateCustomerGlobalId(customerGlobalId);
                if (customerBO == null) {
                    params.clear();
                    params.add(customerGlobalId);
                    throw new XlsParsingException(getCellError(XlsMessageConstants.CUSTOMER_NOT_FOUND, row, currentCell.getValue(), params));
                }
                // product name
                currentCell = XlsLoansImportTemplateConstants.PRODUCT_NAME;
                String productName = getCellStringValue(row, currentCell);
                LoanOfferingBO loanOfferingBO = null;
                loanOfferingBO = validateProductName(productName, customerBO, row, currentCell.getValue());
                //TODO: add support for backdated payments
                LoanCreationLoanDetailsDto lcldd = loanAccountServiceFacade.retrieveLoanDetailsForLoanAccountCreation(customerBO.getCustomerId(), loanOfferingBO.getPrdOfferingId(), false);
                // status name
                currentCell = XlsLoansImportTemplateConstants.STATUS_NAME;
                String statusName = getCellStringValue(row, currentCell);
                XlsLoanSavingsAccountStatesConstants statusConstant = null;
                statusConstant = validateStatusName(statusName, customerBO, this.isEdit, row, currentCell.getValue());
                // status reason flag
                currentCell = XlsLoansImportTemplateConstants.CANCEL_FlAG_REASON;
                String cancelReason = getCellStringValue(row, currentCell);
                XlsLoanSavingsFlagsConstants flagConstant = null;
                flagConstant = validateStatusFlagReason(cancelReason, statusName, AccountTypes.LOAN_ACCOUNT, row, currentCell.getValue());
                // loan amount
                currentCell = XlsLoansImportTemplateConstants.LOAN_AMOUNT;
                BigDecimal loanAmount = getCellDecimalValue(row, currentCell);
                validateAmount(loanAmount, loanOfferingBO, customerBO, lcldd, row, currentCell.getValue());
                // Interest rate
                currentCell = XlsLoansImportTemplateConstants.INTEREST_RATE;
                BigDecimal interestRate = getCellDecimalValue(row, currentCell);
                validateInterestRate(interestRate, loanOfferingBO, customerBO, lcldd, row, currentCell.getValue());
                // number of installments
                currentCell = XlsLoansImportTemplateConstants.NO_OF_INSTALLMENTS;
                Integer numberOfInstallments = getCellIntegerValue(row, currentCell);
                validateNumberOfInstallments(numberOfInstallments, customerBO, loanOfferingBO, lcldd, row, currentCell.getValue());
                // disbursal date
                currentCell = XlsLoansImportTemplateConstants.DISBURLSAL_DATE;
                Date disbursalDate = getCellDateValue(row, currentCell);
                validateDisbursalDate(disbursalDate, customerBO, loanOfferingBO, currentCell.getValue(), row, statusName);
                // grace period
                currentCell = XlsLoansImportTemplateConstants.GRACE_PERIOD;
                Integer gracePeriod = getCellIntegerValue(row, currentCell);
                validateGracePeriod(gracePeriod, loanOfferingBO, customerBO, numberOfInstallments, row, currentCell.getValue());
                // source of founds
                currentCell = XlsLoansImportTemplateConstants.SOURCE_OF_FOUNDS;
                List<FundDto> funds = lcldd.getFundDtos();
                String sourceOfFund = getCellStringValue(row, currentCell);
                Integer sourceOfFundId = null;
                sourceOfFundId = validateSourceOfFund(sourceOfFund, funds, row, currentCell.getValue());
                // purpose
                List<ValueListElement> purposes = lcldd.getLoanPurposes();
                currentCell = XlsLoansImportTemplateConstants.PURPOSE;
                String loanPurpose = getCellStringValue(row, currentCell);
                Integer loanPurposeId = null;
                loanPurposeId = validateLoanPurposeId(loanPurpose, purposes, row, currentCell.getValue());
                // collateral type
                currentCell = XlsLoansImportTemplateConstants.COLLATERAL_TYPE;
                Integer collateralTypeId = null;
                String collateralType = getCellStringValue(row, currentCell);
                Map<String, String> collaterals = lcldd.getCollateralOptions();
                collateralTypeId = validateCollateralType(collateralType, collaterals, row, currentCell.getValue());
                // collateral notes
                currentCell = XlsLoansImportTemplateConstants.COLLATERAL_NOTES;
                String collateralNotes = getCellStringValue(row, currentCell);
                collateralNotes = StringUtils.isBlank(collateralNotes) ? null : collateralNotes;
                // external id
                currentCell = XlsLoansImportTemplateConstants.EXTERNAL_ID;
                String externalId = getCellStringValue(row, currentCell);
                externalId = StringUtils.isBlank(externalId) ? null : externalId;
                //...will be used for editing/adding loans with predefined account numbers
                if (accountNumber != null) {
                    newAccountsNumbers.add(accountNumber);
                }
                //create final objects
                //TODO handle backdated payments
                Short flagValue = flagConstant == null ? null : flagConstant.getFlag().getValue();
                ImportedLoanDetail detail = new ImportedLoanDetail(accountNumber, customerBO.getCustomerId(), loanOfferingBO.getPrdOfferingId(), statusConstant.getState().getValue(), flagValue, loanAmount, interestRate, numberOfInstallments, disbursalDate, gracePeriod, sourceOfFundId, loanPurposeId, collateralTypeId, collateralNotes, externalId);
                parsedLoanDetails.add(detail);
            } catch (XlsParsingException xex) {
                if (xex.isMultiple()) {
                    for (String msg : xex.getMessages()) {
                        errors.add(msg);
                    }
                } else {
                    errors.add(xex.getMessage());
                }
            } catch (Exception cex) {
                errors.add(cex.getMessage());
            }
        }
    } catch (Exception ex) {
        errors.add(ex.getMessage());
    }
    result = new ParsedLoansDto(errors, parsedLoanDetails);
    return result;
}
Also used : ArrayList(java.util.ArrayList) HSSFRow(org.apache.poi.hssf.usermodel.HSSFRow) HSSFRichTextString(org.apache.poi.hssf.usermodel.HSSFRichTextString) CustomerBO(org.mifos.customers.business.CustomerBO) ParsedLoansDto(org.mifos.dto.domain.ParsedLoansDto) ImportedLoanDetail(org.mifos.dto.domain.ImportedLoanDetail) FundDto(org.mifos.accounts.fund.servicefacade.FundDto) HSSFWorkbook(org.apache.poi.hssf.usermodel.HSSFWorkbook) BigDecimal(java.math.BigDecimal) Date(java.util.Date) LocalDate(org.joda.time.LocalDate) LoanOfferingBO(org.mifos.accounts.productdefinition.business.LoanOfferingBO) HSSFSheet(org.apache.poi.hssf.usermodel.HSSFSheet) HSSFRow(org.apache.poi.hssf.usermodel.HSSFRow) Row(org.apache.poi.ss.usermodel.Row) LoanCreationLoanDetailsDto(org.mifos.dto.screen.LoanCreationLoanDetailsDto) ValueListElement(org.mifos.dto.domain.ValueListElement)

Example 3 with LoanCreationLoanDetailsDto

use of org.mifos.dto.screen.LoanCreationLoanDetailsDto in project head by mifos.

the class LoanControllerHelper method populateFormBeanFromDto.

public void populateFormBeanFromDto(int customerId, int productId, LoanAccountFormBean formBean, BackdatedPaymentable loanScheduleFormBean, LocalDate disbursementDate, LoanScheduleDto loanSchedule, boolean resetActualPaymentDatesAndAmountsForRedoLoan) {
    List<DateTime> installments = new ArrayList<DateTime>();
    List<DateTime> actualPaymentDates = new ArrayList<DateTime>();
    List<Number> installmentAmounts = new ArrayList<Number>();
    List<Number> actualPaymentAmounts = new ArrayList<Number>();
    List<Short> actualPaymentTypes = new ArrayList<Short>();
    BigDecimal totalLoanInterest = BigDecimal.ZERO;
    BigDecimal totalLoanFees = BigDecimal.ZERO;
    for (LoanCreationInstallmentDto installment : loanSchedule.getInstallments()) {
        totalLoanInterest = totalLoanInterest.add(BigDecimal.valueOf(installment.getInterest()));
        totalLoanFees = totalLoanFees.add(BigDecimal.valueOf(installment.getFees()));
        installments.add(new DateTime(installment.getDueDate()));
        actualPaymentDates.add(new DateTime(installment.getDueDate()));
        installmentAmounts.add(installment.getTotal());
        if (new LocalDate(installment.getDueDate()).isBefore(new LocalDate().plusDays(1))) {
            actualPaymentAmounts.add(installment.getTotal());
        } else {
            actualPaymentAmounts.add(Double.valueOf("0.0"));
        }
        actualPaymentTypes.add(null);
    }
    loanScheduleFormBean.setInstallments(installments);
    loanScheduleFormBean.setVariableInstallments(loanSchedule.getInstallments());
    loanScheduleFormBean.setInstallmentAmounts(installmentAmounts);
    if (resetActualPaymentDatesAndAmountsForRedoLoan) {
        loanScheduleFormBean.setActualPaymentDates(actualPaymentDates);
        loanScheduleFormBean.setActualPaymentAmounts(actualPaymentAmounts);
        loanScheduleFormBean.setActualPaymentTypes(actualPaymentTypes);
    }
    loanScheduleFormBean.setLoanPrincipal(BigDecimal.valueOf(formBean.getAmount().doubleValue()));
    loanScheduleFormBean.setTotalLoanInterest(totalLoanInterest);
    loanScheduleFormBean.setTotalLoanFees(totalLoanFees);
    loanScheduleFormBean.setRepaymentInstallments(loanSchedule.getInstallments());
    if (disbursementDate != null) {
        loanScheduleFormBean.setDisbursementDate(disbursementDate.toDateMidnight().toDate());
    }
    // variable installments related
    loanScheduleFormBean.setVariableInstallmentsAllowed(formBean.isVariableInstallmentsAllowed());
    if (loanScheduleFormBean.isVariableInstallmentsAllowed()) {
        loanScheduleFormBean.setMinGapInDays(formBean.getMinGapInDays());
        loanScheduleFormBean.setMaxGapInDays(formBean.getMaxGapInDays());
        loanScheduleFormBean.setMinInstallmentAmount(formBean.getMinInstallmentAmount());
        loanScheduleFormBean.setCustomerId(formBean.getCustomerId());
        loanScheduleFormBean.setLoanAccountFormBean(formBean);
    }
    List<FeeDto> applicableFees = new ArrayList<FeeDto>();
    LoanCreationLoanDetailsDto dto = this.loanAccountServiceFacade.retrieveLoanDetailsForLoanAccountCreation(customerId, Integer.valueOf(productId).shortValue(), formBean.isRedoLoanAccount());
    int feeIndex = 0;
    for (Boolean defaultFeeSelectedForRemoval : formBean.getDefaultFeeSelected()) {
        if (defaultFeeSelectedForRemoval == null || !defaultFeeSelectedForRemoval) {
            Integer feeId = formBean.getDefaultFeeId()[feeIndex].intValue();
            BigDecimal amountOrRate = BigDecimal.valueOf(formBean.getDefaultFeeAmountOrRate()[feeIndex].doubleValue());
            applicableFees.add(findFeeById(dto.getDefaultFees(), feeId, amountOrRate));
        }
        feeIndex++;
    }
    List<PenaltyDto> applicablePenalties = new ArrayList<PenaltyDto>();
    int penaltyIndex = 0;
    for (Boolean defaultPenaltySelectedForRemoval : formBean.getDefaultPenaltySelected()) {
        if (defaultPenaltySelectedForRemoval == null || !defaultPenaltySelectedForRemoval) {
            Integer penaltyId = formBean.getDefaultPenaltyId()[penaltyIndex].intValue();
            BigDecimal amountOrRate = BigDecimal.valueOf(formBean.getDefaultPenaltyAmountOrRate()[penaltyIndex].doubleValue());
            applicablePenalties.add(findPenaltyById(dto.getDefaultPenalties(), penaltyId, amountOrRate));
        }
        penaltyIndex++;
    }
    feeIndex = 0;
    Number[] additionalFeesSelected = formBean.getSelectedFeeId();
    if (additionalFeesSelected != null) {
        for (Number additionalFee : additionalFeesSelected) {
            if (additionalFee != null) {
                BigDecimal amountOrRate = BigDecimal.valueOf(formBean.getSelectedFeeAmount()[feeIndex].doubleValue());
                applicableFees.add(findFeeById(dto.getAdditionalFees(), additionalFee.intValue(), amountOrRate));
            }
            feeIndex++;
        }
    }
    loanScheduleFormBean.setApplicableFees(applicableFees);
    loanScheduleFormBean.setApplicablePenalties(applicablePenalties);
}
Also used : PenaltyDto(org.mifos.dto.domain.PenaltyDto) ArrayList(java.util.ArrayList) FeeDto(org.mifos.dto.domain.FeeDto) LoanCreationInstallmentDto(org.mifos.dto.domain.LoanCreationInstallmentDto) LocalDate(org.joda.time.LocalDate) DateTime(org.joda.time.DateTime) BigDecimal(java.math.BigDecimal) LoanCreationLoanDetailsDto(org.mifos.dto.screen.LoanCreationLoanDetailsDto)

Example 4 with LoanCreationLoanDetailsDto

use of org.mifos.dto.screen.LoanCreationLoanDetailsDto in project head by mifos.

the class ImportLoansSavingsFacadeWebTier method saveLoans.

@Override
public ParsedLoansDto saveLoans(ParsedLoansDto parsedLoansDto) {
    List<CreateAccountFeeDto> defaultAccountFees = new ArrayList<CreateAccountFeeDto>();
    List<QuestionGroupDetail> questionGroupDetails = new ArrayList<QuestionGroupDetail>();
    List<CreateAccountPenaltyDto> defaultPenalties = new ArrayList<CreateAccountPenaltyDto>();
    for (ImportedLoanDetail detail : parsedLoansDto.getSuccessfullyParsedRows()) {
        LoanCreationLoanDetailsDto lcldd = loanAccountServiceFacade.retrieveLoanDetailsForLoanAccountCreation(detail.getCustomerId(), detail.getPrdOfferingId(), false);
        RecurringSchedule recurringSchedule = null;
        MeetingDto meetingDto = lcldd.getCustomerMeetingDetail();
        int meetingEvery = (lcldd.isRepaymentIndependentOfMeetingEnabled()) ? lcldd.getLoanOfferingMeetingDetail().getMeetingDetailsDto().getEvery() : meetingDto.getMeetingDetailsDto().getEvery();
        int loanRecurrenceTypeId = (lcldd.isRepaymentIndependentOfMeetingEnabled()) ? lcldd.getLoanOfferingMeetingDetail().getMeetingDetailsDto().getRecurrenceTypeId() : meetingDto.getMeetingDetailsDto().getRecurrenceTypeId();
        if (loanRecurrenceTypeId == 1) {
            recurringSchedule = new WeeklySchedule(meetingEvery, meetingDto.getMeetingDetailsDto().getRecurrenceDetails().getDayOfWeek());
        } else if (loanRecurrenceTypeId == 2) {
            if (meetingDto.getMeetingDetailsDto().getRecurrenceDetails().getWeekOfMonth().equals(0)) {
                recurringSchedule = new MonthlyOnDayOfMonthSchedule(meetingEvery, meetingDto.getMeetingDetailsDto().getRecurrenceDetails().getDayNumber());
            } else {
                recurringSchedule = new MonthlyOnWeekOfMonthSchedule(meetingEvery, meetingDto.getMeetingDetailsDto().getRecurrenceDetails().getWeekOfMonth(), meetingDto.getMeetingDetailsDto().getRecurrenceDetails().getDayOfWeek());
            }
        } else if (loanRecurrenceTypeId == 3) {
            recurringSchedule = new DailySchedule(meetingEvery);
        }
        CreateLoanAccount cla = new CreateLoanAccount(detail.getCustomerId(), new Integer(detail.getPrdOfferingId()), new Integer(detail.getStatus()), detail.getLoanAmount(), lcldd.getMinLoanAmount(), lcldd.getMaxLoanAmount(), detail.getInterestRate().doubleValue(), new LocalDate(detail.getDisbursalDate().getTime()), null, detail.getNumberOfInstallments(), lcldd.getMinNumberOfInstallments(), lcldd.getMaxNumberOfInstallments(), detail.getGracePeriod(), detail.getSourceOfFundId(), detail.getLoanPurposeId(), detail.getCollateralTypeId(), detail.getCollateralNotes(), detail.getExternalId(), lcldd.isRepaymentIndependentOfMeetingEnabled(), recurringSchedule, defaultAccountFees, defaultPenalties);
        cla.setPredefinedAccountNumber(detail.getAccountNumber());
        cla.setFlagId(detail.getFlag());
        this.loanAccountServiceFacade.createLoan(cla, questionGroupDetails, null);
    }
    return null;
}
Also used : QuestionGroupDetail(org.mifos.platform.questionnaire.service.QuestionGroupDetail) ArrayList(java.util.ArrayList) WeeklySchedule(org.mifos.clientportfolio.loan.service.WeeklySchedule) LocalDate(org.joda.time.LocalDate) MeetingDto(org.mifos.dto.domain.MeetingDto) DailySchedule(org.mifos.clientportfolio.loan.service.DailySchedule) RecurringSchedule(org.mifos.clientportfolio.loan.service.RecurringSchedule) CreateLoanAccount(org.mifos.clientportfolio.newloan.applicationservice.CreateLoanAccount) CreateAccountPenaltyDto(org.mifos.dto.domain.CreateAccountPenaltyDto) MonthlyOnDayOfMonthSchedule(org.mifos.clientportfolio.loan.service.MonthlyOnDayOfMonthSchedule) CreateAccountFeeDto(org.mifos.dto.domain.CreateAccountFeeDto) LoanCreationLoanDetailsDto(org.mifos.dto.screen.LoanCreationLoanDetailsDto) MonthlyOnWeekOfMonthSchedule(org.mifos.clientportfolio.loan.service.MonthlyOnWeekOfMonthSchedule) ImportedLoanDetail(org.mifos.dto.domain.ImportedLoanDetail)

Aggregations

ArrayList (java.util.ArrayList)4 LocalDate (org.joda.time.LocalDate)4 LoanCreationLoanDetailsDto (org.mifos.dto.screen.LoanCreationLoanDetailsDto)4 BigDecimal (java.math.BigDecimal)3 FundDto (org.mifos.accounts.fund.servicefacade.FundDto)2 LoanOfferingBO (org.mifos.accounts.productdefinition.business.LoanOfferingBO)2 CustomerBO (org.mifos.customers.business.CustomerBO)2 FeeDto (org.mifos.dto.domain.FeeDto)2 PenaltyDto (org.mifos.dto.domain.PenaltyDto)2 ValueListElement (org.mifos.dto.domain.ValueListElement)2 Date (java.util.Date)1 LinkedHashMap (java.util.LinkedHashMap)1 HSSFRichTextString (org.apache.poi.hssf.usermodel.HSSFRichTextString)1 HSSFRow (org.apache.poi.hssf.usermodel.HSSFRow)1 HSSFSheet (org.apache.poi.hssf.usermodel.HSSFSheet)1 HSSFWorkbook (org.apache.poi.hssf.usermodel.HSSFWorkbook)1 Row (org.apache.poi.ss.usermodel.Row)1 DateTime (org.joda.time.DateTime)1 AccountException (org.mifos.accounts.exceptions.AccountException)1 AmountFeeBO (org.mifos.accounts.fees.business.AmountFeeBO)1