package org.mifos.application.servicefacade;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.mifos.accounts.loan.persistance.LoanDao;
import org.mifos.accounts.savings.persistence.SavingsDao;
import org.mifos.accounts.servicefacade.UserContextFactory;
import org.mifos.accounts.util.helpers.AccountTypes;
import org.mifos.core.MifosRuntimeException;
import org.mifos.customers.api.CustomerLevel;
import org.mifos.customers.business.CustomerSearchDto;
import org.mifos.customers.business.CustomerStatusEntity;
import org.mifos.customers.center.util.helpers.CenterConstants;
import org.mifos.customers.office.persistence.OfficeDao;
import org.mifos.customers.persistence.CustomerPersistence;
import org.mifos.customers.personnel.persistence.PersonnelDao;
import org.mifos.dto.screen.CenterSearchResultDto;
import org.mifos.dto.screen.ClientSearchResultDto;
import org.mifos.dto.screen.CustomerHierarchyDto;
import org.mifos.dto.screen.CustomerStatusDetailDto;
import org.mifos.dto.screen.GroupSearchResultDto;
import org.mifos.dto.screen.LoanAccountSearchResultDto;
import org.mifos.dto.screen.SavingsAccountSearchResultDto;
import org.mifos.dto.screen.SearchFiltersDto;
import org.mifos.framework.exceptions.HibernateSearchException;
import org.mifos.framework.exceptions.PersistenceException;
import org.mifos.framework.hibernate.helper.QueryResult;
import org.mifos.security.MifosUser;
import org.mifos.security.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
public class CustomerSearchServiceFacadeWebTier implements
CustomerSearchServiceFacade {
@Autowired
LoanDao loanDao;
@Autowired
SavingsDao savingsDao;
@Autowired
CustomerServiceFacade customerServiceFacade;
@Autowired
PersonnelDao personnelDao;
@Autowired
OfficeDao officeDao;
@Override
public CustomerHierarchyDto search(String searchString, Short officeId, int pageNumber, int pageSize, SearchFiltersDto filters){
MifosUser user = (MifosUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserContext userContext = new UserContextFactory().create(user);
if (searchString == null) {
throw new MifosRuntimeException(CenterConstants.NO_SEARCH_STRING);
}
String normalisedSearchString = org.mifos.framework.util.helpers.SearchUtils
.normalizeSearchString(searchString);
if (normalisedSearchString.equals("")) {
throw new MifosRuntimeException(CenterConstants.NO_SEARCH_STRING);
}
CustomerHierarchyDto customerHierarchyDto = new CustomerHierarchyDto();
QueryResult searchResult = null;
List<CustomerSearchDto> resultList = null;
try {
searchResult = new CustomerPersistence().search(normalisedSearchString, officeId, userContext.getId(), userContext.getBranchId(), filters);
} catch ( PersistenceException e ) {
throw new MifosRuntimeException(e);
}
try {
resultList = searchResult.get(pageNumber, pageSize);
customerHierarchyDto.setSize(searchResult.getSize());
customerHierarchyDto.setSearchResultSize(resultList.size());
} catch ( HibernateSearchException e ){
throw new MifosRuntimeException(e);
}
/* FIXME: QueryResult.get returns CustomerSearchDto with messed up customers and accounts data.
*/
for ( CustomerSearchDto customerSearchDto : resultList ){
if ( customerSearchDto.getCustomerType() == 1){
ClientSearchResultDto clientSearchResultDto = new ClientSearchResultDto();
clientSearchResultDto.setOfficeId(customerSearchDto.getOfficeId());
clientSearchResultDto.setOfficeName(customerSearchDto.getOfficeName());
/* QueryResult.get returns CustomerSearchDto (as Client) with clientName as centerName,
* clientGobalCustNum as centerGobalCustNum and vice versa
*/
clientSearchResultDto.setClientName(customerSearchDto.getCenterName());
clientSearchResultDto.setClientGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
clientSearchResultDto.setGroupName(customerSearchDto.getGroupName());
clientSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
clientSearchResultDto.setCenterName(customerSearchDto.getClientName());
clientSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getClientGlobalCustNum());
clientSearchResultDto.setBranchName(customerSearchDto.getBranchName());
clientSearchResultDto.setBranchId(customerSearchDto.getBranchGlobalNum());
clientSearchResultDto.setCustomerStatusId(customerSearchDto.getCustomerStatus());
clientSearchResultDto.setLoanOfficerName(customerSearchDto.getLoanOfficerName());
clientSearchResultDto.setLoanOfficerId(customerSearchDto.getLoanOffcerGlobalNum());
for (Object loanGlobalAccount : customerSearchDto.getLoanGlobalAccountNum()) {
String accountStr = (String)loanGlobalAccount;
clientSearchResultDto.getLoanGlobalAccountNum().add(accountStr);
clientSearchResultDto.getLoanGlobalAccountStateIds().put(accountStr,
loanDao.findByGlobalAccountNum(accountStr).getAccountState().getId());
}
for (Object savingGlobalAccount : customerSearchDto.getSavingsGlobalAccountNum()){
String accountStr = (String)savingGlobalAccount;
clientSearchResultDto.getSavingsGlobalAccountNum().add(accountStr);
clientSearchResultDto.getSavingsGlobalAccountStateIds().put(accountStr,
savingsDao.findBySystemId(accountStr).getState().getValue());
}
for (Object groupLoanAccount: customerSearchDto.getGroupLoanGlobalAccountNum()) {
String accountStr = (String)groupLoanAccount;
clientSearchResultDto.getGroupLoanGlobalAccountNum().add(accountStr);
clientSearchResultDto.getGroupLoanGlobalAccountStateIds().put(accountStr,
loanDao.findByGlobalAccountNum(accountStr).getAccountState().getId());
}
clientSearchResultDto.setStatus(customerSearchDto.getStatus());
customerHierarchyDto.getClients().add(clientSearchResultDto);
} else if ( customerSearchDto.getCustomerType() == 2){
GroupSearchResultDto groupSearchResultDto = new GroupSearchResultDto();
groupSearchResultDto.setOfficeId(customerSearchDto.getOfficeId());
groupSearchResultDto.setOfficeName(customerSearchDto.getOfficeName());
/* QueryResult.get returns CustomerSearchDto (as Group) with groupName as centerName,
* groupGobalCustNum as centerGobalCustNum and vice versa
*/
groupSearchResultDto.setGroupName(customerSearchDto.getCenterName());
groupSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
groupSearchResultDto.setCenterName(customerSearchDto.getGroupName());
groupSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
groupSearchResultDto.setBranchName(customerSearchDto.getBranchName());
groupSearchResultDto.setBranchId(customerSearchDto.getBranchGlobalNum());
groupSearchResultDto.setCustomerStatusId(customerSearchDto.getCustomerStatus());
groupSearchResultDto.setLoanOfficerName(customerSearchDto.getLoanOfficerName());
groupSearchResultDto.setLoanOfficerId(customerSearchDto.getLoanOffcerGlobalNum());
for (Object loanGlobalAccount : customerSearchDto.getLoanGlobalAccountNum()){
String accountStr = (String) loanGlobalAccount;
groupSearchResultDto.getLoanGlobalAccountNum().add(accountStr);
groupSearchResultDto.getLoanGlobalAccountStateIds().put(accountStr,
loanDao.findByGlobalAccountNum(accountStr).getAccountState().getId());
}
for (Object savingGlobalAccount : customerSearchDto.getSavingsGlobalAccountNum()){
String accountStr = (String)savingGlobalAccount;
groupSearchResultDto.getSavingsGlobalAccountNum().add(accountStr);
groupSearchResultDto.getSavingsGlobalAccountStateIds().put(accountStr,
savingsDao.findBySystemId(accountStr).getState().getValue());
}
for (Object groupLoanAccount: customerSearchDto.getGroupLoanGlobalAccountNum()) {
String accountStr = (String)groupLoanAccount;
groupSearchResultDto.getGroupLoanGlobalAccountNum().add(accountStr);
groupSearchResultDto.getGroupLoanGlobalAccountStateIds().put(accountStr,
loanDao.findByGlobalAccountNum(accountStr).getAccountState().getId());
}
groupSearchResultDto.setStatus(customerSearchDto.getStatus());
customerHierarchyDto.getGroups().add(groupSearchResultDto);
} else if ( customerSearchDto.getCustomerType() == 3 ){
CenterSearchResultDto centerSearchResultDto = new CenterSearchResultDto();
centerSearchResultDto.setOfficeId(customerSearchDto.getOfficeId());
centerSearchResultDto.setOfficeName(customerSearchDto.getOfficeName());
centerSearchResultDto.setCenterName(customerSearchDto.getCenterName());
centerSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
centerSearchResultDto.setBranchName(customerSearchDto.getBranchName());
centerSearchResultDto.setBranchId(customerSearchDto.getBranchGlobalNum());
centerSearchResultDto.setCustomerStatusId(customerSearchDto.getCustomerStatus());
centerSearchResultDto.setLoanOfficerName(customerSearchDto.getLoanOfficerName());
centerSearchResultDto.setLoanOfficerId(customerSearchDto.getLoanOffcerGlobalNum());
for (Object savingGlobalAccount : customerSearchDto.getSavingsGlobalAccountNum()){
String accountStr = (String)savingGlobalAccount;
centerSearchResultDto.getSavingsGlobalAccountNum().add(accountStr);
centerSearchResultDto.getSavingsGlobalAccountStateIds().put(accountStr,
savingsDao.findBySystemId(accountStr).getState().getValue());
}
centerSearchResultDto.setStatus(customerSearchDto.getStatus());
customerHierarchyDto.getCenters().add(centerSearchResultDto);
} else if ( customerSearchDto.getLoanGlobalAccountNumber() != null && (customerSearchDto.getCustomerType() == 5 || customerSearchDto.getCustomerType() == 4
|| customerSearchDto.getCustomerType() == 9) || customerSearchDto.getCustomerType() == 10) {
LoanAccountSearchResultDto loanAccountSearchResultDto = new LoanAccountSearchResultDto();
loanAccountSearchResultDto.setLoanGlobalAccountNum(customerSearchDto.getLoanGlobalAccountNumber());
loanAccountSearchResultDto.setOfficeId(customerSearchDto.getOfficeId());
loanAccountSearchResultDto.setOfficeName(customerSearchDto.getOfficeName());
loanAccountSearchResultDto.setBranchName(customerSearchDto.getBranchName());
loanAccountSearchResultDto.setBranchId(customerSearchDto.getBranchGlobalNum());
loanAccountSearchResultDto.setAccountStatusId(customerSearchDto.getCustomerStatus());
loanAccountSearchResultDto.setLoanOfficerName(customerSearchDto.getLoanOfficerName());
loanAccountSearchResultDto.setLoanOfficerId(customerSearchDto.getLoanOffcerGlobalNum());
//new group loan group or client account
if (customerSearchDto.getCustomerType() == 9 || customerSearchDto.getCustomerType() == 10) {
loanAccountSearchResultDto.setGroupLoan(Boolean.TRUE);
loanAccountSearchResultDto.setAccountStatusId(AccountTypes.GROUP_LOAN_ACCOUNT.getValue());
}
if ( customerSearchDto.getClientGlobalCustNum() != null){
loanAccountSearchResultDto.setCenterName(customerSearchDto.getClientName());
loanAccountSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getClientGlobalCustNum());
loanAccountSearchResultDto.setClientName(customerSearchDto.getCenterName());
loanAccountSearchResultDto.setClientGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
loanAccountSearchResultDto.setGroupName(customerSearchDto.getGroupName());
loanAccountSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
} else if( customerSearchDto.getCustomerType() == 5 || customerSearchDto.getCustomerType() == 9) {
loanAccountSearchResultDto.setGroupName(customerSearchDto.getCenterName());
loanAccountSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
loanAccountSearchResultDto.setCenterName(customerSearchDto.getGroupName());
loanAccountSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
}
else {
loanAccountSearchResultDto.setClientName(customerSearchDto.getCenterName());
loanAccountSearchResultDto.setClientGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
loanAccountSearchResultDto.setGroupName(customerSearchDto.getClientName());
loanAccountSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getClientGlobalCustNum());
loanAccountSearchResultDto.setCenterName(customerSearchDto.getGroupName());
loanAccountSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
}
loanAccountSearchResultDto.setStatus(customerSearchDto.getStatus());
customerHierarchyDto.setLoan(loanAccountSearchResultDto);
} else if ( customerSearchDto.getLoanGlobalAccountNumber() != null || customerSearchDto.getCustomerType() == 6){
SavingsAccountSearchResultDto savingsAccountSearchResultDto = new SavingsAccountSearchResultDto();
savingsAccountSearchResultDto.setSavingsGlobalAccountNum(customerSearchDto.getLoanGlobalAccountNumber());
savingsAccountSearchResultDto.setOfficeId(customerSearchDto.getOfficeId());
savingsAccountSearchResultDto.setOfficeName(customerSearchDto.getOfficeName());
savingsAccountSearchResultDto.setBranchName(customerSearchDto.getBranchName());
savingsAccountSearchResultDto.setBranchId(customerSearchDto.getBranchGlobalNum());
savingsAccountSearchResultDto.setAccountStatusId(customerSearchDto.getCustomerStatus());
savingsAccountSearchResultDto.setLoanOfficerName(customerSearchDto.getLoanOfficerName());
savingsAccountSearchResultDto.setLoanOfficerId(customerSearchDto.getLoanOffcerGlobalNum());
if ( customerSearchDto.getClientGlobalCustNum() != null){
savingsAccountSearchResultDto.setCenterName(customerSearchDto.getClientName());
savingsAccountSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getClientGlobalCustNum());
savingsAccountSearchResultDto.setClientName(customerSearchDto.getCenterName());
savingsAccountSearchResultDto.setClientGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
savingsAccountSearchResultDto.setGroupName(customerSearchDto.getGroupName());
savingsAccountSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
} else if ( customerSearchDto.getGroupGlobalCustNum() != null ){
savingsAccountSearchResultDto.setClientName(customerSearchDto.getClientName());
savingsAccountSearchResultDto.setClientGlobalCustNum(customerSearchDto.getClientGlobalCustNum());
savingsAccountSearchResultDto.setGroupName(customerSearchDto.getCenterName());
savingsAccountSearchResultDto.setGroupGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
savingsAccountSearchResultDto.setCenterName(customerSearchDto.getGroupName());
savingsAccountSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getGroupGlobalCustNum());
} else {
savingsAccountSearchResultDto.setCenterName(customerSearchDto.getCenterName());
savingsAccountSearchResultDto.setCenterGlobalCustNum(customerSearchDto.getCenterGlobalCustNum());
}
savingsAccountSearchResultDto.setStatus(customerSearchDto.getStatus());
customerHierarchyDto.setSavings(savingsAccountSearchResultDto);
}
}
return customerHierarchyDto;
}
@Override
public Map<String, ArrayList<CustomerStatusDetailDto>> getAvailibleCustomerStates() throws PersistenceException {
HashMap<String, ArrayList<CustomerStatusDetailDto>> customerStates = new HashMap<String, ArrayList<CustomerStatusDetailDto>>();
for (CustomerLevel customerLevel : CustomerLevel.values()) {
List<CustomerStatusEntity> states = new CustomerPersistence().retrieveAllCustomerStatusList(customerLevel.getValue());
ArrayList<CustomerStatusDetailDto> statesDtos = new ArrayList<CustomerStatusDetailDto>();
for (CustomerStatusEntity customerStatusEntity : states) {
CustomerStatusDetailDto customerStatusDetailDto =
new CustomerStatusDetailDto(customerStatusEntity.getId().toString(), customerStatusEntity.getName(), null);
statesDtos.add(customerStatusDetailDto);
}
customerStates.put(customerLevel.toString(), statesDtos);
}
return customerStates;
}
}