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.item.server.command; 018 019import com.echothree.control.user.item.common.edit.ItemAliasEdit; 020import com.echothree.control.user.item.common.edit.ItemEditFactory; 021import com.echothree.control.user.item.common.result.EditItemAliasResult; 022import com.echothree.control.user.item.common.result.ItemResultFactory; 023import com.echothree.control.user.item.common.spec.ItemAliasSpec; 024import com.echothree.model.control.item.server.control.ItemControl; 025import com.echothree.model.control.item.server.logic.ItemAliasChecksumTypeLogic; 026import com.echothree.model.control.party.common.PartyTypes; 027import com.echothree.model.control.security.common.SecurityRoleGroups; 028import com.echothree.model.control.security.common.SecurityRoles; 029import com.echothree.model.control.uom.server.control.UomControl; 030import com.echothree.model.control.vendor.server.control.VendorControl; 031import com.echothree.model.data.item.server.entity.Item; 032import com.echothree.model.data.item.server.entity.ItemAlias; 033import com.echothree.model.data.item.server.entity.ItemAliasType; 034import com.echothree.model.data.uom.server.entity.UnitOfMeasureType; 035import com.echothree.util.common.message.ExecutionErrors; 036import com.echothree.util.common.validation.FieldDefinition; 037import com.echothree.util.common.validation.FieldType; 038import com.echothree.util.common.persistence.BasePK; 039import com.echothree.util.server.control.BaseAbstractEditCommand; 040import com.echothree.util.server.control.CommandSecurityDefinition; 041import com.echothree.util.server.control.PartyTypeDefinition; 042import com.echothree.util.server.control.SecurityRoleDefinition; 043import com.echothree.util.server.persistence.Session; 044import java.util.List; 045import java.util.regex.Pattern; 046import javax.enterprise.context.Dependent; 047 048@Dependent 049public class EditItemAliasCommand 050 extends BaseAbstractEditCommand<ItemAliasSpec, ItemAliasEdit, EditItemAliasResult, ItemAlias, Item> { 051 052 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 053 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 054 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 055 056 static { 057 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of( 058 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 059 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of( 060 new SecurityRoleDefinition(SecurityRoleGroups.ItemAlias.name(), SecurityRoles.Edit.name()) 061 )) 062 )); 063 064 SPEC_FIELD_DEFINITIONS = List.of( 065 new FieldDefinition("Alias", FieldType.ENTITY_NAME, true, null, null) 066 ); 067 068 EDIT_FIELD_DEFINITIONS = List.of( 069 new FieldDefinition("UnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null), 070 new FieldDefinition("ItemAliasTypeName", FieldType.ENTITY_NAME, true, null, null), 071 new FieldDefinition("Alias", FieldType.ENTITY_NAME, true, null, null) 072 ); 073 } 074 075 /** Creates a new instance of EditItemAliasCommand */ 076 public EditItemAliasCommand() { 077 super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 078 } 079 080 @Override 081 public EditItemAliasResult getResult() { 082 return ItemResultFactory.getEditItemAliasResult(); 083 } 084 085 @Override 086 public ItemAliasEdit getEdit() { 087 return ItemEditFactory.getItemAliasEdit(); 088 } 089 090 @Override 091 public ItemAlias getEntity(EditItemAliasResult result) { 092 var itemControl = Session.getModelController(ItemControl.class); 093 var alias = spec.getAlias(); 094 var itemAlias = itemControl.getItemAliasByAliasForUpdate(alias); 095 096 if(itemAlias == null) { 097 addExecutionError(ExecutionErrors.UnknownItemAlias.name(), alias); 098 } 099 100 return itemAlias; 101 } 102 103 @Override 104 public Item getLockEntity(ItemAlias itemAlias) { 105 return itemAlias.getItem(); 106 } 107 108 @Override 109 public void fillInResult(EditItemAliasResult result, ItemAlias itemAlias) { 110 var itemControl = Session.getModelController(ItemControl.class); 111 112 result.setItemAlias(itemControl.getItemAliasTransfer(getUserVisit(), itemAlias)); 113 } 114 115 @Override 116 public void doLock(ItemAliasEdit edit, ItemAlias itemAlias) { 117 edit.setUnitOfMeasureTypeName(itemAlias.getUnitOfMeasureType().getLastDetail().getUnitOfMeasureTypeName()); 118 edit.setItemAliasTypeName(itemAlias.getItemAliasType().getLastDetail().getItemAliasTypeName()); 119 edit.setAlias(itemAlias.getAlias()); 120 } 121 122 UnitOfMeasureType unitOfMeasureType; 123 ItemAliasType itemAliasType; 124 125 @Override 126 public void canUpdate(ItemAlias itemAlias) { 127 var itemControl = Session.getModelController(ItemControl.class); 128 var alias = edit.getAlias(); 129 var duplicateItem = itemControl.getItemByName(alias); 130 131 if(duplicateItem == null) { 132 var duplicateItemAlias = itemControl.getItemAliasByAlias(alias); 133 134 if(duplicateItemAlias == null || duplicateItemAlias.getPrimaryKey().equals(itemAlias.getPrimaryKey())) { 135 var uomControl = Session.getModelController(UomControl.class); 136 var unitOfMeasureTypeName = edit.getUnitOfMeasureTypeName(); 137 var itemDetail = itemAlias.getItem().getLastDetail(); 138 var unitOfMeasureKind = itemDetail.getUnitOfMeasureKind(); 139 140 unitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(unitOfMeasureKind, unitOfMeasureTypeName); 141 142 if(unitOfMeasureType != null) { 143 var itemAliasTypeName = edit.getItemAliasTypeName(); 144 145 itemAliasType = itemControl.getItemAliasTypeByName(itemAliasTypeName); 146 147 if(itemAliasType != null) { 148 var itemAliasTypeDetail = itemAliasType.getLastDetail(); 149 var validationPattern = itemAliasTypeDetail.getValidationPattern(); 150 151 if(validationPattern != null) { 152 var pattern = Pattern.compile(validationPattern); 153 var m = pattern.matcher(alias); 154 155 if(!m.matches()) { 156 addExecutionError(ExecutionErrors.InvalidAlias.name(), alias); 157 } 158 } 159 160 if(!hasExecutionErrors()) { 161 ItemAliasChecksumTypeLogic.getInstance().checkItemAliasChecksum(this, itemAliasType, alias); 162 } 163 } else { 164 addExecutionError(ExecutionErrors.UnknownItemAliasType.name(), itemAliasTypeName); 165 } 166 } else { 167 addExecutionError(ExecutionErrors.UnknownUnitOfMeasureTypeName.name(), unitOfMeasureTypeName); 168 } 169 } else { 170 addExecutionError(ExecutionErrors.DuplicateItemAlias.name(), itemAlias.getItem().getLastDetail().getItemName(), 171 itemAlias.getUnitOfMeasureType().getLastDetail().getUnitOfMeasureTypeName(), itemAlias.getAlias()); 172 } 173 } else { 174 addExecutionError(ExecutionErrors.AliasDuplicatesItemName.name(), duplicateItem.getLastDetail().getItemName()); 175 } 176 } 177 178 @Override 179 public void doUpdate(ItemAlias itemAlias) { 180 var itemControl = Session.getModelController(ItemControl.class); 181 var itemAliasValue = itemControl.getItemAliasValue(itemAlias); 182 var alias = edit.getAlias(); 183 var originalAlias = itemAliasValue.getAlias(); 184 BasePK updatedBy = getPartyPK(); 185 186 itemAliasValue.setUnitOfMeasureTypePK(unitOfMeasureType.getPrimaryKey()); 187 itemAliasValue.setItemAliasTypePK(itemAliasType.getPrimaryKey()); 188 itemAliasValue.setAlias(alias); 189 190 itemControl.updateItemAliasFromValue(itemAliasValue, updatedBy); 191 192 if(itemAliasValue.getAliasHasBeenModified()) { 193 var vendorControl = Session.getModelController(VendorControl.class); 194 var vendors = vendorControl.getVendorsByDefaultItemAliasType(itemAliasType); 195 196 for(var vendor : vendors) { 197 var vendorParty = vendor.getParty(); 198 var vendorItem = vendorControl.getVendorItemByVendorPartyAndVendorItemNameForUpdate(vendorParty, originalAlias); 199 200 if(vendorItem != null) { 201 try { 202 if(lockEntity(vendorItem) && lockEntityForUpdate(vendorItem)) { 203 var duplicateVendorItem = vendorControl.getVendorItemByVendorPartyAndVendorItemName(vendorParty, alias); 204 205 if(duplicateVendorItem == null) { 206 var vendorItemDetailValue = vendorControl.getVendorItemDetailValueForUpdate(vendorItem); 207 208 vendorItemDetailValue.setVendorItemName(alias); 209 210 vendorControl.updateVendorItemFromValue(vendorItemDetailValue, updatedBy); 211 } 212 } 213 } finally { 214 unlockEntity(vendorItem); 215 } 216 } 217 } 218 } 219 } 220 221}