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.period.server.logic; 018 019import com.echothree.control.user.period.common.spec.PeriodKindDescriptionSpec; 020import com.echothree.control.user.period.common.spec.PeriodKindUniversalSpec; 021import com.echothree.model.control.core.common.ComponentVendors; 022import com.echothree.model.control.core.common.EntityTypes; 023import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 024import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 025import com.echothree.model.control.party.server.logic.LanguageLogic; 026import com.echothree.model.control.period.common.exception.DuplicatePeriodKindNameException; 027import com.echothree.model.control.period.common.exception.UnknownDefaultPeriodKindException; 028import com.echothree.model.control.period.common.exception.UnknownPeriodKindDescriptionException; 029import com.echothree.model.control.period.common.exception.UnknownPeriodKindNameException; 030import com.echothree.model.control.period.server.control.PeriodControl; 031import com.echothree.model.data.party.server.entity.Language; 032import com.echothree.model.data.period.server.entity.PeriodKind; 033import com.echothree.model.data.period.server.entity.PeriodKindDescription; 034import com.echothree.model.data.workflow.server.entity.WorkflowEntrance; 035import com.echothree.util.common.message.ExecutionErrors; 036import com.echothree.util.common.persistence.BasePK; 037import com.echothree.util.server.control.BaseLogic; 038import com.echothree.util.server.message.ExecutionErrorAccumulator; 039import com.echothree.util.server.persistence.EntityPermission; 040import javax.enterprise.context.ApplicationScoped; 041import javax.inject.Inject; 042 043@ApplicationScoped 044public class PeriodKindLogic 045 extends BaseLogic { 046 047 @Inject 048 PeriodControl periodControl; 049 050 @Inject 051 EntityInstanceLogic entityInstanceLogic; 052 053 @Inject 054 LanguageLogic languageLogic; 055 056 protected PeriodKindLogic() { 057 super(); 058 } 059 060 public PeriodKind createPeriodKind(final ExecutionErrorAccumulator eea, final String periodKindName, 061 final WorkflowEntrance workflowEntrance, final Boolean isDefault, final Integer sortOrder, 062 final Language language, final String description, final BasePK createdBy) { 063 var periodKind = periodControl.getPeriodKindByName(periodKindName); 064 065 if(periodKind == null) { 066 periodKind = periodControl.createPeriodKind(periodKindName, workflowEntrance, isDefault, sortOrder, createdBy); 067 068 if(description != null) { 069 periodControl.createPeriodKindDescription(periodKind, language, description, createdBy); 070 } 071 } else { 072 handleExecutionError(DuplicatePeriodKindNameException.class, eea, ExecutionErrors.DuplicatePeriodKindName.name(), periodKindName); 073 } 074 075 return periodKind; 076 } 077 078 public PeriodKind getPeriodKindByName(final ExecutionErrorAccumulator eea, final String periodKindName, 079 final EntityPermission entityPermission) { 080 var periodKind = periodControl.getPeriodKindByName(periodKindName, entityPermission); 081 082 if(periodKind == null) { 083 handleExecutionError(UnknownPeriodKindNameException.class, eea, ExecutionErrors.UnknownPeriodKindName.name(), periodKindName); 084 } 085 086 return periodKind; 087 } 088 089 public PeriodKind getPeriodKindByName(final ExecutionErrorAccumulator eea, final String periodKindName) { 090 return getPeriodKindByName(eea, periodKindName, EntityPermission.READ_ONLY); 091 } 092 093 public PeriodKind getPeriodKindByNameForUpdate(final ExecutionErrorAccumulator eea, final String periodKindName) { 094 return getPeriodKindByName(eea, periodKindName, EntityPermission.READ_WRITE); 095 } 096 097 public PeriodKind getPeriodKindByUniversalSpec(final ExecutionErrorAccumulator eea, 098 final PeriodKindUniversalSpec universalSpec, boolean allowDefault, final EntityPermission entityPermission) { 099 PeriodKind periodKind = null; 100 var periodKindName = universalSpec.getPeriodKindName(); 101 var parameterCount = (periodKindName == null ? 0 : 1) + entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 102 103 switch(parameterCount) { 104 case 0 -> { 105 if(allowDefault) { 106 periodKind = periodControl.getDefaultPeriodKind(entityPermission); 107 108 if(periodKind == null) { 109 handleExecutionError(UnknownDefaultPeriodKindException.class, eea, ExecutionErrors.UnknownDefaultPeriodKind.name()); 110 } 111 } else { 112 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 113 } 114 } 115 case 1 -> { 116 if(periodKindName == null) { 117 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 118 ComponentVendors.ECHO_THREE.name(), EntityTypes.PeriodKind.name()); 119 120 if(eea == null || !eea.hasExecutionErrors()) { 121 periodKind = periodControl.getPeriodKindByEntityInstance(entityInstance, entityPermission); 122 } 123 } else { 124 periodKind = getPeriodKindByName(eea, periodKindName, entityPermission); 125 } 126 } 127 default -> 128 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 129 } 130 131 return periodKind; 132 } 133 134 public PeriodKind getPeriodKindByUniversalSpec(final ExecutionErrorAccumulator eea, 135 final PeriodKindUniversalSpec universalSpec, boolean allowDefault) { 136 return getPeriodKindByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 137 } 138 139 public PeriodKind getPeriodKindByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 140 final PeriodKindUniversalSpec universalSpec, boolean allowDefault) { 141 return getPeriodKindByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 142 } 143 144 public PeriodKindDescription getPeriodKindDescriptionBySpec(final ExecutionErrorAccumulator eea, 145 final PeriodKindDescriptionSpec spec, final EntityPermission entityPermission) { 146 PeriodKindDescription periodKindDescription = null; 147 var periodKindName = spec.getPeriodKindName(); 148 var periodKind = getPeriodKindByName(eea, periodKindName); 149 150 if(!hasExecutionErrors(eea)) { 151 var languageIsoName = spec.getLanguageIsoName(); 152 var language = languageLogic.getLanguageByName(eea, languageIsoName); 153 154 if(!hasExecutionErrors(eea)) { 155 periodKindDescription = periodControl.getPeriodKindDescription(periodKind, language, entityPermission); 156 157 if(periodKindDescription == null) { 158 handleExecutionError(UnknownPeriodKindDescriptionException.class, eea, ExecutionErrors.UnknownPeriodKindDescription.name(), periodKindName, languageIsoName); 159 } 160 } 161 } 162 163 return periodKindDescription; 164 } 165 166 public void deletePeriodKind(final ExecutionErrorAccumulator eea, final PeriodKind periodKind, 167 final BasePK deletedBy) { 168 periodControl.deletePeriodKind(periodKind, deletedBy); 169 } 170 171}