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}