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.model.control.associate.server.logic; 018 019import com.echothree.control.user.associate.common.spec.AssociatePartyContactMechanismUniversalSpec; 020import com.echothree.model.control.associate.common.exception.CannotDeleteAssociatePartyContactMechanismInUseException; 021import com.echothree.model.control.associate.common.exception.DuplicateAssociatePartyContactMechanismNameException; 022import com.echothree.model.control.associate.common.exception.UnknownAssociatePartyContactMechanismNameException; 023import com.echothree.model.control.associate.common.exception.UnknownDefaultAssociatePartyContactMechanismException; 024import com.echothree.model.control.associate.common.exception.UnknownDefaultAssociateProgramException; 025import com.echothree.model.control.associate.server.control.AssociateControl; 026import com.echothree.model.control.core.common.ComponentVendors; 027import com.echothree.model.control.core.common.EntityTypes; 028import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 029import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 030import com.echothree.model.data.associate.server.entity.Associate; 031import com.echothree.model.data.associate.server.entity.AssociatePartyContactMechanism; 032import com.echothree.model.data.associate.server.entity.AssociateProgram; 033import com.echothree.model.data.contact.server.entity.PartyContactMechanism; 034import com.echothree.util.common.message.ExecutionErrors; 035import com.echothree.util.common.persistence.BasePK; 036import com.echothree.util.server.control.BaseLogic; 037import com.echothree.util.server.message.ExecutionErrorAccumulator; 038import com.echothree.util.server.persistence.EntityPermission; 039import com.echothree.util.server.validation.ParameterUtils; 040import javax.enterprise.context.ApplicationScoped; 041import javax.enterprise.inject.spi.CDI; 042import javax.inject.Inject; 043 044@ApplicationScoped 045public class AssociatePartyContactMechanismLogic 046 extends BaseLogic { 047 048 @Inject 049 AssociateControl associateControl; 050 051 @Inject 052 EntityInstanceLogic entityInstanceLogic; 053 054 @Inject 055 AssociateLogic associateLogic; 056 057 @Inject 058 AssociateProgramLogic associateProgramLogic; 059 060 protected AssociatePartyContactMechanismLogic() { 061 super(); 062 } 063 064 public static AssociatePartyContactMechanismLogic getInstance() { 065 return CDI.current().select(AssociatePartyContactMechanismLogic.class).get(); 066 } 067 068 public AssociatePartyContactMechanism createAssociatePartyContactMechanism(final ExecutionErrorAccumulator eea, 069 final String associateProgramName, final String associateName, 070 final String associatePartyContactMechanismName, final PartyContactMechanism partyContactMechanism, 071 final Boolean isDefault, final Integer sortOrder, final BasePK createdBy) { 072 var associate = associateLogic.getAssociateByName(eea, associateProgramName, associateName); 073 AssociatePartyContactMechanism associatePartyContactMechanism = null; 074 075 if(eea == null || !eea.hasExecutionErrors()) { 076 associatePartyContactMechanism = createAssociatePartyContactMechanism(eea, associate, 077 associatePartyContactMechanismName, partyContactMechanism, isDefault, sortOrder, createdBy); 078 } 079 080 return associatePartyContactMechanism; 081 } 082 083 public AssociatePartyContactMechanism createAssociatePartyContactMechanism(final ExecutionErrorAccumulator eea, 084 final Associate associate, final String associatePartyContactMechanismName, 085 final PartyContactMechanism partyContactMechanism, final Boolean isDefault, final Integer sortOrder, 086 final BasePK createdBy) { 087 var associatePartyContactMechanism = associateControl.getAssociatePartyContactMechanismByName(associate, 088 associatePartyContactMechanismName); 089 090 if(associatePartyContactMechanism == null) { 091 associatePartyContactMechanism = associateControl.createAssociatePartyContactMechanism(associate, 092 associatePartyContactMechanismName, partyContactMechanism, isDefault, sortOrder, createdBy); 093 } else { 094 handleExecutionError(DuplicateAssociatePartyContactMechanismNameException.class, eea, 095 ExecutionErrors.DuplicateAssociatePartyContactMechanismName.name(), 096 associatePartyContactMechanismName); 097 } 098 099 return associatePartyContactMechanism; 100 } 101 102 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByName( 103 final ExecutionErrorAccumulator eea, final Associate associate, 104 final String associatePartyContactMechanismName, final EntityPermission entityPermission) { 105 var associatePartyContactMechanism = associateControl.getAssociatePartyContactMechanismByName(associate, 106 associatePartyContactMechanismName, entityPermission); 107 108 if(associatePartyContactMechanism == null) { 109 var associateDetail = associate.getLastDetail(); 110 111 handleExecutionError(UnknownAssociatePartyContactMechanismNameException.class, eea, 112 ExecutionErrors.UnknownAssociatePartyContactMechanismName.name(), 113 associateDetail.getAssociateProgram().getLastDetail().getAssociateProgramName(), 114 associateDetail.getAssociateName(), associatePartyContactMechanismName); 115 } 116 117 return associatePartyContactMechanism; 118 } 119 120 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByName( 121 final ExecutionErrorAccumulator eea, final Associate associate, 122 final String associatePartyContactMechanismName) { 123 return getAssociatePartyContactMechanismByName(eea, associate, associatePartyContactMechanismName, 124 EntityPermission.READ_ONLY); 125 } 126 127 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByNameForUpdate( 128 final ExecutionErrorAccumulator eea, final Associate associate, 129 final String associatePartyContactMechanismName) { 130 return getAssociatePartyContactMechanismByName(eea, associate, associatePartyContactMechanismName, 131 EntityPermission.READ_WRITE); 132 } 133 134 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByName( 135 final ExecutionErrorAccumulator eea, final String associateProgramName, final String associateName, 136 final String associatePartyContactMechanismName, final EntityPermission entityPermission) { 137 var associate = associateLogic.getAssociateByName(eea, associateProgramName, associateName); 138 AssociatePartyContactMechanism associatePartyContactMechanism = null; 139 140 if(eea == null || !eea.hasExecutionErrors()) { 141 associatePartyContactMechanism = getAssociatePartyContactMechanismByName(eea, associate, 142 associatePartyContactMechanismName, entityPermission); 143 } 144 145 return associatePartyContactMechanism; 146 } 147 148 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByName( 149 final ExecutionErrorAccumulator eea, final String associateProgramName, final String associateName, 150 final String associatePartyContactMechanismName) { 151 return getAssociatePartyContactMechanismByName(eea, associateProgramName, associateName, 152 associatePartyContactMechanismName, EntityPermission.READ_ONLY); 153 } 154 155 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByNameForUpdate( 156 final ExecutionErrorAccumulator eea, final String associateProgramName, final String associateName, 157 final String associatePartyContactMechanismName) { 158 return getAssociatePartyContactMechanismByName(eea, associateProgramName, associateName, 159 associatePartyContactMechanismName, EntityPermission.READ_WRITE); 160 } 161 162 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByUniversalSpec( 163 final ExecutionErrorAccumulator eea, final AssociatePartyContactMechanismUniversalSpec universalSpec, 164 final boolean allowDefault, final EntityPermission entityPermission) { 165 var associateProgramName = universalSpec.getAssociateProgramName(); 166 var associateName = universalSpec.getAssociateName(); 167 var associatePartyContactMechanismName = universalSpec.getAssociatePartyContactMechanismName(); 168 var nameParameterCount = ParameterUtils.getInstance().countNonNullParameters(associateProgramName, 169 associateName, associatePartyContactMechanismName); 170 var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 171 AssociatePartyContactMechanism associatePartyContactMechanism = null; 172 173 if(nameParameterCount < 4 && possibleEntitySpecs == 0) { 174 AssociateProgram associateProgram = null; 175 176 if(associateProgramName == null) { 177 if(allowDefault) { 178 associateProgram = associateControl.getDefaultAssociateProgram(); 179 180 if(associateProgram == null) { 181 handleExecutionError(UnknownDefaultAssociateProgramException.class, eea, 182 ExecutionErrors.UnknownDefaultAssociateProgram.name()); 183 } 184 } else { 185 handleExecutionError(InvalidParameterCountException.class, eea, 186 ExecutionErrors.InvalidParameterCount.name()); 187 } 188 } else { 189 associateProgram = associateProgramLogic.getAssociateProgramByName(eea, associateProgramName); 190 } 191 192 Associate associate = null; 193 194 if(eea == null || !eea.hasExecutionErrors()) { 195 if(associateName == null) { 196 handleExecutionError(InvalidParameterCountException.class, eea, 197 ExecutionErrors.InvalidParameterCount.name()); 198 } else { 199 associate = associateLogic.getAssociateByName(eea, associateProgram, associateName); 200 } 201 } 202 203 if(eea == null || !eea.hasExecutionErrors()) { 204 if(associatePartyContactMechanismName == null) { 205 if(allowDefault) { 206 associatePartyContactMechanism = associateControl 207 .getDefaultAssociatePartyContactMechanism(associate, entityPermission); 208 209 if(associatePartyContactMechanism == null) { 210 handleExecutionError(UnknownDefaultAssociatePartyContactMechanismException.class, eea, 211 ExecutionErrors.UnknownDefaultAssociatePartyContactMechanism.name(), 212 associateProgram.getLastDetail().getAssociateProgramName(), associateName); 213 } 214 } else { 215 handleExecutionError(InvalidParameterCountException.class, eea, 216 ExecutionErrors.InvalidParameterCount.name()); 217 } 218 } else { 219 associatePartyContactMechanism = getAssociatePartyContactMechanismByName(eea, associate, 220 associatePartyContactMechanismName, entityPermission); 221 } 222 } 223 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 224 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 225 ComponentVendors.ECHO_THREE.name(), EntityTypes.AssociatePartyContactMechanism.name()); 226 227 if(eea == null || !eea.hasExecutionErrors()) { 228 associatePartyContactMechanism = associateControl 229 .getAssociatePartyContactMechanismByEntityInstance(entityInstance, entityPermission); 230 } 231 } else { 232 handleExecutionError(InvalidParameterCountException.class, eea, 233 ExecutionErrors.InvalidParameterCount.name()); 234 } 235 236 return associatePartyContactMechanism; 237 } 238 239 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByUniversalSpec( 240 final ExecutionErrorAccumulator eea, final AssociatePartyContactMechanismUniversalSpec universalSpec, 241 final boolean allowDefault) { 242 return getAssociatePartyContactMechanismByUniversalSpec(eea, universalSpec, allowDefault, 243 EntityPermission.READ_ONLY); 244 } 245 246 public AssociatePartyContactMechanism getAssociatePartyContactMechanismByUniversalSpecForUpdate( 247 final ExecutionErrorAccumulator eea, final AssociatePartyContactMechanismUniversalSpec universalSpec, 248 final boolean allowDefault) { 249 return getAssociatePartyContactMechanismByUniversalSpec(eea, universalSpec, allowDefault, 250 EntityPermission.READ_WRITE); 251 } 252 253 public void deleteAssociatePartyContactMechanism(final ExecutionErrorAccumulator eea, 254 final AssociatePartyContactMechanism associatePartyContactMechanism, final BasePK deletedBy) { 255 var associateReferralCount = associateControl 256 .countAssociateReferralsByAssociatePartyContactMechanism(associatePartyContactMechanism); 257 258 if(associateReferralCount == 0) { 259 associateControl.deleteAssociatePartyContactMechanism(associatePartyContactMechanism, deletedBy); 260 } else { 261 var associatePartyContactMechanismDetail = associatePartyContactMechanism.getLastDetail(); 262 var associateDetail = associatePartyContactMechanismDetail.getAssociate().getLastDetail(); 263 264 handleExecutionError(CannotDeleteAssociatePartyContactMechanismInUseException.class, eea, 265 ExecutionErrors.CannotDeleteAssociatePartyContactMechanismInUse.name(), 266 associateDetail.getAssociateProgram().getLastDetail().getAssociateProgramName(), 267 associateDetail.getAssociateName(), 268 associatePartyContactMechanismDetail.getAssociatePartyContactMechanismName()); 269 } 270 } 271 272}