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.employee.EmployeeForeignKeys.LEAVES_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.employee.LeaveDetails.LeaveDetails; 023import static com.echothree.model.jooq.server.tables.employee.Leaves.Leaves; 024import static com.echothree.model.jooq.server.tables.workflow.WorkflowEntityStatuses.WorkflowEntityStatuses; 025import com.echothree.model.control.core.common.ComponentVendors; 026import com.echothree.model.control.core.common.EntityTypes; 027import com.echothree.model.control.core.server.control.EntityInstanceControl; 028import com.echothree.model.control.employee.server.control.EmployeeControl; 029import com.echothree.model.control.search.server.search.BaseSearchEvaluator; 030import com.echothree.model.control.search.server.search.EntityInstancePKHolder; 031import com.echothree.model.data.employee.server.entity.LeaveReason; 032import com.echothree.model.data.employee.server.entity.LeaveType; 033import com.echothree.model.data.party.server.entity.Party; 034import com.echothree.model.data.search.server.entity.SearchDefaultOperator; 035import com.echothree.model.data.search.server.entity.SearchSortDirection; 036import com.echothree.model.data.search.server.entity.SearchSortOrder; 037import com.echothree.model.data.search.server.entity.SearchType; 038import com.echothree.model.data.user.server.entity.UserVisit; 039import com.echothree.model.data.workflow.server.entity.WorkflowStep; 040import com.echothree.util.server.message.ExecutionErrorAccumulator; 041import com.echothree.util.server.persistence.Session; 042 043public class LeaveSearchEvaluator 044 extends BaseSearchEvaluator { 045 046 private String leaveName; 047 private Party party; 048 private Party companyParty; 049 private LeaveType leaveType; 050 private LeaveReason leaveReason; 051 private WorkflowStep leaveStatusWorkflowStep; 052 053 /** Creates a new instance of LeaveSearchEvaluator */ 054 public LeaveSearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator, SearchSortOrder searchSortOrder, 055 SearchSortDirection searchSortDirection) { 056 super(userVisit, searchDefaultOperator, searchType, searchSortOrder, searchSortDirection, null, ComponentVendors.ECHO_THREE.name(), 057 EntityTypes.Leave.name(), null, null, null); 058 } 059 060 public EntityInstancePKHolder getEntityInstancePKHolderByParty(Party party) { 061 var query = session.getDslContext() 062 .select(EntityInstances.ENTITY_INSTANCE) 063 .from(EntityInstances) 064 .join(Leaves).on(Leaves.LEAVE.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 065 .join(LeaveDetails).onKey(LEAVES_ACTIVE_DETAIL_FK) 066 .where(LeaveDetails.PARTY.eq(party.getPrimaryKey()), 067 EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey())); 068 069 return getEntityInstancePKHolderFromQuery(query); 070 } 071 072 public EntityInstancePKHolder getEntityInstancePKHolderByCompanyParty(Party companyParty) { 073 var query = session.getDslContext() 074 .select(EntityInstances.ENTITY_INSTANCE) 075 .from(EntityInstances) 076 .join(Leaves).on(Leaves.LEAVE.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 077 .join(LeaveDetails).onKey(LEAVES_ACTIVE_DETAIL_FK) 078 .where(LeaveDetails.COMPANY_PARTY.eq(companyParty.getPrimaryKey()), 079 EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey())); 080 081 return getEntityInstancePKHolderFromQuery(query); 082 } 083 084 public EntityInstancePKHolder getEntityInstancePKHolderByLeaveType(LeaveType leaveType) { 085 var query = session.getDslContext() 086 .select(EntityInstances.ENTITY_INSTANCE) 087 .from(EntityInstances) 088 .join(Leaves).on(Leaves.LEAVE.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 089 .join(LeaveDetails).onKey(LEAVES_ACTIVE_DETAIL_FK) 090 .where(LeaveDetails.LEAVE_TYPE.eq(leaveType.getPrimaryKey()), 091 EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey())); 092 093 return getEntityInstancePKHolderFromQuery(query); 094 } 095 096 public EntityInstancePKHolder getEntityInstancePKHolderByLeaveReason(LeaveReason leaveReason) { 097 var query = session.getDslContext() 098 .select(EntityInstances.ENTITY_INSTANCE) 099 .from(EntityInstances) 100 .join(Leaves).on(Leaves.LEAVE.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 101 .join(LeaveDetails).onKey(LEAVES_ACTIVE_DETAIL_FK) 102 .where(LeaveDetails.LEAVE_REASON.eq(leaveReason.getPrimaryKey()), 103 EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey())); 104 105 return getEntityInstancePKHolderFromQuery(query); 106 } 107 108 public EntityInstancePKHolder getEntityInstancePKHolderByLeaveStatusWorkflowStep(WorkflowStep leaveStatusWorkflowStep) { 109 var query = session.getDslContext() 110 .select(EntityInstances.ENTITY_INSTANCE) 111 .from(EntityInstances) 112 .join(Leaves).on(Leaves.LEAVE.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 113 .join(LeaveDetails).onKey(LEAVES_ACTIVE_DETAIL_FK) 114 .join(WorkflowEntityStatuses).onKey(WORKFLOW_ENTITY_STATUSES_ENTITY_INSTANCE_FK) 115 .where(EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()), 116 WorkflowEntityStatuses.WORKFLOW_STEP.eq(leaveStatusWorkflowStep.getPrimaryKey()), 117 WorkflowEntityStatuses.THRU_TIME.eq(Session.MAX_TIME)); 118 119 return getEntityInstancePKHolderFromQuery(query); 120 } 121 122 /** 123 * Returns the leaveName. 124 * @return the leaveName 125 */ 126 public String getLeaveName() { 127 return leaveName; 128 } 129 130 /** 131 * Sets the leaveName. 132 * @param leaveName the leaveName to set 133 */ 134 public void setLeaveName(String leaveName) { 135 this.leaveName = leaveName; 136 } 137 138 /** 139 * Returns the party. 140 * @return the party 141 */ 142 public Party getParty() { 143 return party; 144 } 145 146 /** 147 * Sets the party. 148 * @param party the party to set 149 */ 150 public void setParty(Party party) { 151 this.party = party; 152 } 153 154 /** 155 * Returns the companyParty. 156 * @return the companyParty 157 */ 158 public Party getCompanyParty() { 159 return companyParty; 160 } 161 162 /** 163 * Sets the companyParty. 164 * @param companyParty the companyParty to set 165 */ 166 public void setCompanyParty(Party companyParty) { 167 this.companyParty = companyParty; 168 } 169 170 /** 171 * Returns the leaveType. 172 * @return the leaveType 173 */ 174 public LeaveType getLeaveType() { 175 return leaveType; 176 } 177 178 /** 179 * Sets the leaveType. 180 * @param leaveType the leaveType to set 181 */ 182 public void setLeaveType(LeaveType leaveType) { 183 this.leaveType = leaveType; 184 } 185 186 /** 187 * Returns the leaveReason. 188 * @return the leaveReason 189 */ 190 public LeaveReason getLeaveReason() { 191 return leaveReason; 192 } 193 194 /** 195 * Sets the leaveReason. 196 * @param leaveReason the leaveReason to set 197 */ 198 public void setLeaveReason(LeaveReason leaveReason) { 199 this.leaveReason = leaveReason; 200 } 201 202 /** 203 * Returns the leaveStatusWorkflowStep. 204 * @return the leaveStatusWorkflowStep 205 */ 206 public WorkflowStep getLeaveStatusWorkflowStep() { 207 return leaveStatusWorkflowStep; 208 } 209 210 /** 211 * Sets the leaveStatusWorkflowStep. 212 * @param leaveStatusWorkflowStep the leaveStatusWorkflowStep to set 213 */ 214 public void setLeaveStatusWorkflowStep(WorkflowStep leaveStatusWorkflowStep) { 215 this.leaveStatusWorkflowStep = leaveStatusWorkflowStep; 216 } 217 218 @Override 219 protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) { 220 EntityInstancePKHolder resultSet = null; 221 222 if(leaveName == null) { 223 resultSet = super.executeSearch(eea); 224 225 if(resultSet == null || resultSet.size() > 0) { 226 if(party != null) { 227 var entityInstancePKHolder = getEntityInstancePKHolderByParty(party); 228 229 if(resultSet == null) { 230 resultSet = entityInstancePKHolder; 231 } else { 232 resultSet.retainAll(entityInstancePKHolder); 233 } 234 } 235 } 236 237 if(resultSet == null || resultSet.size() > 0) { 238 if(companyParty != null) { 239 var entityInstancePKHolder = getEntityInstancePKHolderByCompanyParty(companyParty); 240 241 if(resultSet == null) { 242 resultSet = entityInstancePKHolder; 243 } else { 244 resultSet.retainAll(entityInstancePKHolder); 245 } 246 } 247 } 248 249 if(resultSet == null || resultSet.size() > 0) { 250 if(leaveType != null) { 251 var entityInstancePKHolder = getEntityInstancePKHolderByLeaveType(leaveType); 252 253 if(resultSet == null) { 254 resultSet = entityInstancePKHolder; 255 } else { 256 resultSet.retainAll(entityInstancePKHolder); 257 } 258 } 259 } 260 261 if(resultSet == null || resultSet.size() > 0) { 262 if(leaveReason != null) { 263 var entityInstancePKHolder = getEntityInstancePKHolderByLeaveReason(leaveReason); 264 265 if(resultSet == null) { 266 resultSet = entityInstancePKHolder; 267 } else { 268 resultSet.retainAll(entityInstancePKHolder); 269 } 270 } 271 } 272 273 if(resultSet == null || resultSet.size() > 0) { 274 if(leaveStatusWorkflowStep != null) { 275 var entityInstancePKHolder = getEntityInstancePKHolderByLeaveStatusWorkflowStep(leaveStatusWorkflowStep); 276 277 if(resultSet == null) { 278 resultSet = entityInstancePKHolder; 279 } else { 280 resultSet.retainAll(entityInstancePKHolder); 281 } 282 } 283 } 284 } else { 285 var employeeControl = Session.getModelController(EmployeeControl.class); 286 var leave = employeeControl.getLeaveByName(leaveName); 287 288 if(leave != null) { 289 var entityInstanceControl = Session.getModelController(EntityInstanceControl.class); 290 291 resultSet = new EntityInstancePKHolder(1); 292 resultSet.add(entityInstanceControl.getEntityInstanceByBasePK(leave.getPrimaryKey()).getPrimaryKey(), null); 293 } 294 } 295 296 return resultSet; 297 } 298 299}