use of org.mifos.accounts.fund.business.FundBO 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);
}
}
use of org.mifos.accounts.fund.business.FundBO in project head by mifos.
the class LoanAccountServiceFacadeWebTier method assembleLoanAccountDetail.
private LoanAccountDetail assembleLoanAccountDetail(CreateLoanAccount loanAccountInfo) {
CustomerBO customer = this.customerDao.findCustomerById(loanAccountInfo.getCustomerId());
LoanOfferingBO loanProduct = this.loanProductDao.findById(loanAccountInfo.getProductId());
Money loanAmount = new Money(loanProduct.getCurrency(), loanAccountInfo.getLoanAmount());
AccountState accountStateType = AccountState.fromShort(loanAccountInfo.getAccountState().shortValue());
FundBO fund = null;
if (loanAccountInfo.getSourceOfFundId() != null) {
fund = this.fundDao.findById(loanAccountInfo.getSourceOfFundId().shortValue());
}
return new LoanAccountDetail(customer, loanProduct, loanAmount, accountStateType, fund);
}
use of org.mifos.accounts.fund.business.FundBO in project head by mifos.
the class LoanPrdAction method getFundsFromList.
private List<FundBO> getFundsFromList(List<FundBO> funds, String[] fundsSelected) {
logger.debug("start getFundsFromList method of Loan Product Action ");
List<FundBO> fundList = new ArrayList<FundBO>();
if (fundsSelected != null && fundsSelected.length > 0 && funds != null && funds.size() > 0) {
for (String fundSelected : fundsSelected) {
FundBO fund = getFundFromList(funds, fundSelected);
if (fund != null) {
fundList.add(fund);
}
}
}
logger.debug("getFundsFromList method of Loan Product Action called");
return fundList;
}
use of org.mifos.accounts.fund.business.FundBO in project head by mifos.
the class WebTierFundServiceFacade method createFund.
@Override
public void createFund(FundDto fundDto) {
List<FundCodeEntity> fundCodeEntities = fundDao.findAllFundCodes();
Short fundCodeId = Short.valueOf(fundDto.getCode().getId());
FundCodeEntity fundCode = null;
for (FundCodeEntity fundCodeEntity : fundCodeEntities) {
if (fundCodeEntity.getFundCodeId().equals(fundCodeId)) {
fundCode = fundCodeEntity;
break;
}
}
FundBO fundBO = new FundBO(fundCode, fundDto.getName());
if (this.fundDao.countOfFundByName(fundDto.getName().trim()) > 0) {
throw new org.mifos.service.BusinessRuleException(FundConstants.DUPLICATE_FUNDNAME_EXCEPTION);
}
try {
StaticHibernateUtil.startTransaction();
this.fundDao.save(fundBO);
StaticHibernateUtil.commitTransaction();
} catch (Exception e) {
StaticHibernateUtil.rollbackTransaction();
throw new MifosRuntimeException(e.getMessage(), e);
} finally {
StaticHibernateUtil.closeSession();
}
}
use of org.mifos.accounts.fund.business.FundBO in project head by mifos.
the class LoanPrdActionStrutsTest method testManage.
@Test
public void testManage() throws Exception {
loanOffering = createLoanOfferingBO("Loan Offering", "LOAN");
setRequestPathInfo("/loanproductaction.do");
addRequestParameter("method", "manage");
addRequestParameter("prdOfferingId", loanOffering.getPrdOfferingId().toString());
addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
performNoErrors();
verifyForward(ActionForwards.manage_success.toString());
List<ProductCategoryBO> productCategories = (List<ProductCategoryBO>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANPRODUCTCATEGORYLIST, request);
Assert.assertEquals("The size of master data for categories", 1, productCategories.size());
for (ProductCategoryBO productCategory : productCategories) {
Assert.assertNotNull(productCategory.getProductType());
}
Assert.assertEquals("The size of applicable list", 2, ((List<MasterDataEntity>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANAPPLFORLIST, request)).size());
Assert.assertEquals("The size of grace period types list", 3, ((List<MasterDataEntity>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANGRACEPERIODTYPELIST, request)).size());
Assert.assertEquals("The size of interest types list", 4, ((List<MasterDataEntity>) SessionUtils.getAttribute(ProductDefinitionConstants.INTERESTTYPESLIST, request)).size());
Assert.assertEquals("The size of applicable list", 10, ((List<GLCodeEntity>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANPRICIPALGLCODELIST, request)).size());
Assert.assertEquals("The size of applicable list", 3, ((List<GLCodeEntity>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANINTERESTGLCODELIST, request)).size());
List<FundBO> funds = (List<FundBO>) SessionUtils.getAttribute(ProductDefinitionConstants.SRCFUNDSLIST, request);
Assert.assertNotNull(funds);
List<FeeDto> fees = (List<FeeDto>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANFEESLIST, request);
Assert.assertNull(fees);
List<FeeBO> productFees = (List<FeeBO>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANPRDFEE, request);
Assert.assertNotNull(productFees);
List<FeeDto> selectedFees = (List<FeeDto>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANPRDFEESELECTEDLIST, request);
Assert.assertNotNull(selectedFees);
List<FundBO> selectedFunds = (List<FundBO>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANPRDFUNDSELECTEDLIST, request);
Assert.assertNotNull(selectedFunds);
Assert.assertEquals("The size of applicable status list", 2, ((List<PrdStatusEntity>) SessionUtils.getAttribute(ProductDefinitionConstants.LOANPRDSTATUSLIST, request)).size());
LoanPrdActionForm loanPrdActionForm = (LoanPrdActionForm) request.getSession().getAttribute(ProductDefinitionConstants.LOANPRODUCTACTIONFORM);
Assert.assertNotNull(loanPrdActionForm);
Assert.assertEquals(loanOffering.getPrdOfferingId().toString(), loanPrdActionForm.getPrdOfferingId());
Assert.assertEquals(loanOffering.getPrdOfferingName(), loanPrdActionForm.getPrdOfferingName());
Assert.assertEquals(loanOffering.getPrdOfferingShortName(), loanPrdActionForm.getPrdOfferingShortName());
Assert.assertEquals(loanOffering.getPrdCategory().getProductCategoryID().toString(), loanPrdActionForm.getPrdCategory());
Assert.assertEquals(loanOffering.getStatus().getValue().toString(), loanPrdActionForm.getPrdStatus());
Assert.assertEquals(loanOffering.getPrdApplicableMasterEnum(), loanPrdActionForm.getPrdApplicableMasterEnum());
Assert.assertEquals(DateUtils.getUserLocaleDate(TestObjectFactory.getContext().getPreferredLocale(), DateUtils.toDatabaseFormat(loanOffering.getStartDate())), loanPrdActionForm.getStartDate());
if (loanOffering.getEndDate() != null) {
Assert.assertEquals(DateUtils.getUserLocaleDate(TestObjectFactory.getContext().getPreferredLocale(), DateUtils.toDatabaseFormat(loanOffering.getEndDate())), loanPrdActionForm.getEndDate());
} else {
Assert.assertNull(loanPrdActionForm.getEndDate());
}
Assert.assertEquals(loanOffering.getDescription(), loanPrdActionForm.getDescription());
Assert.assertEquals(loanOffering.getGracePeriodType().getId().toString(), loanPrdActionForm.getGracePeriodType());
Assert.assertEquals(loanOffering.getGracePeriodDuration().toString(), loanPrdActionForm.getGracePeriodDuration());
Assert.assertEquals(loanOffering.getInterestTypes().getId().toString(), loanPrdActionForm.getInterestTypes());
Set<LoanAmountSameForAllLoanBO> loanAmountSameForAllLoan = loanOffering.getLoanAmountSameForAllLoan();
Assert.assertNotNull(loanAmountSameForAllLoan);
Set<NoOfInstallSameForAllLoanBO> noOfInstallSameForAllLoan = loanOffering.getNoOfInstallSameForAllLoan();
Assert.assertNotNull(noOfInstallSameForAllLoan);
Assert.assertEquals(loanOffering.getMaxInterestRate().toString(), loanPrdActionForm.getMaxInterestRate());
Assert.assertEquals(loanOffering.getMinInterestRate().toString(), loanPrdActionForm.getMinInterestRate());
Assert.assertEquals(loanOffering.getDefInterestRate().toString(), loanPrdActionForm.getDefInterestRate());
Assert.assertEquals(loanOffering.isIntDedDisbursement(), loanPrdActionForm.isIntDedAtDisbValue());
Assert.assertEquals(loanOffering.isPrinDueLastInst(), loanPrdActionForm.isPrinDueLastInstValue());
Assert.assertEquals(loanOffering.isIncludeInLoanCounter(), loanPrdActionForm.isLoanCounterValue());
Assert.assertEquals(loanOffering.getLoanOfferingMeeting().getMeeting().getMeetingDetails().getRecurAfter().toString(), loanPrdActionForm.getRecurAfter());
Assert.assertEquals(loanOffering.getLoanOfferingMeeting().getMeeting().getMeetingDetails().getRecurrenceType().getRecurrenceId().toString(), loanPrdActionForm.getFreqOfInstallments());
Assert.assertEquals(loanOffering.getPrincipalGLcode().getGlcodeId().toString(), loanPrdActionForm.getPrincipalGLCode());
Assert.assertEquals(loanOffering.getInterestGLcode().getGlcodeId().toString(), loanPrdActionForm.getInterestGLCode());
Assert.assertEquals(loanOffering.getLoanOfferingFees().size(), (selectedFees).size());
Assert.assertEquals(loanOffering.getLoanOfferingFunds().size(), (selectedFunds).size());
}
Aggregations