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}