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.InventoryDispositionEdit;
020import com.echothree.control.user.inventory.common.edit.InventoryEditFactory;
021import com.echothree.control.user.inventory.common.result.EditInventoryDispositionResult;
022import com.echothree.control.user.inventory.common.result.InventoryResultFactory;
023import com.echothree.control.user.inventory.common.spec.InventoryDispositionUniversalSpec;
024import com.echothree.model.control.inventory.server.control.InventoryDispositionControl;
025import com.echothree.model.control.inventory.server.control.InventoryTransactionTypeControl;
026import com.echothree.model.control.inventory.server.logic.InventoryDispositionLogic;
027import com.echothree.model.control.party.common.PartyTypes;
028import com.echothree.model.control.security.common.SecurityRoleGroups;
029import com.echothree.model.control.security.common.SecurityRoles;
030import com.echothree.model.data.inventory.server.entity.InventoryDisposition;
031import com.echothree.util.common.message.ExecutionErrors;
032import com.echothree.util.common.validation.FieldDefinition;
033import com.echothree.util.common.validation.FieldType;
034import com.echothree.util.server.control.BaseAbstractEditCommand;
035import com.echothree.util.server.control.CommandSecurityDefinition;
036import com.echothree.util.server.control.PartyTypeDefinition;
037import com.echothree.util.server.control.SecurityRoleDefinition;
038import java.util.List;
039import javax.enterprise.context.Dependent;
040import javax.inject.Inject;
041
042@Dependent
043public class EditInventoryDispositionCommand
044        extends BaseAbstractEditCommand<InventoryDispositionUniversalSpec, InventoryDispositionEdit,
045                EditInventoryDispositionResult, InventoryDisposition, InventoryDisposition> {
046    
047    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
048    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
049    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
050    
051    static {
052        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of(
053                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
054                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of(
055                        new SecurityRoleDefinition(SecurityRoleGroups.InventoryDisposition.name(), SecurityRoles.Edit.name())
056                ))
057        ));
058        
059        SPEC_FIELD_DEFINITIONS = List.of(
060                new FieldDefinition("InventoryTransactionTypeName", FieldType.ENTITY_NAME, false, null, null),
061                new FieldDefinition("InventoryDispositionName", FieldType.ENTITY_NAME, false, null, null),
062                new FieldDefinition("EntityRef", FieldType.ENTITY_REF, false, null, null),
063                new FieldDefinition("Uuid", FieldType.UUID, false, null, null)
064        );
065        
066        EDIT_FIELD_DEFINITIONS = List.of(
067                new FieldDefinition("InventoryDispositionName", FieldType.ENTITY_NAME, true, null, null),
068                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
069                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
070                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L)
071        );
072    }
073
074    @Inject
075    InventoryDispositionControl inventoryDispositionControl;
076
077    @Inject
078    InventoryTransactionTypeControl inventoryTransactionTypeControl;
079
080    @Inject
081    InventoryDispositionLogic inventoryDispositionLogic;
082
083    
084    /** Creates a new instance of EditInventoryDispositionCommand */
085    public EditInventoryDispositionCommand() {
086        super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
087    }
088
089    @Override
090    public EditInventoryDispositionResult getResult() {
091        return InventoryResultFactory.getEditInventoryDispositionResult();
092    }
093
094    @Override
095    public InventoryDispositionEdit getEdit() {
096        return InventoryEditFactory.getInventoryDispositionEdit();
097    }
098
099    @Override
100    public InventoryDisposition getEntity(EditInventoryDispositionResult result) {
101        return inventoryDispositionLogic.getInventoryDispositionByUniversalSpec(this, spec, false,
102                editModeToEntityPermission(editMode));
103    }
104
105    @Override
106    public InventoryDisposition getLockEntity(InventoryDisposition inventoryDisposition) {
107        return inventoryDisposition;
108    }
109
110    @Override
111    public void fillInResult(EditInventoryDispositionResult result, InventoryDisposition inventoryDisposition) {
112        result.setInventoryDisposition(inventoryDispositionControl.getInventoryDispositionTransfer(getUserVisit(),
113                inventoryDisposition));
114    }
115
116    @Override
117    public void doLock(InventoryDispositionEdit edit, InventoryDisposition inventoryDisposition) {
118        var inventoryDispositionDescription = 
119                inventoryDispositionControl.getInventoryDispositionDescription(inventoryDisposition, getPreferredLanguage());
120        var inventoryDispositionDetail = inventoryDisposition.getLastDetail();
121
122        edit.setInventoryDispositionName(inventoryDispositionDetail.getInventoryDispositionName());
123        edit.setIsDefault(inventoryDispositionDetail.getIsDefault().toString());
124        edit.setSortOrder(inventoryDispositionDetail.getSortOrder().toString());
125
126        if(inventoryDispositionDescription != null) {
127            edit.setDescription(inventoryDispositionDescription.getDescription());
128        }
129    }
130
131    @Override
132    public void canUpdate(InventoryDisposition inventoryDisposition) {
133        var inventoryTransactionType = inventoryDisposition.getLastDetail().getInventoryTransactionType();
134        var inventoryDispositionName = edit.getInventoryDispositionName();
135        var duplicateInventoryDisposition =
136                inventoryDispositionControl.getInventoryDispositionByName(inventoryTransactionType, inventoryDispositionName);
137
138        if(duplicateInventoryDisposition != null && !inventoryDisposition.equals(duplicateInventoryDisposition)) {
139            addExecutionError(ExecutionErrors.DuplicateInventoryDispositionName.name(),
140                    inventoryTransactionType.getLastDetail().getInventoryTransactionTypeName(),
141                    inventoryDispositionName);
142        }
143    }
144
145    @Override
146    public void doUpdate(InventoryDisposition inventoryDisposition) {
147        var partyPK = getPartyPK();
148        var inventoryDispositionDetailValue = 
149                inventoryDispositionControl.getInventoryDispositionDetailValueForUpdate(inventoryDisposition);
150        var inventoryDispositionDescription = 
151                inventoryDispositionControl.getInventoryDispositionDescriptionForUpdate(
152                        inventoryDisposition, getPreferredLanguage());
153        var description = edit.getDescription();
154
155        inventoryDispositionDetailValue.setInventoryDispositionName(edit.getInventoryDispositionName());
156        inventoryDispositionDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
157        inventoryDispositionDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
158
159        inventoryDispositionControl.updateInventoryDispositionFromValue(inventoryDispositionDetailValue, partyPK);
160
161        if(inventoryDispositionDescription == null && description != null) {
162            inventoryDispositionControl.createInventoryDispositionDescription(inventoryDisposition, getPreferredLanguage(),
163                    description, partyPK);
164        } else {
165            if(inventoryDispositionDescription != null && description == null) {
166                inventoryDispositionControl.deleteInventoryDispositionDescription(inventoryDispositionDescription, partyPK);
167            } else {
168                if(inventoryDispositionDescription != null && description != null) {
169                    var inventoryDispositionDescriptionValue = 
170                            inventoryDispositionControl.getInventoryDispositionDescriptionValue(inventoryDispositionDescription);
171
172                    inventoryDispositionDescriptionValue.setDescription(description);
173                    inventoryDispositionControl.updateInventoryDispositionDescriptionFromValue(
174                            inventoryDispositionDescriptionValue, partyPK);
175                }
176            }
177        }
178    }
179
180}