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.control.user.inventory.server.command;
018
019import com.echothree.control.user.inventory.common.edit.InventoryDispositionAdjustmentEdit;
020import com.echothree.control.user.inventory.common.edit.InventoryEditFactory;
021import com.echothree.control.user.inventory.common.result.EditInventoryDispositionAdjustmentResult;
022import com.echothree.control.user.inventory.common.result.InventoryResultFactory;
023import com.echothree.control.user.inventory.common.spec.InventoryDispositionAdjustmentUniversalSpec;
024import com.echothree.model.control.inventory.server.control.InventoryDispositionAdjustmentControl;
025import com.echothree.model.control.inventory.server.control.InventoryTransactionTypeControl;
026import com.echothree.model.control.inventory.server.logic.InventoryDispositionAdjustmentLogic;
027import com.echothree.model.control.inventory.server.logic.InventoryDispositionLogic;
028import com.echothree.model.control.inventory.server.logic.InventoryAdjustmentTypeLogic;
029import com.echothree.model.control.inventory.server.logic.InventoryBucketTypeLogic;
030import com.echothree.model.control.party.common.PartyTypes;
031import com.echothree.model.control.security.common.SecurityRoleGroups;
032import com.echothree.model.control.security.common.SecurityRoles;
033import com.echothree.model.data.inventory.server.entity.InventoryDispositionAdjustment;
034import com.echothree.model.data.inventory.server.entity.InventoryDisposition;
035import com.echothree.model.data.inventory.server.entity.InventoryAdjustmentType;
036import com.echothree.model.data.inventory.server.entity.InventoryBucketType;
037import com.echothree.util.common.message.ExecutionErrors;
038import com.echothree.util.common.validation.FieldDefinition;
039import com.echothree.util.common.validation.FieldType;
040import com.echothree.util.server.control.BaseAbstractEditCommand;
041import com.echothree.util.server.control.CommandSecurityDefinition;
042import com.echothree.util.server.control.PartyTypeDefinition;
043import com.echothree.util.server.control.SecurityRoleDefinition;
044import java.util.List;
045import javax.enterprise.context.Dependent;
046import javax.inject.Inject;
047
048@Dependent
049public class EditInventoryDispositionAdjustmentCommand
050        extends BaseAbstractEditCommand<InventoryDispositionAdjustmentUniversalSpec, InventoryDispositionAdjustmentEdit,
051                EditInventoryDispositionAdjustmentResult, InventoryDispositionAdjustment, InventoryDispositionAdjustment> {
052    
053    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
054    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
055    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
056    
057    static {
058        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of(
059                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
060                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of(
061                        new SecurityRoleDefinition(SecurityRoleGroups.InventoryDispositionAdjustment.name(), SecurityRoles.Edit.name())
062                ))
063        ));
064        
065        SPEC_FIELD_DEFINITIONS = List.of(
066                new FieldDefinition("InventoryTransactionTypeName", FieldType.ENTITY_NAME, false, null, null),
067                new FieldDefinition("InventoryDispositionName", FieldType.ENTITY_NAME, false, null, null),
068                new FieldDefinition("InventoryDispositionAdjustmentName", FieldType.ENTITY_NAME, false, null, null),
069                new FieldDefinition("EntityRef", FieldType.ENTITY_REF, false, null, null),
070                new FieldDefinition("Uuid", FieldType.UUID, false, null, null)
071        );
072        
073        EDIT_FIELD_DEFINITIONS = List.of(
074                new FieldDefinition("InventoryDispositionAdjustmentName", FieldType.ENTITY_NAME, true, null, null),
075                new FieldDefinition("InventoryAdjustmentTypeName", FieldType.ENTITY_NAME, true, null, null),
076                new FieldDefinition("InventoryBucketTypeName", FieldType.ENTITY_NAME, true, null, null),
077                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
078                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
079                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L)
080        );
081    }
082
083    @Inject
084    InventoryDispositionAdjustmentControl inventoryDispositionAdjustmentControl;
085
086    @Inject
087    InventoryTransactionTypeControl inventoryTransactionTypeControl;
088
089    @Inject
090    InventoryDispositionAdjustmentLogic inventoryDispositionAdjustmentLogic;
091
092    @Inject
093    InventoryDispositionLogic inventoryDispositionLogic;
094
095    @Inject InventoryAdjustmentTypeLogic inventoryAdjustmentTypeLogic;
096    @Inject InventoryBucketTypeLogic inventoryBucketTypeLogic;
097
098    
099    /** Creates a new instance of EditInventoryDispositionAdjustmentCommand */
100    public EditInventoryDispositionAdjustmentCommand() {
101        super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
102    }
103
104    @Override
105    public EditInventoryDispositionAdjustmentResult getResult() {
106        return InventoryResultFactory.getEditInventoryDispositionAdjustmentResult();
107    }
108
109    @Override
110    public InventoryDispositionAdjustmentEdit getEdit() {
111        return InventoryEditFactory.getInventoryDispositionAdjustmentEdit();
112    }
113
114    @Override
115    public InventoryDispositionAdjustment getEntity(EditInventoryDispositionAdjustmentResult result) {
116        return inventoryDispositionAdjustmentLogic.getInventoryDispositionAdjustmentByUniversalSpec(this, spec, false,
117                editModeToEntityPermission(editMode));
118    }
119
120    @Override
121    public InventoryDispositionAdjustment getLockEntity(InventoryDispositionAdjustment inventoryDispositionAdjustment) {
122        return inventoryDispositionAdjustment;
123    }
124
125    @Override
126    public void fillInResult(EditInventoryDispositionAdjustmentResult result, InventoryDispositionAdjustment inventoryDispositionAdjustment) {
127        result.setInventoryDispositionAdjustment(inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentTransfer(getUserVisit(),
128                inventoryDispositionAdjustment));
129    }
130
131    @Override
132    public void doLock(InventoryDispositionAdjustmentEdit edit, InventoryDispositionAdjustment inventoryDispositionAdjustment) {
133        var inventoryDispositionAdjustmentDescription = 
134                inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentDescription(inventoryDispositionAdjustment, getPreferredLanguage());
135        var inventoryDispositionAdjustmentDetail = inventoryDispositionAdjustment.getLastDetail();
136
137        edit.setInventoryDispositionAdjustmentName(inventoryDispositionAdjustmentDetail.getInventoryDispositionAdjustmentName());
138        edit.setInventoryAdjustmentTypeName(
139                inventoryDispositionAdjustmentDetail.getInventoryAdjustmentType().getLastDetail().getInventoryAdjustmentTypeName());
140        edit.setInventoryBucketTypeName(
141                inventoryDispositionAdjustmentDetail.getInventoryBucketType().getLastDetail().getInventoryBucketTypeName());
142        edit.setIsDefault(inventoryDispositionAdjustmentDetail.getIsDefault().toString());
143        edit.setSortOrder(inventoryDispositionAdjustmentDetail.getSortOrder().toString());
144
145        if(inventoryDispositionAdjustmentDescription != null) {
146            edit.setDescription(inventoryDispositionAdjustmentDescription.getDescription());
147        }
148    }
149
150    InventoryAdjustmentType inventoryAdjustmentType;
151    InventoryBucketType inventoryBucketType;
152
153    @Override
154    public void canUpdate(InventoryDispositionAdjustment inventoryDispositionAdjustment) {
155        var inventoryDisposition = inventoryDispositionAdjustment.getLastDetail().getInventoryDisposition();
156        var inventoryDispositionAdjustmentName = edit.getInventoryDispositionAdjustmentName();
157        var duplicateInventoryDispositionAdjustment =
158                inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentByName(inventoryDisposition,
159                        inventoryDispositionAdjustmentName);
160
161        if(duplicateInventoryDispositionAdjustment != null && !inventoryDispositionAdjustment.equals(duplicateInventoryDispositionAdjustment)) {
162            addExecutionError(ExecutionErrors.DuplicateInventoryDispositionAdjustmentName.name(),
163                    inventoryDisposition.getLastDetail().getInventoryDispositionName(),
164                    inventoryDispositionAdjustmentName);
165        }
166
167        inventoryAdjustmentType = inventoryAdjustmentTypeLogic.getInventoryAdjustmentTypeByName(this,
168                edit.getInventoryAdjustmentTypeName());
169        inventoryBucketType = inventoryBucketTypeLogic.getInventoryBucketTypeByName(this, edit.getInventoryBucketTypeName());
170    }
171
172    @Override
173    public void doUpdate(InventoryDispositionAdjustment inventoryDispositionAdjustment) {
174        var partyPK = getPartyPK();
175        var inventoryDispositionAdjustmentDetailValue = 
176                inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentDetailValueForUpdate(inventoryDispositionAdjustment);
177        var inventoryDispositionAdjustmentDescription = 
178                inventoryDispositionAdjustmentControl.getInventoryDispositionAdjustmentDescriptionForUpdate(
179                        inventoryDispositionAdjustment, getPreferredLanguage());
180        var description = edit.getDescription();
181
182        inventoryDispositionAdjustmentDetailValue.setInventoryDispositionAdjustmentName(edit.getInventoryDispositionAdjustmentName());
183        inventoryDispositionAdjustmentDetailValue.setInventoryAdjustmentTypePK(inventoryAdjustmentType.getPrimaryKey());
184        inventoryDispositionAdjustmentDetailValue.setInventoryBucketTypePK(inventoryBucketType.getPrimaryKey());
185        inventoryDispositionAdjustmentDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
186        inventoryDispositionAdjustmentDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
187
188        inventoryDispositionAdjustmentControl.updateInventoryDispositionAdjustmentFromValue(inventoryDispositionAdjustmentDetailValue, partyPK);
189
190        if(inventoryDispositionAdjustmentDescription == null && description != null) {
191            inventoryDispositionAdjustmentControl.createInventoryDispositionAdjustmentDescription(inventoryDispositionAdjustment, getPreferredLanguage(),
192                    description, partyPK);
193        } else {
194            if(inventoryDispositionAdjustmentDescription != null && description == null) {
195                inventoryDispositionAdjustmentControl.deleteInventoryDispositionAdjustmentDescription(inventoryDispositionAdjustmentDescription, partyPK);
196            } else {
197                if(inventoryDispositionAdjustmentDescription != null && description != null) {
198                    var inventoryDispositionAdjustmentDescriptionValue = inventoryDispositionAdjustmentControl
199                            .getInventoryDispositionAdjustmentDescriptionValue(inventoryDispositionAdjustmentDescription);
200
201                    inventoryDispositionAdjustmentDescriptionValue.setDescription(description);
202                    inventoryDispositionAdjustmentControl.updateInventoryDispositionAdjustmentDescriptionFromValue(
203                            inventoryDispositionAdjustmentDescriptionValue, partyPK);
204                }
205            }
206        }
207    }
208
209}