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}