001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.employee.server.search;
018
019import com.echothree.model.control.employee.server.control.EmployeeControl;
020import com.echothree.model.control.index.common.IndexFields;
021import com.echothree.model.control.index.common.Indexes;
022import com.echothree.model.control.party.common.PartyTypes;
023import com.echothree.model.control.party.server.search.PartySearchEvaluator;
024import com.echothree.model.control.search.server.search.EntityInstancePKHolder;
025import com.echothree.model.data.core.server.factory.EntityInstanceFactory;
026import com.echothree.model.data.employee.server.entity.PartyEmployee;
027import com.echothree.model.data.search.server.entity.SearchDefaultOperator;
028import com.echothree.model.data.search.server.entity.SearchSortDirection;
029import com.echothree.model.data.search.server.entity.SearchSortOrder;
030import com.echothree.model.data.search.server.entity.SearchType;
031import com.echothree.model.data.user.server.entity.UserVisit;
032import com.echothree.model.data.workflow.server.entity.WorkflowStep;
033import com.echothree.util.server.message.ExecutionErrorAccumulator;
034import com.echothree.util.server.persistence.Session;
035
036public class EmployeeSearchEvaluator
037        extends PartySearchEvaluator {
038    
039    private String partyEmployeeName;
040    private WorkflowStep employeeStatusWorkflowStep;
041    private WorkflowStep employeeAvailabilityWorkflowStep;
042    
043    /** Creates a new instance of EmployeeSearchEvaluator */
044    public EmployeeSearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator,
045            SearchSortOrder searchSortOrder, SearchSortDirection searchSortDirection) {
046        super(userVisit, searchType, searchDefaultOperator, searchSortOrder, searchSortDirection, PartyTypes.EMPLOYEE.name(),
047                IndexFields.partyEmployeeName.name(), Indexes.EMPLOYEE.name());
048    }
049    
050    public EntityInstancePKHolder getEntityInstancePKHolderByEmployeeStatusWorkflowStep(WorkflowStep employeeStatusWorkflowStep) {
051            return getEntityInstancePKHolderFromQuery(EntityInstanceFactory.getInstance().prepareStatement(
052                    "SELECT _PK_ " +
053                    "FROM entityinstances, parties, partydetails, workflowentitystatuses " +
054                    "WHERE par_activedetailid = pardt_partydetailid " +
055                    "AND eni_ent_entitytypeid = ? AND par_partyid = eni_entityuniqueid " +
056                    "AND eni_entityinstanceid = wkfles_eni_entityinstanceid AND wkfles_wkfls_workflowstepid = ? AND wkfles_thrutime = ?"),
057                    entityType, employeeStatusWorkflowStep, Session.MAX_TIME);
058    }
059
060    public EntityInstancePKHolder getEntityInstancePKHolderByEmployeeAvailabilityWorkflowStep(WorkflowStep employeeAvailabilityWorkflowStep) {
061            return getEntityInstancePKHolderFromQuery(EntityInstanceFactory.getInstance().prepareStatement(
062                    "SELECT _PK_ " +
063                    "FROM entityinstances, parties, partydetails, workflowentitystatuses " +
064                    "WHERE par_activedetailid = pardt_partydetailid " +
065                    "AND eni_ent_entitytypeid = ? AND par_partyid = eni_entityuniqueid " +
066                    "AND eni_entityinstanceid = wkfles_eni_entityinstanceid AND wkfles_wkfls_workflowstepid = ? AND wkfles_thrutime = ?"),
067                    entityType, employeeAvailabilityWorkflowStep, Session.MAX_TIME);
068    }
069
070    /**
071     * Returns the partyEmployeeName.
072     * @return the partyEmployeeName
073     */
074    public String getPartyEmployeeName() {
075        return partyEmployeeName;
076    }
077
078    /**
079     * Sets the partyEmployeeName.
080     * @param partyEmployeeName the partyEmployeeName to set
081     */
082    public void setPartyEmployeeName(String partyEmployeeName) {
083        this.partyEmployeeName = partyEmployeeName;
084    }
085
086    /**
087     * Returns the employeeStatusWorkflowStep.
088     * @return the employeeStatusWorkflowStep
089     */
090    public WorkflowStep getEmployeeStatusWorkflowStep() {
091        return employeeStatusWorkflowStep;
092    }
093
094    /**
095     * Sets the employeeStatusWorkflowStep.
096     * @param employeeStatusWorkflowStep the employeeStatusWorkflowStep to set
097     */
098    public void setEmployeeStatusWorkflowStep(WorkflowStep employeeStatusWorkflowStep) {
099        this.employeeStatusWorkflowStep = employeeStatusWorkflowStep;
100    }
101
102    /**
103     * Returns the employeeAvailabilityWorkflowStep.
104     * @return the employeeAvailabilityWorkflowStep
105     */
106    public WorkflowStep getEmployeeAvailabilityWorkflowStep() {
107        return employeeAvailabilityWorkflowStep;
108    }
109
110    /**
111     * Sets the employeeAvailabilityWorkflowStep.
112     * @param employeeAvailabilityWorkflowStep the employeeAvailabilityWorkflowStep to set
113     */
114    public void setEmployeeAvailabilityWorkflowStep(WorkflowStep employeeAvailabilityWorkflowStep) {
115        this.employeeAvailabilityWorkflowStep = employeeAvailabilityWorkflowStep;
116    }
117
118    @Override
119    protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) {
120        EntityInstancePKHolder resultSet = null;
121
122        if(partyEmployeeName == null) {
123            resultSet = super.executeSearch(eea);
124
125            if(resultSet == null || resultSet.size() > 0) {
126                if(employeeStatusWorkflowStep != null) {
127                    EntityInstancePKHolder entityInstancePKHolder = getEntityInstancePKHolderByEmployeeStatusWorkflowStep(employeeStatusWorkflowStep);
128
129                    if(resultSet == null) {
130                        resultSet = entityInstancePKHolder;
131                    } else {
132                        resultSet.retainAll(entityInstancePKHolder);
133                    }
134                }
135            }
136
137            if(resultSet == null || resultSet.size() > 0) {
138                if(employeeAvailabilityWorkflowStep != null) {
139                    EntityInstancePKHolder entityInstancePKHolder = getEntityInstancePKHolderByEmployeeAvailabilityWorkflowStep(employeeAvailabilityWorkflowStep);
140
141                    if(resultSet == null) {
142                        resultSet = entityInstancePKHolder;
143                    } else {
144                        resultSet.retainAll(entityInstancePKHolder);
145                    }
146                }
147            }
148        } else {
149            PartyEmployee partyEmployee = null;
150            
151            if(partyEmployeeName != null) {
152                var employeeControl = Session.getModelController(EmployeeControl.class);
153                
154                partyEmployee = employeeControl.getPartyEmployeeByName(partyEmployeeName);
155            }
156            
157            if(partyEmployee != null) {
158                resultSet = new EntityInstancePKHolder(1);
159                resultSet.add(getCoreControl().getEntityInstanceByBasePK(partyEmployee.getPartyPK()).getPrimaryKey(), null);
160            }
161        }
162        
163        return resultSet;
164    }
165
166}