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