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.content.server.transfer;
018
019import com.echothree.model.control.accounting.server.control.AccountingControl;
020import com.echothree.model.control.content.common.ContentOptions;
021import com.echothree.model.control.content.common.ContentProperties;
022import com.echothree.model.control.content.common.transfer.ContentCatalogItemTransfer;
023import com.echothree.model.control.content.server.control.ContentControl;
024import com.echothree.model.control.inventory.server.control.InventoryControl;
025import com.echothree.model.control.item.common.ItemPriceTypes;
026import com.echothree.model.control.item.server.control.ItemControl;
027import com.echothree.model.control.uom.server.control.UomControl;
028import com.echothree.model.data.content.server.entity.ContentCatalogItem;
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.string.AmountUtils;
033import javax.enterprise.context.RequestScoped;
034
035@RequestScoped
036public class ContentCatalogItemTransferCache
037        extends BaseContentTransferCache<ContentCatalogItem, ContentCatalogItemTransfer> {
038
039    AccountingControl accountingControl = Session.getModelController(AccountingControl.class);
040    ContentControl contentControl = Session.getModelController(ContentControl.class);
041    InventoryControl inventoryControl = Session.getModelController(InventoryControl.class);
042    ItemControl itemControl = Session.getModelController(ItemControl.class);
043    UomControl uomControl = Session.getModelController(UomControl.class);
044    AmountUtils amountUtils = AmountUtils.getInstance();
045    
046    TransferProperties transferProperties;
047    boolean filterContentCatalog;
048    boolean filterItem;
049    boolean filterInventoryCondition;
050    boolean filterUnitOfMeasureType;
051    boolean filterCurrency;
052    boolean filterUnformattedUnitPrice;
053    boolean filterUnitPrice;
054    boolean filterUnformattedMinimumUnitPrice;
055    boolean filterMinimumUnitPrice;
056    boolean filterUnformattedMaximumUnitPrice;
057    boolean filterMaximumUnitPrice;
058    boolean filterUnformattedUnitPriceIncrement;
059    boolean filterUnitPriceIncrement;
060    boolean filterEntityInstance;
061    
062    /** Creates a new instance of ContentCatalogItemTransferCache */
063    protected ContentCatalogItemTransferCache() {
064        super();
065
066        var options = session.getOptions();
067        if(options != null) {
068            setIncludeEntityAttributeGroups(options.contains(ContentOptions.ContentCatalogItemIncludeEntityAttributeGroups));
069            setIncludeTagScopes(options.contains(ContentOptions.ContentCatalogItemIncludeTagScopes));
070        }
071
072        transferProperties = session.getTransferProperties();
073        if(transferProperties != null) {
074            var properties = transferProperties.getProperties(ContentCatalogItemTransfer.class);
075            
076            if(properties != null) {
077                filterContentCatalog = !properties.contains(ContentProperties.CONTENT_CATALOG);
078                filterItem = !properties.contains(ContentProperties.ITEM);
079                filterInventoryCondition = !properties.contains(ContentProperties.INVENTORY_CONDITION);
080                filterUnitOfMeasureType = !properties.contains(ContentProperties.UNIT_OF_MEASURE_TYPE);
081                filterCurrency = !properties.contains(ContentProperties.CURRENCY);
082                filterUnformattedUnitPrice = !properties.contains(ContentProperties.UNFORMATTED_UNIT_PRICE);
083                filterUnitPrice = !properties.contains(ContentProperties.UNIT_PRICE);
084                filterUnformattedMinimumUnitPrice = !properties.contains(ContentProperties.UNFORMATTED_MINIMUM_UNIT_PRICE);
085                filterMinimumUnitPrice = !properties.contains(ContentProperties.MINIMUM_UNIT_PRICE);
086                filterUnformattedMaximumUnitPrice = !properties.contains(ContentProperties.UNFORMATTED_MAXIMUM_UNIT_PRICE);
087                filterMaximumUnitPrice = !properties.contains(ContentProperties.MAXIMUM_UNIT_PRICE);
088                filterUnformattedUnitPriceIncrement = !properties.contains(ContentProperties.UNFORMATTED_UNIT_PRICE_INCREMENT);
089                filterUnitPriceIncrement = !properties.contains(ContentProperties.UNIT_PRICE_INCREMENT);
090                filterEntityInstance = !properties.contains(ContentProperties.ENTITY_INSTANCE);
091            }
092        }
093        
094        setIncludeEntityInstance(!filterEntityInstance);
095    }
096    
097    public ContentCatalogItemTransfer getContentCatalogItemTransfer(UserVisit userVisit, ContentCatalogItem contentCatalogItem) {
098        var contentCatalogItemTransfer = get(contentCatalogItem);
099        
100        if(contentCatalogItemTransfer == null) {
101            var contentCatalog = filterContentCatalog ? null : contentControl.getContentCatalogTransfer(userVisit, contentCatalogItem.getContentCatalog());
102            var item = contentCatalogItem.getItem();
103            var itemTransfer = filterItem ? null : itemControl.getItemTransfer(userVisit, item);
104            var inventoryConditionTransfer = inventoryControl.getInventoryConditionTransfer(userVisit, contentCatalogItem.getInventoryCondition());
105            var unitOfMeasureTypeTransfer = filterUnitOfMeasureType ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, contentCatalogItem.getUnitOfMeasureType());
106            var currency = contentCatalogItem.getCurrency();
107            var currencyTransfer = filterCurrency ? null : accountingControl.getCurrencyTransfer(userVisit, currency);
108            Long unformattedUnitPrice = null;
109            String unitPrice = null;
110            Long unformattedMinimumUnitPrice = null;
111            String minimumUnitPrice = null;
112            Long unformattedMaximumUnitPrice = null;
113            String maximumUnitPrice = null;
114            Long unformattedUnitPriceIncrement = null;
115            String unitPriceIncrement = null;
116
117            var itemPriceTypeName = item.getLastDetail().getItemPriceType().getItemPriceTypeName();
118            if(ItemPriceTypes.FIXED.name().equals(itemPriceTypeName)) {
119                if(!filterUnformattedUnitPrice || !filterUnitPrice) {
120                    var contentCatalogItemFixedPrice = contentControl.getContentCatalogItemFixedPrice(contentCatalogItem);
121
122                    if(contentCatalogItemFixedPrice != null) {
123                        var rawUnitPrice = contentCatalogItemFixedPrice.getUnitPrice();
124                        
125                        unformattedUnitPrice = filterUnformattedUnitPrice ? null : rawUnitPrice;
126                        unitPrice = filterUnitPrice ? null : amountUtils.formatPriceUnit(currency, rawUnitPrice);
127                    }
128                }
129            } else if(ItemPriceTypes.VARIABLE.name().equals(itemPriceTypeName)) {
130                if(!filterUnformattedMinimumUnitPrice || !filterMinimumUnitPrice || !filterUnformattedMaximumUnitPrice || !filterMaximumUnitPrice
131                        || !filterUnformattedUnitPriceIncrement || !filterUnitPriceIncrement) {
132                    var contentCatalogItemVariablePrice = contentControl.getContentCatalogItemVariablePrice(contentCatalogItem);
133
134                    if(contentCatalogItemVariablePrice != null) {
135                        var rawMinimumUnitPrice = contentCatalogItemVariablePrice.getMinimumUnitPrice();
136                        var rawMaximumUnitPrice = contentCatalogItemVariablePrice.getMaximumUnitPrice();
137                        var rawUnitPriceIncrement = contentCatalogItemVariablePrice.getUnitPriceIncrement();
138
139                        unformattedMinimumUnitPrice = filterUnformattedMinimumUnitPrice ? null : rawMinimumUnitPrice;
140                        minimumUnitPrice = filterMinimumUnitPrice ? null : amountUtils.formatPriceUnit(currency, rawMinimumUnitPrice);
141                        unformattedMaximumUnitPrice = filterUnformattedMaximumUnitPrice ? null : rawMaximumUnitPrice;
142                        maximumUnitPrice = filterMaximumUnitPrice ? null : amountUtils.formatPriceUnit(currency, rawMaximumUnitPrice);
143                        unformattedUnitPriceIncrement = filterUnformattedUnitPriceIncrement ? null : rawUnitPriceIncrement;
144                        unitPriceIncrement = filterUnitPriceIncrement ? null : amountUtils.formatPriceUnit(currency, rawUnitPriceIncrement);
145                    }
146                }
147            }
148
149            contentCatalogItemTransfer = new ContentCatalogItemTransfer(contentCatalog, itemTransfer, inventoryConditionTransfer, unitOfMeasureTypeTransfer,
150                    currencyTransfer, unformattedUnitPrice, unitPrice, unformattedMinimumUnitPrice, minimumUnitPrice, unformattedMaximumUnitPrice,
151                    maximumUnitPrice, unformattedUnitPriceIncrement, unitPriceIncrement);
152            put(userVisit, contentCatalogItem, contentCatalogItemTransfer);
153        }
154        
155        return contentCatalogItemTransfer;
156    }
157    
158}