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