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.order.OrderForeignKeys.ORDERS_ACTIVE_DETAIL_FK; 020import static com.echothree.model.jooq.server.keys.sales.SalesForeignKeys.SALES_ORDERS_ORDER_FK; 021import static com.echothree.model.jooq.server.tables.core.EntityInstances.EntityInstances; 022import static com.echothree.model.jooq.server.tables.order.OrderDetails.OrderDetails; 023import static com.echothree.model.jooq.server.tables.order.Orders.Orders; 024import static com.echothree.model.jooq.server.tables.sales.SalesOrders.SalesOrders; 025import com.echothree.model.control.order.common.OrderTypes; 026import com.echothree.model.control.order.server.logic.OrderLogic; 027import com.echothree.model.control.order.server.search.OrderSearchEvaluator; 028import com.echothree.model.control.search.server.search.EntityInstancePKHolder; 029import com.echothree.model.data.associate.server.entity.AssociateReferral; 030import com.echothree.model.data.offer.server.entity.OfferUse; 031import com.echothree.model.data.search.server.entity.SearchDefaultOperator; 032import com.echothree.model.data.search.server.entity.SearchSortDirection; 033import com.echothree.model.data.search.server.entity.SearchSortOrder; 034import com.echothree.model.data.search.server.entity.SearchType; 035import com.echothree.model.data.user.server.entity.UserVisit; 036import com.echothree.util.server.message.ExecutionErrorAccumulator; 037import com.echothree.util.server.persistence.Session; 038 039public class SalesOrderSearchEvaluator 040 extends OrderSearchEvaluator { 041 042 private OfferUse offerUse; 043 private AssociateReferral associateReferral; 044 045 /** Creates a new instance of SalesOrderSearchEvaluator */ 046 public SalesOrderSearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator, SearchSortOrder searchSortOrder, 047 SearchSortDirection searchSortDirection) { 048 super(userVisit, searchType, searchDefaultOperator, searchSortOrder, searchSortDirection, OrderLogic.getInstance().getOrderTypeByName(null, 049 OrderTypes.SALES_ORDER.name())); 050 } 051 052 public EntityInstancePKHolder getEntityInstancePKHolderByOfferUse(OfferUse offerUse) { 053 var query = session.getDslContext() 054 .select(EntityInstances.ENTITY_INSTANCE) 055 .from(EntityInstances) 056 .join(Orders).on(Orders.ORDER.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 057 .join(OrderDetails).onKey(ORDERS_ACTIVE_DETAIL_FK) 058 .join(SalesOrders).onKey(SALES_ORDERS_ORDER_FK) 059 .where(OrderDetails.ORDER_TYPE.eq(orderType.getPrimaryKey()), 060 SalesOrders.OFFER_USE.eq(offerUse.getPrimaryKey()), 061 SalesOrders.THRU_TIME.eq(Session.MAX_TIME), 062 EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey())); 063 064 return getEntityInstancePKHolderFromQuery(query); 065 } 066 067 public EntityInstancePKHolder getEntityInstancePKHolderByAssociateReferral(AssociateReferral associateReferral) { 068 var query = session.getDslContext() 069 .select(EntityInstances.ENTITY_INSTANCE) 070 .from(EntityInstances) 071 .join(Orders).on(Orders.ORDER.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE)) 072 .join(OrderDetails).onKey(ORDERS_ACTIVE_DETAIL_FK) 073 .join(SalesOrders).onKey(SALES_ORDERS_ORDER_FK) 074 .where(OrderDetails.ORDER_TYPE.eq(orderType.getPrimaryKey()), 075 SalesOrders.ASSOCIATE_REFERRAL.eq(associateReferral.getPrimaryKey()), 076 SalesOrders.THRU_TIME.eq(Session.MAX_TIME), 077 EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey())); 078 079 return getEntityInstancePKHolderFromQuery(query); 080 } 081 082 public OfferUse getOfferUse() { 083 return offerUse; 084 } 085 086 public void setOfferUse(OfferUse offerUse) { 087 this.offerUse = offerUse; 088 } 089 090 /** Counts the number of search parameters. */ 091 @Override 092 protected int countParameters() { 093 return super.countParameters() + (offerUse == null ? 0 : 1); 094 } 095 096 @Override 097 protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) { 098 var resultSet = super.executeSearch(eea); 099 100 if(offerUse != null && (resultSet == null || resultSet.size() > 0)) { 101 var entityInstancePKHolder = getEntityInstancePKHolderByOfferUse(offerUse); 102 103 if(resultSet == null) { 104 resultSet = entityInstancePKHolder; 105 } else { 106 resultSet.retainAll(entityInstancePKHolder); 107 } 108 } 109 110 if(associateReferral != null && (resultSet == null || resultSet.size() > 0)) { 111 var entityInstancePKHolder = getEntityInstancePKHolderByAssociateReferral(associateReferral); 112 113 if(resultSet == null) { 114 resultSet = entityInstancePKHolder; 115 } else { 116 resultSet.retainAll(entityInstancePKHolder); 117 } 118 } 119 120 return resultSet; 121 } 122 123}