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