vn.com.ecopharma.hrm.rc.service.impl.CandidateLocalServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for vn.com.ecopharma.hrm.rc.service.impl.CandidateLocalServiceImpl.java

Source

/**
m  * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package vn.com.ecopharma.hrm.rc.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import vn.com.ecopharma.emp.service.EmpLocalServiceUtil;
import vn.com.ecopharma.hrm.rc.constant.CandidateField;
import vn.com.ecopharma.hrm.rc.constant.ECO_RCUtils;
import vn.com.ecopharma.hrm.rc.enumeration.CandidateHistoryActionType;
import vn.com.ecopharma.hrm.rc.enumeration.CandidateStatus;
import vn.com.ecopharma.hrm.rc.enumeration.VacancyCandidateType;
import vn.com.ecopharma.hrm.rc.model.Candidate;
import vn.com.ecopharma.hrm.rc.model.CandidateActionHistory;
import vn.com.ecopharma.hrm.rc.model.Certificate;
import vn.com.ecopharma.hrm.rc.model.Experience;
import vn.com.ecopharma.hrm.rc.model.ExperienceClp;
import vn.com.ecopharma.hrm.rc.model.VacancyCandidate;
import vn.com.ecopharma.hrm.rc.model.impl.ExperienceImpl;
import vn.com.ecopharma.hrm.rc.service.VacancyCandidateLocalServiceUtil;
import vn.com.ecopharma.hrm.rc.service.base.CandidateLocalServiceBaseImpl;
import vn.com.ecopharma.hrm.rc.util.RCUtils;

import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.search.BooleanClauseOccur;
import com.liferay.portal.kernel.search.BooleanQuery;
import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.search.ParseException;
import com.liferay.portal.kernel.search.Query;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchEngineUtil;
import com.liferay.portal.kernel.search.SearchException;
import com.liferay.portal.kernel.search.Sort;
import com.liferay.portal.kernel.search.TermRangeQueryFactoryUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.service.ServiceContext;

/**
 * The implementation of the candidate local service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are
 * added, rerun ServiceBuilder to copy their definitions into the
 * {@link vn.com.ecopharma.hrm.rc.service.CandidateLocalService} interface.
 *
 * <p>
 * This is a local service. Methods of this service will not have security
 * checks based on the propagated JAAS credentials because this service can only
 * be accessed from within the same VM.
 * </p>
 *
 * @author tvt
 * @see vn.com.ecopharma.hrm.rc.service.base.CandidateLocalServiceBaseImpl
 * @see vn.com.ecopharma.hrm.rc.service.CandidateLocalServiceUtil
 */
public class CandidateLocalServiceImpl extends CandidateLocalServiceBaseImpl {
    /*
     * NOTE FOR DEVELOPERS:
     * 
     * Never reference this interface directly. Always use {@link
     * vn.com.ecopharma.hrm.rc.service.CandidateLocalServiceUtil} to access the
     * candidate local service.
     */

    private static final Log LOGGER = LogFactoryUtil.getLog(CandidateLocalServiceImpl.class);

