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.vendor.server.command;
018
019import com.echothree.control.user.vendor.common.form.CreateVendorItemForm;
020import com.echothree.control.user.vendor.common.result.VendorResultFactory;
021import com.echothree.model.control.cancellationpolicy.common.CancellationKinds;
022import com.echothree.model.control.cancellationpolicy.server.control.CancellationPolicyControl;
023import com.echothree.model.control.core.server.control.EntityInstanceControl;
024import com.echothree.model.control.item.server.control.ItemControl;
025import com.echothree.model.control.party.common.PartyTypes;
026import com.echothree.model.control.returnpolicy.common.ReturnKinds;
027import com.echothree.model.control.returnpolicy.server.control.ReturnPolicyControl;
028import com.echothree.model.control.security.common.SecurityRoleGroups;
029import com.echothree.model.control.security.common.SecurityRoles;
030import com.echothree.model.control.vendor.common.workflow.VendorItemStatusConstants;
031import com.echothree.model.control.vendor.server.control.VendorControl;
032import com.echothree.model.control.workflow.server.control.WorkflowControl;
033import com.echothree.model.data.cancellationpolicy.server.entity.CancellationPolicy;
034import com.echothree.model.data.returnpolicy.server.entity.ReturnPolicy;
035import com.echothree.model.data.user.common.pk.UserVisitPK;
036import com.echothree.model.data.vendor.server.entity.VendorItem;
037import com.echothree.util.common.command.BaseResult;
038import com.echothree.util.common.message.ExecutionErrors;
039import com.echothree.util.common.persistence.BasePK;
040import com.echothree.util.common.validation.FieldDefinition;
041import com.echothree.util.common.validation.FieldType;
042import com.echothree.util.server.control.BaseSimpleCommand;
043import com.echothree.util.server.control.CommandSecurityDefinition;
044import com.echothree.util.server.control.PartyTypeDefinition;
045import com.echothree.util.server.control.SecurityRoleDefinition;
046import java.util.List;
047import javax.enterprise.context.Dependent;
048import javax.inject.Inject;
049
050@Dependent
051public class CreateVendorItemCommand
052        extends BaseSimpleCommand<CreateVendorItemForm> {
053    
054    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
055    private final static List<FieldDefinition> FORM_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.VendorItem.name(), SecurityRoles.Create.name())
062                ))
063        ));
064        
065        FORM_FIELD_DEFINITIONS = List.of(
066                new FieldDefinition("ItemName", FieldType.ENTITY_NAME, true, null, null),
067                new FieldDefinition("VendorName", FieldType.ENTITY_NAME, true, null, null),
068                new FieldDefinition("VendorItemName", FieldType.ENTITY_NAME, false, null, null),
069                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L),
070                new FieldDefinition("Priority", FieldType.SIGNED_INTEGER, true, null, null),
071                new FieldDefinition("CancellationPolicyName", FieldType.ENTITY_NAME, false, null, null),
072                new FieldDefinition("ReturnPolicyName", FieldType.ENTITY_NAME, false, null, null)
073        );
074    }
075
076    @Inject
077    CancellationPolicyControl cancellationPolicyControl;
078
079    @Inject
080    EntityInstanceControl entityInstanceControl;
081
082    @Inject
083    ItemControl itemControl;
084
085    @Inject
086    ReturnPolicyControl returnPolicyControl;
087
088    @Inject
089    VendorControl vendorControl;
090
091    @Inject
092    WorkflowControl workflowControl;
093
094    
095    /** Creates a new instance of CreateVendorItemCommand */
096    public CreateVendorItemCommand() {
097        super(COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, false);
098    }
099    
100    @Override
101    protected BaseResult execute() {
102        var result = VendorResultFactory.getCreateVendorItemResult();
103        VendorItem vendorItem = null;
104        var vendorName = form.getVendorName();
105        var vendor = vendorControl.getVendorByName(vendorName);
106        
107        if(vendor != null) {
108            var itemName = form.getItemName();
109            var item = itemControl.getItemByNameThenAlias(itemName);
110            
111            if(item != null) {
112                var vendorItemName = form.getVendorItemName();
113                
114                if(vendorItemName == null) {
115                    var defaultItemAliasType = vendor.getDefaultItemAliasType();
116                    
117                    if(defaultItemAliasType == null) {
118                        addExecutionError(ExecutionErrors.UnknownDefaultItemAliasType.name());
119                    } else {
120                        var itemUnitOfMeasureType = itemControl.getDefaultItemUnitOfMeasureType(item);
121                        
122                        if(itemUnitOfMeasureType == null) {
123                            addExecutionError(ExecutionErrors.UnknownDefaultItemUnitOfMeasureType.name());
124                        } else {
125                            var unitOfMeasureType = itemUnitOfMeasureType.getUnitOfMeasureType();
126                            var itemAliases = itemControl.getItemAliases(item, unitOfMeasureType, defaultItemAliasType);
127                            var iter = itemAliases.iterator();
128                            
129                            if(iter.hasNext()) {
130                                vendorItemName = iter.next().getAlias();
131                            } else {
132                                addExecutionError(ExecutionErrors.NoItemAliasesFound.name(), itemName,
133                                        unitOfMeasureType.getLastDetail().getUnitOfMeasureTypeName(),
134                                        defaultItemAliasType.getLastDetail().getItemAliasTypeName());
135                            }
136                        }
137                    }
138                }
139                
140                if(!hasExecutionErrors()) {
141                    var vendorParty = vendor.getParty();
142                    
143                    vendorItem = vendorControl.getVendorItemByVendorPartyAndVendorItemName(vendorParty, vendorItemName);
144                    
145                    if(vendorItem == null) {
146                        var cancellationPolicyName = form.getCancellationPolicyName();
147                        CancellationPolicy cancellationPolicy = null;
148                        
149                        if(cancellationPolicyName != null) {
150                            var cancellationKind = cancellationPolicyControl.getCancellationKindByName(CancellationKinds.VENDOR_CANCELLATION.name());
151                            
152                            cancellationPolicy = cancellationPolicyControl.getCancellationPolicyByName(cancellationKind, cancellationPolicyName);
153                        }
154                        
155                        if(cancellationPolicyName == null || cancellationPolicy != null) {
156                            var returnPolicyName = form.getReturnPolicyName();
157                            ReturnPolicy returnPolicy = null;
158                            
159                            if(returnPolicyName != null) {
160                                var returnKind = returnPolicyControl.getReturnKindByName(ReturnKinds.VENDOR_RETURN.name());
161                                
162                                returnPolicy = returnPolicyControl.getReturnPolicyByName(returnKind, returnPolicyName);
163                            }
164                            
165                            if(returnPolicyName == null || returnPolicy != null) {
166                                var description = form.getDescription();
167                                var priority = Integer.valueOf(form.getPriority());
168                                BasePK createdBy = getPartyPK();
169                                
170                                vendorItem = vendorControl.createVendorItem(item, vendorParty, vendorItemName, description, priority, cancellationPolicy,
171                                        returnPolicy, createdBy);
172
173                                var entityInstance = entityInstanceControl.getEntityInstanceByBasePK(vendorItem.getPrimaryKey());
174                                workflowControl.addEntityToWorkflowUsingNames(null, VendorItemStatusConstants.Workflow_VENDOR_ITEM_STATUS,
175                                        VendorItemStatusConstants.WorkflowEntrance_NEW_ACTIVE, entityInstance, null, null, createdBy);
176                            } else {
177                                addExecutionError(ExecutionErrors.UnknownReturnPolicyName.name(), returnPolicyName);
178                            }
179                        } else {
180                            addExecutionError(ExecutionErrors.UnknownCancellationPolicyName.name(), cancellationPolicyName);
181                        }
182                    } else {
183                        addExecutionError(ExecutionErrors.DuplicateVendorItemName.name(), vendorName, vendorItemName);
184                    }
185                }
186            } else {
187                addExecutionError(ExecutionErrors.UnknownItemName.name(), itemName);
188            }
189        } else {
190            addExecutionError(ExecutionErrors.UnknownVendorName.name(), vendorName);
191        }
192
193        if(vendorItem != null) {
194            result.setEntityRef(vendorItem.getPrimaryKey().getEntityRef());
195            result.setVendorItemName(vendorItem.getLastDetail().getVendorItemName());
196        }
197
198        return result;
199    }
200    
201}