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.item.server.command; 018 019import com.echothree.control.user.item.common.edit.ItemEditFactory; 020import com.echothree.control.user.item.common.edit.ItemVolumeEdit; 021import com.echothree.control.user.item.common.form.EditItemVolumeForm; 022import com.echothree.control.user.item.common.result.EditItemVolumeResult; 023import com.echothree.control.user.item.common.result.ItemResultFactory; 024import com.echothree.control.user.item.common.spec.ItemVolumeSpec; 025import com.echothree.model.control.item.server.control.ItemControl; 026import com.echothree.model.control.uom.common.UomConstants; 027import com.echothree.model.control.uom.server.control.UomControl; 028import com.echothree.model.control.uom.server.util.Conversion; 029import com.echothree.model.data.item.server.entity.Item; 030import com.echothree.model.data.item.server.entity.ItemVolume; 031import com.echothree.model.data.item.server.value.ItemVolumeValue; 032import com.echothree.model.data.uom.server.entity.UnitOfMeasureKind; 033import com.echothree.model.data.uom.server.entity.UnitOfMeasureType; 034import com.echothree.model.data.user.common.pk.UserVisitPK; 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.command.EditMode; 039import com.echothree.util.server.control.BaseAbstractEditCommand; 040import com.echothree.util.server.persistence.Session; 041import java.util.Arrays; 042import java.util.Collections; 043import java.util.List; 044 045public class EditItemVolumeCommand 046 extends BaseAbstractEditCommand<ItemVolumeSpec, ItemVolumeEdit, EditItemVolumeResult, ItemVolume, Item> { 047 048 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 049 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 050 051 static { 052 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 053 new FieldDefinition("ItemName", FieldType.ENTITY_NAME, true, null, null), 054 new FieldDefinition("UnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null) 055 )); 056 057 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 058 new FieldDefinition("HeightUnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null), 059 new FieldDefinition("Height", FieldType.UNSIGNED_LONG, true, null, null), 060 new FieldDefinition("WidthUnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null), 061 new FieldDefinition("Width", FieldType.UNSIGNED_LONG, true, null, null), 062 new FieldDefinition("DepthUnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null), 063 new FieldDefinition("Depth", FieldType.UNSIGNED_LONG, true, null, null) 064 )); 065 } 066 067 /** Creates a new instance of EditItemVolumeCommand */ 068 public EditItemVolumeCommand(UserVisitPK userVisitPK, EditItemVolumeForm form) { 069 super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 070 } 071 072 @Override 073 public EditItemVolumeResult getResult() { 074 return ItemResultFactory.getEditItemVolumeResult(); 075 } 076 077 @Override 078 public ItemVolumeEdit getEdit() { 079 return ItemEditFactory.getItemVolumeEdit(); 080 } 081 082 UnitOfMeasureKind volumeUnitOfMeasureKind; 083 084 @Override 085 public ItemVolume getEntity(EditItemVolumeResult result) { 086 var itemControl = Session.getModelController(ItemControl.class); 087 var uomControl = Session.getModelController(UomControl.class); 088 ItemVolume itemVolume = null; 089 String itemName = spec.getItemName(); 090 Item item = itemControl.getItemByName(itemName); 091 092 if(item != null) { 093 String unitOfMeasureTypeName = spec.getUnitOfMeasureTypeName(); 094 UnitOfMeasureType unitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(item.getLastDetail().getUnitOfMeasureKind(), unitOfMeasureTypeName); 095 096 if(unitOfMeasureType != null) { 097 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 098 itemVolume = itemControl.getItemVolume(item, unitOfMeasureType); 099 } else { // EditMode.UPDATE 100 itemVolume = itemControl.getItemVolumeForUpdate(item, unitOfMeasureType); 101 } 102 103 if(itemVolume == null) { 104 addExecutionError(ExecutionErrors.UnknownItemVolume.name(), itemName, unitOfMeasureTypeName); 105 } 106 } else { 107 addExecutionError(ExecutionErrors.UnknownUnitOfMeasureTypeName.name(), unitOfMeasureTypeName); 108 } 109 } else { 110 addExecutionError(ExecutionErrors.UnknownItemName.name(), itemName); 111 } 112 113 if(!hasExecutionErrors() && (editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.UPDATE))) { 114 volumeUnitOfMeasureKind = uomControl.getUnitOfMeasureKindByUnitOfMeasureKindUseTypeUsingNames(UomConstants.UnitOfMeasureKindUseType_VOLUME); 115 116 if(volumeUnitOfMeasureKind == null) { 117 addExecutionError(ExecutionErrors.UnknownVolumeUnitOfMeasureKind.name()); 118 } 119 } 120 121 return itemVolume; 122 } 123 124 @Override 125 public Item getLockEntity(ItemVolume itemVolume) { 126 return itemVolume.getItem(); 127 } 128 129 @Override 130 public void fillInResult(EditItemVolumeResult result, ItemVolume itemVolume) { 131 var itemControl = Session.getModelController(ItemControl.class); 132 133 result.setItemVolume(itemControl.getItemVolumeTransfer(getUserVisit(), itemVolume)); 134 } 135 136 @Override 137 public void doLock(ItemVolumeEdit edit, ItemVolume itemVolume) { 138 var uomControl = Session.getModelController(UomControl.class); 139 140 height = itemVolume.getHeight(); 141 Conversion heightConversion = height == null ? null : new Conversion(uomControl, volumeUnitOfMeasureKind, height).convertToHighestUnitOfMeasureType(); 142 143 width = itemVolume.getWidth(); 144 Conversion widthConversion = width == null ? null : new Conversion(uomControl, volumeUnitOfMeasureKind, width).convertToHighestUnitOfMeasureType(); 145 146 depth = itemVolume.getDepth(); 147 Conversion depthConversion = depth == null ? null : new Conversion(uomControl, volumeUnitOfMeasureKind, depth).convertToHighestUnitOfMeasureType(); 148 149 edit.setHeight(heightConversion.getQuantity().toString()); 150 edit.setHeightUnitOfMeasureTypeName(heightConversion.getUnitOfMeasureType().getLastDetail().getUnitOfMeasureTypeName()); 151 edit.setWidth(widthConversion.getQuantity().toString()); 152 edit.setWidthUnitOfMeasureTypeName(widthConversion.getUnitOfMeasureType().getLastDetail().getUnitOfMeasureTypeName()); 153 edit.setDepth(depthConversion.getQuantity().toString()); 154 edit.setDepthUnitOfMeasureTypeName(depthConversion.getUnitOfMeasureType().getLastDetail().getUnitOfMeasureTypeName()); 155 } 156 157 UnitOfMeasureType heightUnitOfMeasureType; 158 Long height; 159 UnitOfMeasureType widthUnitOfMeasureType; 160 Long width; 161 UnitOfMeasureType depthUnitOfMeasureType; 162 Long depth; 163 164 @Override 165 public void canUpdate(ItemVolume itemVolume) { 166 var uomControl = Session.getModelController(UomControl.class); 167 String heightUnitOfMeasureTypeName = edit.getHeightUnitOfMeasureTypeName(); 168 169 heightUnitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(volumeUnitOfMeasureKind, heightUnitOfMeasureTypeName); 170 171 if(heightUnitOfMeasureType != null) { 172 height = Long.valueOf(edit.getHeight()); 173 174 if(height > 0) { 175 String widthUnitOfMeasureTypeName = edit.getWidthUnitOfMeasureTypeName(); 176 177 widthUnitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(volumeUnitOfMeasureKind, widthUnitOfMeasureTypeName); 178 179 if(widthUnitOfMeasureType != null) { 180 width = Long.valueOf(edit.getWidth()); 181 182 if(width > 0) { 183 String depthUnitOfMeasureTypeName = edit.getDepthUnitOfMeasureTypeName(); 184 185 depthUnitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(volumeUnitOfMeasureKind, depthUnitOfMeasureTypeName); 186 187 if(depthUnitOfMeasureType != null) { 188 depth = Long.valueOf(edit.getDepth()); 189 190 if(depth < 1) { 191 addExecutionError(ExecutionErrors.InvalidDepth.name(), depth); 192 } 193 } else { 194 addExecutionError(ExecutionErrors.UnknownDepthUnitOfMeasureTypeName.name(), depthUnitOfMeasureTypeName); 195 } 196 } else { 197 addExecutionError(ExecutionErrors.InvalidWidth.name(), width); 198 } 199 } else { 200 addExecutionError(ExecutionErrors.UnknownWidthUnitOfMeasureTypeName.name(), widthUnitOfMeasureTypeName); 201 } 202 } else { 203 addExecutionError(ExecutionErrors.InvalidHeight.name(), height); 204 } 205 } else { 206 addExecutionError(ExecutionErrors.UnknownHeightUnitOfMeasureTypeName.name(), heightUnitOfMeasureTypeName); 207 } 208 } 209 210 @Override 211 public void doUpdate(ItemVolume itemVolume) { 212 var itemControl = Session.getModelController(ItemControl.class); 213 var uomControl = Session.getModelController(UomControl.class); 214 ItemVolumeValue itemVolumeValue = itemControl.getItemVolumeValue(itemVolume); 215 216 Conversion heightConversion = new Conversion(uomControl, heightUnitOfMeasureType, height).convertToLowestUnitOfMeasureType(); 217 Conversion widthConversion = new Conversion(uomControl, widthUnitOfMeasureType, width).convertToLowestUnitOfMeasureType(); 218 Conversion depthConversion = new Conversion(uomControl, depthUnitOfMeasureType, depth).convertToLowestUnitOfMeasureType(); 219 220 itemVolumeValue.setHeight(heightConversion.getQuantity()); 221 itemVolumeValue.setWidth(widthConversion.getQuantity()); 222 itemVolumeValue.setDepth(depthConversion.getQuantity()); 223 224 itemControl.updateItemVolumeFromValue(itemVolumeValue, getPartyPK()); 225 } 226 227}