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