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.HarmonizedTariffScheduleCodeEdit;
020import com.echothree.control.user.item.common.edit.ItemEditFactory;
021import com.echothree.control.user.item.common.form.EditHarmonizedTariffScheduleCodeForm;
022import com.echothree.control.user.item.common.result.EditHarmonizedTariffScheduleCodeResult;
023import com.echothree.control.user.item.common.result.ItemResultFactory;
024import com.echothree.control.user.item.common.spec.HarmonizedTariffScheduleCodeSpec;
025import com.echothree.model.control.core.common.MimeTypeUsageTypes;
026import com.echothree.model.control.core.server.logic.MimeTypeLogic;
027import com.echothree.model.control.geo.server.control.GeoControl;
028import com.echothree.model.control.item.server.control.ItemControl;
029import com.echothree.model.control.party.common.PartyTypes;
030import com.echothree.model.control.security.common.SecurityRoleGroups;
031import com.echothree.model.control.security.common.SecurityRoles;
032import com.echothree.model.data.core.server.entity.MimeType;
033import com.echothree.model.data.geo.server.entity.GeoCode;
034import com.echothree.model.data.geo.server.entity.GeoCodeDetail;
035import com.echothree.model.data.item.server.entity.HarmonizedTariffScheduleCode;
036import com.echothree.model.data.item.server.entity.HarmonizedTariffScheduleCodeDetail;
037import com.echothree.model.data.item.server.entity.HarmonizedTariffScheduleCodeTranslation;
038import com.echothree.model.data.item.server.entity.HarmonizedTariffScheduleCodeUnit;
039import com.echothree.model.data.item.server.value.HarmonizedTariffScheduleCodeDetailValue;
040import com.echothree.model.data.item.server.value.HarmonizedTariffScheduleCodeTranslationValue;
041import com.echothree.model.data.user.common.pk.UserVisitPK;
042import com.echothree.util.common.message.ExecutionErrors;
043import com.echothree.util.common.validation.FieldDefinition;
044import com.echothree.util.common.validation.FieldType;
045import com.echothree.util.common.command.EditMode;
046import com.echothree.util.server.control.BaseAbstractEditCommand;
047import com.echothree.util.server.control.CommandSecurityDefinition;
048import com.echothree.util.server.control.PartyTypeDefinition;
049import com.echothree.util.server.control.SecurityRoleDefinition;
050import com.echothree.util.server.persistence.Session;
051import java.util.Arrays;
052import java.util.Collections;
053import java.util.List;
054
055public class EditHarmonizedTariffScheduleCodeCommand
056        extends BaseAbstractEditCommand<HarmonizedTariffScheduleCodeSpec, HarmonizedTariffScheduleCodeEdit, EditHarmonizedTariffScheduleCodeResult, HarmonizedTariffScheduleCode, HarmonizedTariffScheduleCode> {
057
058    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
059    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
060    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
061
062    static {
063        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
064                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
065                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
066                        new SecurityRoleDefinition(SecurityRoleGroups.HarmonizedTariffScheduleCode.name(), SecurityRoles.Edit.name())
067                        )))
068                )));
069
070        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
071                new FieldDefinition("CountryName", FieldType.ENTITY_NAME, true, null, null),
072                new FieldDefinition("HarmonizedTariffScheduleCodeName", FieldType.ENTITY_NAME, true, null, null)
073                ));
074
075        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
076                new FieldDefinition("HarmonizedTariffScheduleCodeName", FieldType.ENTITY_NAME, true, null, null),
077                new FieldDefinition("FirstHarmonizedTariffScheduleCodeUnitName", FieldType.ENTITY_NAME, false, null, null),
078                new FieldDefinition("SecondHarmonizedTariffScheduleCodeUnitName", FieldType.ENTITY_NAME, false, null, null),
079                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
080                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
081                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L),
082                new FieldDefinition("OverviewMimeTypeName", FieldType.MIME_TYPE, false, null, null),
083                new FieldDefinition("Overview", FieldType.STRING, false, null, null)
084                ));
085    }
086
087    /** Creates a new instance of EditHarmonizedTariffScheduleCodeCommand */
088    public EditHarmonizedTariffScheduleCodeCommand(UserVisitPK userVisitPK, EditHarmonizedTariffScheduleCodeForm form) {
089        super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
090    }
091
092    @Override
093    public EditHarmonizedTariffScheduleCodeResult getResult() {
094        return ItemResultFactory.getEditHarmonizedTariffScheduleCodeResult();
095    }
096
097    @Override
098    public HarmonizedTariffScheduleCodeEdit getEdit() {
099        return ItemEditFactory.getHarmonizedTariffScheduleCodeEdit();
100    }
101
102    GeoCode countryGeoCode;
103
104    @Override
105    public HarmonizedTariffScheduleCode getEntity(EditHarmonizedTariffScheduleCodeResult result) {
106        var geoControl = Session.getModelController(GeoControl.class);
107        HarmonizedTariffScheduleCode harmonizedTariffScheduleCode = null;
108        String countryName = spec.getCountryName();
109
110        countryGeoCode = geoControl.getCountryByAlias(countryName);
111
112        if(countryGeoCode != null) {
113            var itemControl = Session.getModelController(ItemControl.class);
114            String harmonizedTariffScheduleCodeName = spec.getHarmonizedTariffScheduleCodeName();
115
116            if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
117                harmonizedTariffScheduleCode = itemControl.getHarmonizedTariffScheduleCodeByName(countryGeoCode, harmonizedTariffScheduleCodeName);
118            } else { // EditMode.UPDATE
119                harmonizedTariffScheduleCode = itemControl.getHarmonizedTariffScheduleCodeByNameForUpdate(countryGeoCode, harmonizedTariffScheduleCodeName);
120            }
121
122            if(harmonizedTariffScheduleCode == null) {
123                addExecutionError(ExecutionErrors.UnknownHarmonizedTariffScheduleCodeName.name(), countryName, harmonizedTariffScheduleCodeName);
124            }
125        } else {
126            addExecutionError(ExecutionErrors.UnknownGeoCodeName.name(), countryName);
127        }
128
129        return harmonizedTariffScheduleCode;
130    }
131
132    @Override
133    public HarmonizedTariffScheduleCode getLockEntity(HarmonizedTariffScheduleCode harmonizedTariffScheduleCode) {
134        return harmonizedTariffScheduleCode;
135    }
136
137    @Override
138    public void fillInResult(EditHarmonizedTariffScheduleCodeResult result, HarmonizedTariffScheduleCode harmonizedTariffScheduleCode) {
139        var itemControl = Session.getModelController(ItemControl.class);
140
141        result.setHarmonizedTariffScheduleCode(itemControl.getHarmonizedTariffScheduleCodeTransfer(getUserVisit(), harmonizedTariffScheduleCode));
142    }
143
144    MimeType overviewMimeType;
145    
146    HarmonizedTariffScheduleCodeUnit firstHarmonizedTariffScheduleCodeUnit;
147    HarmonizedTariffScheduleCodeUnit secondHarmonizedTariffScheduleCodeUnit;
148
149    @Override
150    public void doLock(HarmonizedTariffScheduleCodeEdit edit, HarmonizedTariffScheduleCode harmonizedTariffScheduleCode) {
151        var itemControl = Session.getModelController(ItemControl.class);
152        HarmonizedTariffScheduleCodeTranslation harmonizedTariffScheduleCodeTranslation = itemControl.getHarmonizedTariffScheduleCodeTranslation(harmonizedTariffScheduleCode, getPreferredLanguage());
153        HarmonizedTariffScheduleCodeDetail harmonizedTariffScheduleCodeDetail = harmonizedTariffScheduleCode.getLastDetail();
154
155        firstHarmonizedTariffScheduleCodeUnit = harmonizedTariffScheduleCodeDetail.getFirstHarmonizedTariffScheduleCodeUnit();
156        secondHarmonizedTariffScheduleCodeUnit = harmonizedTariffScheduleCodeDetail.getSecondHarmonizedTariffScheduleCodeUnit();
157        
158        edit.setHarmonizedTariffScheduleCodeName(harmonizedTariffScheduleCodeDetail.getHarmonizedTariffScheduleCodeName());
159        edit.setFirstHarmonizedTariffScheduleCodeUnitName(firstHarmonizedTariffScheduleCodeUnit == null ? null : firstHarmonizedTariffScheduleCodeUnit.getLastDetail().getHarmonizedTariffScheduleCodeUnitName());
160        edit.setSecondHarmonizedTariffScheduleCodeUnitName(secondHarmonizedTariffScheduleCodeUnit == null ? null : secondHarmonizedTariffScheduleCodeUnit.getLastDetail().getHarmonizedTariffScheduleCodeUnitName());
161        edit.setIsDefault(harmonizedTariffScheduleCodeDetail.getIsDefault().toString());
162        edit.setSortOrder(harmonizedTariffScheduleCodeDetail.getSortOrder().toString());
163
164        if(harmonizedTariffScheduleCodeTranslation != null) {
165            overviewMimeType = harmonizedTariffScheduleCodeTranslation.getOverviewMimeType();
166            
167            edit.setDescription(harmonizedTariffScheduleCodeTranslation.getDescription());
168            edit.setOverviewMimeTypeName(overviewMimeType == null? null: overviewMimeType.getLastDetail().getMimeTypeName());
169            edit.setOverview(harmonizedTariffScheduleCodeTranslation.getOverview());
170        }
171    }
172    
173    @Override
174    public void canUpdate(HarmonizedTariffScheduleCode harmonizedTariffScheduleCode) {
175        var itemControl = Session.getModelController(ItemControl.class);
176        GeoCodeDetail geoCodeDetail = countryGeoCode.getLastDetail();
177        String harmonizedTariffScheduleCodeName = edit.getHarmonizedTariffScheduleCodeName();
178        HarmonizedTariffScheduleCode duplicateHarmonizedTariffScheduleCode = itemControl.getHarmonizedTariffScheduleCodeByName(countryGeoCode, harmonizedTariffScheduleCodeName);
179
180        if(duplicateHarmonizedTariffScheduleCode != null && !harmonizedTariffScheduleCode.equals(duplicateHarmonizedTariffScheduleCode)) {
181            addExecutionError(ExecutionErrors.DuplicateHarmonizedTariffScheduleCodeName.name(), geoCodeDetail.getGeoCodeName(), harmonizedTariffScheduleCodeName);
182        } else {
183            String overviewMimeTypeName = edit.getOverviewMimeTypeName();
184            String overview = edit.getOverview();
185
186            overviewMimeType = MimeTypeLogic.getInstance().checkMimeType(this, overviewMimeTypeName, overview, MimeTypeUsageTypes.TEXT.name(),
187                    ExecutionErrors.MissingRequiredOverviewMimeTypeName.name(), ExecutionErrors.MissingRequiredOverview.name(),
188                    ExecutionErrors.UnknownOverviewMimeTypeName.name(), ExecutionErrors.UnknownOverviewMimeTypeUsage.name());
189            
190            if(!hasExecutionErrors()) {
191                String firstHarmonizedTariffScheduleCodeUnitName = edit.getFirstHarmonizedTariffScheduleCodeUnitName();
192                
193                firstHarmonizedTariffScheduleCodeUnit = firstHarmonizedTariffScheduleCodeUnitName == null ? null : itemControl.getHarmonizedTariffScheduleCodeUnitByName(firstHarmonizedTariffScheduleCodeUnitName);
194                
195                if(firstHarmonizedTariffScheduleCodeUnitName == null || firstHarmonizedTariffScheduleCodeUnit != null) {
196                    String secondHarmonizedTariffScheduleCodeUnitName = edit.getSecondHarmonizedTariffScheduleCodeUnitName();
197                    
198                    secondHarmonizedTariffScheduleCodeUnit = secondHarmonizedTariffScheduleCodeUnitName == null ? null : itemControl.getHarmonizedTariffScheduleCodeUnitByName(secondHarmonizedTariffScheduleCodeUnitName);
199
200                    if(secondHarmonizedTariffScheduleCodeUnitName != null && secondHarmonizedTariffScheduleCodeUnit == null) {
201                        addExecutionError(ExecutionErrors.UnknownSecondHarmonizedTariffScheduleCodeUnitName.name(), secondHarmonizedTariffScheduleCodeUnitName);
202                    }
203                } else {
204                    addExecutionError(ExecutionErrors.UnknownFirstHarmonizedTariffScheduleCodeUnitName.name(), firstHarmonizedTariffScheduleCodeUnitName);
205                }
206            }
207        }
208    }
209
210    @Override
211    public void doUpdate(HarmonizedTariffScheduleCode harmonizedTariffScheduleCode) {
212        var itemControl = Session.getModelController(ItemControl.class);
213        var partyPK = getPartyPK();
214        HarmonizedTariffScheduleCodeDetailValue harmonizedTariffScheduleCodeDetailValue = itemControl.getHarmonizedTariffScheduleCodeDetailValueForUpdate(harmonizedTariffScheduleCode);
215        HarmonizedTariffScheduleCodeTranslation harmonizedTariffScheduleCodeTranslation = itemControl.getHarmonizedTariffScheduleCodeTranslationForUpdate(harmonizedTariffScheduleCode, getPreferredLanguage());
216        String description = edit.getDescription();
217        String overview = edit.getOverview();
218
219        harmonizedTariffScheduleCodeDetailValue.setHarmonizedTariffScheduleCodeName(edit.getHarmonizedTariffScheduleCodeName());
220        harmonizedTariffScheduleCodeDetailValue.setFirstHarmonizedTariffScheduleCodeUnitPK(firstHarmonizedTariffScheduleCodeUnit == null ? null : firstHarmonizedTariffScheduleCodeUnit.getPrimaryKey());
221        harmonizedTariffScheduleCodeDetailValue.setSecondHarmonizedTariffScheduleCodeUnitPK(secondHarmonizedTariffScheduleCodeUnit == null ? null : secondHarmonizedTariffScheduleCodeUnit.getPrimaryKey());
222        harmonizedTariffScheduleCodeDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
223        harmonizedTariffScheduleCodeDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
224
225        itemControl.updateHarmonizedTariffScheduleCodeFromValue(harmonizedTariffScheduleCodeDetailValue, partyPK);
226
227        if(harmonizedTariffScheduleCodeTranslation == null && (description != null || overview != null)) {
228            itemControl.createHarmonizedTariffScheduleCodeTranslation(harmonizedTariffScheduleCode, getPreferredLanguage(), description, overviewMimeType, overview, partyPK);
229        } else if(harmonizedTariffScheduleCodeTranslation != null && (description == null && overview == null)) {
230            itemControl.deleteHarmonizedTariffScheduleCodeTranslation(harmonizedTariffScheduleCodeTranslation, partyPK);
231        } else if(harmonizedTariffScheduleCodeTranslation != null && (description != null || overview != null)) {
232            HarmonizedTariffScheduleCodeTranslationValue harmonizedTariffScheduleCodeTranslationValue = itemControl.getHarmonizedTariffScheduleCodeTranslationValue(harmonizedTariffScheduleCodeTranslation);
233
234            harmonizedTariffScheduleCodeTranslationValue.setDescription(description);
235            harmonizedTariffScheduleCodeTranslationValue.setOverviewMimeTypePK(overviewMimeType == null? null: overviewMimeType.getPrimaryKey());
236            harmonizedTariffScheduleCodeTranslationValue.setOverview(overview);
237            itemControl.updateHarmonizedTariffScheduleCodeTranslationFromValue(harmonizedTariffScheduleCodeTranslationValue, partyPK);
238        }
239    }
240
241}