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