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.AssociateUniversalSpec; 020import com.echothree.model.control.associate.common.exception.CannotDeleteAssociateInUseException; 021import com.echothree.model.control.associate.common.exception.DuplicateAssociateNameException; 022import com.echothree.model.control.associate.common.exception.UnknownAssociateNameException; 023import com.echothree.model.control.associate.common.exception.UnknownDefaultAssociateProgramException; 024import com.echothree.model.control.associate.server.control.AssociateControl; 025import com.echothree.model.control.core.common.ComponentVendors; 026import com.echothree.model.control.core.common.EntityTypes; 027import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 028import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 029import com.echothree.model.data.associate.server.entity.Associate; 030import com.echothree.model.data.associate.server.entity.AssociateProgram; 031import com.echothree.model.data.core.server.entity.MimeType; 032import com.echothree.model.data.party.server.entity.Party; 033import com.echothree.util.common.message.ExecutionErrors; 034import com.echothree.util.common.persistence.BasePK; 035import com.echothree.util.server.control.BaseLogic; 036import com.echothree.util.server.message.ExecutionErrorAccumulator; 037import com.echothree.util.server.persistence.EntityPermission; 038import com.echothree.util.server.validation.ParameterUtils; 039import javax.enterprise.context.ApplicationScoped; 040import javax.enterprise.inject.spi.CDI; 041import javax.inject.Inject; 042 043@ApplicationScoped 044public class AssociateLogic 045 extends BaseLogic { 046 047 @Inject 048 AssociateControl associateControl; 049 050 @Inject 051 EntityInstanceLogic entityInstanceLogic; 052 053 @Inject 054 AssociateProgramLogic associateProgramLogic; 055 056 protected AssociateLogic() { 057 super(); 058 } 059 060 public static AssociateLogic getInstance() { 061 return CDI.current().select(AssociateLogic.class).get(); 062 } 063 064 public Associate createAssociate(final ExecutionErrorAccumulator eea, final String associateProgramName, 065 final String associateName, final Party party, final String description, final MimeType summaryMimeType, 066 final String summary, final BasePK createdBy) { 067 var associateProgram = associateProgramLogic.getAssociateProgramByName(eea, associateProgramName); 068 Associate associate = null; 069 070 if(eea == null || !eea.hasExecutionErrors()) { 071 associate = createAssociate(eea, associateProgram, associateName, party, description, summaryMimeType, 072 summary, createdBy); 073 } 074 075 return associate; 076 } 077 078 public Associate createAssociate(final ExecutionErrorAccumulator eea, final AssociateProgram associateProgram, 079 final String associateName, final Party party, final String description, final MimeType summaryMimeType, 080 final String summary, final BasePK createdBy) { 081 var associate = associateControl.getAssociateByName(associateProgram, associateName); 082 083 if(associate == null) { 084 associate = associateControl.createAssociate(associateProgram, associateName, party, description, 085 summaryMimeType, summary, createdBy); 086 } else { 087 handleExecutionError(DuplicateAssociateNameException.class, eea, 088 ExecutionErrors.DuplicateAssociateName.name(), associateName); 089 } 090 091 return associate; 092 } 093 094 public Associate getAssociateByName(final ExecutionErrorAccumulator eea, final AssociateProgram associateProgram, 095 final String associateName, final EntityPermission entityPermission) { 096 var associate = associateControl.getAssociateByName(associateProgram, associateName, entityPermission); 097 098 if(associate == null) { 099 handleExecutionError(UnknownAssociateNameException.class, eea, ExecutionErrors.UnknownAssociateName.name(), 100 associateProgram.getLastDetail().getAssociateProgramName(), associateName); 101 } 102 103 return associate; 104 } 105 106 public Associate getAssociateByName(final ExecutionErrorAccumulator eea, final AssociateProgram associateProgram, 107 final String associateName) { 108 return getAssociateByName(eea, associateProgram, associateName, EntityPermission.READ_ONLY); 109 } 110 111 public Associate getAssociateByNameForUpdate(final ExecutionErrorAccumulator eea, 112 final AssociateProgram associateProgram, final String associateName) { 113 return getAssociateByName(eea, associateProgram, associateName, EntityPermission.READ_WRITE); 114 } 115 116 public Associate getAssociateByName(final ExecutionErrorAccumulator eea, final String associateProgramName, 117 final String associateName, final EntityPermission entityPermission) { 118 var associateProgram = associateProgramLogic.getAssociateProgramByName(eea, associateProgramName); 119 Associate associate = null; 120 121 if(eea == null || !eea.hasExecutionErrors()) { 122 associate = getAssociateByName(eea, associateProgram, associateName, entityPermission); 123 } 124 125 return associate; 126 } 127 128 public Associate getAssociateByName(final ExecutionErrorAccumulator eea, final String associateProgramName, 129 final String associateName) { 130 return getAssociateByName(eea, associateProgramName, associateName, EntityPermission.READ_ONLY); 131 } 132 133 public Associate getAssociateByNameForUpdate(final ExecutionErrorAccumulator eea, 134 final String associateProgramName, final String associateName) { 135 return getAssociateByName(eea, associateProgramName, associateName, EntityPermission.READ_WRITE); 136 } 137 138 public Associate getAssociateByUniversalSpec(final ExecutionErrorAccumulator eea, 139 final AssociateUniversalSpec universalSpec, final boolean allowDefault, 140 final EntityPermission entityPermission) { 141 var associateProgramName = universalSpec.getAssociateProgramName(); 142 var associateName = universalSpec.getAssociateName(); 143 var nameParameterCount = ParameterUtils.getInstance().countNonNullParameters(associateProgramName, 144 associateName); 145 var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 146 Associate associate = null; 147 148 if(nameParameterCount < 3 && possibleEntitySpecs == 0) { 149 AssociateProgram associateProgram = null; 150 151 if(associateProgramName == null) { 152 if(allowDefault) { 153 associateProgram = associateControl.getDefaultAssociateProgram(); 154 155 if(associateProgram == null) { 156 handleExecutionError(UnknownDefaultAssociateProgramException.class, eea, 157 ExecutionErrors.UnknownDefaultAssociateProgram.name()); 158 } 159 } else { 160 handleExecutionError(InvalidParameterCountException.class, eea, 161 ExecutionErrors.InvalidParameterCount.name()); 162 } 163 } else { 164 associateProgram = associateProgramLogic.getAssociateProgramByName(eea, associateProgramName); 165 } 166 167 if(eea == null || !eea.hasExecutionErrors()) { 168 if(associateName == null) { 169 handleExecutionError(InvalidParameterCountException.class, eea, 170 ExecutionErrors.InvalidParameterCount.name()); 171 } else { 172 associate = getAssociateByName(eea, associateProgram, associateName, entityPermission); 173 } 174 } 175 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 176 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 177 ComponentVendors.ECHO_THREE.name(), EntityTypes.Associate.name()); 178 179 if(eea == null || !eea.hasExecutionErrors()) { 180 associate = associateControl.getAssociateByEntityInstance(entityInstance, entityPermission); 181 } 182 } else { 183 handleExecutionError(InvalidParameterCountException.class, eea, 184 ExecutionErrors.InvalidParameterCount.name()); 185 } 186 187 return associate; 188 } 189 190 public Associate getAssociateByUniversalSpec(final ExecutionErrorAccumulator eea, 191 final AssociateUniversalSpec universalSpec, final boolean allowDefault) { 192 return getAssociateByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 193 } 194 195 public Associate getAssociateByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 196 final AssociateUniversalSpec universalSpec, final boolean allowDefault) { 197 return getAssociateByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 198 } 199 200 public void deleteAssociate(final ExecutionErrorAccumulator eea, final Associate associate, 201 final BasePK deletedBy) { 202 var associatePartyContactMechanismCount = associateControl 203 .countAssociatePartyContactMechanismsByAssociate(associate); 204 var associateReferralCount = associateControl.countAssociateReferralsByAssociate(associate); 205 206 if(associatePartyContactMechanismCount == 0 && associateReferralCount == 0) { 207 associateControl.deleteAssociate(associate, deletedBy); 208 } else { 209 var associateDetail = associate.getLastDetail(); 210 211 handleExecutionError(CannotDeleteAssociateInUseException.class, eea, 212 ExecutionErrors.CannotDeleteAssociateInUse.name(), 213 associateDetail.getAssociateProgram().getLastDetail().getAssociateProgramName(), 214 associateDetail.getAssociateName()); 215 } 216 } 217 218}