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