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}