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}