001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 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.offer.server.transfer;
018
019import com.echothree.model.control.filter.server.control.FilterControl;
020import com.echothree.model.control.offer.common.OfferOptions;
021import com.echothree.model.control.offer.common.OfferProperties;
022import com.echothree.model.control.offer.common.transfer.OfferTransfer;
023import com.echothree.model.control.offer.server.control.OfferControl;
024import com.echothree.model.control.offer.server.control.OfferNameElementControl;
025import com.echothree.model.control.party.server.control.PartyControl;
026import com.echothree.model.control.selector.server.control.SelectorControl;
027import com.echothree.model.control.sequence.server.control.SequenceControl;
028import com.echothree.model.data.offer.server.entity.Offer;
029import com.echothree.model.data.user.server.entity.UserVisit;
030import com.echothree.util.common.form.TransferProperties;
031import com.echothree.util.server.persistence.Session;
032import com.echothree.util.server.transfer.ListWrapperBuilder;
033import javax.enterprise.context.RequestScoped;
034
035@RequestScoped
036public class OfferTransferCache
037        extends BaseOfferTransferCache<Offer, OfferTransfer> {
038    
039    OfferControl offerControl = Session.getModelController(OfferControl.class);
040    FilterControl filterControl = Session.getModelController(FilterControl.class);
041    OfferNameElementControl offerNameElementControl = Session.getModelController(OfferNameElementControl.class);
042    PartyControl partyControl = Session.getModelController(PartyControl.class);
043    SelectorControl selectorControl = Session.getModelController(SelectorControl.class);
044    SequenceControl sequenceControl = Session.getModelController(SequenceControl.class);
045    
046    boolean includeOfferCustomerTypes;
047    boolean includeOfferNameElements;
048    
049    TransferProperties transferProperties;
050    boolean filterOfferName;
051    boolean filterSalesOrderSequence;
052    boolean filterDepartment;
053    boolean filterOfferItemSelector;
054    boolean filterOfferItemPriceFilter;
055    boolean filterIsDefault;
056    boolean filterSortOrder;
057    boolean filterDescription;
058    boolean filterEntityInstance;
059    
060    /** Creates a new instance of OfferTransferCache */
061    protected OfferTransferCache() {
062        super();
063
064        var options = session.getOptions();
065        if(options != null) {
066            includeOfferCustomerTypes = options.contains(OfferOptions.OfferIncludeOfferCustomerTypes);
067            includeOfferNameElements = options.contains(OfferOptions.OfferIncludeOfferNameElements);
068            setIncludeEntityAttributeGroups(options.contains(OfferOptions.OfferIncludeEntityAttributeGroups));
069            setIncludeTagScopes(options.contains(OfferOptions.OfferIncludeTagScopes));
070        }
071        
072        transferProperties = session.getTransferProperties();
073        if(transferProperties != null) {
074            var properties = transferProperties.getProperties(OfferTransfer.class);
075            
076            if(properties != null) {
077                filterOfferName = !properties.contains(OfferProperties.OFFER_NAME);
078                filterSalesOrderSequence = !properties.contains(OfferProperties.SALES_ORDER_SEQUENCE);
079                filterDepartment = !properties.contains(OfferProperties.DEPARTMENT);
080                filterOfferItemSelector = !properties.contains(OfferProperties.OFFER_ITEM_SELECTOR);
081                filterOfferItemPriceFilter = !properties.contains(OfferProperties.OFFER_ITEM_PRICE_FILTER);
082                filterIsDefault = !properties.contains(OfferProperties.IS_DEFAULT);
083                filterSortOrder = !properties.contains(OfferProperties.SORT_ORDER);
084                filterDescription = !properties.contains(OfferProperties.DESCRIPTION);
085                filterEntityInstance = !properties.contains(OfferProperties.ENTITY_INSTANCE);
086            }
087        }
088        
089        setIncludeEntityInstance(!filterEntityInstance);
090    }
091    
092    public OfferTransfer getOfferTransfer(UserVisit userVisit, Offer offer) {
093        var offerTransfer = get(offer);
094        
095        if(offerTransfer == null) {
096            var offerDetail = offer.getLastDetail();
097            var offerName = filterOfferName ? null : offerDetail.getOfferName();
098            var salesOrderSequence = filterSalesOrderSequence ? null : offerDetail.getSalesOrderSequence();
099            var salesOrderSequenceTransfer = salesOrderSequence == null ? null : sequenceControl.getSequenceTransfer(userVisit, salesOrderSequence);
100            var departmentParty = filterDepartment ? null : offerDetail.getDepartmentParty();
101            var departmentTransfer = departmentParty == null ? null : partyControl.getDepartmentTransfer(userVisit, offerDetail.getDepartmentParty());
102            var offerItemSelector = filterOfferItemSelector ? null : offerDetail.getOfferItemSelector();
103            var offerItemSelectorTransfer = offerItemSelector == null ? null : selectorControl.getSelectorTransfer(userVisit, offerItemSelector);
104            var offerItemPriceFilter = filterOfferItemPriceFilter ? null : offerDetail.getOfferItemPriceFilter();
105            var offerItemPriceFilterTransfer = offerItemPriceFilter == null ? null : filterControl.getFilterTransfer(userVisit, offerItemPriceFilter);
106            var isDefault = filterIsDefault ? null : offerDetail.getIsDefault();
107            var sortOrder = filterSortOrder ? null : offerDetail.getSortOrder();
108            var description = filterDescription ? null : offerControl.getBestOfferDescription(offer, getLanguage(userVisit));
109            
110            offerTransfer = new OfferTransfer(offerName, salesOrderSequenceTransfer, departmentTransfer, offerItemSelectorTransfer,
111                    offerItemPriceFilterTransfer, isDefault, sortOrder, description);
112            put(userVisit, offer, offerTransfer);
113
114            if(includeOfferCustomerTypes) {
115                offerTransfer.setOfferCustomerTypes(ListWrapperBuilder.getInstance().filter(transferProperties, offerControl.getOfferCustomerTypeTransfersByOffer(userVisit, offer)));
116            }
117
118            if(includeOfferNameElements) {
119                offerTransfer.setOfferNameElements(ListWrapperBuilder.getInstance().filter(transferProperties, offerNameElementControl.getOfferNameElementTransfers(userVisit)));
120            }
121        }
122        
123        return offerTransfer;
124    }
125    
126}