001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 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.control.user.order.common.spec.OrderPriorityUniversalSpec;
020import com.echothree.model.control.core.common.ComponentVendors;
021import com.echothree.model.control.core.common.EntityTypes;
022import com.echothree.model.control.core.common.exception.InvalidParameterCountException;
023import com.echothree.model.control.core.server.logic.EntityInstanceLogic;
024import com.echothree.model.control.order.common.exception.DuplicateOrderPriorityNameException;
025import com.echothree.model.control.order.common.exception.UnknownDefaultOrderPriorityException;
026import com.echothree.model.control.order.common.exception.UnknownDefaultOrderTypeException;
027import com.echothree.model.control.order.common.exception.UnknownOrderPriorityNameException;
028import com.echothree.model.control.order.server.control.OrderPriorityControl;
029import com.echothree.model.control.order.server.control.OrderTypeControl;
030import com.echothree.model.data.order.server.entity.OrderPriority;
031import com.echothree.model.data.order.server.entity.OrderType;
032import com.echothree.model.data.order.server.value.OrderPriorityDetailValue;
033import com.echothree.model.data.party.server.entity.Language;
034import com.echothree.util.common.message.ExecutionErrors;
035import com.echothree.util.common.persistence.BasePK;
036import com.echothree.util.server.control.BaseLogic;
037import com.echothree.util.server.message.ExecutionErrorAccumulator;
038import com.echothree.util.server.persistence.EntityPermission;
039import com.echothree.util.server.persistence.Session;
040import com.echothree.util.server.validation.ParameterUtils;
041
042public class OrderPriorityLogic
043        extends BaseLogic {
044
045    private OrderPriorityLogic() {
046        super();
047    }
048
049    private static class OrderPriorityLogicHolder {
050        static OrderPriorityLogic instance = new OrderPriorityLogic();
051    }
052
053    public static OrderPriorityLogic getInstance() {
054        return OrderPriorityLogic.OrderPriorityLogicHolder.instance;
055    }
056
057    public OrderPriority createOrderPriority(final ExecutionErrorAccumulator eea, final String orderTypeName, final String orderPriorityName,
058            final Integer priority, final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) {
059        var orderType = OrderTypeLogic.getInstance().getOrderTypeByName(eea, orderTypeName);
060        OrderPriority orderPriority = null;
061
062        if(eea == null || !eea.hasExecutionErrors()) {
063            orderPriority = createOrderPriority(eea, orderType, orderPriorityName, priority, isDefault, sortOrder, language, description, createdBy);
064        }
065
066        return orderPriority;
067    }
068
069    public OrderPriority createOrderPriority(final ExecutionErrorAccumulator eea, final OrderType orderType, final String orderPriorityName,
070            final Integer priority, final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) {
071        var orderPriorityControl = Session.getModelController(OrderPriorityControl.class);
072        var orderPriority = orderPriorityControl.getOrderPriorityByName(orderType, orderPriorityName);
073
074        if(orderPriority == null) {
075            orderPriority = orderPriorityControl.createOrderPriority(orderType, orderPriorityName, priority, isDefault, sortOrder, createdBy);
076
077            if(description != null) {
078                orderPriorityControl.createOrderPriorityDescription(orderPriority, language, description, createdBy);
079            }
080        } else {
081            handleExecutionError(DuplicateOrderPriorityNameException.class, eea, ExecutionErrors.DuplicateOrderPriorityName.name(),
082                    orderType.getLastDetail().getOrderTypeName(), orderPriorityName);
083        }
084
085        return orderPriority;
086    }
087
088    public OrderPriority getOrderPriorityByName(final ExecutionErrorAccumulator eea, final OrderType orderType, final String orderPriorityName,
089            final EntityPermission entityPermission) {
090        var orderPriorityControl = Session.getModelController(OrderPriorityControl.class);
091        var orderPriority = orderPriorityControl.getOrderPriorityByName(orderType, orderPriorityName, entityPermission);
092
093        if(orderPriority == null) {
094            handleExecutionError(UnknownOrderPriorityNameException.class, eea, ExecutionErrors.UnknownOrderPriorityName.name(),
095                    orderType.getLastDetail().getOrderTypeName(), orderPriorityName);
096        }
097
098        return orderPriority;
099    }
100
101    public OrderPriority getOrderPriorityByName(final ExecutionErrorAccumulator eea, final OrderType orderType, final String orderPriorityName) {
102        return getOrderPriorityByName(eea, orderType, orderPriorityName, EntityPermission.READ_ONLY);
103    }
104
105    public OrderPriority getOrderPriorityByNameForUpdate(final ExecutionErrorAccumulator eea, final OrderType orderType, final String orderPriorityName) {
106        return getOrderPriorityByName(eea, orderType, orderPriorityName, EntityPermission.READ_WRITE);
107    }
108
109    public OrderPriority getOrderPriorityByName(final ExecutionErrorAccumulator eea, final String orderTypeName, final String orderPriorityName,
110            final EntityPermission entityPermission) {
111        var orderType = OrderTypeLogic.getInstance().getOrderTypeByName(eea, orderTypeName);
112        OrderPriority orderPriority = null;
113
114        if(!eea.hasExecutionErrors()) {
115            orderPriority = getOrderPriorityByName(eea, orderType, orderPriorityName, entityPermission);
116        }
117
118        return orderPriority;
119    }
120
121    public OrderPriority getOrderPriorityByName(final ExecutionErrorAccumulator eea, final String orderTypeName, final String orderPriorityName) {
122        return getOrderPriorityByName(eea, orderTypeName, orderPriorityName, EntityPermission.READ_ONLY);
123    }
124
125    public OrderPriority getOrderPriorityByNameForUpdate(final ExecutionErrorAccumulator eea, final String orderTypeName, final String orderPriorityName) {
126        return getOrderPriorityByName(eea, orderTypeName, orderPriorityName, EntityPermission.READ_WRITE);
127    }
128
129    public OrderPriority getOrderPriorityByUniversalSpec(final ExecutionErrorAccumulator eea, final OrderPriorityUniversalSpec universalSpec,
130            final boolean allowDefault, final EntityPermission entityPermission) {
131        var orderPriorityControl = Session.getModelController(OrderPriorityControl.class);
132        var orderTypeName = universalSpec.getOrderTypeName();
133        var orderPriorityName = universalSpec.getOrderPriorityName();
134        var nameParameterCount= ParameterUtils.getInstance().countNonNullParameters(orderTypeName, orderPriorityName);
135        var possibleEntitySpecs= EntityInstanceLogic.getInstance().countPossibleEntitySpecs(universalSpec);
136        OrderPriority orderPriority = null;
137
138        if(nameParameterCount < 3 && possibleEntitySpecs == 0) {
139            OrderType orderType = null;
140
141            if(orderTypeName == null) {
142                if(allowDefault) {
143                    var orderTypeControl = Session.getModelController(OrderTypeControl.class);
144                    orderType = orderTypeControl.getDefaultOrderType();
145
146                    if(orderType == null) {
147                        handleExecutionError(UnknownDefaultOrderTypeException.class, eea, ExecutionErrors.UnknownDefaultOrderType.name());
148                    }
149                } else {
150                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
151                }
152            } else {
153                orderType = OrderTypeLogic.getInstance().getOrderTypeByName(eea, orderTypeName);
154            }
155
156            if(!eea.hasExecutionErrors()) {
157                if(orderPriorityName == null) {
158                    if(allowDefault) {
159                        orderPriority = orderPriorityControl.getDefaultOrderPriority(orderType, entityPermission);
160
161                        if(orderPriority == null) {
162                            handleExecutionError(UnknownDefaultOrderPriorityException.class, eea, ExecutionErrors.UnknownDefaultOrderPriority.name());
163                        }
164                    } else {
165                        handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
166                    }
167                } else {
168                    orderPriority = getOrderPriorityByName(eea, orderType, orderPriorityName, entityPermission);
169                }
170            }
171        } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) {
172            var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, universalSpec,
173                    ComponentVendors.ECHO_THREE.name(), EntityTypes.OrderPriority.name());
174
175            if(!eea.hasExecutionErrors()) {
176                orderPriority = orderPriorityControl.getOrderPriorityByEntityInstance(entityInstance, entityPermission);
177            }
178        } else {
179            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
180        }
181
182        return orderPriority;
183    }
184
185    public OrderPriority getOrderPriorityByUniversalSpec(final ExecutionErrorAccumulator eea, final OrderPriorityUniversalSpec universalSpec,
186            boolean allowDefault) {
187        return getOrderPriorityByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY);
188    }
189
190    public OrderPriority getOrderPriorityByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final OrderPriorityUniversalSpec universalSpec,
191            boolean allowDefault) {
192        return getOrderPriorityByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE);
193    }
194
195    public void updateOrderPriorityFromValue(final ExecutionErrorAccumulator eea, OrderPriorityDetailValue orderPriorityDetailValue,
196            BasePK updatedBy) {
197        var orderPriorityControl = Session.getModelController(OrderPriorityControl.class);
198
199        orderPriorityControl.updateOrderPriorityFromValue(orderPriorityDetailValue, updatedBy);
200    }
201
202    public void deleteOrderPriority(final ExecutionErrorAccumulator eea, final OrderPriority orderPriority,
203            final BasePK deletedBy) {
204        var orderPriorityControl = Session.getModelController(OrderPriorityControl.class);
205
206        orderPriorityControl.deleteOrderPriority(orderPriority, deletedBy);
207    }
208
209}