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