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.InventoryTransactionUniversalSpec; 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.DuplicateInventoryTransactionNameException; 025import com.echothree.model.control.inventory.common.exception.InvalidInventoryTransactionTypeException; 026import com.echothree.model.control.inventory.common.exception.UnknownInventoryTransactionNameException; 027import com.echothree.model.control.inventory.server.control.InventoryTransactionControl; 028import com.echothree.model.control.sequence.server.logic.SequenceGeneratorLogic; 029import com.echothree.model.control.workflow.server.control.WorkflowControl; 030import com.echothree.model.data.inventory.server.entity.InventoryTransaction; 031import com.echothree.model.data.inventory.server.entity.InventoryTransactionReason; 032import com.echothree.model.data.inventory.server.entity.InventoryTransactionType; 033import com.echothree.model.data.inventory.server.value.InventoryTransactionDetailValue; 034import com.echothree.model.data.party.server.entity.Party; 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 javax.enterprise.context.ApplicationScoped; 041import javax.inject.Inject; 042 043@ApplicationScoped 044public class InventoryTransactionLogic 045 extends BaseLogic { 046 047 @Inject 048 InventoryTransactionControl inventoryTransactionControl; 049 050 @Inject 051 WorkflowControl workflowControl; 052 053 @Inject 054 EntityInstanceLogic entityInstanceLogic; 055 056 @Inject 057 InventoryTransactionTypeLogic inventoryTransactionTypeLogic; 058 059 @Inject 060 SequenceGeneratorLogic sequenceGeneratorLogic; 061 062 protected InventoryTransactionLogic() { 063 super(); 064 } 065 066 // -------------------------------------------------------------------------------- 067 // Inventory Transactions 068 // -------------------------------------------------------------------------------- 069 070 public InventoryTransaction createInventoryTransaction(final ExecutionErrorAccumulator eea, final String inventoryTransactionTypeName, 071 String inventoryTransactionName, final Party companyParty, final Party locationParty, 072 final InventoryTransactionReason inventoryTransactionReason, final String reference, final String description, final BasePK createdBy) { 073 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 074 InventoryTransaction inventoryTransaction = null; 075 076 if(eea == null || !eea.hasExecutionErrors()) { 077 if(inventoryTransactionName == null) { 078 var inventoryTransactionSequenceType = inventoryTransactionType.getLastDetail().getInventoryTransactionSequenceType(); 079 080 if(inventoryTransactionSequenceType != null) { 081 inventoryTransactionName = sequenceGeneratorLogic.getNextSequenceValue(eea, inventoryTransactionSequenceType); 082 } 083 } 084 085 if(eea == null || !eea.hasExecutionErrors()) { 086 inventoryTransaction = createInventoryTransaction(eea, inventoryTransactionType, inventoryTransactionName, companyParty, 087 locationParty, inventoryTransactionReason, reference, description, createdBy); 088 089 if(eea == null || !eea.hasExecutionErrors()) { 090 var inventoryTransactionWorkflowEntrance = inventoryTransactionType.getLastDetail().getInventoryTransactionWorkflowEntrance(); 091 092 if(inventoryTransactionWorkflowEntrance != null) { 093 workflowControl.addEntityToWorkflow(inventoryTransactionWorkflowEntrance, 094 getEntityInstanceByBaseEntity(inventoryTransaction), null, null, createdBy); 095 } 096 } 097 } 098 } 099 100 return inventoryTransaction; 101 } 102 103 public InventoryTransaction createInventoryTransaction(final ExecutionErrorAccumulator eea, 104 final InventoryTransactionType inventoryTransactionType, final String inventoryTransactionName, final Party companyParty, 105 final Party locationParty, final InventoryTransactionReason inventoryTransactionReason, final String reference, final String description, 106 final BasePK createdBy) { 107 var inventoryTransaction = inventoryTransactionControl.getInventoryTransactionByName(inventoryTransactionType, inventoryTransactionName); 108 109 if(inventoryTransaction == null) { 110 inventoryTransaction = inventoryTransactionControl.createInventoryTransaction(inventoryTransactionType, inventoryTransactionName, 111 companyParty, locationParty, inventoryTransactionReason, reference, description, createdBy); 112 } else { 113 handleExecutionError(DuplicateInventoryTransactionNameException.class, eea, ExecutionErrors.DuplicateInventoryTransactionName.name(), 114 inventoryTransactionType.getLastDetail().getInventoryTransactionTypeName(), inventoryTransactionName); 115 } 116 117 return inventoryTransaction; 118 } 119 120 public InventoryTransaction getInventoryTransactionByName(final ExecutionErrorAccumulator eea, 121 final InventoryTransactionType inventoryTransactionType, final String inventoryTransactionName, final EntityPermission entityPermission) { 122 var inventoryTransaction = inventoryTransactionControl.getInventoryTransactionByName(inventoryTransactionType, 123 inventoryTransactionName, entityPermission); 124 125 if(inventoryTransaction == null) { 126 handleExecutionError(UnknownInventoryTransactionNameException.class, eea, ExecutionErrors.UnknownInventoryTransactionName.name(), 127 inventoryTransactionType.getLastDetail().getInventoryTransactionTypeName(), inventoryTransactionName); 128 } 129 130 return inventoryTransaction; 131 } 132 133 public InventoryTransaction getInventoryTransactionByName(final ExecutionErrorAccumulator eea, 134 final InventoryTransactionType inventoryTransactionType, final String inventoryTransactionName) { 135 return getInventoryTransactionByName(eea, inventoryTransactionType, inventoryTransactionName, EntityPermission.READ_ONLY); 136 } 137 138 public InventoryTransaction getInventoryTransactionByNameForUpdate(final ExecutionErrorAccumulator eea, 139 final InventoryTransactionType inventoryTransactionType, final String inventoryTransactionName) { 140 return getInventoryTransactionByName(eea, inventoryTransactionType, inventoryTransactionName, EntityPermission.READ_WRITE); 141 } 142 143 public InventoryTransaction getInventoryTransactionByName(final ExecutionErrorAccumulator eea, final String inventoryTransactionTypeName, 144 final String inventoryTransactionName, final EntityPermission entityPermission) { 145 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 146 InventoryTransaction inventoryTransaction = null; 147 148 if(eea == null || !eea.hasExecutionErrors()) { 149 inventoryTransaction = getInventoryTransactionByName(eea, inventoryTransactionType, inventoryTransactionName, entityPermission); 150 } 151 152 return inventoryTransaction; 153 } 154 155 public InventoryTransaction getInventoryTransactionByName(final ExecutionErrorAccumulator eea, final String inventoryTransactionTypeName, 156 final String inventoryTransactionName) { 157 return getInventoryTransactionByName(eea, inventoryTransactionTypeName, inventoryTransactionName, EntityPermission.READ_ONLY); 158 } 159 160 public InventoryTransaction getInventoryTransactionByNameForUpdate(final ExecutionErrorAccumulator eea, final String inventoryTransactionTypeName, 161 final String inventoryTransactionName) { 162 return getInventoryTransactionByName(eea, inventoryTransactionTypeName, inventoryTransactionName, EntityPermission.READ_WRITE); 163 } 164 165 public InventoryTransaction getInventoryTransactionByUniversalSpec(final ExecutionErrorAccumulator eea, 166 final InventoryTransactionUniversalSpec universalSpec, final String inventoryTransactionTypeName, 167 final EntityPermission entityPermission) { 168 var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName); 169 InventoryTransaction inventoryTransaction = null; 170 171 if(eea == null || !eea.hasExecutionErrors()) { 172 var inventoryTransactionName = universalSpec.getInventoryTransactionName(); 173 var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 174 175 if(inventoryTransactionName != null && possibleEntitySpecs == 0) { 176 inventoryTransaction = getInventoryTransactionByName(eea, inventoryTransactionType, inventoryTransactionName, entityPermission); 177 } else if(inventoryTransactionName == null && possibleEntitySpecs == 1) { 178 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, ComponentVendors.ECHO_THREE.name(), EntityTypes.InventoryTransaction.name()); 179 180 if(eea == null || !eea.hasExecutionErrors()) { 181 inventoryTransaction = inventoryTransactionControl.getInventoryTransactionByEntityInstance(entityInstance, entityPermission); 182 } 183 } else { 184 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 185 } 186 187 if((eea == null || !eea.hasExecutionErrors()) && inventoryTransaction != null) { 188 var foundInventoryTransactionType = inventoryTransaction.getLastDetail().getInventoryTransactionType(); 189 190 if(!foundInventoryTransactionType.equals(inventoryTransactionType)) { 191 handleExecutionError(InvalidInventoryTransactionTypeException.class, eea, ExecutionErrors.InvalidInventoryTransactionType.name(), 192 foundInventoryTransactionType.getLastDetail().getInventoryTransactionTypeName()); 193 } 194 } 195 } 196 197 return inventoryTransaction; 198 } 199 200 public InventoryTransaction getInventoryTransactionByUniversalSpec(final ExecutionErrorAccumulator eea, 201 final InventoryTransactionUniversalSpec universalSpec, final String inventoryTransactionTypeName) { 202 return getInventoryTransactionByUniversalSpec(eea, universalSpec, inventoryTransactionTypeName, EntityPermission.READ_ONLY); 203 } 204 205 public InventoryTransaction getInventoryTransactionByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 206 final InventoryTransactionUniversalSpec universalSpec, final String inventoryTransactionTypeName) { 207 return getInventoryTransactionByUniversalSpec(eea, universalSpec, inventoryTransactionTypeName, EntityPermission.READ_WRITE); 208 } 209 210 public void updateInventoryTransactionFromValue(final InventoryTransactionDetailValue inventoryTransactionDetailValue, 211 final BasePK updatedBy) { 212 inventoryTransactionControl.updateInventoryTransactionFromValue(inventoryTransactionDetailValue, updatedBy); 213 } 214 215 public void deleteInventoryTransaction(final ExecutionErrorAccumulator eea, final InventoryTransaction inventoryTransaction, 216 final BasePK deletedBy) { 217 inventoryTransactionControl.deleteInventoryTransaction(inventoryTransaction, deletedBy); 218 } 219 220}