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