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.order.server.logic;
018
019import com.echothree.model.control.order.common.exception.DuplicateOrderShipmentGroupSequenceException;
020import com.echothree.model.control.order.common.exception.UnknownDefaultOrderShipmentGroupException;
021import com.echothree.model.control.order.common.exception.UnknownOrderShipmentGroupException;
022import com.echothree.model.control.order.server.control.OrderControl;
023import com.echothree.model.control.order.server.control.OrderShipmentGroupControl;
024import com.echothree.model.data.contact.server.entity.PartyContactMechanism;
025import com.echothree.model.data.item.server.entity.ItemDeliveryType;
026import com.echothree.model.data.order.server.entity.Order;
027import com.echothree.model.data.order.server.entity.OrderShipmentGroup;
028import com.echothree.model.data.shipping.server.entity.ShippingMethod;
029import com.echothree.util.common.message.ExecutionErrors;
030import com.echothree.util.common.persistence.BasePK;
031import com.echothree.util.server.control.BaseLogic;
032import com.echothree.util.server.message.ExecutionErrorAccumulator;
033import com.echothree.util.server.persistence.EntityPermission;
034import com.echothree.util.server.persistence.Session;
035import javax.enterprise.context.ApplicationScoped;
036import javax.enterprise.inject.spi.CDI;
037
038public class BaseOrderShipmentGroupLogic
039        extends BaseLogic {
040
041    protected BaseOrderShipmentGroupLogic() {
042        super();
043    }
044
045    public OrderShipmentGroup createOrderShipmentGroup(final ExecutionErrorAccumulator eea, final Order order, Integer orderShipmentGroupSequence,
046            final ItemDeliveryType itemDeliveryType, final Boolean isDefault, final PartyContactMechanism partyContactMechanism,
047            final ShippingMethod shippingMethod, final Boolean holdUntilComplete, final BasePK createdBy) {
048        var orderControl = Session.getModelController(OrderControl.class);
049        var orderShipmentGroupControl = Session.getModelController(OrderShipmentGroupControl.class);
050        var orderStatus = orderControl.getOrderStatusForUpdate(order);
051        OrderShipmentGroup orderShipmentGroup = null;
052
053        if(orderShipmentGroupSequence == null) {
054            orderShipmentGroupSequence = orderStatus.getOrderShipmentGroupSequence() + 1;
055            orderStatus.setOrderShipmentGroupSequence(orderShipmentGroupSequence);
056        } else {
057            orderShipmentGroup = orderShipmentGroupControl.getOrderShipmentGroupBySequence(order, orderShipmentGroupSequence);
058
059            if(orderShipmentGroup == null) {
060                // If the orderShipmentGroupSequence is > the last one that was recorded in the OrderStatus, jump the
061                // one in OrderStatus forward - it should always record the greatest orderShipmentGroupSequence used.
062                if(orderShipmentGroupSequence > orderStatus.getOrderShipmentGroupSequence()) {
063                    orderStatus.setOrderShipmentGroupSequence(orderShipmentGroupSequence);
064                }
065            } else {
066                handleExecutionError(DuplicateOrderShipmentGroupSequenceException.class, eea, ExecutionErrors.DuplicateOrderShipmentGroupSequence.name(),
067                        order.getLastDetail().getOrderName(), orderShipmentGroupSequence.toString());
068            }
069        }
070
071        if(orderShipmentGroup == null) {
072            orderShipmentGroup = orderShipmentGroupControl.createOrderShipmentGroup(order, orderShipmentGroupSequence, itemDeliveryType, isDefault, partyContactMechanism,
073                    shippingMethod, holdUntilComplete, createdBy);
074        }
075
076        return orderShipmentGroup;
077    }
078
079    public OrderShipmentGroup getDefaultOrderShipmentGroup(final ExecutionErrorAccumulator eea, final Order order,
080            final ItemDeliveryType itemDeliveryType, final EntityPermission entityPermission) {
081        var orderShipmentGroupControl = Session.getModelController(OrderShipmentGroupControl.class);
082        var orderShipmentGroup = orderShipmentGroupControl.getDefaultOrderShipmentGroup(order, itemDeliveryType, entityPermission);
083
084        if(orderShipmentGroup == null) {
085            handleExecutionError(UnknownDefaultOrderShipmentGroupException.class, eea, ExecutionErrors.UnknownDefaultOrderShipmentGroup.name(),
086                    order.getLastDetail().getOrderName(), itemDeliveryType.getItemDeliveryTypeName());
087        }
088
089        return orderShipmentGroup;
090    }
091
092    public OrderShipmentGroup getDefaultOrderShipmentGroup(final ExecutionErrorAccumulator eea, final Order order,
093            final ItemDeliveryType itemDeliveryType) {
094        return getDefaultOrderShipmentGroup(eea, order, itemDeliveryType, EntityPermission.READ_ONLY);
095    }
096
097    public OrderShipmentGroup getDefaultOrderShipmentGroupForUpdate(final ExecutionErrorAccumulator eea, final Order order,
098            final ItemDeliveryType itemDeliveryType) {
099        return getDefaultOrderShipmentGroup(eea, order, itemDeliveryType, EntityPermission.READ_WRITE);
100    }
101
102    public OrderShipmentGroup getOrderShipmentGroupBySequence(final ExecutionErrorAccumulator eea, final Order order,
103            final Integer orderShipmentGroupSequence, final EntityPermission entityPermission) {
104        var orderShipmentGroupControl = Session.getModelController(OrderShipmentGroupControl.class);
105        var orderShipmentGroup = orderShipmentGroupControl.getOrderShipmentGroupBySequence(order, orderShipmentGroupSequence);
106
107        if(orderShipmentGroup == null) {
108            handleExecutionError(UnknownOrderShipmentGroupException.class, eea, ExecutionErrors.UnknownOrderShipmentGroup.name(),
109                    order.getLastDetail().getOrderName(), orderShipmentGroupSequence);
110        }
111
112        return orderShipmentGroup;
113    }
114
115    public OrderShipmentGroup getOrderShipmentGroup(final ExecutionErrorAccumulator eea, final Order order, final Integer orderShipmentGroupSequence) {
116        return getOrderShipmentGroupBySequence(eea, order, orderShipmentGroupSequence, EntityPermission.READ_ONLY);
117    }
118
119    public OrderShipmentGroup getOrderShipmentGroupForUpdate(final ExecutionErrorAccumulator eea, final Order order, final Integer orderShipmentGroupSequence) {
120        return getOrderShipmentGroupBySequence(eea, order, orderShipmentGroupSequence, EntityPermission.READ_WRITE);
121    }
122
123}