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