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}