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.model.control.chain.server.logic; 018 019import com.echothree.model.control.chain.common.ChainConstants; 020import com.echothree.model.control.chain.server.control.ChainControl; 021import com.echothree.model.control.contactlist.server.control.ContactListControl; 022import com.echothree.model.control.core.common.ComponentVendors; 023import com.echothree.model.control.core.common.EntityTypes; 024import com.echothree.model.control.core.server.control.ComponentControl; 025import com.echothree.model.control.core.server.control.EntityTypeControl; 026import com.echothree.model.control.letter.server.control.LetterControl; 027import com.echothree.model.control.party.server.logic.PartyLogic; 028import com.echothree.model.data.chain.server.entity.ChainAction; 029import com.echothree.model.data.chain.server.entity.ChainInstance; 030import com.echothree.model.data.chain.server.entity.ChainInstanceStatus; 031import com.echothree.util.common.persistence.BasePK; 032import com.echothree.util.server.persistence.Session; 033import javax.enterprise.context.ApplicationScoped; 034import javax.enterprise.inject.spi.CDI; 035 036@ApplicationScoped 037public class ChainInstanceStatusLogic { 038 039 protected ChainInstanceStatusLogic() { 040 super(); 041 } 042 043 public static ChainInstanceStatusLogic getInstance() { 044 return CDI.current().select(ChainInstanceStatusLogic.class).get(); 045 } 046 047 private void processChainActionLetter(final ChainControl chainControl, final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) { 048 var chainActionLetter = chainControl.getChainActionLetter(chainAction); 049 var letter = chainActionLetter.getLetter(); 050 var contactList = letter.getLastDetail().getContactList(); 051 052 if(contactList != null) { 053 var entityTypeControl = Session.getModelController(EntityTypeControl.class); 054 var componentControl = Session.getModelController(ComponentControl.class); 055 var chainType = chainInstance.getLastDetail().getChain().getLastDetail().getChainType(); 056 var partyEntityType = entityTypeControl.getEntityTypeByName(componentControl.getComponentVendorByName(ComponentVendors.ECHO_THREE.name()), EntityTypes.Party.name()); 057 058 for(var chainEntityRoleType: chainControl.getChainEntityRoleTypes(chainType)) { 059 if(chainEntityRoleType.getLastDetail().getEntityType().equals(partyEntityType)) { 060 var chainInstanceEntityRole = chainControl.getChainInstanceEntityRole(chainInstance, chainEntityRoleType); 061 062 if(chainInstanceEntityRole != null) { 063 var contactListControl = Session.getModelController(ContactListControl.class); 064 var entityInstance = chainInstanceEntityRole.getEntityInstance(); 065 var party = PartyLogic.getInstance().getPartyFromEntityInstance(entityInstance); 066 var partyContactList = contactListControl.getPartyContactList(party, contactList); 067 068 if(partyContactList == null) { 069 letter = null; // Don't send. 070 } 071 } 072 } 073 } 074 } 075 076 if(letter != null) { 077 var letterControl = Session.getModelController(LetterControl.class); 078 079 letterControl.createQueuedLetter(chainInstance, letter); 080 } 081 } 082 083 private void processChainActionSurvey(final ChainControl chainControl, final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) { 084 var chainActionSurvey = chainControl.getChainActionSurvey(chainAction); 085 086 // TODO 087 } 088 089 private void processChainActionChainActionSet(final Session session, final ChainControl chainControl, final ChainInstanceStatus chainInstanceStatus, final ChainAction chainAction, final BasePK processedBy) { 090 var chainActionChainActionSet = chainControl.getChainActionChainActionSet(chainAction); 091 var nextChainActionSet = chainActionChainActionSet.getNextChainActionSet(); 092 Long nextChainActionSetTime = session.START_TIME + chainActionChainActionSet.getDelayTime(); 093 094 chainInstanceStatus.setNextChainActionSet(nextChainActionSet); 095 chainInstanceStatus.setNextChainActionSetTime(nextChainActionSetTime); 096 } 097 098 public void processChainInstanceStatus(final Session session, final ChainControl chainControl, final ChainInstanceStatus chainInstanceStatus, final BasePK processedBy) { 099 var chainInstance = chainInstanceStatus.getChainInstance(); 100 var chainActionSet = chainInstanceStatus.getNextChainActionSet(); 101 var hasNextChainActionSet = false; 102 103 for(var chainAction: chainControl.getChainActionsByChainActionSet(chainActionSet)) { 104 var chainActionTypeName = chainAction.getLastDetail().getChainActionType().getLastDetail().getChainActionTypeName(); 105 106 if(chainActionTypeName.equals(ChainConstants.ChainActionType_LETTER)) { 107 processChainActionLetter(chainControl, chainInstance, chainAction, processedBy); 108 } else if(chainActionTypeName.equals(ChainConstants.ChainActionType_SURVEY)) { 109 processChainActionSurvey(chainControl, chainInstance, chainAction, processedBy); 110 } else if(chainActionTypeName.equals(ChainConstants.ChainActionType_CHAIN_ACTION_SET)) { 111 processChainActionChainActionSet(session, chainControl, chainInstanceStatus, chainAction, processedBy); 112 hasNextChainActionSet = true; 113 } 114 } 115 116 if(!hasNextChainActionSet) { 117 chainControl.removeChainInstanceStatusByChainInstance(chainInstance); 118 } 119 } 120 121}