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