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}