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.ItemWeightEdit; 021import com.echothree.control.user.item.common.form.EditItemWeightForm; 022import com.echothree.control.user.item.common.result.EditItemWeightResult; 023import com.echothree.control.user.item.common.result.ItemResultFactory; 024import com.echothree.control.user.item.common.spec.ItemWeightSpec; 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.ItemWeight; 031import com.echothree.model.data.item.server.value.ItemWeightValue; 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 EditItemWeightCommand 046 extends BaseAbstractEditCommand<ItemWeightSpec, ItemWeightEdit, EditItemWeightResult, ItemWeight, 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("WeightUnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null), 059 new FieldDefinition("Weight", FieldType.UNSIGNED_LONG, true, null, null) 060 )); 061 } 062 063 /** Creates a new instance of EditItemWeightCommand */ 064 public EditItemWeightCommand(UserVisitPK userVisitPK, EditItemWeightForm form) { 065 super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 066 } 067 068 @Override 069 public EditItemWeightResult getResult() { 070 return ItemResultFactory.getEditItemWeightResult(); 071 } 072 073 @Override 074 public ItemWeightEdit getEdit() { 075 return ItemEditFactory.getItemWeightEdit(); 076 } 077 078 UnitOfMeasureKind volumeUnitOfMeasureKind; 079 080 @Override 081 public ItemWeight getEntity(EditItemWeightResult result) { 082 var itemControl = Session.getModelController(ItemControl.class); 083 var uomControl = Session.getModelController(UomControl.class); 084 ItemWeight itemWeight = null; 085 String itemName = spec.getItemName(); 086 Item item = itemControl.getItemByName(itemName); 087 088 if(item != null) { 089 String unitOfMeasureTypeName = spec.getUnitOfMeasureTypeName(); 090 UnitOfMeasureType unitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(item.getLastDetail().getUnitOfMeasureKind(), unitOfMeasureTypeName); 091 092 if(unitOfMeasureType != null) { 093 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 094 itemWeight = itemControl.getItemWeight(item, unitOfMeasureType); 095 } else { // EditMode.UPDATE 096 itemWeight = itemControl.getItemWeightForUpdate(item, unitOfMeasureType); 097 } 098 099 if(itemWeight == null) { 100 addExecutionError(ExecutionErrors.UnknownItemWeight.name(), itemName, unitOfMeasureTypeName); 101 } 102 } else { 103 addExecutionError(ExecutionErrors.UnknownUnitOfMeasureTypeName.name(), unitOfMeasureTypeName); 104 } 105 } else { 106 addExecutionError(ExecutionErrors.UnknownItemName.name(), itemName); 107 } 108 109 if(!hasExecutionErrors() && (editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.UPDATE))) { 110 volumeUnitOfMeasureKind = uomControl.getUnitOfMeasureKindByUnitOfMeasureKindUseTypeUsingNames(UomConstants.UnitOfMeasureKindUseType_WEIGHT); 111 112 if(volumeUnitOfMeasureKind == null) { 113 addExecutionError(ExecutionErrors.UnknownWeightUnitOfMeasureKind.name()); 114 } 115 } 116 117 return itemWeight; 118 } 119 120 @Override 121 public Item getLockEntity(ItemWeight itemWeight) { 122 return itemWeight.getItem(); 123 } 124 125 @Override 126 public void fillInResult(EditItemWeightResult result, ItemWeight itemWeight) { 127 var itemControl = Session.getModelController(ItemControl.class); 128 129 result.setItemWeight(itemControl.getItemWeightTransfer(getUserVisit(), itemWeight)); 130 } 131 132 @Override 133 public void doLock(ItemWeightEdit edit, ItemWeight itemWeight) { 134 var uomControl = Session.getModelController(UomControl.class); 135 136 weight = itemWeight.getWeight(); 137 Conversion weightConversion = weight == null ? null : new Conversion(uomControl, volumeUnitOfMeasureKind, weight).convertToHighestUnitOfMeasureType(); 138 139 edit.setWeight(weightConversion.getQuantity().toString()); 140 edit.setWeightUnitOfMeasureTypeName(weightConversion.getUnitOfMeasureType().getLastDetail().getUnitOfMeasureTypeName()); 141 } 142 143 UnitOfMeasureType weightUnitOfMeasureType; 144 Long weight; 145 146 @Override 147 public void canUpdate(ItemWeight itemWeight) { 148 var uomControl = Session.getModelController(UomControl.class); 149 String weightUnitOfMeasureTypeName = edit.getWeightUnitOfMeasureTypeName(); 150 151 weightUnitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(volumeUnitOfMeasureKind, weightUnitOfMeasureTypeName); 152 153 if(weightUnitOfMeasureType != null) { 154 weight = Long.valueOf(edit.getWeight()); 155 156 if(weight < 1) { 157 addExecutionError(ExecutionErrors.InvalidWeight.name(), weight); 158 } 159 } else { 160 addExecutionError(ExecutionErrors.UnknownWeightUnitOfMeasureTypeName.name(), weightUnitOfMeasureTypeName); 161 } 162 } 163 164 @Override 165 public void doUpdate(ItemWeight itemWeight) { 166 var itemControl = Session.getModelController(ItemControl.class); 167 var uomControl = Session.getModelController(UomControl.class); 168 ItemWeightValue itemWeightValue = itemControl.getItemWeightValue(itemWeight); 169 170 Conversion weightConversion = new Conversion(uomControl, weightUnitOfMeasureType, weight).convertToLowestUnitOfMeasureType(); 171 172 itemWeightValue.setWeight(weightConversion.getQuantity()); 173 174 itemControl.updateItemWeightFromValue(itemWeightValue, getPartyPK()); 175 } 176 177}