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.logic;
018
019import com.echothree.control.user.offer.common.spec.OfferItemPriceSpec;
020import com.echothree.model.control.accounting.server.logic.CurrencyLogic;
021import com.echothree.model.control.inventory.server.logic.InventoryConditionLogic;
022import com.echothree.model.control.item.server.logic.ItemLogic;
023import com.echothree.model.control.offer.common.exception.UnknownOfferItemException;
024import com.echothree.model.control.offer.common.exception.UnknownOfferItemPriceException;
025import com.echothree.model.control.offer.server.control.OfferItemControl;
026import com.echothree.model.control.uom.server.logic.UnitOfMeasureTypeLogic;
027import com.echothree.model.data.offer.server.entity.OfferItemPrice;
028import com.echothree.util.common.message.ExecutionErrors;
029import com.echothree.util.server.control.BaseLogic;
030import com.echothree.util.server.message.ExecutionErrorAccumulator;
031import com.echothree.util.server.persistence.EntityPermission;
032import javax.enterprise.context.ApplicationScoped;
033import javax.inject.Inject;
034
035@ApplicationScoped
036public class OfferItemPriceLogic
037        extends BaseLogic {
038
039    @Inject
040    OfferItemControl offerItemControl;
041
042    @Inject
043    CurrencyLogic currencyLogic;
044
045    @Inject
046    InventoryConditionLogic inventoryConditionLogic;
047
048    @Inject
049    ItemLogic itemLogic;
050
051    @Inject
052    OfferLogic offerLogic;
053
054    @Inject
055    UnitOfMeasureTypeLogic unitOfMeasureTypeLogic;
056
057    protected OfferItemPriceLogic() {
058        super();
059    }
060
061    public OfferItemPrice getOfferItemPriceBySpec(final ExecutionErrorAccumulator eea,
062            final OfferItemPriceSpec spec, final EntityPermission entityPermission) {
063        OfferItemPrice offerItemPrice = null;
064        var offerName = spec.getOfferName();
065        var offer = offerLogic.getOfferByName(eea, offerName);
066
067        if(!hasExecutionErrors(eea)) {
068            var itemName = spec.getItemName();
069            var inventoryConditionName = spec.getInventoryConditionName();
070            var unitOfMeasureTypeName = spec.getUnitOfMeasureTypeName();
071            var currencyIsoName = spec.getCurrencyIsoName();
072            var item = itemLogic.getItemByName(eea, itemName);
073            var inventoryCondition = inventoryConditionLogic.getInventoryConditionByName(eea, inventoryConditionName);
074            var currency = currencyLogic.getCurrencyByName(eea, currencyIsoName);
075
076            if(!hasExecutionErrors(eea)) {
077                var offerItem = offerItemControl.getOfferItem(offer, item);
078
079                if(offerItem != null) {
080                    var unitOfMeasureType = unitOfMeasureTypeLogic.getUnitOfMeasureTypeByName(eea,
081                            item.getLastDetail().getUnitOfMeasureKind(), unitOfMeasureTypeName);
082
083                    if(!hasExecutionErrors(eea)) {
084                        offerItemPrice = offerItemControl.getOfferItemPrice(offerItem, inventoryCondition, unitOfMeasureType,
085                                currency, entityPermission);
086
087                        if(offerItemPrice == null) {
088                            handleExecutionError(UnknownOfferItemPriceException.class, eea, ExecutionErrors.UnknownOfferItemPrice.name(), offerName, itemName,
089                                    inventoryConditionName, unitOfMeasureTypeName, currencyIsoName);
090                        }
091                    }
092                } else {
093                    handleExecutionError(UnknownOfferItemException.class, eea, ExecutionErrors.UnknownOfferItem.name(), offerName, itemName);
094                }
095            }
096        }
097
098        return offerItemPrice;
099    }
100
101}