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.InventoryDispositionAdjustmentUniversalSpec; 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.DuplicateInventoryDispositionAdjustmentNameException; 025import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryDispositionAdjustmentException; 026import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryDispositionException; 027import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryTransactionTypeException; 028import com.echothree.model.control.inventory.common.exception.UnknownInventoryDispositionAdjustmentNameException; 029import com.echothree.model.control.inventory.server.control.InventoryDispositionAdjustmentControl; 030import com.echothree.model.control.inventory.server.control.InventoryDispositionControl; 031import com.echothree.model.control.inventory.server.control.InventoryTransactionTypeControl; 032import com.echothree.model.data.inventory.server.entity.InventoryDispositionAdjustment; 033import com.echothree.model.data.inventory.server.entity.InventoryDisposition; 034import com.echothree.model.data.inventory.server.entity.InventoryAdjustmentType; 035import com.echothree.model.data.inventory.server.entity.InventoryBucketType; 036import com.echothree.model.data.inventory.server.entity.InventoryTransactionType; 037import com.echothree.model.data.inventory.server.value.InventoryDispositionAdjustmentDetailValue; 038import com.echothree.model.data.party.server.entity.Language; 039import com.echothree.util.common.message.ExecutionErrors; 040import com.echothree.util.common.persistence.BasePK; 041import com.echothree.util.server.control.BaseLogic; 042import com.echothree.util.server.message.ExecutionErrorAccumulator; 043import com.echothree.util.server.persistence.EntityPermission; 044import com.echothree.util.server.validation.ParameterUtils; 045import javax.enterprise.context.ApplicationScoped; 046import javax.inject.Inject; 047 048@ApplicationScoped 049public class InventoryDispositionAdjustmentLogic 050 extends BaseLogic { 051 052 @Inject 053 InventoryDispositionAdjustmentControl inventoryDispositionAdjustmentControl; 054 055 @Inject 056 InventoryDispositionControl inventoryDispositionControl; 057 058 @Inject 059 InventoryTransactionTypeControl inventoryTransactionTypeControl; 060 061 @Inject 062 EntityInstanceLogic entityInstanceLogic; 063 064 @Inject 065 InventoryTransactionTypeLogic inventoryTransactionTypeLogic; 066 067 @Inject 068 InventoryDispositionLogic inventoryDispositionLogic; 069 070 @Inject 071 InventoryAdjustmentTypeLogic inventoryAdjustmentTypeLogic; 072 073 @Inject 074 InventoryBucketTypeLogic inventoryBucketTypeLogic; 075 076 protected InventoryDispositionAdjustmentLogic() { 077 super(); 078 } 079 080 public InventoryDispositionAdjustment createInventoryDispositionAdjustment(final ExecutionErrorAccumulator eea, 081 final String inventoryTransactionTypeName, final String inventoryDispositionAdjustmentName, final String inventoryDispositionName, 082 final String inventoryAdjustmentTypeName, final String inventoryBucketTypeName, 083 final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) { 084 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 085 InventoryDispositionAdjustment inventoryDispositionAdjustment = null; 086 087 if(eea == null || !eea.hasExecutionErrors()) { 088 var inventoryDisposition = inventoryDispositionLogic.getInventoryDispositionByName(eea, inventoryTransactionType, 089 inventoryDispositionName); 090 091 if(eea == null || !eea.hasExecutionErrors()) { 092 var inventoryAdjustmentType = inventoryAdjustmentTypeLogic.getInventoryAdjustmentTypeByName(eea, inventoryAdjustmentTypeName); 093 var inventoryBucketType = inventoryBucketTypeLogic.getInventoryBucketTypeByName(eea, inventoryBucketTypeName); 094 095 if(eea == null || !eea.hasExecutionErrors()) { 096 inventoryDispositionAdjustment = createInventoryDispositionAdjustment(eea, inventoryDisposition, 097 inventoryDispositionAdjustmentName, inventoryAdjustmentType, inventoryBucketType, isDefault, sortOrder, 098 language, description, createdBy); 099 } 100 } 101 } 102 103 return inventoryDispositionAdjustment; 104 } 105 106 public InventoryDispositionAdjustment createInventoryDispositionAdjustment(final ExecutionErrorAccumulator eea, 107 final InventoryDisposition inventoryDisposition, 108 final String inventoryDispositionAdjustmentName, final InventoryAdjustmentType inventoryAdjustmentType, 109 final InventoryBucketType inventoryBucketType, 110 final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) { 111 var inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByName(inventoryDisposition, 112 inventoryDispositionAdjustmentName); 113 114 if(inventoryDispositionAdjustment == null) { 115 inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.createInventoryDispositionAdjustment(inventoryDisposition, 116 inventoryDispositionAdjustmentName, inventoryAdjustmentType, inventoryBucketType, isDefault, sortOrder, createdBy); 117 118 if(description != null) { 119 inventoryDispositionAdjustmentControl.createInventoryDispositionAdjustmentDescription(inventoryDispositionAdjustment, 120 language, description, createdBy); 121 } 122 } else { 123 handleExecutionError(DuplicateInventoryDispositionAdjustmentNameException.class, eea, 124 ExecutionErrors.DuplicateInventoryDispositionAdjustmentName.name(), 125 inventoryDisposition.getLastDetail().getInventoryDispositionName(), inventoryDispositionAdjustmentName); 126 } 127 128 return inventoryDispositionAdjustment; 129 } 130 131 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea, 132 final InventoryDisposition inventoryDisposition, final String inventoryDispositionAdjustmentName, 133 final EntityPermission entityPermission) { 134 var inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByName(inventoryDisposition, 135 inventoryDispositionAdjustmentName, entityPermission); 136 137 if(inventoryDispositionAdjustment == null) { 138 handleExecutionError(UnknownInventoryDispositionAdjustmentNameException.class, eea, 139 ExecutionErrors.UnknownInventoryDispositionAdjustmentName.name(), 140 inventoryDisposition.getLastDetail().getInventoryDispositionName(), inventoryDispositionAdjustmentName); 141 } 142 143 return inventoryDispositionAdjustment; 144 } 145 146 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea, 147 final InventoryDisposition inventoryDisposition, final String inventoryDispositionAdjustmentName) { 148 return getInventoryDispositionAdjustmentByName(eea, inventoryDisposition, inventoryDispositionAdjustmentName, EntityPermission.READ_ONLY); 149 } 150 151 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByNameForUpdate(final ExecutionErrorAccumulator eea, 152 final InventoryDisposition inventoryDisposition, final String inventoryDispositionAdjustmentName) { 153 return getInventoryDispositionAdjustmentByName(eea, inventoryDisposition, inventoryDispositionAdjustmentName, EntityPermission.READ_WRITE); 154 } 155 156 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea, 157 final String inventoryTransactionTypeName, final String inventoryDispositionName, 158 final String inventoryDispositionAdjustmentName, 159 final EntityPermission entityPermission) { 160 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 161 InventoryDispositionAdjustment inventoryDispositionAdjustment = null; 162 163 if(eea == null || !eea.hasExecutionErrors()) { 164 var inventoryDisposition = inventoryDispositionLogic.getInventoryDispositionByName(eea, inventoryTransactionType, 165 inventoryDispositionName); 166 if(eea == null || !eea.hasExecutionErrors()) { 167 inventoryDispositionAdjustment = getInventoryDispositionAdjustmentByName(eea, inventoryDisposition, 168 inventoryDispositionAdjustmentName, entityPermission); 169 } 170 } 171 172 return inventoryDispositionAdjustment; 173 } 174 175 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea, 176 final String inventoryTransactionTypeName, final String inventoryDispositionName, 177 final String inventoryDispositionAdjustmentName) { 178 return getInventoryDispositionAdjustmentByName(eea, inventoryTransactionTypeName, inventoryDispositionName, 179 inventoryDispositionAdjustmentName, EntityPermission.READ_ONLY); 180 } 181 182 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByNameForUpdate(final ExecutionErrorAccumulator eea, 183 final String inventoryTransactionTypeName, final String inventoryDispositionName, 184 final String inventoryDispositionAdjustmentName) { 185 return getInventoryDispositionAdjustmentByName(eea, inventoryTransactionTypeName, inventoryDispositionName, 186 inventoryDispositionAdjustmentName, 187 EntityPermission.READ_WRITE); 188 } 189 190 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByUniversalSpec(final ExecutionErrorAccumulator eea, 191 final InventoryDispositionAdjustmentUniversalSpec universalSpec, 192 final boolean allowDefault, final EntityPermission entityPermission) { 193 var inventoryTransactionTypeName = universalSpec.getInventoryTransactionTypeName(); 194 var inventoryDispositionName = universalSpec.getInventoryDispositionName(); 195 var inventoryDispositionAdjustmentName = universalSpec.getInventoryDispositionAdjustmentName(); 196 var nameParameterCount = ParameterUtils.getInstance().countNonNullParameters(inventoryTransactionTypeName, 197 inventoryDispositionName, inventoryDispositionAdjustmentName); 198 var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 199 InventoryDispositionAdjustment inventoryDispositionAdjustment = null; 200 201 if(nameParameterCount < 4 && possibleEntitySpecs == 0) { 202 InventoryTransactionType inventoryTransactionType = null; 203 204 if(inventoryTransactionTypeName == null) { 205 if(allowDefault) { 206 inventoryTransactionType = inventoryTransactionTypeControl.getDefaultInventoryTransactionType(); 207 208 if(inventoryTransactionType == null) { 209 handleExecutionError(UnknownDefaultInventoryTransactionTypeException.class, eea, 210 ExecutionErrors.UnknownDefaultInventoryTransactionType.name()); 211 } 212 } else { 213 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 214 } 215 } else { 216 inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 217 } 218 219 if(eea == null || !eea.hasExecutionErrors()) { 220 InventoryDisposition inventoryDisposition; 221 if(inventoryDispositionName == null && allowDefault) { 222 inventoryDisposition = inventoryDispositionControl.getDefaultInventoryDisposition(inventoryTransactionType); 223 if(inventoryDisposition == null) { 224 handleExecutionError(UnknownDefaultInventoryDispositionException.class, eea, 225 ExecutionErrors.UnknownDefaultInventoryDisposition.name()); 226 } 227 } else { 228 inventoryDisposition = inventoryDispositionLogic.getInventoryDispositionByName(eea, inventoryTransactionType, 229 inventoryDispositionName); 230 } 231 232 if(eea != null && eea.hasExecutionErrors()) { 233 return null; 234 } 235 236 if(inventoryDispositionAdjustmentName == null) { 237 if(allowDefault) { 238 inventoryDispositionAdjustment = 239 inventoryDispositionAdjustmentControl.getDefaultInventoryDispositionAdjustment(inventoryDisposition, entityPermission); 240 241 if(inventoryDispositionAdjustment == null) { 242 handleExecutionError(UnknownDefaultInventoryDispositionAdjustmentException.class, eea, 243 ExecutionErrors.UnknownDefaultInventoryDispositionAdjustment.name()); 244 } 245 } else { 246 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 247 } 248 } else { 249 inventoryDispositionAdjustment = getInventoryDispositionAdjustmentByName(eea, inventoryDisposition, 250 inventoryDispositionAdjustmentName, entityPermission); 251 } 252 } 253 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 254 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 255 ComponentVendors.ECHO_THREE.name(), EntityTypes.InventoryDispositionAdjustment.name()); 256 257 if(eea == null || !eea.hasExecutionErrors()) { 258 inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByEntityInstance(entityInstance, 259 entityPermission); 260 } 261 } else { 262 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 263 } 264 265 return inventoryDispositionAdjustment; 266 } 267 268 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByUniversalSpec(final ExecutionErrorAccumulator eea, 269 final InventoryDispositionAdjustmentUniversalSpec universalSpec, boolean allowDefault) { 270 return getInventoryDispositionAdjustmentByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 271 } 272 273 public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 274 final InventoryDispositionAdjustmentUniversalSpec universalSpec, boolean allowDefault) { 275 return getInventoryDispositionAdjustmentByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 276 } 277 278 public void updateInventoryDispositionAdjustmentFromValue(final ExecutionErrorAccumulator eea, 279 InventoryDispositionAdjustmentDetailValue inventoryDispositionAdjustmentDetailValue, 280 BasePK updatedBy) { 281 inventoryDispositionAdjustmentControl.updateInventoryDispositionAdjustmentFromValue(inventoryDispositionAdjustmentDetailValue, updatedBy); 282 } 283 284 public void deleteInventoryDispositionAdjustment(final ExecutionErrorAccumulator eea, 285 final InventoryDispositionAdjustment inventoryDispositionAdjustment, final BasePK deletedBy) { 286 inventoryDispositionAdjustmentControl.deleteInventoryDispositionAdjustment(inventoryDispositionAdjustment, deletedBy); 287 } 288 289}