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.carrier.server.command;
018
019import com.echothree.control.user.carrier.common.edit.CarrierEditFactory;
020import com.echothree.control.user.carrier.common.edit.CarrierOptionEdit;
021import com.echothree.control.user.carrier.common.form.EditCarrierOptionForm;
022import com.echothree.control.user.carrier.common.result.CarrierResultFactory;
023import com.echothree.control.user.carrier.common.result.EditCarrierOptionResult;
024import com.echothree.control.user.carrier.common.spec.CarrierOptionSpec;
025import com.echothree.model.control.carrier.server.control.CarrierControl;
026import com.echothree.model.control.party.common.PartyTypes;
027import com.echothree.model.control.security.common.SecurityRoleGroups;
028import com.echothree.model.control.security.common.SecurityRoles;
029import com.echothree.model.control.selector.common.SelectorKinds;
030import com.echothree.model.control.selector.common.SelectorTypes;
031import com.echothree.model.control.selector.server.control.SelectorControl;
032import com.echothree.model.data.carrier.server.entity.CarrierOption;
033import com.echothree.model.data.party.server.entity.Party;
034import com.echothree.model.data.selector.server.entity.Selector;
035import com.echothree.model.data.user.common.pk.UserVisitPK;
036import com.echothree.util.common.command.EditMode;
037import com.echothree.util.common.message.ExecutionErrors;
038import com.echothree.util.common.validation.FieldDefinition;
039import com.echothree.util.common.validation.FieldType;
040import com.echothree.util.server.control.BaseAbstractEditCommand;
041import com.echothree.util.server.control.CommandSecurityDefinition;
042import com.echothree.util.server.control.PartyTypeDefinition;
043import com.echothree.util.server.control.SecurityRoleDefinition;
044import com.echothree.util.server.persistence.Session;
045import java.util.Arrays;
046import java.util.Collections;
047import java.util.List;
048import javax.enterprise.context.RequestScoped;
049
050@RequestScoped
051public class EditCarrierOptionCommand
052        extends BaseAbstractEditCommand<CarrierOptionSpec, CarrierOptionEdit, EditCarrierOptionResult, CarrierOption, CarrierOption> {
053    
054    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
055    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
056    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
057    
058    static {
059        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
060                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
061                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
062                        new SecurityRoleDefinition(SecurityRoleGroups.CarrierOption.name(), SecurityRoles.Edit.name())
063                        )))
064                )));
065
066        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
067                new FieldDefinition("CarrierName", FieldType.ENTITY_NAME, true, null, null),
068                new FieldDefinition("CarrierOptionName", FieldType.ENTITY_NAME, true, null, null)
069                ));
070        
071        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
072                new FieldDefinition("CarrierOptionName", FieldType.ENTITY_NAME, true, null, null),
073                new FieldDefinition("IsRecommended", FieldType.BOOLEAN, true, null, null),
074                new FieldDefinition("IsRequired", FieldType.BOOLEAN, true, null, null),
075                new FieldDefinition("RecommendedGeoCodeSelectorName", FieldType.ENTITY_NAME, false, null, null),
076                new FieldDefinition("RequiredGeoCodeSelectorName", FieldType.ENTITY_NAME, false, null, null),
077                new FieldDefinition("RecommendedItemSelectorName", FieldType.ENTITY_NAME, false, null, null),
078                new FieldDefinition("RequiredItemSelectorName", FieldType.ENTITY_NAME, false, null, null),
079                new FieldDefinition("RecommendedOrderSelectorName", FieldType.ENTITY_NAME, false, null, null),
080                new FieldDefinition("RequiredOrderSelectorName", FieldType.ENTITY_NAME, false, null, null),
081                new FieldDefinition("RecommendedShipmentSelectorName", FieldType.ENTITY_NAME, false, null, null),
082                new FieldDefinition("RequiredShipmentSelectorName", FieldType.ENTITY_NAME, false, null, null),
083                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
084                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
085                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L)
086                ));
087    }
088    
089    /** Creates a new instance of EditCarrierOptionCommand */
090    public EditCarrierOptionCommand() {
091        super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
092    }
093    
094    @Override
095    public EditCarrierOptionResult getResult() {
096        return CarrierResultFactory.getEditCarrierOptionResult();
097    }
098
099    @Override
100    public CarrierOptionEdit getEdit() {
101        return CarrierEditFactory.getCarrierOptionEdit();
102    }
103
104    Party carrierParty;
105
106    @Override
107    public CarrierOption getEntity(EditCarrierOptionResult result) {
108        var carrierControl = Session.getModelController(CarrierControl.class);
109        CarrierOption carrierOption = null;
110        var carrierName = spec.getCarrierName();
111        var carrier = carrierControl.getCarrierByName(carrierName);
112
113        if(carrier != null) {
114            var carrierOptionName = spec.getCarrierOptionName();
115
116            carrierParty = carrier.getParty();
117
118            if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
119                carrierOption = carrierControl.getCarrierOptionByName(carrierParty, carrierOptionName);
120            } else { // EditMode.UPDATE
121                carrierOption = carrierControl.getCarrierOptionByNameForUpdate(carrierParty, carrierOptionName);
122            }
123
124            if(carrierOption != null) {
125                result.setCarrierOption(carrierControl.getCarrierOptionTransfer(getUserVisit(), carrierOption));
126            } else {
127                addExecutionError(ExecutionErrors.UnknownCarrierOptionName.name(), carrierName, carrierOptionName);
128            }
129        } else {
130            addExecutionError(ExecutionErrors.UnknownCarrierName.name(), carrierName);
131        }
132
133        return carrierOption;
134    }
135
136    @Override
137    public CarrierOption getLockEntity(CarrierOption carrierOption) {
138        return carrierOption;
139    }
140
141    @Override
142    public void fillInResult(EditCarrierOptionResult result, CarrierOption carrierOption) {
143        var carrierControl = Session.getModelController(CarrierControl.class);
144
145        result.setCarrierOption(carrierControl.getCarrierOptionTransfer(getUserVisit(), carrierOption));
146    }
147
148    Selector recommendedGeoCodeSelector;
149    Selector requiredGeoCodeSelector;
150    Selector recommendedItemSelector;
151    Selector requiredItemSelector;
152    Selector recommendedOrderSelector;
153    Selector requiredOrderSelector;
154    Selector recommendedShipmentSelector;
155    Selector requiredShipmentSelector;
156
157    @Override
158    public void doLock(CarrierOptionEdit edit, CarrierOption carrierOption) {
159        var carrierControl = Session.getModelController(CarrierControl.class);
160        var carrierOptionDescription = carrierControl.getCarrierOptionDescription(carrierOption, getPreferredLanguage());
161        var carrierOptionDetail = carrierOption.getLastDetail();
162
163        recommendedGeoCodeSelector = carrierOptionDetail.getRecommendedGeoCodeSelector();
164        requiredGeoCodeSelector = carrierOptionDetail.getRequiredGeoCodeSelector();
165        recommendedItemSelector = carrierOptionDetail.getRecommendedItemSelector();
166        requiredItemSelector = carrierOptionDetail.getRequiredItemSelector();
167        recommendedOrderSelector = carrierOptionDetail.getRecommendedOrderSelector();
168        requiredOrderSelector = carrierOptionDetail.getRequiredOrderSelector();
169        recommendedShipmentSelector = carrierOptionDetail.getRecommendedShipmentSelector();
170        requiredShipmentSelector = carrierOptionDetail.getRequiredShipmentSelector();
171
172        edit.setCarrierOptionName(carrierOptionDetail.getCarrierOptionName());
173        edit.setIsRecommended(carrierOptionDetail.getIsRecommended().toString());
174        edit.setIsRequired(carrierOptionDetail.getIsRequired().toString());
175        edit.setRecommendedGeoCodeSelectorName(recommendedGeoCodeSelector == null? null: recommendedGeoCodeSelector.getLastDetail().getSelectorName());
176        edit.setRequiredGeoCodeSelectorName(requiredGeoCodeSelector == null? null: requiredGeoCodeSelector.getLastDetail().getSelectorName());
177        edit.setRecommendedItemSelectorName(recommendedItemSelector == null? null: recommendedItemSelector.getLastDetail().getSelectorName());
178        edit.setRequiredItemSelectorName(requiredItemSelector == null? null: requiredItemSelector.getLastDetail().getSelectorName());
179        edit.setRecommendedOrderSelectorName(recommendedOrderSelector == null? null: recommendedOrderSelector.getLastDetail().getSelectorName());
180        edit.setRequiredOrderSelectorName(requiredOrderSelector == null? null: requiredOrderSelector.getLastDetail().getSelectorName());
181        edit.setRecommendedShipmentSelectorName(recommendedShipmentSelector == null? null: recommendedShipmentSelector.getLastDetail().getSelectorName());
182        edit.setRequiredShipmentSelectorName(requiredShipmentSelector == null? null: requiredShipmentSelector.getLastDetail().getSelectorName());
183        edit.setIsDefault(carrierOptionDetail.getIsDefault().toString());
184        edit.setSortOrder(carrierOptionDetail.getSortOrder().toString());
185
186        if(carrierOptionDescription != null) {
187            edit.setDescription(carrierOptionDescription.getDescription());
188        }
189    }
190
191    @Override
192    public void canUpdate(CarrierOption carrierOption) {
193        var carrierControl = Session.getModelController(CarrierControl.class);
194        var carrierOptionName = edit.getCarrierOptionName();
195        var duplicateCarrierOption = carrierControl.getCarrierOptionByName(carrierParty, carrierOptionName);
196
197        if(duplicateCarrierOption == null || carrierOption.equals(duplicateCarrierOption)) {
198            var selectorControl = Session.getModelController(SelectorControl.class);
199            var selectorKind = selectorControl.getSelectorKindByName(SelectorKinds.POSTAL_ADDRESS.name());
200
201            if(selectorKind != null) {
202                var selectorType = selectorControl.getSelectorTypeByName(selectorKind, SelectorTypes.CARRIER_OPTION.name());
203
204                if(selectorType != null) {
205                    var recommendedGeoCodeSelectorName = edit.getRecommendedGeoCodeSelectorName();
206
207                    if(recommendedGeoCodeSelectorName != null) {
208                        recommendedGeoCodeSelector = selectorControl.getSelectorByName(selectorType, recommendedGeoCodeSelectorName);
209                    }
210
211                    if(recommendedGeoCodeSelectorName == null || recommendedGeoCodeSelector != null) {
212                        var requiredGeoCodeSelectorName = edit.getRequiredGeoCodeSelectorName();
213
214                        if(requiredGeoCodeSelectorName != null) {
215                            requiredGeoCodeSelector = selectorControl.getSelectorByName(selectorType, requiredGeoCodeSelectorName);
216                        }
217
218                        if(requiredGeoCodeSelectorName == null || requiredGeoCodeSelector != null) {
219                            selectorKind = selectorControl.getSelectorKindByName(SelectorKinds.ITEM.name());
220
221                            if(selectorKind != null) {
222                                selectorType = selectorControl.getSelectorTypeByName(selectorKind, SelectorTypes.CARRIER_OPTION.name());
223
224                                if(selectorType != null) {
225                                    var recommendedItemSelectorName = edit.getRecommendedItemSelectorName();
226
227                                    if(recommendedItemSelectorName != null) {
228                                        recommendedItemSelector = selectorControl.getSelectorByName(selectorType, recommendedItemSelectorName);
229                                    }
230
231                                    if(recommendedItemSelectorName == null || recommendedItemSelector != null) {
232                                        var requiredItemSelectorName = edit.getRequiredItemSelectorName();
233
234                                        if(requiredItemSelectorName != null) {
235                                            requiredItemSelector = selectorControl.getSelectorByName(selectorType, requiredItemSelectorName);
236                                        }
237
238                                        if(requiredItemSelectorName == null || requiredItemSelector != null) {
239                                            selectorKind = selectorControl.getSelectorKindByName(SelectorKinds.ORDER.name());
240
241                                            if(selectorKind != null) {
242                                                selectorType = selectorControl.getSelectorTypeByName(selectorKind, SelectorTypes.CARRIER_OPTION.name());
243
244                                                if(selectorType != null) {
245                                                    var recommendedOrderSelectorName = edit.getRecommendedOrderSelectorName();
246
247                                                    if(recommendedOrderSelectorName != null) {
248                                                        recommendedOrderSelector = selectorControl.getSelectorByName(selectorType, recommendedOrderSelectorName);
249                                                    }
250
251                                                    if(recommendedOrderSelectorName == null || recommendedOrderSelector != null) {
252                                                        var requiredOrderSelectorName = edit.getRequiredOrderSelectorName();
253
254                                                        if(requiredOrderSelectorName != null) {
255                                                            requiredOrderSelector = selectorControl.getSelectorByName(selectorType, requiredOrderSelectorName);
256                                                        }
257
258                                                        if(requiredOrderSelectorName == null || requiredOrderSelector != null) {
259                                                            selectorKind = selectorControl.getSelectorKindByName(SelectorKinds.SHIPMENT.name());
260
261                                                            if(selectorKind != null) {
262                                                                selectorType = selectorControl.getSelectorTypeByName(selectorKind, SelectorTypes.CARRIER_OPTION.name());
263
264                                                                if(selectorType != null) {
265                                                                    var recommendedShipmentSelectorName = edit.getRecommendedShipmentSelectorName();
266
267                                                                    if(recommendedShipmentSelectorName != null) {
268                                                                        recommendedShipmentSelector = selectorControl.getSelectorByName(selectorType, recommendedShipmentSelectorName);
269                                                                    }
270
271                                                                    if(recommendedShipmentSelectorName == null || recommendedShipmentSelector != null) {
272                                                                        var requiredShipmentSelectorName = edit.getRequiredShipmentSelectorName();
273
274                                                                        if(requiredShipmentSelectorName != null) {
275                                                                            requiredShipmentSelector = selectorControl.getSelectorByName(selectorType, requiredShipmentSelectorName);
276                                                                        }
277
278                                                                        if(requiredShipmentSelectorName != null && requiredShipmentSelector == null) {
279                                                                            addExecutionError(ExecutionErrors.UnknownRequiredShipmentSelectorName.name(), requiredShipmentSelectorName);
280                                                                        }
281                                                                    } else {
282                                                                        addExecutionError(ExecutionErrors.UnknownRecommendedShipmentSelectorName.name(), recommendedShipmentSelectorName);
283                                                                    }
284                                                                } else {
285                                                                    addExecutionError(ExecutionErrors.UnknownSelectorTypeName.name(),
286                                                                            SelectorKinds.SHIPMENT.name(),
287                                                                            SelectorTypes.CARRIER_OPTION.name());
288                                                                }
289                                                            } else {
290                                                                addExecutionError(ExecutionErrors.UnknownSelectorKindName.name(), SelectorKinds.SHIPMENT.name());
291                                                            }
292                                                        } else {
293                                                            addExecutionError(ExecutionErrors.UnknownRequiredOrderSelectorName.name(), requiredOrderSelectorName);
294                                                        }
295                                                    } else {
296                                                        addExecutionError(ExecutionErrors.UnknownRecommendedOrderSelectorName.name(), recommendedOrderSelectorName);
297                                                    }
298                                                } else {
299                                                    addExecutionError(ExecutionErrors.UnknownSelectorTypeName.name(),
300                                                            SelectorKinds.ORDER.name(), SelectorTypes.CARRIER_OPTION.name());
301                                                }
302                                            } else {
303                                                addExecutionError(ExecutionErrors.UnknownSelectorKindName.name(), SelectorKinds.ORDER.name());
304                                            }
305                                        } else {
306                                            addExecutionError(ExecutionErrors.UnknownRequiredItemSelectorName.name(), requiredItemSelectorName);
307                                        }
308                                    } else {
309                                        addExecutionError(ExecutionErrors.UnknownRecommendedItemSelectorName.name(), recommendedItemSelectorName);
310                                    }
311                                } else {
312                                    addExecutionError(ExecutionErrors.UnknownSelectorTypeName.name(), SelectorKinds.ITEM.name(),
313                                            SelectorTypes.CARRIER_OPTION.name());
314                                }
315                            } else {
316                                addExecutionError(ExecutionErrors.UnknownSelectorKindName.name(), SelectorKinds.ITEM.name());
317                            }
318                        } else {
319                            addExecutionError(ExecutionErrors.UnknownRequiredGeoCodeSelectorName.name(), requiredGeoCodeSelectorName);
320                        }
321                    } else {
322                        addExecutionError(ExecutionErrors.UnknownRecommendedGeoCodeSelectorName.name(), recommendedGeoCodeSelectorName);
323                    }
324                } else {
325                    addExecutionError(ExecutionErrors.UnknownSelectorTypeName.name(), SelectorKinds.POSTAL_ADDRESS.name(),
326                            SelectorTypes.CARRIER_OPTION.name());
327                }
328            } else {
329                addExecutionError(ExecutionErrors.UnknownSelectorKindName.name(), SelectorKinds.POSTAL_ADDRESS.name());
330            }
331        } else {
332            addExecutionError(ExecutionErrors.DuplicateCarrierOptionName.name(), carrierOptionName);
333        }
334    }
335
336    @Override
337    public void doUpdate(CarrierOption carrierOption) {
338        var carrierControl = Session.getModelController(CarrierControl.class);
339        var partyPK = getPartyPK();
340        var carrierOptionDetailValue = carrierControl.getCarrierOptionDetailValueForUpdate(carrierOption);
341        var carrierOptionDescription = carrierControl.getCarrierOptionDescriptionForUpdate(carrierOption, getPreferredLanguage());
342        var description = edit.getDescription();
343
344        carrierOptionDetailValue.setCarrierOptionName(edit.getCarrierOptionName());
345        carrierOptionDetailValue.setIsRecommended(Boolean.valueOf(edit.getIsRecommended()));
346        carrierOptionDetailValue.setIsRequired(Boolean.valueOf(edit.getIsRequired()));
347        carrierOptionDetailValue.setRecommendedGeoCodeSelectorPK(recommendedGeoCodeSelector.getPrimaryKey());
348        carrierOptionDetailValue.setRequiredGeoCodeSelectorPK(requiredGeoCodeSelector.getPrimaryKey());
349        carrierOptionDetailValue.setRecommendedItemSelectorPK(recommendedItemSelector.getPrimaryKey());
350        carrierOptionDetailValue.setRequiredItemSelectorPK(requiredItemSelector.getPrimaryKey());
351        carrierOptionDetailValue.setRecommendedOrderSelectorPK(recommendedOrderSelector.getPrimaryKey());
352        carrierOptionDetailValue.setRequiredOrderSelectorPK(requiredOrderSelector.getPrimaryKey());
353        carrierOptionDetailValue.setRecommendedShipmentSelectorPK(recommendedShipmentSelector.getPrimaryKey());
354        carrierOptionDetailValue.setRequiredShipmentSelectorPK(requiredShipmentSelector.getPrimaryKey());
355        carrierOptionDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
356        carrierOptionDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
357
358        carrierControl.updateCarrierOptionFromValue(carrierOptionDetailValue, partyPK);
359
360        if(carrierOptionDescription == null && description != null) {
361            carrierControl.createCarrierOptionDescription(carrierOption, getPreferredLanguage(), description, partyPK);
362        } else {
363            if(carrierOptionDescription != null && description == null) {
364                carrierControl.deleteCarrierOptionDescription(carrierOptionDescription, partyPK);
365            } else {
366                if(carrierOptionDescription != null && description != null) {
367                    var carrierOptionDescriptionValue = carrierControl.getCarrierOptionDescriptionValue(carrierOptionDescription);
368
369                    carrierOptionDescriptionValue.setDescription(description);
370                    carrierControl.updateCarrierOptionDescriptionFromValue(carrierOptionDescriptionValue, partyPK);
371                }
372            }
373        }
374    }
375    
376}