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.item.server.transfer;
018
019import javax.inject.Inject;
020import com.echothree.model.control.accounting.server.control.AccountingControl;
021import com.echothree.model.control.inventory.server.control.InventoryControl;
022import com.echothree.model.control.item.common.ItemPriceTypes;
023import com.echothree.model.control.item.common.ItemProperties;
024import com.echothree.model.control.item.common.transfer.ItemPriceTransfer;
025import com.echothree.model.control.item.server.control.ItemControl;
026import com.echothree.model.control.uom.server.control.UomControl;
027import com.echothree.model.data.item.server.entity.ItemFixedPrice;
028import com.echothree.model.data.item.server.entity.ItemPrice;
029import com.echothree.model.data.item.server.entity.ItemVariablePrice;
030import com.echothree.model.data.user.server.entity.UserVisit;
031import com.echothree.util.common.form.TransferProperties;
032import com.echothree.util.common.transfer.HistoryTransfer;
033import com.echothree.util.common.transfer.ListWrapper;
034import com.echothree.util.server.string.AmountUtils;
035import com.echothree.util.server.transfer.HistoryCache;
036import java.util.ArrayList;
037import java.util.List;
038import javax.enterprise.context.RequestScoped;
039
040@RequestScoped
041public class ItemPriceTransferCache
042        extends BaseItemTransferCache<ItemPrice, ItemPriceTransfer>
043        implements HistoryCache<ItemPrice, ItemPriceTransfer> {
044
045    @Inject
046    AccountingControl accountingControl;
047
048    @Inject
049    InventoryControl inventoryControl;
050
051    @Inject
052    ItemControl itemControl;
053
054    @Inject
055    UomControl uomControl;
056    
057    TransferProperties transferProperties;
058    boolean filterItem;
059    boolean filterInventoryCondition;
060    boolean filterUnitOfMeasureType;
061    boolean filterCurrency;
062    boolean filterUnformattedUnitPrice;
063    boolean filterUnitPrice;
064    boolean filterUnformattedMinimumUnitPrice;
065    boolean filterMinimumUnitPrice;
066    boolean filterUnformattedMaximumUnitPrice;
067    boolean filterMaximumUnitPrice;
068    boolean filterUnformattedUnitPriceIncrement;
069    boolean filterUnitPriceIncrement;
070    boolean filterUnformattedFromTime;
071    boolean filterFromTime;
072    boolean filterUnformattedThruTime;
073    boolean filterThruTime;
074    
075    /** Creates a new instance of ItemPriceTransferCache */
076    protected ItemPriceTransferCache() {
077        super();
078        
079        transferProperties = session.getTransferProperties();
080        if(transferProperties != null) {
081            var properties = transferProperties.getProperties(ItemPriceTransfer.class);
082            
083            if(properties != null) {
084                filterItem = !properties.contains(ItemProperties.ITEM);
085                filterInventoryCondition = !properties.contains(ItemProperties.INVENTORY_CONDITION);
086                filterUnitOfMeasureType = !properties.contains(ItemProperties.UNIT_OF_MEASURE_TYPE);
087                filterCurrency = !properties.contains(ItemProperties.CURRENCY);
088                filterUnformattedUnitPrice = !properties.contains(ItemProperties.UNFORMATTED_UNIT_PRICE);
089                filterUnitPrice = !properties.contains(ItemProperties.UNIT_PRICE);
090                filterUnformattedMinimumUnitPrice = !properties.contains(ItemProperties.UNFORMATTED_MINIMUM_UNIT_PRICE);
091                filterMinimumUnitPrice = !properties.contains(ItemProperties.MINIMUM_UNIT_PRICE);
092                filterUnformattedMaximumUnitPrice = !properties.contains(ItemProperties.UNFORMATTED_MAXIMUM_UNIT_PRICE);
093                filterMaximumUnitPrice = !properties.contains(ItemProperties.MAXIMUM_UNIT_PRICE);
094                filterUnformattedUnitPriceIncrement = !properties.contains(ItemProperties.UNFORMATTED_UNIT_PRICE_INCREMENT);
095                filterUnitPriceIncrement = !properties.contains(ItemProperties.UNIT_PRICE_INCREMENT);
096                filterUnformattedFromTime = !properties.contains(ItemProperties.UNFORMATTED_FROM_TIME);
097                filterFromTime = !properties.contains(ItemProperties.FROM_TIME);
098                filterUnformattedThruTime = !properties.contains(ItemProperties.UNFORMATTED_THRU_TIME);
099                filterThruTime = !properties.contains(ItemProperties.THRU_TIME);
100            }
101        }
102    }
103
104    private ItemPriceTransfer getItemPriceTransfer(final UserVisit userVisit, ItemPrice itemPrice, ItemFixedPrice itemFixedPrice, ItemVariablePrice itemVariablePrice) {
105        var item = itemPrice.getItem();
106        var itemTransfer = filterItem ? null : itemControl.getItemTransfer(userVisit, item);
107        var inventoryCondition = filterInventoryCondition ? null : itemPrice.getInventoryCondition();
108        var inventoryConditionTransfer = inventoryCondition == null ? null : inventoryControl.getInventoryConditionTransfer(userVisit, inventoryCondition);
109        var unitOfMeasureType = filterUnitOfMeasureType ? null : itemPrice.getUnitOfMeasureType();
110        var unitOfMeasureTypeTransfer = unitOfMeasureType == null ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, unitOfMeasureType);
111        var currency = itemPrice.getCurrency();
112        var currencyTransfer = filterCurrency ? null : accountingControl.getCurrencyTransfer(userVisit, currency);
113        Long unformattedUnitPrice = null;
114        String unitPrice = null;
115        Long unformattedMinimumUnitPrice = null;
116        String minimumUnitPrice = null;
117        Long unformattedMaximumUnitPrice = null;
118        String maximumUnitPrice = null;
119        Long unformattedUnitPriceIncrement = null;
120        String unitPriceIncrement = null;
121
122        if(itemFixedPrice != null) {
123            unformattedUnitPrice = filterUnformattedUnitPrice ? null : itemFixedPrice.getUnitPrice();
124            unitPrice = filterUnitPrice ? null : AmountUtils.getInstance().formatPriceUnit(currency, itemFixedPrice.getUnitPrice());
125        }
126        
127        if(itemVariablePrice != null) {
128            unformattedMinimumUnitPrice = filterUnformattedMinimumUnitPrice ? null : itemVariablePrice.getMinimumUnitPrice();
129            minimumUnitPrice = filterMinimumUnitPrice ? null : AmountUtils.getInstance().formatPriceUnit(currency, itemVariablePrice.getMinimumUnitPrice());
130            unformattedMaximumUnitPrice = filterUnformattedMinimumUnitPrice ? null : itemVariablePrice.getMaximumUnitPrice();
131            maximumUnitPrice = filterMaximumUnitPrice ? null : AmountUtils.getInstance().formatPriceUnit(currency, itemVariablePrice.getMaximumUnitPrice());
132            unformattedUnitPriceIncrement = filterUnformattedUnitPriceIncrement ? null : itemVariablePrice.getUnitPriceIncrement();
133            unitPriceIncrement = filterUnitPriceIncrement ? null : AmountUtils.getInstance().formatPriceUnit(currency, itemVariablePrice.getUnitPriceIncrement());
134        }
135
136        return new ItemPriceTransfer(itemTransfer, inventoryConditionTransfer, unitOfMeasureTypeTransfer, currencyTransfer,
137                unformattedUnitPrice, unitPrice, unformattedMinimumUnitPrice, minimumUnitPrice, unformattedMaximumUnitPrice, maximumUnitPrice,
138                unformattedUnitPriceIncrement, unitPriceIncrement);
139    }
140    
141    @Override
142    public ListWrapper<HistoryTransfer<ItemPriceTransfer>> getHistory(final UserVisit userVisit, ItemPrice itemPrice) {
143        List<HistoryTransfer<ItemPriceTransfer>> historyTransfers = null;
144        var itemPriceTypeName = itemPrice.getItem().getLastDetail().getItemPriceType().getItemPriceTypeName();
145        
146        if(ItemPriceTypes.FIXED.name().equals(itemPriceTypeName)) {
147            var itemFixedPriceHistory = itemControl.getItemFixedPriceHistory(itemPrice);
148            
149            historyTransfers = new ArrayList<>(itemFixedPriceHistory.size());
150            
151            for(var itemFixedPrice : itemFixedPriceHistory) {
152                var unformattedFromTime = filterUnformattedFromTime ? null : itemFixedPrice.getFromTime();
153                var fromTime = filterFromTime ? null : formatTypicalDateTime(userVisit, itemFixedPrice.getFromTime());
154                var unformattedThruTime = filterUnformattedThruTime ? null : itemFixedPrice.getThruTime();
155                var thruTime = filterThruTime ? null : formatTypicalDateTime(userVisit, itemFixedPrice.getThruTime());
156                
157                historyTransfers.add(new HistoryTransfer<>(getItemPriceTransfer(userVisit, itemPrice, itemFixedPrice, null),
158                        unformattedFromTime, fromTime, unformattedThruTime, thruTime));
159            }
160        } else if(ItemPriceTypes.VARIABLE.name().equals(itemPriceTypeName)) {
161            var itemVariablePriceHistory = itemControl.getItemVariablePriceHistory(itemPrice);
162            
163            historyTransfers = new ArrayList<>(itemVariablePriceHistory.size());
164            
165            for(var itemVariablePrice : itemVariablePriceHistory) {
166                var unformattedFromTime = filterUnformattedFromTime ? null : itemVariablePrice.getFromTime();
167                var fromTime = filterFromTime ? null : formatTypicalDateTime(userVisit, itemVariablePrice.getFromTime());
168                var unformattedThruTime = filterUnformattedThruTime ? null : itemVariablePrice.getThruTime();
169                var thruTime = filterThruTime ? null : formatTypicalDateTime(userVisit, itemVariablePrice.getThruTime());
170                
171                historyTransfers.add(new HistoryTransfer<>(getItemPriceTransfer(userVisit, itemPrice, null, itemVariablePrice),
172                        unformattedFromTime, fromTime, unformattedThruTime, thruTime));
173            }
174        }
175        
176        return new ListWrapper<>(historyTransfers);
177    }
178    
179    @Override
180    public ItemPriceTransfer getTransfer(UserVisit userVisit, ItemPrice itemPrice) {
181        var itemPriceTransfer = get(itemPrice);
182        
183        if(itemPriceTransfer == null) {
184            ItemFixedPrice itemFixedPrice = null;
185            ItemVariablePrice itemVariablePrice = null;
186            var itemPriceTypeName = itemPrice.getItem().getLastDetail().getItemPriceType().getItemPriceTypeName();
187
188            if(ItemPriceTypes.FIXED.name().equals(itemPriceTypeName)) {
189                itemFixedPrice = itemControl.getItemFixedPrice(itemPrice);
190            } else if(ItemPriceTypes.VARIABLE.name().equals(itemPriceTypeName)) {
191                itemVariablePrice = itemControl.getItemVariablePrice(itemPrice);
192            }
193            
194            itemPriceTransfer = getItemPriceTransfer(userVisit, itemPrice, itemFixedPrice, itemVariablePrice);
195            
196            put(userVisit, itemPrice, itemPriceTransfer);
197        }
198        
199        return itemPriceTransfer;
200    }
201    
202}