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}