001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 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.order.server.command;
018
019import com.echothree.control.user.order.common.edit.OrderAliasEdit;
020import com.echothree.control.user.order.common.edit.OrderEditFactory;
021import com.echothree.control.user.order.common.result.EditOrderAliasResult;
022import com.echothree.control.user.order.common.result.OrderResultFactory;
023import com.echothree.control.user.order.common.spec.OrderAliasSpec;
024import com.echothree.control.user.order.server.command.util.OrderAliasUtil;
025import com.echothree.model.control.order.server.control.OrderAliasControl;
026import com.echothree.model.control.order.server.control.OrderControl;
027import com.echothree.model.control.order.server.control.OrderTypeControl;
028import com.echothree.model.control.party.common.PartyTypes;
029import com.echothree.model.control.security.common.SecurityRoles;
030import com.echothree.model.data.order.server.entity.OrderAlias;
031import com.echothree.model.data.order.server.entity.OrderAliasType;
032import com.echothree.util.common.command.EditMode;
033import com.echothree.util.common.message.ExecutionErrors;
034import com.echothree.util.common.validation.FieldDefinition;
035import com.echothree.util.common.validation.FieldType;
036import com.echothree.util.server.control.BaseAbstractEditCommand;
037import com.echothree.util.server.control.CommandSecurityDefinition;
038import com.echothree.util.server.control.PartyTypeDefinition;
039import com.echothree.util.server.control.SecurityRoleDefinition;
040import com.echothree.util.server.persistence.Session;
041import java.util.Arrays;
042import java.util.Collections;
043import java.util.List;
044import javax.enterprise.context.RequestScoped;
045
046@RequestScoped
047public class EditOrderAliasCommand
048        extends BaseAbstractEditCommand<OrderAliasSpec, OrderAliasEdit, EditOrderAliasResult, OrderAlias, OrderAlias> {
049    
050    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
051    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
052    
053    static {
054        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
055                new FieldDefinition("OrderTypeName", FieldType.ENTITY_NAME, true, null, null),
056                new FieldDefinition("OrderName", FieldType.ENTITY_NAME, true, null, null),
057                new FieldDefinition("OrderAliasTypeName", FieldType.ENTITY_NAME, true, null, null)
058                ));
059        
060        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
061                new FieldDefinition("Alias", FieldType.ENTITY_NAME, true, null, null)
062                ));
063    }
064    
065    /** Creates a new instance of EditOrderAliasCommand */
066    public EditOrderAliasCommand() {
067        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
068    }
069
070    @Override
071    protected CommandSecurityDefinition getCommandSecurityDefinition() {
072        return new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
073                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
074                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
075                        new SecurityRoleDefinition(OrderAliasUtil.getInstance().getSecurityRoleGroupNameByOrderTypeSpec(spec), SecurityRoles.Edit.name())
076                )))
077        )));
078    }
079
080    @Override
081    public EditOrderAliasResult getResult() {
082        return OrderResultFactory.getEditOrderAliasResult();
083    }
084
085    @Override
086    public OrderAliasEdit getEdit() {
087        return OrderEditFactory.getOrderAliasEdit();
088    }
089
090    OrderAliasType orderAliasType;
091    
092    @Override
093    public OrderAlias getEntity(EditOrderAliasResult result) {
094        var orderTypeControl = Session.getModelController(OrderTypeControl.class);
095        OrderAlias orderAlias = null;
096        var orderTypeName = spec.getOrderTypeName();
097        var orderType = orderTypeControl.getOrderTypeByName(orderTypeName);
098
099        if(orderType != null) {
100            var orderControl = Session.getModelController(OrderControl.class);
101            var orderName = spec.getOrderName();
102            var order = orderControl.getOrderByName(orderType, orderName);
103
104            if(order != null) {
105                var orderAliasControl = Session.getModelController(OrderAliasControl.class);
106                var orderAliasTypeName = spec.getOrderAliasTypeName();
107
108                orderAliasType = orderAliasControl.getOrderAliasTypeByName(orderType, orderAliasTypeName);
109
110                if(orderAliasType != null) {
111                    if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
112                        orderAlias = orderAliasControl.getOrderAlias(order, orderAliasType);
113                    } else { // EditMode.UPDATE
114                        orderAlias = orderAliasControl.getOrderAliasForUpdate(order, orderAliasType);
115                    }
116
117                    if(orderAlias != null) {
118                        result.setOrderAlias(orderAliasControl.getOrderAliasTransfer(getUserVisit(), orderAlias));
119                    } else {
120                        addExecutionError(ExecutionErrors.UnknownOrderAlias.name(), orderTypeName, orderName, orderAliasTypeName);
121                    }
122                } else {
123                    addExecutionError(ExecutionErrors.UnknownOrderAliasTypeName.name(), orderTypeName, orderAliasTypeName);
124                }
125            } else {
126                addExecutionError(ExecutionErrors.UnknownOrderName.name(), orderTypeName, orderName);
127            }
128        } else {
129            addExecutionError(ExecutionErrors.UnknownOrderTypeName.name(), orderTypeName);
130        }
131
132        return orderAlias;
133    }
134
135    @Override
136    public OrderAlias getLockEntity(OrderAlias orderAlias) {
137        return orderAlias;
138    }
139
140    @Override
141    public void fillInResult(EditOrderAliasResult result, OrderAlias orderAlias) {
142        var orderAliasControl = Session.getModelController(OrderAliasControl.class);
143
144        result.setOrderAlias(orderAliasControl.getOrderAliasTransfer(getUserVisit(), orderAlias));
145    }
146
147    @Override
148    public void doLock(OrderAliasEdit edit, OrderAlias orderAlias) {
149        edit.setAlias(orderAlias.getAlias());
150    }
151
152    @Override
153    public void canUpdate(OrderAlias orderAlias) {
154        var orderAliasControl = Session.getModelController(OrderAliasControl.class);
155        var alias = edit.getAlias();
156        var duplicateOrderAlias = orderAliasControl.getOrderAliasByAlias(orderAliasType, alias);
157
158        if(duplicateOrderAlias != null && !orderAlias.equals(duplicateOrderAlias)) {
159            var orderAliasTypeDetail = orderAlias.getOrderAliasType().getLastDetail();
160
161            addExecutionError(ExecutionErrors.DuplicateOrderAlias.name(), orderAliasTypeDetail.getOrderType().getLastDetail().getOrderTypeName(),
162                    orderAliasTypeDetail.getOrderAliasTypeName(), alias);
163        }
164    }
165
166    @Override
167    public void doUpdate(OrderAlias orderAlias) {
168        var orderAliasControl = Session.getModelController(OrderAliasControl.class);
169        var orderAliasValue = orderAliasControl.getOrderAliasValue(orderAlias);
170
171        orderAliasValue.setAlias(edit.getAlias());
172
173        orderAliasControl.updateOrderAliasFromValue(orderAliasValue, getPartyPK());
174    }
175
176}