use of org.mifos.customers.client.business.ClientBO in project head by mifos.
the class LoanAccountServiceFacadeWebTier method createLoanAccount.
private LoanCreationResultDto createLoanAccount(CreateLoanAccount loanAccountInfo, List<LoanPaymentDto> backdatedLoanPayments, List<QuestionGroupDetail> questionGroups, LoanAccountCashFlow loanAccountCashFlow, List<DateTime> loanScheduleInstallmentDates, List<Number> totalInstallmentAmounts, List<GroupMemberAccountDto> memberDetails, boolean isBackdatedLoan) {
DateTime creationDate = new DateTime();
// 0. verify member details for GLIM group accounts
for (GroupMemberAccountDto groupMemberAccount : memberDetails) {
ClientBO member = this.customerDao.findClientBySystemId(groupMemberAccount.getGlobalId());
if (creationDate.isBefore(new DateTime(member.getCreatedDate()))) {
throw new BusinessRuleException("errors.cannotCreateLoan.because.clientsAreCreatedInFuture");
}
}
// 1. assemble loan details
MifosUser user = (MifosUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserContext userContext = toUserContext(user);
OfficeBO userOffice = this.officeDao.findOfficeById(user.getBranchId());
PersonnelBO createdBy = this.personnelDao.findPersonnelById(userContext.getId());
CustomerBO customer = this.customerDao.findCustomerById(loanAccountInfo.getCustomerId());
if (customer.isGroup()) {
customer = this.customerDao.findGroupBySystemId(customer.getGlobalCustNum());
}
// assemble
LoanAccountDetail loanAccountDetail = assembleLoanAccountDetail(loanAccountInfo);
List<AccountFeesEntity> accountFeeEntities = assembleAccountFees(loanAccountInfo.getAccountFees());
List<AccountPenaltiesEntity> accountPenaltyEntities = assembleAccountPenalties(loanAccountInfo.getAccountPenalties());
LoanProductOverridenDetail overridenDetail = new LoanProductOverridenDetail(loanAccountDetail.getLoanAmount(), loanAccountInfo.getDisbursementDate(), loanAccountInfo.getInterestRate(), loanAccountInfo.getNumberOfInstallments(), loanAccountInfo.getGraceDuration(), accountFeeEntities, accountPenaltyEntities);
Integer interestDays = Integer.valueOf(AccountingRules.getNumberOfInterestDays().intValue());
boolean loanScheduleIndependentOfCustomerMeetingEnabled = loanAccountInfo.isRepaymentScheduleIndependentOfCustomerMeeting();
LoanScheduleConfiguration configuration = new LoanScheduleConfiguration(loanScheduleIndependentOfCustomerMeetingEnabled, interestDays);
MeetingBO repaymentDayMeeting = null;
if (loanScheduleIndependentOfCustomerMeetingEnabled) {
repaymentDayMeeting = this.createNewMeetingForRepaymentDay(loanAccountInfo.getDisbursementDate(), loanAccountInfo, loanAccountDetail.getCustomer());
} else {
MeetingDto customerMeetingDto = customer.getCustomerMeetingValue().toDto();
repaymentDayMeeting = new MeetingFactory().create(customerMeetingDto);
Short recurAfter = loanAccountDetail.getLoanProduct().getLoanOfferingMeeting().getMeeting().getRecurAfter();
repaymentDayMeeting.getMeetingDetails().setRecurAfter(recurAfter);
}
List<DateTime> loanScheduleDates = new ArrayList<DateTime>(loanScheduleInstallmentDates);
LoanSchedule loanSchedule = assembleLoanSchedule(loanAccountDetail.getCustomer(), loanAccountDetail.getLoanProduct(), overridenDetail, configuration, repaymentDayMeeting, userOffice, loanScheduleDates, loanAccountInfo.getDisbursementDate(), totalInstallmentAmounts);
// 2. create loan
InstallmentRange installmentRange = new MaxMinNoOfInstall(loanAccountInfo.getMinAllowedNumberOfInstallments().shortValue(), loanAccountInfo.getMaxAllowedNumberOfInstallments().shortValue(), null);
AmountRange amountRange = new MaxMinLoanAmount(loanAccountInfo.getMaxAllowedLoanAmount().doubleValue(), loanAccountInfo.getMinAllowedLoanAmount().doubleValue(), null);
if (isBackdatedLoan) {
creationDate = loanAccountInfo.getDisbursementDate().toDateMidnight().toDateTime();
}
CreationDetail creationDetail = new CreationDetail(creationDate, Integer.valueOf(user.getUserId()));
LoanBO loan = LoanBO.openStandardLoanAccount(loanAccountDetail.getLoanProduct(), loanAccountDetail.getCustomer(), repaymentDayMeeting, loanSchedule, loanAccountDetail.getAccountState(), loanAccountDetail.getFund(), overridenDetail, configuration, installmentRange, amountRange, creationDetail, createdBy);
loan.setBusinessActivityId(loanAccountInfo.getLoanPurposeId());
loan.setExternalId(loanAccountInfo.getExternalId());
loan.setCollateralNote(loanAccountInfo.getCollateralNotes());
loan.setCollateralTypeId(loanAccountInfo.getCollateralTypeId());
if (isBackdatedLoan) {
loan.markAsCreatedWithBackdatedPayments();
}
//set up predefined loan account for importing loans
if (loanAccountInfo.getPredefinedAccountNumber() != null) {
loan.setGlobalAccountNum(loanAccountInfo.getPredefinedAccountNumber());
}
try {
personnelDao.checkAccessPermission(userContext, loan.getOfficeId(), loan.getCustomer().getLoanOfficerId());
} catch (AccountException e) {
throw new MifosRuntimeException("Access denied!", e);
}
try {
transactionHelper.startTransaction();
this.loanDao.save(loan);
transactionHelper.flushSession();
//no predefined account number, generate one instead
if (loanAccountInfo.getPredefinedAccountNumber() == null) {
try {
loan.setGlobalAccountNum(loan.generateId(userOffice.getGlobalOfficeNum()));
} catch (AccountException e) {
throw new BusinessRuleException(e.getMessage());
}
this.loanDao.save(loan);
transactionHelper.flushSession();
}
//set up status flag
AccountStateFlagEntity flagEntity = null;
if (loanAccountInfo.getFlagId() != null) {
try {
flagEntity = legacyMasterDao.getPersistentObject(AccountStateFlagEntity.class, loanAccountInfo.getFlagId());
loan.setUserContext(userContext);
loan.setFlag(flagEntity);
loan.setClosedDate(new DateTimeService().getCurrentJavaDateTime());
loan.setUserContext(userContext);
} catch (PersistenceException e) {
throw new BusinessRuleException(e.getMessage());
}
this.loanDao.save(loan);
transactionHelper.flushSession();
}
// for GLIM loans only
List<GroupMemberLoanDetail> individualMembersOfGroupLoan = new ArrayList<GroupMemberLoanDetail>();
List<BigDecimal> radio = new ArrayList<BigDecimal>(loan.getNoOfInstallments());
for (GroupMemberAccountDto groupMemberAccount : memberDetails) {
ClientBO member = this.customerDao.findClientBySystemId(groupMemberAccount.getGlobalId());
Money loanAmount = new Money(loanAccountDetail.getLoanProduct().getCurrency(), groupMemberAccount.getLoanAmount());
List<CreateAccountFeeDto> defaultAccountFees = new ArrayList<CreateAccountFeeDto>();
List<CreateAccountPenaltyDto> defaultAccountPenalties = new ArrayList<CreateAccountPenaltyDto>();
radio.add(loanAmount.divide(loan.getLoanAmount()));
for (CreateAccountFeeDto createAccountFeeDto : loanAccountInfo.getAccountFees()) {
Integer feeId = createAccountFeeDto.getFeeId();
String amount = createAccountFeeDto.getAmount();
FeeBO feeBO = this.feeDao.findById(feeId.shortValue());
if (feeBO instanceof AmountFeeBO) {
amount = String.valueOf(Double.valueOf(createAccountFeeDto.getAmount()) * (loanAmount.divide(loanAccountInfo.getLoanAmount()).getAmount().doubleValue()));
}
defaultAccountFees.add(new CreateAccountFeeDto(feeId, amount));
}
int memberCount = memberDetails.size();
for (CreateAccountPenaltyDto createAccountPenaltyDto : loanAccountInfo.getAccountPenalties()) {
Integer penaltyId = createAccountPenaltyDto.getPenaltyId();
String amount = createAccountPenaltyDto.getAmount();
PenaltyBO penaltyBO = this.penaltyDao.findPenaltyById(penaltyId.shortValue());
if (penaltyBO instanceof AmountPenaltyBO) {
amount = String.valueOf(Double.valueOf(createAccountPenaltyDto.getAmount()) / memberCount);
}
defaultAccountPenalties.add(new CreateAccountPenaltyDto(penaltyId, amount));
}
List<AccountFeesEntity> feeEntities = assembleAccountFees(defaultAccountFees);
List<AccountPenaltiesEntity> penaltyEntities = assembleAccountPenalties(defaultAccountPenalties);
LoanProductOverridenDetail memberOverridenDetail = new LoanProductOverridenDetail(loanAmount, feeEntities, overridenDetail, penaltyEntities);
LoanSchedule memberSchedule = assembleLoanSchedule(member, loanAccountDetail.getLoanProduct(), memberOverridenDetail, configuration, repaymentDayMeeting, userOffice, new ArrayList<DateTime>(), loanAccountInfo.getDisbursementDate(), new ArrayList<Number>());
GroupMemberLoanDetail groupMemberLoanDetail = new GroupMemberLoanDetail(member, memberOverridenDetail, memberSchedule, groupMemberAccount.getLoanPurposeId());
individualMembersOfGroupLoan.add(groupMemberLoanDetail);
}
checkScheduleForMembers(loanSchedule, loan, individualMembersOfGroupLoan, radio);
//for original schedule persisting
List<LoanBO> memberLoans = new ArrayList<LoanBO>();
for (GroupMemberLoanDetail groupMemberAccount : individualMembersOfGroupLoan) {
LoanBO memberLoan = LoanBO.openGroupMemberLoanAccount(loan, loanAccountDetail.getLoanProduct(), groupMemberAccount.getMember(), repaymentDayMeeting, groupMemberAccount.getMemberSchedule(), groupMemberAccount.getMemberOverridenDetail(), configuration, installmentRange, amountRange, creationDetail, createdBy);
if (groupMemberAccount.getLoanPurposeId() > 0) {
memberLoan.setBusinessActivityId(groupMemberAccount.getLoanPurposeId());
}
if (!backdatedLoanPayments.isEmpty()) {
memberLoan.markAsCreatedWithBackdatedPayments();
}
this.loanDao.save(memberLoan);
transactionHelper.flushSession();
try {
memberLoan.setGlobalAccountNum(memberLoan.generateId(userOffice.getGlobalOfficeNum()));
} catch (AccountException e) {
throw new BusinessRuleException(e.getMessage());
}
this.loanDao.save(memberLoan);
transactionHelper.flushSession();
memberLoans.add(memberLoan);
}
// save question groups
if (!questionGroups.isEmpty()) {
Integer eventSourceId = questionnaireServiceFacade.getEventSourceId("Create", "Loan");
QuestionGroupDetails questionGroupDetails = new QuestionGroupDetails(Integer.valueOf(user.getUserId()).shortValue(), loan.getAccountId(), eventSourceId, questionGroups);
questionnaireServiceFacade.saveResponses(questionGroupDetails);
transactionHelper.flushSession();
}
if (loanAccountCashFlow != null && !loanAccountCashFlow.getMonthlyCashFlow().isEmpty()) {
List<MonthlyCashFlowDetail> monthlyCashFlowDetails = new ArrayList<MonthlyCashFlowDetail>();
for (MonthlyCashFlowDto monthlyCashFlow : loanAccountCashFlow.getMonthlyCashFlow()) {
MonthlyCashFlowDetail monthlyCashFlowDetail = new MonthlyCashFlowDetail(monthlyCashFlow.getMonthDate(), monthlyCashFlow.getRevenue(), monthlyCashFlow.getExpenses(), monthlyCashFlow.getNotes());
monthlyCashFlowDetails.add(monthlyCashFlowDetail);
}
org.mifos.platform.cashflow.service.CashFlowDetail cashFlowDetail = new org.mifos.platform.cashflow.service.CashFlowDetail(monthlyCashFlowDetails);
cashFlowDetail.setTotalCapital(loanAccountCashFlow.getTotalCapital());
cashFlowDetail.setTotalLiability(loanAccountCashFlow.getTotalLiability());
cashFlowService.save(cashFlowDetail);
transactionHelper.flushSession();
}
if (isBackdatedLoan) {
// 3. auto approve loan
String comment = "Automatic Status Update (Redo Loan)";
LocalDate approvalDate = loanAccountInfo.getDisbursementDate();
loan.approve(createdBy, comment, approvalDate);
// 4. disburse loan
String receiptNumber = null;
Date receiptDate = null;
PaymentTypeEntity paymentType = new PaymentTypeEntity(PaymentTypes.CASH.getValue());
if (loanAccountInfo.getDisbursalPaymentTypeId() != null) {
paymentType = new PaymentTypeEntity(loanAccountInfo.getDisbursalPaymentTypeId());
}
Date paymentDate = loanAccountInfo.getDisbursementDate().toDateMidnight().toDate();
AccountPaymentEntity disbursalPayment = new AccountPaymentEntity(loan, loan.getLoanAmount(), receiptNumber, receiptDate, paymentType, paymentDate);
disbursalPayment.setCreatedByUser(createdBy);
this.loanBusinessService.persistOriginalSchedule(loan);
for (LoanBO memberLoan : memberLoans) {
this.loanBusinessService.persistOriginalSchedule(memberLoan);
}
// refactoring of loan disbursal
if (customer.isDisbursalPreventedDueToAnyExistingActiveLoansForTheSameProduct(loan.getLoanOffering())) {
throw new BusinessRuleException("errors.cannotDisburseLoan.because.otherLoansAreActive");
}
try {
loan.updateCustomer(customer);
new ProductMixValidator().checkIfProductsOfferingCanCoexist(loan);
} catch (ServiceException e1) {
throw new AccountException(e1.getMessage());
}
loan.disburse(createdBy, disbursalPayment);
customer.updatePerformanceHistoryOnDisbursement(loan, loan.getLoanAmount());
// end of refactoring of loan disbural
this.loanDao.save(loan);
transactionHelper.flushSession();
// 5. apply each payment
for (LoanPaymentDto loanPayment : backdatedLoanPayments) {
Money amountPaidToDate = new Money(loan.getCurrency(), loanPayment.getAmount());
PaymentData paymentData = new PaymentData(amountPaidToDate, createdBy, loanPayment.getPaymentTypeId(), loanPayment.getPaymentDate().toDateMidnight().toDate());
loan.applyPayment(paymentData);
this.loanDao.save(loan);
}
}
transactionHelper.commitTransaction();
return new LoanCreationResultDto(false, loan.getAccountId(), loan.getGlobalAccountNum());
} catch (BusinessRuleException e) {
this.transactionHelper.rollbackTransaction();
throw new BusinessRuleException(e.getMessageKey(), e);
} catch (Exception e) {
this.transactionHelper.rollbackTransaction();
throw new MifosRuntimeException(e);
} finally {
this.transactionHelper.closeSession();
}
}
use of org.mifos.customers.client.business.ClientBO in project head by mifos.
the class LoanAccountServiceFacadeWebTier method retrieveLoanAccountDetails.
@Override
public List<LoanAccountDetailsDto> retrieveLoanAccountDetails(LoanInformationDto loanInformationDto) {
List<LoanBO> individualLoans = this.loanDao.findIndividualLoans(loanInformationDto.getAccountId());
List<ValueListElement> allLoanPurposes = this.loanProductDao.findAllLoanPurposes();
List<LoanAccountDetailsDto> loanAccountDetailsViewList = new ArrayList<LoanAccountDetailsDto>();
for (LoanBO individualLoan : individualLoans) {
LoanAccountDetailsDto loandetails = new LoanAccountDetailsDto();
loandetails.setClientId(individualLoan.getCustomer().getGlobalCustNum());
loandetails.setClientName(individualLoan.getCustomer().getDisplayName());
loandetails.setLoanAmount(null != individualLoan.getLoanAmount() && !EMPTY.equals(individualLoan.getLoanAmount().toString()) ? individualLoan.getLoanAmount().toString() : "0.0");
loandetails.setLoanAccountId(individualLoan.getAccountId().toString());
loandetails.setLoanGlobalAccountNum(individualLoan.getGlobalAccountNum());
loandetails.setParentLoanGlobalAccountNum(individualLoan.getParentAccount().getGlobalAccountNum());
loandetails.setParentLoanAccountId(individualLoan.getParentAccount().getAccountId());
if (null != individualLoan.getBusinessActivityId()) {
loandetails.setBusinessActivity(individualLoan.getBusinessActivityId().toString());
for (ValueListElement busact : allLoanPurposes) {
if (busact.getId().toString().equals(individualLoan.getBusinessActivityId().toString())) {
loandetails.setBusinessActivityName(busact.getName());
}
}
}
ClientBO client = this.customerDao.findClientBySystemId(individualLoan.getCustomer().getGlobalCustNum());
String governmentId = client.getGovernmentId();
loandetails.setGovermentId(StringUtils.isNotBlank(governmentId) ? governmentId : "-");
loanAccountDetailsViewList.add(loandetails);
}
return loanAccountDetailsViewList;
}
use of org.mifos.customers.client.business.ClientBO in project head by mifos.
the class LoanAccountServiceFacadeWebTier method retrieveGetProductDetailsForLoanAccountCreation.
@Override
public LoanCreationProductDetailsDto retrieveGetProductDetailsForLoanAccountCreation(final Integer customerId) {
final CustomerBO customer = this.customerDao.findCustomerById(customerId);
final CustomerDetailDto customerDetailDto = customer.toCustomerDetailDto();
// FIXME - keithw - below code is not needed when jsp/struts is removed as this is worked out for enter loan account details step.
final Date nextMeetingDate = customer.getCustomerAccount().getNextMeetingDate();
final String recurMonth = customer.getCustomerMeeting().getMeeting().getMeetingDetails().getRecurAfter().toString();
final boolean isGroup = customer.isGroup();
final boolean isGlimEnabled = configurationPersistence.isGlimEnabled();
final boolean isLsimEnabled = configurationPersistence.isRepaymentIndepOfMeetingEnabled();
final boolean isGroupLoanWithMembersEnabled = AccountingRules.isGroupLoanWithMembers();
List<PrdOfferingDto> loanProductDtos = retrieveActiveLoanProductsApplicableForCustomer(customer, isLsimEnabled);
LoanCreationGlimDto loanCreationGlimDto = null;
List<LoanAccountDetailsDto> clientDetails = new ArrayList<LoanAccountDetailsDto>();
Errors errors = new Errors();
List<ErrorEntry> errorEntry = new ArrayList<ErrorEntry>();
if (isGroup && isGlimEnabled && isGroupLoanWithMembersEnabled) {
String defaultMessage = "New Group Loan option is enabled in configuration file and also GLIM option is enabled in the database. Loan for Group will be created using new Group Loan approach. Please turn off GLIM option in database. If you want to create Loan for Group using old approach, then please disable AccountingRules.GroupLoanWithMembers option in configuration file and restart Mifos.";
errorEntry.add(new ErrorEntry("createLoanAccount.glim.and.new.glim.are.enabled", "activeClients2", defaultMessage));
errors.addErrors(errorEntry);
}
if (isGroup && (isGlimEnabled || isGroupLoanWithMembersEnabled)) {
final List<ValueListElement> loanPurposes = loanProductDao.findAllLoanPurposes();
final List<ClientBO> activeClientsOfGroup = customerDao.findActiveClientsUnderGroup(customer);
loanCreationGlimDto = new LoanCreationGlimDto(loanPurposes);
if (activeClientsOfGroup == null || activeClientsOfGroup.size() < 2) {
errorEntry.clear();
String defaultMessage = "Group loan is not allowed as there must be at least two active clients within the group when Group loan with individual monitoring (GLIM) is enabled";
errorEntry.add(new ErrorEntry("createLoanAccount.glim.invalid.less.than.two.active.clients.in.group", "activeClients", defaultMessage));
errors.addErrors(errorEntry);
loanProductDtos = new ArrayList<PrdOfferingDto>();
} else {
for (ClientBO client : activeClientsOfGroup) {
LoanAccountDetailsDto clientDetail = new LoanAccountDetailsDto();
clientDetail.setClientId(client.getCustomerId().toString());
clientDetail.setClientName(client.getDisplayName());
clientDetails.add(clientDetail);
}
}
}
return new LoanCreationProductDetailsDto(loanProductDtos, customerDetailDto, nextMeetingDate, recurMonth, isGroup, isGlimEnabled, loanCreationGlimDto, clientDetails, errors);
}
use of org.mifos.customers.client.business.ClientBO 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.customers.client.business.ClientBO in project head by mifos.
the class LoanAccountServiceFacadeWebTier method previewLoanCreationDetails.
@Override
public LoanCreationPreviewDto previewLoanCreationDetails(Integer customerId, List<LoanAccountDetailsDto> accountDetails, List<String> selectedClientIds) {
CustomerBO customer = this.customerDao.findCustomerById(customerId);
final boolean isGroup = customer.isGroup();
final boolean isGlimEnabled = configurationPersistence.isGlimEnabled();
List<LoanAccountDetailsDto> loanAccountDetailsView = new ArrayList<LoanAccountDetailsDto>();
for (String clientIdAsString : selectedClientIds) {
if (StringUtils.isNotEmpty(clientIdAsString)) {
LoanAccountDetailsDto tempLoanAccount = new LoanAccountDetailsDto();
ClientBO client = (ClientBO) this.customerDao.findCustomerById(Integer.valueOf(clientIdAsString));
LoanAccountDetailsDto account = null;
for (LoanAccountDetailsDto tempAccount : accountDetails) {
if (tempAccount.getClientId().equals(clientIdAsString)) {
account = tempAccount;
}
}
tempLoanAccount.setClientId(client.getGlobalCustNum().toString());
tempLoanAccount.setClientName(client.getDisplayName());
tempLoanAccount.setLoanAmount((null != account.getLoanAmount() && !EMPTY.equals(account.getLoanAmount().toString()) ? account.getLoanAmount() : "0.0"));
tempLoanAccount.setBusinessActivity(account.getBusinessActivity());
tempLoanAccount.setGovermentId((StringUtils.isNotBlank(client.getGovernmentId()) ? client.getGovernmentId() : "-").toString());
loanAccountDetailsView.add(tempLoanAccount);
}
}
return new LoanCreationPreviewDto(isGlimEnabled, isGroup, loanAccountDetailsView);
}
Aggregations