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.InventoryDispositionAdjustmentUniversalSpec;
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.DuplicateInventoryDispositionAdjustmentNameException;
025import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryDispositionAdjustmentException;
026import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryDispositionException;
027import com.echothree.model.control.inventory.common.exception.UnknownDefaultInventoryTransactionTypeException;
028import com.echothree.model.control.inventory.common.exception.UnknownInventoryDispositionAdjustmentNameException;
029import com.echothree.model.control.inventory.server.control.InventoryDispositionAdjustmentControl;
030import com.echothree.model.control.inventory.server.control.InventoryDispositionControl;
031import com.echothree.model.control.inventory.server.control.InventoryTransactionTypeControl;
032import com.echothree.model.data.inventory.server.entity.InventoryDispositionAdjustment;
033import com.echothree.model.data.inventory.server.entity.InventoryDisposition;
034import com.echothree.model.data.inventory.server.entity.InventoryAdjustmentType;
035import com.echothree.model.data.inventory.server.entity.InventoryBucketType;
036import com.echothree.model.data.inventory.server.entity.InventoryTransactionType;
037import com.echothree.model.data.inventory.server.value.InventoryDispositionAdjustmentDetailValue;
038import com.echothree.model.data.party.server.entity.Language;
039import com.echothree.util.common.message.ExecutionErrors;
040import com.echothree.util.common.persistence.BasePK;
041import com.echothree.util.server.control.BaseLogic;
042import com.echothree.util.server.message.ExecutionErrorAccumulator;
043import com.echothree.util.server.persistence.EntityPermission;
044import com.echothree.util.server.validation.ParameterUtils;
045import javax.enterprise.context.ApplicationScoped;
046import javax.inject.Inject;
047
048@ApplicationScoped
049public class InventoryDispositionAdjustmentLogic
050        extends BaseLogic {
051
052    @Inject
053    InventoryDispositionAdjustmentControl inventoryDispositionAdjustmentControl;
054
055    @Inject
056    InventoryDispositionControl inventoryDispositionControl;
057
058    @Inject
059    InventoryTransactionTypeControl inventoryTransactionTypeControl;
060
061    @Inject
062    EntityInstanceLogic entityInstanceLogic;
063
064    @Inject
065    InventoryTransactionTypeLogic inventoryTransactionTypeLogic;
066
067    @Inject
068    InventoryDispositionLogic inventoryDispositionLogic;
069
070    @Inject
071    InventoryAdjustmentTypeLogic inventoryAdjustmentTypeLogic;
072
073    @Inject
074    InventoryBucketTypeLogic inventoryBucketTypeLogic;
075
076    protected InventoryDispositionAdjustmentLogic() {
077        super();
078    }
079
080    public InventoryDispositionAdjustment createInventoryDispositionAdjustment(final ExecutionErrorAccumulator eea,
081            final String inventoryTransactionTypeName, final String inventoryDispositionAdjustmentName, final String inventoryDispositionName,
082            final String inventoryAdjustmentTypeName, final String inventoryBucketTypeName,
083            final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) {
084        var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName);
085        InventoryDispositionAdjustment inventoryDispositionAdjustment = null;
086
087        if(eea == null || !eea.hasExecutionErrors()) {
088            var inventoryDisposition = inventoryDispositionLogic.getInventoryDispositionByName(eea, inventoryTransactionType,
089                    inventoryDispositionName);
090
091            if(eea == null || !eea.hasExecutionErrors()) {
092                var inventoryAdjustmentType = inventoryAdjustmentTypeLogic.getInventoryAdjustmentTypeByName(eea, inventoryAdjustmentTypeName);
093                var inventoryBucketType = inventoryBucketTypeLogic.getInventoryBucketTypeByName(eea, inventoryBucketTypeName);
094
095                if(eea == null || !eea.hasExecutionErrors()) {
096                    inventoryDispositionAdjustment = createInventoryDispositionAdjustment(eea, inventoryDisposition,
097                            inventoryDispositionAdjustmentName, inventoryAdjustmentType, inventoryBucketType, isDefault, sortOrder,
098                            language, description, createdBy);
099                }
100            }
101        }
102
103        return inventoryDispositionAdjustment;
104    }
105
106    public InventoryDispositionAdjustment createInventoryDispositionAdjustment(final ExecutionErrorAccumulator eea,
107            final InventoryDisposition inventoryDisposition,
108            final String inventoryDispositionAdjustmentName, final InventoryAdjustmentType inventoryAdjustmentType,
109            final InventoryBucketType inventoryBucketType,
110            final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) {
111        var inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByName(inventoryDisposition,
112                inventoryDispositionAdjustmentName);
113
114        if(inventoryDispositionAdjustment == null) {
115            inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.createInventoryDispositionAdjustment(inventoryDisposition,
116                    inventoryDispositionAdjustmentName, inventoryAdjustmentType, inventoryBucketType, isDefault, sortOrder, createdBy);
117
118            if(description != null) {
119                inventoryDispositionAdjustmentControl.createInventoryDispositionAdjustmentDescription(inventoryDispositionAdjustment,
120                        language, description, createdBy);
121            }
122        } else {
123            handleExecutionError(DuplicateInventoryDispositionAdjustmentNameException.class, eea,
124                    ExecutionErrors.DuplicateInventoryDispositionAdjustmentName.name(),
125                    inventoryDisposition.getLastDetail().getInventoryDispositionName(), inventoryDispositionAdjustmentName);
126        }
127
128        return inventoryDispositionAdjustment;
129    }
130
131    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea,
132            final InventoryDisposition inventoryDisposition, final String inventoryDispositionAdjustmentName,
133            final EntityPermission entityPermission) {
134        var inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByName(inventoryDisposition,
135                inventoryDispositionAdjustmentName, entityPermission);
136
137        if(inventoryDispositionAdjustment == null) {
138            handleExecutionError(UnknownInventoryDispositionAdjustmentNameException.class, eea,
139                    ExecutionErrors.UnknownInventoryDispositionAdjustmentName.name(),
140                    inventoryDisposition.getLastDetail().getInventoryDispositionName(), inventoryDispositionAdjustmentName);
141        }
142
143        return inventoryDispositionAdjustment;
144    }
145
146    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea,
147            final InventoryDisposition inventoryDisposition, final String inventoryDispositionAdjustmentName) {
148        return getInventoryDispositionAdjustmentByName(eea, inventoryDisposition, inventoryDispositionAdjustmentName, EntityPermission.READ_ONLY);
149    }
150
151    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByNameForUpdate(final ExecutionErrorAccumulator eea,
152            final InventoryDisposition inventoryDisposition, final String inventoryDispositionAdjustmentName) {
153        return getInventoryDispositionAdjustmentByName(eea, inventoryDisposition, inventoryDispositionAdjustmentName, EntityPermission.READ_WRITE);
154    }
155
156    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea,
157            final String inventoryTransactionTypeName, final String inventoryDispositionName,
158            final String inventoryDispositionAdjustmentName,
159            final EntityPermission entityPermission) {
160        var inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName);
161        InventoryDispositionAdjustment inventoryDispositionAdjustment = null;
162
163        if(eea == null || !eea.hasExecutionErrors()) {
164            var inventoryDisposition = inventoryDispositionLogic.getInventoryDispositionByName(eea, inventoryTransactionType,
165                    inventoryDispositionName);
166            if(eea == null || !eea.hasExecutionErrors()) {
167                inventoryDispositionAdjustment = getInventoryDispositionAdjustmentByName(eea, inventoryDisposition,
168                        inventoryDispositionAdjustmentName, entityPermission);
169            }
170        }
171
172        return inventoryDispositionAdjustment;
173    }
174
175    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByName(final ExecutionErrorAccumulator eea,
176            final String inventoryTransactionTypeName, final String inventoryDispositionName,
177            final String inventoryDispositionAdjustmentName) {
178        return getInventoryDispositionAdjustmentByName(eea, inventoryTransactionTypeName, inventoryDispositionName,
179                inventoryDispositionAdjustmentName, EntityPermission.READ_ONLY);
180    }
181
182    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByNameForUpdate(final ExecutionErrorAccumulator eea,
183            final String inventoryTransactionTypeName, final String inventoryDispositionName,
184            final String inventoryDispositionAdjustmentName) {
185        return getInventoryDispositionAdjustmentByName(eea, inventoryTransactionTypeName, inventoryDispositionName,
186                inventoryDispositionAdjustmentName,
187                EntityPermission.READ_WRITE);
188    }
189
190    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByUniversalSpec(final ExecutionErrorAccumulator eea,
191            final InventoryDispositionAdjustmentUniversalSpec universalSpec,
192            final boolean allowDefault, final EntityPermission entityPermission) {
193        var inventoryTransactionTypeName = universalSpec.getInventoryTransactionTypeName();
194        var inventoryDispositionName = universalSpec.getInventoryDispositionName();
195        var inventoryDispositionAdjustmentName = universalSpec.getInventoryDispositionAdjustmentName();
196        var nameParameterCount = ParameterUtils.getInstance().countNonNullParameters(inventoryTransactionTypeName,
197                inventoryDispositionName, inventoryDispositionAdjustmentName);
198        var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec);
199        InventoryDispositionAdjustment inventoryDispositionAdjustment = null;
200
201        if(nameParameterCount < 4 && possibleEntitySpecs == 0) {
202            InventoryTransactionType inventoryTransactionType = null;
203
204            if(inventoryTransactionTypeName == null) {
205                if(allowDefault) {
206                    inventoryTransactionType = inventoryTransactionTypeControl.getDefaultInventoryTransactionType();
207
208                    if(inventoryTransactionType == null) {
209                        handleExecutionError(UnknownDefaultInventoryTransactionTypeException.class, eea,
210                                ExecutionErrors.UnknownDefaultInventoryTransactionType.name());
211                    }
212                } else {
213                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
214                }
215            } else {
216                inventoryTransactionType = inventoryTransactionTypeLogic.getInventoryTransactionTypeByName(eea, inventoryTransactionTypeName);
217            }
218
219            if(eea == null || !eea.hasExecutionErrors()) {
220                InventoryDisposition inventoryDisposition;
221                if(inventoryDispositionName == null && allowDefault) {
222                    inventoryDisposition = inventoryDispositionControl.getDefaultInventoryDisposition(inventoryTransactionType);
223                    if(inventoryDisposition == null) {
224                        handleExecutionError(UnknownDefaultInventoryDispositionException.class, eea,
225                                ExecutionErrors.UnknownDefaultInventoryDisposition.name());
226                    }
227                } else {
228                    inventoryDisposition = inventoryDispositionLogic.getInventoryDispositionByName(eea, inventoryTransactionType,
229                            inventoryDispositionName);
230                }
231
232                if(eea != null && eea.hasExecutionErrors()) {
233                    return null;
234                }
235
236                if(inventoryDispositionAdjustmentName == null) {
237                    if(allowDefault) {
238                        inventoryDispositionAdjustment = 
239                                inventoryDispositionAdjustmentControl.getDefaultInventoryDispositionAdjustment(inventoryDisposition, entityPermission);
240
241                        if(inventoryDispositionAdjustment == null) {
242                            handleExecutionError(UnknownDefaultInventoryDispositionAdjustmentException.class, eea,
243                                    ExecutionErrors.UnknownDefaultInventoryDispositionAdjustment.name());
244                        }
245                    } else {
246                        handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
247                    }
248                } else {
249                    inventoryDispositionAdjustment = getInventoryDispositionAdjustmentByName(eea, inventoryDisposition,
250                            inventoryDispositionAdjustmentName, entityPermission);
251                }
252            }
253        } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) {
254            var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec,
255                    ComponentVendors.ECHO_THREE.name(), EntityTypes.InventoryDispositionAdjustment.name());
256
257            if(eea == null || !eea.hasExecutionErrors()) {
258                inventoryDispositionAdjustment = inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByEntityInstance(entityInstance,
259                        entityPermission);
260            }
261        } else {
262            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
263        }
264
265        return inventoryDispositionAdjustment;
266    }
267
268    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByUniversalSpec(final ExecutionErrorAccumulator eea,
269            final InventoryDispositionAdjustmentUniversalSpec universalSpec, boolean allowDefault) {
270        return getInventoryDispositionAdjustmentByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY);
271    }
272
273    public InventoryDispositionAdjustment getInventoryDispositionAdjustmentByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea,
274            final InventoryDispositionAdjustmentUniversalSpec universalSpec, boolean allowDefault) {
275        return getInventoryDispositionAdjustmentByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE);
276    }
277
278    public void updateInventoryDispositionAdjustmentFromValue(final ExecutionErrorAccumulator eea,
279            InventoryDispositionAdjustmentDetailValue inventoryDispositionAdjustmentDetailValue,
280            BasePK updatedBy) {
281        inventoryDispositionAdjustmentControl.updateInventoryDispositionAdjustmentFromValue(inventoryDispositionAdjustmentDetailValue, updatedBy);
282    }
283
284    public void deleteInventoryDispositionAdjustment(final ExecutionErrorAccumulator eea,
285            final InventoryDispositionAdjustment inventoryDispositionAdjustment, final BasePK deletedBy) {
286        inventoryDispositionAdjustmentControl.deleteInventoryDispositionAdjustment(inventoryDispositionAdjustment, deletedBy);
287    }
288
289}