    public List<Candidate> findAll() {
        return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS);
    }

    public List<Candidate> findAll(int start, int end) {
        return findAll(start, end, null);
    }

    public List<Candidate> findAll(int start, int end, OrderByComparator orderByComparator) {
        try {
            return candidatePersistence.findAll(start, end, orderByComparator);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return new ArrayList<>();
    }

    /*
     * public Candidate findByEmailAddress(String emailAddress) { try { return
     * candidatePersistence.fetchByEmail(emailAddress); } catch (SystemException
     * e) { LOGGER.info(e); } return null; }
     */

    public boolean isEmailExisted(String emailAddress) {
        try {
            List<Candidate> candidates = candidatePersistence.findByEmailAddress(emailAddress);
            return candidates != null && candidates.size() > 0;
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return false;
    }

    public Candidate findByIdentityCardNo(String identityCardNo) {
        try {
            return candidatePersistence.fetchByIdentityCardNo(identityCardNo);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate findByContactNumber(String contactNumber) {
        try {
            return candidatePersistence.fetchByContactNumber(contactNumber);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate createPrePersistCandidate() {
        try {
            final long id = counterLocalService.increment();
            return candidatePersistence.create(id);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate createPrePersistCandidate(String candidateCode, String fullName, String emailAddress,
            String contactNumber, String identityCardNo, long locationId, long vacancyId, Date applicationDate,
            String status) {
        final Candidate candidate = this.createPrePersistCandidate();
        candidate.setCandidateCode(candidateCode);
        candidate.setFullName(fullName);
        candidate.setEmailAddress(emailAddress);
        candidate.setContactNumber(contactNumber);
        candidate.setIdentityCardNo(identityCardNo);
        candidate.setApplicationDate(applicationDate);

        return candidate;
    }

    public Candidate addCandidate(Candidate candidate, long vacancyId, List<Long> desireVacancies,
            List<Long> fileEntryIds, ServiceContext serviceContext) {
        try {
            candidate.setUserId(serviceContext.getUserId());
            candidate.setGroupId(serviceContext.getScopeGroupId());
            candidate.setCompanyId(serviceContext.getCompanyId());
            candidate.setCreateDate(new Date(System.currentTimeMillis()));
            candidate.setModifiedDate(new Date(System.currentTimeMillis()));

            Candidate result = super.addCandidate(candidate);
            if (result != null) {
                vacancyCandidateLocalService.addVacancyCandidate(vacancyId, result.getCandidateId(),
                        VacancyCandidateType.MAIN.toString());
                // add documents for candidate
                // for (long fileEntryId : fileEntryIds) {
                // DocumentLocalServiceUtil.addDocument(
                // Candidate.class.getName(),
                // candidate.getCandidateId(), fileEntryId,
                // serviceContext);
                // }

                // add candidate experiences
                // for (Map.Entry<?, Boolean> entry : experienceMap.entrySet())
                // {
                // final Experience experience = entry.getKey();
                // ExperienceClp exp;
                // ExperienceImpl expImpl;
                // if (!entry.getValue()) {
                // experienceLocalService.addExperience(Candidate.class
                // .getName(), result.getCandidateId(), entry
                // .getKey().getWorkingPlace(), entry.getKey()
                // .getYearsExperience(), entry.getKey()
                // .getDescription(), serviceContext);
                // }
                // }

                // add candidate certificates
                // for (Map.Entry<?, Boolean> entry : certificateMap.entrySet())
                // {
                // final Certificate certificate = entry.getKey();
                // if (!entry.getValue()) {
                // certificate.setClassPK(result.getCandidateId());
                // certificateLocalService.addCertificate(certificate,
                // serviceContext);
                // certificateLocalService.addCertificate(Candidate.class
                // .getName(), result.getCandidateId(), entry
                // .getKey().getName(), entry.getKey()
                // .getCertificateType(), entry.getKey()
                // .getUniversityId(), serviceContext);
                // }
                // }

                // add desired positions
                if (desireVacancies.contains(vacancyId)) {
                    desireVacancies.remove(vacancyId);
                }
                for (long id : desireVacancies) {
                    vacancyCandidateLocalService.addVacancyCandidate(id, result.getCandidateId(),
                            VacancyCandidateType.OPTIONAL.toString());
                }

                // add permission
                resourceLocalService.addResources(result.getCompanyId(), result.getGroupId(), result.getUserId(),
                        Candidate.class.getName(), result.getCandidateId(), false, true, true);

                // index new employee
                Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(Candidate.class);
                indexer.reindex(Candidate.class.getName(), result.getCandidateId());

                return result;
            }
            return null;
        } catch (SystemException e) {
            LOGGER.info(e);
        } catch (SearchException e) {
            LOGGER.info(e);
        } catch (PortalException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate addCandidate(Candidate candidate, long vacancyId, List<Long> desireVacancies,
            List<Long> fileEntryIds, Map<Experience, Boolean> experienceMap,
            Map<Certificate, Boolean> certificateMap, ServiceContext serviceContext) {
        try {
            candidate.setUserId(serviceContext.getUserId());
            candidate.setGroupId(serviceContext.getScopeGroupId());
            candidate.setCompanyId(serviceContext.getCompanyId());
            candidate.setCreateDate(new Date(System.currentTimeMillis()));
            candidate.setModifiedDate(new Date(System.currentTimeMillis()));

            Candidate result = super.addCandidate(candidate);
            if (result != null) {
                vacancyCandidateLocalService.addVacancyCandidate(vacancyId, result.getCandidateId(),
                        VacancyCandidateType.MAIN.toString());
                // add documents for candidate
                // for (long fileEntryId : fileEntryIds) {
                // DocumentLocalServiceUtil.addDocument(
                // Candidate.class.getName(),
                // candidate.getCandidateId(), fileEntryId,
                // serviceContext);
                // }

                // add candidate experiences
                for (Map.Entry<Experience, Boolean> entry : experienceMap.entrySet()) {
                    final Experience experience = entry.getKey();
                    if (!entry.getValue()) {
                        experience.setClassName(Candidate.class.getName());
                        experience.setClassPK(result.getCandidateId());
                        experienceLocalService.addExperience(experience, serviceContext);
                    }
                }

                // add candidate certificates
                for (Map.Entry<Certificate, Boolean> entry : certificateMap.entrySet()) {
                    final Certificate certificate = entry.getKey();
                    if (!entry.getValue()) {
                        certificate.setClassName(Certificate.class.getName());
                        certificate.setClassPK(result.getCandidateId());
                        certificateLocalService.addCertificate(certificate, serviceContext);
                    }
                }

                // add desired positions
                if (desireVacancies.contains(vacancyId)) {
                    desireVacancies.remove(vacancyId);
                }
                for (long id : desireVacancies) {
                    vacancyCandidateLocalService.addVacancyCandidate(id, result.getCandidateId(),
                            VacancyCandidateType.OPTIONAL.toString());
                }

                // add permission
                resourceLocalService.addResources(result.getCompanyId(), result.getGroupId(), result.getUserId(),
                        Candidate.class.getName(), result.getCandidateId(), false, true, true);

                // index new employee
                Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(Candidate.class);
                indexer.reindex(Candidate.class.getName(), result.getCandidateId());

                return result;
            }
            return null;
        } catch (SystemException e) {
            LOGGER.info(e);
        } catch (SearchException e) {
            LOGGER.info(e);
        } catch (PortalException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate updateCandidate(Candidate candidate, long vacancyId, List<Long> desireVacancies,
            List<Long> fileEntryIds, Map<Experience, Boolean> experienceMap,
            Map<Certificate, Boolean> certificateMap, ServiceContext serviceContext) {
        try {
            /*
             * vacancyCandidateLocalService.setInActivatedByCandidate(candidate
             * .getCandidateId());
             * 
             * final VacancyCandidate vacancyCandidate =
             * vacancyCandidateLocalService
             * .findByVacancyAndCandidate(vacancyId,
             * candidate.getCandidateId()); if (vacancyCandidate != null) {
             * vacancyCandidate.setStatus(1); vacancyCandidateLocalService
             * .updateVacancyCandidate(vacancyCandidate); } else {
             * vacancyCandidateLocalService.addVacancyCandidate(vacancyId,
             * candidate.getCandidateId(), 1); }
             */
            long candidateId = candidate.getCandidateId();
            if (vacancyId != 0) {

                List<VacancyCandidate> oldOPTIONALVacancyCandidates = vacancyCandidateLocalService
                        .findByCandidateAndType(candidateId, VacancyCandidateType.OPTIONAL.toString());
                List<Long> oldOPTIONALVacancyCandidateIds = RCUtils
                        .getIdsFromBasedModelList(oldOPTIONALVacancyCandidates);

                // keep same elements
                List<Long> sameElementList = new ArrayList<Long>(desireVacancies);
                sameElementList.retainAll(oldOPTIONALVacancyCandidateIds);

                // remove elements
                List<Long> deletedElementList = new ArrayList<Long>(oldOPTIONALVacancyCandidateIds);
                deletedElementList.removeAll(sameElementList);

                // new elements
                List<Long> newElementList = new ArrayList<Long>(desireVacancies);
                newElementList.removeAll(sameElementList);

                // remove VacancyCandidate
                for (long id : deletedElementList) {
                    vacancyCandidateLocalService.deleteVacancyCandidate(id);
                }

                // add new VacancyCandidate as OPTIONAL/MAIN
                for (long id : newElementList) {
                    String type = id != vacancyId ? VacancyCandidateType.OPTIONAL.toString()
                            : VacancyCandidateType.MAIN.toString();
                    vacancyCandidateLocalService.addVacancyCandidate(id, candidateId, type);
                }

                // set new MAIN vacancy
                final List<VacancyCandidate> vacancyCandidates = vacancyCandidateLocalService
                        .findByCandidateAndType(candidateId, VacancyCandidateType.MAIN.toString());
                VacancyCandidate currentMAINVacancyCandidate = vacancyCandidates != null
                        && !vacancyCandidates.isEmpty() ? vacancyCandidates.get(0) : null;
                if (currentMAINVacancyCandidate != null && vacancyId != currentMAINVacancyCandidate.getVacancyId())
                    vacancyCandidateLocalService
                            .deleteVacancyCandidate(currentMAINVacancyCandidate.getVacancyCandidateId());

                vacancyCandidateLocalService.addVacancyCandidate(vacancyId, candidateId,
                        VacancyCandidateType.MAIN.toString());
            }

            // add candidate experiences
            for (Map.Entry<Experience, Boolean> entry : experienceMap.entrySet()) {
                final Experience experience = entry.getKey();
                if (!entry.getValue()) {
                    if (experienceLocalService.fetchExperience(experience.getExperienceId()) == null) {
                        experience.setClassPK(candidate.getCandidateId());
                        experienceLocalService.addExperience(experience, serviceContext);
                    } else {
                        experienceLocalService.updateExperience(experience);
                    }
                } else {
                    if (experienceLocalService.fetchExperience(experience.getExperienceId()) != null)
                        experienceLocalService.deleteExperience(experience.getExperienceId());
                }
            }

            // add/remove certificates
            for (Map.Entry<Certificate, Boolean> entry : certificateMap.entrySet()) {
                final Certificate certificate = entry.getKey();
                if (!entry.getValue()) {
                    if (certificateLocalService.fetchCertificate(certificate.getCertificateId()) == null) {
                        certificate.setClassPK(candidate.getCandidateId());
                        certificateLocalService.addCertificate(certificate, serviceContext);
                    } else {
                        certificateLocalService.updateCertificate(certificate);
                    }
                } else {
                    if (certificateLocalService.fetchCertificate(certificate.getCertificateId()) != null)
                        certificateLocalService.deleteCertificate(certificate.getCertificateId());
                }
            }

            // for (Long fileEntryId : fileEntryIds) {
            // if (DocumentLocalServiceUtil
            // .findByClassAndClassPKAndFileEntryId(
            // Candidate.class.getName(),
            // candidate.getCandidateId(), fileEntryId) == null) {
            // DocumentLocalServiceUtil.addDocument(
            // Candidate.class.getName(),
            // candidate.getCandidateId(), fileEntryId,
            // serviceContext);
            // }
            // }

            candidate.setModifiedDate(new Date(System.currentTimeMillis()));

            candidate = candidatePersistence.update(candidate);

            Indexer indexer = IndexerRegistryUtil.getIndexer(Candidate.class.getName());
            indexer.reindex(candidate);

            // add to history
            /*
             * final CandidateActionHistory candidateActionHistory =
             * candidateActionHistoryLocalService
             * .createPrePersistedEntity(candidate.getCandidateId(), "edit",
             * CandidateActionType.EDIT.toString(), serviceContext.getUserId(),
             * "", serviceContext); candidateActionHistoryLocalService
             * .addCandidateActionHistory(candidateActionHistory);
             */

            return candidate;

        } catch (SystemException e) {
            LOGGER.info(e);
        } catch (SearchException e) {
            LOGGER.info(e);
        } catch (PortalException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate changeCandidateStatus(Candidate candidate, String status, ServiceContext serviceContext) {
        try {
            final String origStatus = candidate.getStatus();
            candidate.setStatus(status);
            candidate = candidateLocalService.updateCandidate(candidate);
            // add to history

            final CandidateActionHistory candidateActionHistory = candidateActionHistoryLocalService
                    .createPrePersistedEntity(candidate.getCandidateId(),
                            "StatusChanged: " + origStatus + "-> " + status,
                            CandidateHistoryActionType.CHANGE_STATUS.toString(), serviceContext.getUserId(), "",
                            serviceContext);
            candidateActionHistoryLocalService.addCandidateActionHistory(candidateActionHistory);

            return candidate;
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate changeCandidateStatus(long candidateId, String status, ServiceContext serviceContext) {
        try {
            Candidate candidate = fetchCandidate(candidateId);
            return changeCandidateStatus(candidate, status, serviceContext);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public void changeMultipleCandidateStatus(List<Long> ids, String status, ServiceContext serviceContext) {
        for (long id : ids) {
            changeCandidateStatus(id, status, serviceContext);
        }
    }

    public Candidate setShortListCandidate(long candidateId, ServiceContext serviceContext) {
        return changeCandidateStatus(candidateId, CandidateStatus.SHORTLIST.toString(), serviceContext);
    }

    public void setShortListCandidates(List<Long> ids, ServiceContext serviceContext) {
        changeMultipleCandidateStatus(ids, CandidateStatus.SHORTLIST.toString(), serviceContext);
    }

    /*
     * @Override public Candidate updateCandidate(Candidate candidate) throws
     * SystemException { Candidate c = super.updateCandidate(candidate); //
     * index new employee Indexer indexer =
     * IndexerRegistryUtil.getIndexer(Candidate.class); try {
     * indexer.reindex(c); } catch (SearchException e) { LOGGER.info(e); }
     * return c; }
     */

    public Candidate markDeleted(Candidate candidate, ServiceContext serviceContext) {
        try {
            candidate.setDeleted(true);
            candidate = candidatePersistence.update(candidate);
            // index new employee
            Indexer indexer = IndexerRegistryUtil.getIndexer(Candidate.class.getName());

            indexer.reindex(candidate);

            /*
             * final CandidateActionHistory candidateActionHistory =
             * candidateActionHistoryLocalService
             * .createPrePersistedEntity(candidate.getCandidateId(),
             * "Marked Deleted", CandidateActionType.REMOVE.toString(),
             * serviceContext.getUserId(), "", serviceContext);
             * candidateActionHistoryLocalService
             * .addCandidateActionHistory(candidateActionHistory);
             */

            return candidate;
        } catch (SearchException e) {
            LOGGER.info(e);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public Candidate markDeleted(long candidateId, ServiceContext serviceContext) {
        try {
            Candidate candidate = fetchCandidate(candidateId);
            markDeleted(candidate, serviceContext);
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return null;
    }

    public int countAllUnDeletedIndexedCandidateDocuments(SearchContext searchContext, List<Query> filterQueries,
            long companyId, Sort sort) {
        return searchAllUnDeletedCandidatesIndexedDocument(searchContext, filterQueries, companyId, sort,
                QueryUtil.ALL_POS, QueryUtil.ALL_POS).size();
    }

    public List<Document> searchAllUnDeletedCandidatesIndexedDocument(SearchContext searchContext,
            List<Query> filterQueries, long companyId, Sort sort, int start, int end) {

        LOGGER.info("FilterQueries size: " + filterQueries.size());
        final BooleanQuery fullQuery = BooleanQueryFactoryUtil.create(searchContext);
        final BooleanQuery allCandidateEntriesBooleanQuery = BooleanQueryFactoryUtil.create(searchContext);
        final BooleanQuery noneDeletedCandidateBooleanQuery = BooleanQueryFactoryUtil.create(searchContext);

        allCandidateEntriesBooleanQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, Candidate.class.getName());
        noneDeletedCandidateBooleanQuery.addExactTerm(CandidateField.IS_DELETED, "false");

        try {
            // add filter queries
            fullQuery.add(allCandidateEntriesBooleanQuery, BooleanClauseOccur.MUST);
            if (filterQueries != null && !filterQueries.isEmpty()) {
                for (Query query : filterQueries) {
                    fullQuery.add(query, BooleanClauseOccur.MUST);
                }
            }

            // always filter for none-delete item
            fullQuery.add(noneDeletedCandidateBooleanQuery, BooleanClauseOccur.MUST);

            /* SORT */
            if (sort == null) {
                sort = new Sort(CandidateField.CANDIDATE_ID, false);
            }

            return SearchEngineUtil
                    .search(SearchEngineUtil.getDefaultSearchEngineId(), companyId, fullQuery, sort, start, end)
                    .toList();
        } catch (SearchException e) {
            LOGGER.info(e);
        } catch (ParseException e) {
            LOGGER.info(e);
        }
        return new ArrayList<>();
    }

    @SuppressWarnings("unchecked")
    public List<Document> filterByFields(SearchContext searchContext, Map<String, Object> filters, Sort sort,
            long companyId, int start, int end) throws ParseException {
        final List<Query> queries = new ArrayList<>();
        Date dateFrom = filters.get(CandidateField.APPLY_DATE_FROM) != null
                ? (Date) filters.get(CandidateField.APPLY_DATE_FROM)
                : null;
        Date dateTo = filters.get(CandidateField.APPLY_DATE_TO) != null
                ? (Date) filters.get(CandidateField.APPLY_DATE_TO)
                : null;
        for (Map.Entry<String, Object> filter : filters.entrySet()) {
            String filterProperty = filter.getKey();
            Object filterValue = filter.getValue();
            LOGGER.info(filterProperty);
            LOGGER.info(filterValue);
            if (filterValue instanceof String) {
                if (filterProperty.equalsIgnoreCase(CandidateField.GLOBAL)) {
                    final BooleanQuery globalFilterBooleanQuery = BooleanQueryFactoryUtil.create(searchContext);
                    globalFilterBooleanQuery.addTerms(getGlobalSearchableFields(), (String) filterValue, true);
                    queries.add(globalFilterBooleanQuery);
                } else {
                    BooleanQuery stringFilterQuery = BooleanQueryFactoryUtil.create(searchContext);
                    stringFilterQuery.addTerm(filterProperty, (String) filterValue, true, BooleanClauseOccur.MUST);
                    queries.add(stringFilterQuery);
                }
            } else if (filterValue instanceof List<?>) {
                queries.add(EmpLocalServiceUtil.createStringListQuery(filterProperty, (List<String>) filterValue,
                        searchContext));
            } else if (filterValue instanceof Date) {
                // Query applicationDateRangeQuery = EmpLocalServiceUtil
                // .createDateTermRangeQuery(
                // CandidateField.APPLICATION_DATE, dateFrom,
                // dateTo, true, true, searchContext);
                Query applicationDateRangeQuery = createDateTermRangeQuery(CandidateField.APPLICATION_DATE,
                        dateFrom, dateTo, searchContext);
                if (applicationDateRangeQuery != null)
                    queries.add(applicationDateRangeQuery);
            }
        }
        /* SORT */
        if (sort == null) {
            sort = new Sort(CandidateField.CANDIDATE_ID, false);
        }
        return searchAllUnDeletedCandidatesIndexedDocument(searchContext, queries, companyId, sort, start, end);
    }

    public int countFilterByFields(SearchContext searchContext, Map<String, Object> filters, Sort sort,
            long companyId) throws ParseException {
        return filterByFields(searchContext, filters, sort, companyId, QueryUtil.ALL_POS, QueryUtil.ALL_POS).size();
    }

    public Query createDateTermRangeQuery(String field, Date dateFrom, Date dateTo, SearchContext searchContext) {
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        final String defaultDateFromString = "19700101000000";

        final String defaultDateToString = sdf.format(getCurrentDateNextYear());

        final String filterDateFrom = dateFrom != null ? sdf.format(dateFrom) : defaultDateFromString;

        final String filterDateTo = dateTo != null ? sdf.format(dateTo) : defaultDateToString;

        final boolean isDefaultJDSearch = filterDateFrom.equals(defaultDateFromString)
                && filterDateTo.equals(defaultDateToString);

        // check not include null joined date
        return !isDefaultJDSearch
                ? TermRangeQueryFactoryUtil.create(searchContext, field, filterDateFrom, filterDateTo, true, true)
                : null;

    }

    public Date getCurrentDateNextYear() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.YEAR, 1);
        return calendar.getTime();
    }

    private String[] getGlobalSearchableFields() {
        return new String[] { CandidateField.FULLNAME, CandidateField.STATUS, CandidateField.EMAIL,
                CandidateField.CONTACT_NUMBER, CandidateField.VACANCY, CandidateField.APPLICATION_DATE };
    }

    public Document getIndexCandidateDocument(long id, SearchContext searchContext) {
        searchContext.setPortletIds(new String[] { ECO_RCUtils.PORTLET_ID });
        BooleanQuery fullQuery = BooleanQueryFactoryUtil.create(searchContext);
        BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(searchContext);
        booleanQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, Candidate.class.getName());
        booleanQuery.addExactTerm(CandidateField.CANDIDATE_ID, id);

        try {
            fullQuery.add(booleanQuery, BooleanClauseOccur.MUST);
            Hits hits = SearchEngineUtil.search(searchContext, fullQuery);
            return !hits.toList().isEmpty() ? hits.toList().get(0) : null;
        } catch (ParseException e) {
            LOGGER.info(e);
        } catch (SearchException e) {
            LOGGER.info(e);
        }

        return null;
    }

    public Document getIndexCandidateDocument(String id, SearchContext searchContext) {
        return getIndexCandidateDocument(Long.valueOf(id), searchContext);
    }

    public void indexAllCandidates() {
        final Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(Candidate.class);
        final List<Candidate> items = findAll();
        for (Candidate candidate : items) {
            // index employee
            try {
                indexer.reindex(candidate);
            } catch (SearchException e) {
                LOGGER.info(e);
            }
        }
    }

    public void removeAllCandidateIndexes(SearchContext searchContext, long companyId) {
        final BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(searchContext);
        booleanQuery.addExactTerm(Field.ENTRY_CLASS_NAME, Candidate.class.getName());
        try {
            final Hits hits = SearchEngineUtil.search(SearchEngineUtil.getDefaultSearchEngineId(), companyId,
                    booleanQuery, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
            final List<Document> docs = hits.toList();
            for (Document doc : docs) {
                SearchEngineUtil.deleteDocument(SearchEngineUtil.getDefaultSearchEngineId(), companyId,
                        doc.getUID());

            }
        } catch (SearchException e) {
            LOGGER.info(e);
        }
    }

    public boolean hasAlreadyScheduleForInterview(long candidateId, long vacancyId, long interviewId) {
        final VacancyCandidate vacancyCandidate = VacancyCandidateLocalServiceUtil
                .findByVacancyAndCandidate(vacancyId, candidateId);

        return hasAlreadyScheduleForInterview(vacancyCandidate.getVacancyCandidateId(), interviewId);
    }

    public boolean hasAlreadyScheduleForInterview(long vacancyCandidateId, long interviewId) {

        try {
            return interviewSchedulePersistence.fetchByVacancyCandidateAndInterview(vacancyCandidateId,
                    interviewId) != null;
        } catch (SystemException e) {
            LOGGER.info(e);
        }
        return false;
    }

}