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