001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 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.core.server.control.EntityInstanceControl;
020import com.echothree.model.control.employee.server.control.EmployeeControl;
021import com.echothree.model.control.index.common.IndexFields;
022import com.echothree.model.control.index.common.Indexes;
023import com.echothree.model.control.party.common.PartyTypes;
024import com.echothree.model.control.party.server.search.PartySearchEvaluator;
025import com.echothree.model.control.search.server.search.EntityInstancePKHolder;
026import com.echothree.model.data.core.server.factory.EntityInstanceFactory;
027import com.echothree.model.data.employee.server.entity.PartyEmployee;
028import com.echothree.model.data.search.server.entity.SearchDefaultOperator;
029import com.echothree.model.data.search.server.entity.SearchSortDirection;
030import com.echothree.model.data.search.server.entity.SearchSortOrder;
031import com.echothree.model.data.search.server.entity.SearchType;
032import com.echothree.model.data.user.server.entity.UserVisit;
033import com.echothree.model.data.workflow.server.entity.WorkflowStep;
034import com.echothree.util.server.message.ExecutionErrorAccumulator;
035import com.echothree.util.server.persistence.Session;
036
037public class EmployeeSearchEvaluator
038        extends PartySearchEvaluator {
039    
040    private String partyEmployeeName;
041    private WorkflowStep employeeStatusWorkflowStep;
042    private WorkflowStep employeeAvailabilityWorkflowStep;
043    
044    /** Creates a new instance of EmployeeSearchEvaluator */
045    public EmployeeSearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator,
046            SearchSortOrder searchSortOrder, SearchSortDirection searchSortDirection) {
047        super(userVisit, searchType, searchDefaultOperator, searchSortOrder, searchSortDirection, PartyTypes.EMPLOYEE.name(),
048                IndexFields.partyEmployeeName.name(), Indexes.EMPLOYEE.name());
049    }
050    
051    public EntityInstancePKHolder getEntityInstancePKHolderByEmployeeStatusWorkflowStep(WorkflowStep employeeStatusWorkflowStep) {
052            return getEntityInstancePKHolderFromQuery(EntityInstanceFactory.getInstance().prepareStatement(
053                    "SELECT _PK_ " +
054                    "FROM entityinstances, parties, partydetails, workflowentitystatuses " +
055                    "WHERE par_activedetailid = pardt_partydetailid " +
056                    "AND eni_ent_entitytypeid = ? AND par_partyid = eni_entityuniqueid " +
057                    "AND eni_entityinstanceid = wkfles_eni_entityinstanceid AND wkfles_wkfls_workflowstepid = ? AND wkfles_thrutime = ?"),
058                    entityType, employeeStatusWorkflowStep, Session.MAX_TIME);
059    }
060
061    public EntityInstancePKHolder getEntityInstancePKHolderByEmployeeAvailabilityWorkflowStep(WorkflowStep employeeAvailabilityWorkflowStep) {
062            return getEntityInstancePKHolderFromQuery(EntityInstanceFactory.getInstance().prepareStatement(
063                    "SELECT _PK_ " +
064                    "FROM entityinstances, parties, partydetails, workflowentitystatuses " +
065                    "WHERE par_activedetailid = pardt_partydetailid " +
066                    "AND eni_ent_entitytypeid = ? AND par_partyid = eni_entityuniqueid " +
067                    "AND eni_entityinstanceid = wkfles_eni_entityinstanceid AND wkfles_wkfls_workflowstepid = ? AND wkfles_thrutime = ?"),
068                    entityType, employeeAvailabilityWorkflowStep, Session.MAX_TIME);
069    }
070
071    /**
072     * Returns the partyEmployeeName.
073     * @return the partyEmployeeName
074     */
075    public String getPartyEmployeeName() {
076        return partyEmployeeName;
077    }
078
079    /**
080     * Sets the partyEmployeeName.
081     * @param partyEmployeeName the partyEmployeeName to set
082     */
083    public void setPartyEmployeeName(String partyEmployeeName) {
084        this.partyEmployeeName = partyEmployeeName;
085    }
086
087    /**
088     * Returns the employeeStatusWorkflowStep.
089     * @return the employeeStatusWorkflowStep
090     */
091    public WorkflowStep getEmployeeStatusWorkflowStep() {
092        return employeeStatusWorkflowStep;
093    }
094
095    /**
096     * Sets the employeeStatusWorkflowStep.
097     * @param employeeStatusWorkflowStep the employeeStatusWorkflowStep to set
098     */
099    public void setEmployeeStatusWorkflowStep(WorkflowStep employeeStatusWorkflowStep) {
100        this.employeeStatusWorkflowStep = employeeStatusWorkflowStep;
101    }
102
103    /**
104     * Returns the employeeAvailabilityWorkflowStep.
105     * @return the employeeAvailabilityWorkflowStep
106     */
107    public WorkflowStep getEmployeeAvailabilityWorkflowStep() {
108        return employeeAvailabilityWorkflowStep;
109    }
110
111    /**
112     * Sets the employeeAvailabilityWorkflowStep.
113     * @param employeeAvailabilityWorkflowStep the employeeAvailabilityWorkflowStep to set
114     */
115    public void setEmployeeAvailabilityWorkflowStep(WorkflowStep employeeAvailabilityWorkflowStep) {
116        this.employeeAvailabilityWorkflowStep = employeeAvailabilityWorkflowStep;
117    }
118
119    @Override
120    protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) {
121        EntityInstancePKHolder resultSet = null;
122
123        if(partyEmployeeName == null) {
124            resultSet = super.executeSearch(eea);
125
126            if(resultSet == null || resultSet.size() > 0) {
127                if(employeeStatusWorkflowStep != null) {
128                    var entityInstancePKHolder = getEntityInstancePKHolderByEmployeeStatusWorkflowStep(employeeStatusWorkflowStep);
129
130                    if(resultSet == null) {
131                        resultSet = entityInstancePKHolder;
132                    } else {
133                        resultSet.retainAll(entityInstancePKHolder);
134                    }
135                }
136            }
137
138            if(resultSet == null || resultSet.size() > 0) {
139                if(employeeAvailabilityWorkflowStep != null) {
140                    var entityInstancePKHolder = getEntityInstancePKHolderByEmployeeAvailabilityWorkflowStep(employeeAvailabilityWorkflowStep);
141
142                    if(resultSet == null) {
143                        resultSet = entityInstancePKHolder;
144                    } else {
145                        resultSet.retainAll(entityInstancePKHolder);
146                    }
147                }
148            }
149        } else {
150            PartyEmployee partyEmployee = null;
151            
152            if(partyEmployeeName != null) {
153                var employeeControl = Session.getModelController(EmployeeControl.class);
154                
155                partyEmployee = employeeControl.getPartyEmployeeByName(partyEmployeeName);
156            }
157            
158            if(partyEmployee != null) {
159                var entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
160
161                resultSet = new EntityInstancePKHolder(1);
162                resultSet.add(entityInstanceControl.getEntityInstanceByBasePK(partyEmployee.getPartyPK()).getPrimaryKey(), null);
163            }
164        }
165        
166        return resultSet;
167    }
168
169}