001// --------------------------------------------------------------------------------
002// Copyright 2002-2026 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 static com.echothree.model.jooq.server.keys.party.PartyForeignKeys.PARTIES_ACTIVE_DETAIL_FK;
020import static com.echothree.model.jooq.server.keys.workflow.WorkflowForeignKeys.WORKFLOW_ENTITY_STATUSES_ENTITY_INSTANCE_FK;
021import static com.echothree.model.jooq.server.tables.core.EntityInstances.EntityInstances;
022import static com.echothree.model.jooq.server.tables.party.Parties.Parties;
023import static com.echothree.model.jooq.server.tables.party.PartyDetails.PartyDetails;
024import static com.echothree.model.jooq.server.tables.workflow.WorkflowEntityStatuses.WorkflowEntityStatuses;
025import com.echothree.model.control.core.server.control.EntityInstanceControl;
026import com.echothree.model.control.employee.server.control.EmployeeControl;
027import com.echothree.model.control.index.common.IndexFields;
028import com.echothree.model.control.index.common.Indexes;
029import com.echothree.model.control.party.common.PartyTypes;
030import com.echothree.model.control.party.server.search.PartySearchEvaluator;
031import com.echothree.model.control.search.server.search.EntityInstancePKHolder;
032import com.echothree.model.data.employee.server.entity.PartyEmployee;
033import com.echothree.model.data.search.server.entity.SearchDefaultOperator;
034import com.echothree.model.data.search.server.entity.SearchSortDirection;
035import com.echothree.model.data.search.server.entity.SearchSortOrder;
036import com.echothree.model.data.search.server.entity.SearchType;
037import com.echothree.model.data.user.server.entity.UserVisit;
038import com.echothree.model.data.workflow.server.entity.WorkflowStep;
039import com.echothree.util.server.message.ExecutionErrorAccumulator;
040import com.echothree.util.server.persistence.Session;
041
042public class EmployeeSearchEvaluator
043        extends PartySearchEvaluator {
044    
045    private String partyEmployeeName;
046    private WorkflowStep employeeStatusWorkflowStep;
047    private WorkflowStep employeeAvailabilityWorkflowStep;
048    
049    /** Creates a new instance of EmployeeSearchEvaluator */
050    public EmployeeSearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator,
051            SearchSortOrder searchSortOrder, SearchSortDirection searchSortDirection) {
052        super(userVisit, searchType, searchDefaultOperator, searchSortOrder, searchSortDirection, PartyTypes.EMPLOYEE.name(),
053                IndexFields.partyEmployeeName.name(), Indexes.EMPLOYEE.name());
054    }
055    
056    public EntityInstancePKHolder getEntityInstancePKHolderByEmployeeStatusWorkflowStep(WorkflowStep employeeStatusWorkflowStep) {
057        var query = session.getDslContext()
058                .select(EntityInstances.ENTITY_INSTANCE)
059                .from(EntityInstances)
060                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
061                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
062                .join(WorkflowEntityStatuses).onKey(WORKFLOW_ENTITY_STATUSES_ENTITY_INSTANCE_FK)
063                .where(EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()),
064                        WorkflowEntityStatuses.WORKFLOW_STEP.eq(employeeStatusWorkflowStep.getPrimaryKey()),
065                        WorkflowEntityStatuses.THRU_TIME.eq(Session.MAX_TIME));
066
067        return getEntityInstancePKHolderFromQuery(query);
068    }
069
070    public EntityInstancePKHolder getEntityInstancePKHolderByEmployeeAvailabilityWorkflowStep(WorkflowStep employeeAvailabilityWorkflowStep) {
071        var query = session.getDslContext()
072                .select(EntityInstances.ENTITY_INSTANCE)
073                .from(EntityInstances)
074                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
075                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
076                .join(WorkflowEntityStatuses).onKey(WORKFLOW_ENTITY_STATUSES_ENTITY_INSTANCE_FK)
077                .where(EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()),
078                        WorkflowEntityStatuses.WORKFLOW_STEP.eq(employeeAvailabilityWorkflowStep.getPrimaryKey()),
079                        WorkflowEntityStatuses.THRU_TIME.eq(Session.MAX_TIME));
080
081        return getEntityInstancePKHolderFromQuery(query);
082    }
083
084    /**
085     * Returns the partyEmployeeName.
086     * @return the partyEmployeeName
087     */
088    public String getPartyEmployeeName() {
089        return partyEmployeeName;
090    }
091
092    /**
093     * Sets the partyEmployeeName.
094     * @param partyEmployeeName the partyEmployeeName to set
095     */
096    public void setPartyEmployeeName(String partyEmployeeName) {
097        this.partyEmployeeName = partyEmployeeName;
098    }
099
100    /**
101     * Returns the employeeStatusWorkflowStep.
102     * @return the employeeStatusWorkflowStep
103     */
104    public WorkflowStep getEmployeeStatusWorkflowStep() {
105        return employeeStatusWorkflowStep;
106    }
107
108    /**
109     * Sets the employeeStatusWorkflowStep.
110     * @param employeeStatusWorkflowStep the employeeStatusWorkflowStep to set
111     */
112    public void setEmployeeStatusWorkflowStep(WorkflowStep employeeStatusWorkflowStep) {
113        this.employeeStatusWorkflowStep = employeeStatusWorkflowStep;
114    }
115
116    /**
117     * Returns the employeeAvailabilityWorkflowStep.
118     * @return the employeeAvailabilityWorkflowStep
119     */
120    public WorkflowStep getEmployeeAvailabilityWorkflowStep() {
121        return employeeAvailabilityWorkflowStep;
122    }
123
124    /**
125     * Sets the employeeAvailabilityWorkflowStep.
126     * @param employeeAvailabilityWorkflowStep the employeeAvailabilityWorkflowStep to set
127     */
128    public void setEmployeeAvailabilityWorkflowStep(WorkflowStep employeeAvailabilityWorkflowStep) {
129        this.employeeAvailabilityWorkflowStep = employeeAvailabilityWorkflowStep;
130    }
131
132    @Override
133    protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) {
134        EntityInstancePKHolder resultSet = null;
135
136        if(partyEmployeeName == null) {
137            resultSet = super.executeSearch(eea);
138
139            if(resultSet == null || resultSet.size() > 0) {
140                if(employeeStatusWorkflowStep != null) {
141                    var entityInstancePKHolder = getEntityInstancePKHolderByEmployeeStatusWorkflowStep(employeeStatusWorkflowStep);
142
143                    if(resultSet == null) {
144                        resultSet = entityInstancePKHolder;
145                    } else {
146                        resultSet.retainAll(entityInstancePKHolder);
147                    }
148                }
149            }
150
151            if(resultSet == null || resultSet.size() > 0) {
152                if(employeeAvailabilityWorkflowStep != null) {
153                    var entityInstancePKHolder = getEntityInstancePKHolderByEmployeeAvailabilityWorkflowStep(employeeAvailabilityWorkflowStep);
154
155                    if(resultSet == null) {
156                        resultSet = entityInstancePKHolder;
157                    } else {
158                        resultSet.retainAll(entityInstancePKHolder);
159                    }
160                }
161            }
162        } else {
163            PartyEmployee partyEmployee = null;
164            
165            if(partyEmployeeName != null) {
166                var employeeControl = Session.getModelController(EmployeeControl.class);
167                
168                partyEmployee = employeeControl.getPartyEmployeeByName(partyEmployeeName);
169            }
170            
171            if(partyEmployee != null) {
172                var entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
173
174                resultSet = new EntityInstancePKHolder(1);
175                resultSet.add(entityInstanceControl.getEntityInstanceByBasePK(partyEmployee.getPartyPK()).getPrimaryKey(), null);
176            }
177        }
178        
179        return resultSet;
180    }
181
182}