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