001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 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.uom.server.command;
018
019import com.echothree.control.user.uom.common.edit.UnitOfMeasureKindEdit;
020import com.echothree.control.user.uom.common.edit.UomEditFactory;
021import com.echothree.control.user.uom.common.form.EditUnitOfMeasureKindForm;
022import com.echothree.control.user.uom.common.result.UomResultFactory;
023import com.echothree.control.user.uom.common.spec.UnitOfMeasureKindSpec;
024import com.echothree.model.control.uom.server.control.UomControl;
025import com.echothree.model.data.user.common.pk.UserVisitPK;
026import com.echothree.util.common.message.ExecutionErrors;
027import com.echothree.util.common.validation.FieldDefinition;
028import com.echothree.util.common.validation.FieldType;
029import com.echothree.util.common.command.BaseResult;
030import com.echothree.util.common.command.EditMode;
031import com.echothree.util.server.control.BaseEditCommand;
032import com.echothree.util.server.persistence.Session;
033import java.util.Arrays;
034import java.util.Collections;
035import java.util.List;
036import javax.enterprise.context.RequestScoped;
037
038@RequestScoped
039public class EditUnitOfMeasureKindCommand
040        extends BaseEditCommand<UnitOfMeasureKindSpec, UnitOfMeasureKindEdit> {
041    
042    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
043    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
044    
045    static {
046        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
047                new FieldDefinition("UnitOfMeasureKindName", FieldType.ENTITY_NAME, true, null, null)
048                ));
049        
050        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
051                new FieldDefinition("UnitOfMeasureKindName", FieldType.ENTITY_NAME, true, null, null),
052                new FieldDefinition("FractionDigits", FieldType.UNSIGNED_INTEGER, true, null, null),
053                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
054                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
055                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L)
056                ));
057    }
058    
059    /** Creates a new instance of EditUnitOfMeasureKindCommand */
060    public EditUnitOfMeasureKindCommand() {
061        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
062    }
063    
064    @Override
065    protected BaseResult execute() {
066        var uomControl = Session.getModelController(UomControl.class);
067        var result = UomResultFactory.getEditUnitOfMeasureKindResult();
068        
069        if(editMode.equals(EditMode.LOCK)) {
070            var unitOfMeasureKindName = spec.getUnitOfMeasureKindName();
071            var unitOfMeasureKind = uomControl.getUnitOfMeasureKindByName(unitOfMeasureKindName);
072            
073            if(unitOfMeasureKind != null) {
074                result.setUnitOfMeasureKind(uomControl.getUnitOfMeasureKindTransfer(getUserVisit(), unitOfMeasureKind));
075                
076                if(lockEntity(unitOfMeasureKind)) {
077                    var unitOfMeasureKindDescription = uomControl.getUnitOfMeasureKindDescription(unitOfMeasureKind, getPreferredLanguage());
078                    var edit = UomEditFactory.getUnitOfMeasureKindEdit();
079                    var unitOfMeasureKindDetail = unitOfMeasureKind.getLastDetail();
080                    
081                    result.setEdit(edit);
082                    edit.setUnitOfMeasureKindName(unitOfMeasureKindDetail.getUnitOfMeasureKindName());
083                    edit.setFractionDigits(unitOfMeasureKindDetail.getFractionDigits().toString());
084                    edit.setIsDefault(unitOfMeasureKindDetail.getIsDefault().toString());
085                    edit.setSortOrder(unitOfMeasureKindDetail.getSortOrder().toString());
086                    
087                    if(unitOfMeasureKindDescription != null)
088                        edit.setDescription(unitOfMeasureKindDescription.getDescription());
089                } else {
090                    addExecutionError(ExecutionErrors.EntityLockFailed.name());
091                }
092                
093                result.setEntityLock(getEntityLockTransfer(unitOfMeasureKind));
094            } else {
095                addExecutionError(ExecutionErrors.UnknownUnitOfMeasureKindName.name(), unitOfMeasureKindName);
096            }
097        } else if(editMode.equals(EditMode.UPDATE)) {
098            var unitOfMeasureKindName = spec.getUnitOfMeasureKindName();
099            var unitOfMeasureKind = uomControl.getUnitOfMeasureKindByNameForUpdate(unitOfMeasureKindName);
100            
101            if(unitOfMeasureKind != null) {
102                unitOfMeasureKindName = edit.getUnitOfMeasureKindName();
103                var duplicateUnitOfMeasureKind = uomControl.getUnitOfMeasureKindByName(unitOfMeasureKindName);
104                
105                if(duplicateUnitOfMeasureKind == null || unitOfMeasureKind.equals(duplicateUnitOfMeasureKind)) {
106                    if(lockEntityForUpdate(unitOfMeasureKind)) {
107                        try {
108                            var partyPK = getPartyPK();
109                            var unitOfMeasureKindDetailValue = uomControl.getUnitOfMeasureKindDetailValueForUpdate(unitOfMeasureKind);
110                            var unitOfMeasureKindDescription = uomControl.getUnitOfMeasureKindDescriptionForUpdate(unitOfMeasureKind, getPreferredLanguage());
111                            var description = edit.getDescription();
112                            
113                            unitOfMeasureKindDetailValue.setUnitOfMeasureKindName(edit.getUnitOfMeasureKindName());
114                            unitOfMeasureKindDetailValue.setFractionDigits(Integer.valueOf(edit.getFractionDigits()));
115                            unitOfMeasureKindDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
116                            unitOfMeasureKindDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
117                            
118                            uomControl.updateUnitOfMeasureKindFromValue(unitOfMeasureKindDetailValue, partyPK);
119                            
120                            if(unitOfMeasureKindDescription == null && description != null) {
121                                uomControl.createUnitOfMeasureKindDescription(unitOfMeasureKind, getPreferredLanguage(), description, partyPK);
122                            } else if(unitOfMeasureKindDescription != null && description == null) {
123                                uomControl.deleteUnitOfMeasureKindDescription(unitOfMeasureKindDescription, partyPK);
124                            } else if(unitOfMeasureKindDescription != null && description != null) {
125                                var unitOfMeasureKindDescriptionValue = uomControl.getUnitOfMeasureKindDescriptionValue(unitOfMeasureKindDescription);
126                                
127                                unitOfMeasureKindDescriptionValue.setDescription(description);
128                                uomControl.updateUnitOfMeasureKindDescriptionFromValue(unitOfMeasureKindDescriptionValue, partyPK);
129                            }
130                        } finally {
131                            unlockEntity(unitOfMeasureKind);
132                        }
133                    } else {
134                        addExecutionError(ExecutionErrors.EntityLockStale.name());
135                    }
136                } else {
137                    addExecutionError(ExecutionErrors.DuplicateUnitOfMeasureKindName.name(), unitOfMeasureKindName);
138                }
139            } else {
140                addExecutionError(ExecutionErrors.UnknownUnitOfMeasureKindName.name(), unitOfMeasureKindName);
141            }
142            
143            if(hasExecutionErrors()) {
144                result.setUnitOfMeasureKind(uomControl.getUnitOfMeasureKindTransfer(getUserVisit(), unitOfMeasureKind));
145                result.setEntityLock(getEntityLockTransfer(unitOfMeasureKind));
146            }
147        }
148        
149        return result;
150    }
151    
152}