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.inventory.server.logic; 018 019import com.echothree.control.user.inventory.common.spec.InventoryDispositionUniversalSpec; 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.inventory.common.exception.DuplicateInventoryDispositionNameException; 025import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryDispositionException; 026import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryTransactionTypeException; 027import com.echothree.model.control.inventory.common.exception.UnknownInventoryDispositionNameException; 028import com.echothree.model.control.inventory.server.control.InventoryDispositionControl; 029import com.echothree.model.control.inventory.server.control.InventoryTransactionTypeControl; 030import com.echothree.model.data.inventory.server.entity.InventoryDisposition; 031import com.echothree.model.data.inventory.server.entity.InventoryTransactionType; 032import com.echothree.model.data.inventory.server.value.InventoryDispositionDetailValue; 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.validation.ParameterUtils; 040import javax.enterprise.context.ApplicationScoped; 041import javax.inject.Inject; 042 043@ApplicationScoped 044public class InventoryDispositionLogic 045 extends BaseLogic { 046 047 @Inject 048 InventoryDispositionControl inventoryDispositionControl; 049 050 @Inject 051 InventoryTransactionTypeControl inventoryTransactionTypeControl; 052 053 @Inject 054 EntityInstanceLogic entityInstanceLogic; 055 056 @Inject 057 InventoryTransactionTypeLogic inventoryTransactionTypeLogic; 058 059 protected InventoryDispositionLogic() { 060 super(); 061 } 062 063 public InventoryDisposition createInventoryDisposition(final ExecutionErrorAccumulator eea, 064 final String inventoryTransactionTypeName, final String inventoryDispositionName, 065 final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) { 066 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 067 InventoryDisposition inventoryDisposition = null; 068 069 if(eea == null || !eea.hasExecutionErrors()) { 070 inventoryDisposition = createInventoryDisposition(eea, inventoryTransactionType, inventoryDispositionName, 071 isDefault, sortOrder, language, description, createdBy); 072 } 073 074 return inventoryDisposition; 075 } 076 077 public InventoryDisposition createInventoryDisposition(final ExecutionErrorAccumulator eea, 078 final InventoryTransactionType inventoryTransactionType, final String inventoryDispositionName, 079 final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) { 080 var inventoryDisposition = inventoryDispositionControl.getInventoryDispositionByName(inventoryTransactionType, 081 inventoryDispositionName); 082 083 if(inventoryDisposition == null) { 084 inventoryDisposition = inventoryDispositionControl.createInventoryDisposition(inventoryTransactionType, 085 inventoryDispositionName, isDefault, sortOrder, createdBy); 086 087 if(description != null) { 088 inventoryDispositionControl.createInventoryDispositionDescription(inventoryDisposition, language, description, 089 createdBy); 090 } 091 } else { 092 handleExecutionError(DuplicateInventoryDispositionNameException.class, eea, 093 ExecutionErrors.DuplicateInventoryDispositionName.name(), 094 inventoryTransactionType.getLastDetail().getInventoryTransactionTypeName(), inventoryDispositionName); 095 } 096 097 return inventoryDisposition; 098 } 099 100 public InventoryDisposition getInventoryDispositionByName(final ExecutionErrorAccumulator eea, 101 final InventoryTransactionType inventoryTransactionType, final String inventoryDispositionName, 102 final EntityPermission entityPermission) { 103 var inventoryDisposition = inventoryDispositionControl.getInventoryDispositionByName(inventoryTransactionType, 104 inventoryDispositionName, entityPermission); 105 106 if(inventoryDisposition == null) { 107 handleExecutionError(UnknownInventoryDispositionNameException.class, eea, 108 ExecutionErrors.UnknownInventoryDispositionName.name(), 109 inventoryTransactionType.getLastDetail().getInventoryTransactionTypeName(), inventoryDispositionName); 110 } 111 112 return inventoryDisposition; 113 } 114 115 public InventoryDisposition getInventoryDispositionByName(final ExecutionErrorAccumulator eea, 116 final InventoryTransactionType inventoryTransactionType, final String inventoryDispositionName) { 117 return getInventoryDispositionByName(eea, inventoryTransactionType, inventoryDispositionName, EntityPermission.READ_ONLY); 118 } 119 120 public InventoryDisposition getInventoryDispositionByNameForUpdate(final ExecutionErrorAccumulator eea, 121 final InventoryTransactionType inventoryTransactionType, final String inventoryDispositionName) { 122 return getInventoryDispositionByName(eea, inventoryTransactionType, inventoryDispositionName, EntityPermission.READ_WRITE); 123 } 124 125 public InventoryDisposition getInventoryDispositionByName(final ExecutionErrorAccumulator eea, 126 final String inventoryTransactionTypeName, final String inventoryDispositionName, 127 final EntityPermission entityPermission) { 128 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 129 InventoryDisposition inventoryDisposition = null; 130 131 if(eea == null || !eea.hasExecutionErrors()) { 132 inventoryDisposition = getInventoryDispositionByName(eea, inventoryTransactionType, inventoryDispositionName, 133 entityPermission); 134 } 135 136 return inventoryDisposition; 137 } 138 139 public InventoryDisposition getInventoryDispositionByName(final ExecutionErrorAccumulator eea, 140 final String inventoryTransactionTypeName, final String inventoryDispositionName) { 141 return getInventoryDispositionByName(eea, inventoryTransactionTypeName, inventoryDispositionName, EntityPermission.READ_ONLY); 142 } 143 144 public InventoryDisposition getInventoryDispositionByNameForUpdate(final ExecutionErrorAccumulator eea, 145 final String inventoryTransactionTypeName, final String inventoryDispositionName) { 146 return getInventoryDispositionByName(eea, inventoryTransactionTypeName, inventoryDispositionName, 147 EntityPermission.READ_WRITE); 148 } 149 150 public InventoryDisposition getInventoryDispositionByUniversalSpec(final ExecutionErrorAccumulator eea, 151 final InventoryDispositionUniversalSpec universalSpec, 152 final boolean allowDefault, final EntityPermission entityPermission) { 153 var inventoryTransactionTypeName = universalSpec.getInventoryTransactionTypeName(); 154 var inventoryDispositionName = universalSpec.getInventoryDispositionName(); 155 var nameParameterCount = ParameterUtils.getInstance().countNonNullParameters(inventoryTransactionTypeName, inventoryDispositionName); 156 var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 157 InventoryDisposition inventoryDisposition = null; 158 159 if(nameParameterCount < 3 && possibleEntitySpecs == 0) { 160 InventoryTransactionType inventoryTransactionType = null; 161 162 if(inventoryTransactionTypeName == null) { 163 if(allowDefault) { 164 inventoryTransactionType = inventoryTransactionTypeControl.getDefaultInventoryTransactionType(); 165 166 if(inventoryTransactionType == null) { 167 handleExecutionError(UnknownDefaultInventoryTransactionTypeException.class, eea, 168 ExecutionErrors.UnknownDefaultInventoryTransactionType.name()); 169 } 170 } else { 171 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 172 } 173 } else { 174 inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 175 } 176 177 if(eea == null || !eea.hasExecutionErrors()) { 178 if(inventoryDispositionName == null) { 179 if(allowDefault) { 180 inventoryDisposition = 181 inventoryDispositionControl.getDefaultInventoryDisposition(inventoryTransactionType, entityPermission); 182 183 if(inventoryDisposition == null) { 184 handleExecutionError(UnknownDefaultInventoryDispositionException.class, eea, 185 ExecutionErrors.UnknownDefaultInventoryDisposition.name()); 186 } 187 } else { 188 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 189 } 190 } else { 191 inventoryDisposition = getInventoryDispositionByName(eea, inventoryTransactionType, 192 inventoryDispositionName, entityPermission); 193 } 194 } 195 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 196 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 197 ComponentVendors.ECHO_THREE.name(), EntityTypes.InventoryDisposition.name()); 198 199 if(eea == null || !eea.hasExecutionErrors()) { 200 inventoryDisposition = inventoryDispositionControl.getInventoryDispositionByEntityInstance(entityInstance, 201 entityPermission); 202 } 203 } else { 204 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 205 } 206 207 return inventoryDisposition; 208 } 209 210 public InventoryDisposition getInventoryDispositionByUniversalSpec(final ExecutionErrorAccumulator eea, 211 final InventoryDispositionUniversalSpec universalSpec, 212 boolean allowDefault) { 213 return getInventoryDispositionByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 214 } 215 216 public InventoryDisposition getInventoryDispositionByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 217 final InventoryDispositionUniversalSpec universalSpec, 218 boolean allowDefault) { 219 return getInventoryDispositionByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 220 } 221 222 public void updateInventoryDispositionFromValue(final ExecutionErrorAccumulator eea, 223 InventoryDispositionDetailValue inventoryDispositionDetailValue, 224 BasePK updatedBy) { 225 inventoryDispositionControl.updateInventoryDispositionFromValue(inventoryDispositionDetailValue, updatedBy); 226 } 227 228 public void deleteInventoryDisposition(final ExecutionErrorAccumulator eea, 229 final InventoryDisposition inventoryDisposition, 230 final BasePK deletedBy) { 231 inventoryDispositionControl.deleteInventoryDisposition(inventoryDisposition, deletedBy); 232 } 233 234}