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