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.sales.server.search;
018
019import static com.echothree.model.jooq.server.keys.batch.BatchForeignKeys.BATCHES_ACTIVE_DETAIL_FK;
020import static com.echothree.model.jooq.server.keys.sales.SalesForeignKeys.SALES_ORDER_BATCHES_BATCH_FK;
021import static com.echothree.model.jooq.server.tables.batch.BatchDetails.BatchDetails;
022import static com.echothree.model.jooq.server.tables.batch.Batches.Batches;
023import static com.echothree.model.jooq.server.tables.core.EntityInstances.EntityInstances;
024import static com.echothree.model.jooq.server.tables.sales.SalesOrderBatches.SalesOrderBatches;
025import com.echothree.model.control.batch.common.BatchTypes;
026import com.echothree.model.control.batch.server.logic.BatchLogic;
027import com.echothree.model.control.order.server.search.OrderBatchSearchEvaluator;
028import com.echothree.model.control.search.server.search.EntityInstancePKHolder;
029import com.echothree.model.data.payment.server.entity.PaymentMethod;
030import com.echothree.model.data.search.server.entity.SearchDefaultOperator;
031import com.echothree.model.data.search.server.entity.SearchSortDirection;
032import com.echothree.model.data.search.server.entity.SearchSortOrder;
033import com.echothree.model.data.search.server.entity.SearchType;
034import com.echothree.model.data.user.server.entity.UserVisit;
035import com.echothree.util.server.message.ExecutionErrorAccumulator;
036import com.echothree.util.server.persistence.Session;
037
038public class SalesOrderBatchSearchEvaluator
039        extends OrderBatchSearchEvaluator {
040    
041    private PaymentMethod paymentMethod;
042    
043    /** Creates a new instance of SalesOrderBatchSearchEvaluator */
044    public SalesOrderBatchSearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator,
045            SearchSortOrder searchSortOrder, SearchSortDirection searchSortDirection) {
046        super(userVisit, searchType, searchDefaultOperator, searchSortOrder, searchSortDirection,BatchLogic.getInstance().getBatchTypeByName(null,
047                BatchTypes.SALES_ORDER.name()));
048    }
049    
050    public EntityInstancePKHolder getEntityInstancePKHolderByPaymentMethod(PaymentMethod paymentMethod) {
051        var query = session.getDslContext()
052                .select(EntityInstances.ENTITY_INSTANCE)
053                .from(EntityInstances)
054                .join(Batches).on(Batches.BATCH.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
055                .join(BatchDetails).onKey(BATCHES_ACTIVE_DETAIL_FK)
056                .join(SalesOrderBatches).onKey(SALES_ORDER_BATCHES_BATCH_FK)
057                .where(BatchDetails.BATCH_TYPE.eq(batchType.getPrimaryKey()),
058                        SalesOrderBatches.PAYMENT_METHOD.eq(paymentMethod.getPrimaryKey()),
059                        SalesOrderBatches.THRU_TIME.eq(Session.MAX_TIME),
060                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
061
062        return getEntityInstancePKHolderFromQuery(query);
063    }
064    
065    public PaymentMethod getPaymentMethod() {
066        return paymentMethod;
067    }
068    
069    public void setPaymentMethod(PaymentMethod paymentMethod) {
070        this.paymentMethod = paymentMethod;
071    }
072    
073    /** Counts the number of search parameters. */
074    @Override
075    protected int countParameters() {
076        return super.countParameters() + (paymentMethod == null ? 0 : 1);
077    }
078
079    @Override
080    protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) {
081        var resultSet = super.executeSearch(eea);
082            
083        if(paymentMethod != null && (resultSet == null || resultSet.size() > 0)) {
084            var entityInstancePKHolder = getEntityInstancePKHolderByPaymentMethod(paymentMethod);
085
086            if(resultSet == null) {
087                resultSet = entityInstancePKHolder;
088            } else {
089                resultSet.retainAll(entityInstancePKHolder);
090            }
091        }
092        
093        return resultSet;
094    }
095    
096}