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