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}