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.accounting.server.logic; 018 019import com.echothree.control.user.accounting.common.spec.TransactionGlAccountCategoryUniversalSpec; 020import com.echothree.model.control.accounting.common.exception.DuplicateTransactionGlAccountCategoryNameException; 021import com.echothree.model.control.accounting.common.exception.UnknownTransactionGlAccountCategoryNameException; 022import com.echothree.model.control.accounting.server.control.AccountingControl; 023import com.echothree.model.control.core.common.ComponentVendors; 024import com.echothree.model.control.core.common.EntityTypes; 025import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 026import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 027import com.echothree.model.data.accounting.server.entity.GlAccountCategory; 028import com.echothree.model.data.accounting.server.entity.TransactionGlAccountCategory; 029import com.echothree.model.data.accounting.server.entity.TransactionType; 030import com.echothree.model.data.party.server.entity.Language; 031import com.echothree.util.common.message.ExecutionErrors; 032import com.echothree.util.common.persistence.BasePK; 033import com.echothree.util.server.control.BaseLogic; 034import com.echothree.util.server.message.ExecutionErrorAccumulator; 035import com.echothree.util.server.persistence.EntityPermission; 036import com.echothree.util.server.persistence.Session; 037import com.echothree.util.server.validation.ParameterUtils; 038import javax.enterprise.context.ApplicationScoped; 039import javax.enterprise.inject.spi.CDI; 040 041@ApplicationScoped 042public class TransactionGlAccountCategoryLogic 043 extends BaseLogic { 044 045 protected TransactionGlAccountCategoryLogic() { 046 super(); 047 } 048 049 public static TransactionGlAccountCategoryLogic getInstance() { 050 return CDI.current().select(TransactionGlAccountCategoryLogic.class).get(); 051 } 052 053 public TransactionGlAccountCategory createTransactionGlAccountCategory(final ExecutionErrorAccumulator eea, final String transactionTypeName, 054 final String transactionGlAccountCategoryName, final GlAccountCategory glAccountCategory, final Integer sortOrder, 055 final Language language, final String description, final BasePK createdBy) { 056 var transactionType = TransactionTypeLogic.getInstance().getTransactionTypeByName(eea, transactionTypeName); 057 TransactionGlAccountCategory transactionGlAccountCategory = null; 058 059 if(eea == null || !eea.hasExecutionErrors()) { 060 transactionGlAccountCategory = createTransactionGlAccountCategory(eea, transactionType, transactionGlAccountCategoryName, 061 glAccountCategory, sortOrder, language, description, createdBy); 062 } 063 064 return transactionGlAccountCategory; 065 } 066 067 public TransactionGlAccountCategory createTransactionGlAccountCategory(final ExecutionErrorAccumulator eea, final TransactionType transactionType, 068 final String transactionGlAccountCategoryName, final GlAccountCategory glAccountCategory, final Integer sortOrder, final Language language, 069 final String description, final BasePK createdBy) { 070 var accountingControl = Session.getModelController(AccountingControl.class); 071 var transactionGlAccountCategory = accountingControl.getTransactionGlAccountCategoryByName(transactionType, transactionGlAccountCategoryName); 072 073 if(transactionGlAccountCategory == null) { 074 transactionGlAccountCategory = accountingControl.createTransactionGlAccountCategory(transactionType, transactionGlAccountCategoryName, 075 glAccountCategory, sortOrder, createdBy); 076 077 if(description != null) { 078 accountingControl.createTransactionGlAccountCategoryDescription(transactionGlAccountCategory, language, description, createdBy); 079 } 080 } else { 081 handleExecutionError(DuplicateTransactionGlAccountCategoryNameException.class, eea, ExecutionErrors.DuplicateTransactionGlAccountCategoryName.name(), transactionGlAccountCategoryName); 082 } 083 return transactionGlAccountCategory; 084 } 085 086 public TransactionGlAccountCategory getTransactionGlAccountCategoryByName(final ExecutionErrorAccumulator eea, 087 final TransactionType transactionType, final String transactionGlAccountCategoryName, 088 final EntityPermission entityPermission) { 089 var accountingControl = Session.getModelController(AccountingControl.class); 090 var transactionGlAccountCategory = accountingControl.getTransactionGlAccountCategoryByName(transactionType, transactionGlAccountCategoryName, entityPermission); 091 092 if(transactionGlAccountCategory == null) { 093 handleExecutionError(UnknownTransactionGlAccountCategoryNameException.class, eea, ExecutionErrors.UnknownTransactionGlAccountCategoryName.name(), 094 transactionType.getLastDetail().getTransactionTypeName(), transactionGlAccountCategoryName); 095 } 096 097 return transactionGlAccountCategory; 098 } 099 100 public TransactionGlAccountCategory getTransactionGlAccountCategoryByName(final ExecutionErrorAccumulator eea, 101 final TransactionType transactionType, final String transactionGlAccountCategoryName) { 102 return getTransactionGlAccountCategoryByName(eea, transactionType, transactionGlAccountCategoryName, EntityPermission.READ_ONLY); 103 } 104 105 public TransactionGlAccountCategory getTransactionGlAccountCategoryByNameForUpdate(final ExecutionErrorAccumulator eea, 106 final TransactionType transactionType, final String transactionGlAccountCategoryName) { 107 return getTransactionGlAccountCategoryByName(eea, transactionType, transactionGlAccountCategoryName, EntityPermission.READ_WRITE); 108 } 109 110 public TransactionGlAccountCategory getTransactionGlAccountCategoryByName(final ExecutionErrorAccumulator eea, 111 final String transactionTypeName, final String transactionGlAccountCategoryName, 112 final EntityPermission entityPermission) { 113 var transactionType = TransactionTypeLogic.getInstance().getTransactionTypeByName(eea, transactionTypeName); 114 TransactionGlAccountCategory transactionGlAccountCategory = null; 115 116 if(!eea.hasExecutionErrors()) { 117 transactionGlAccountCategory = getTransactionGlAccountCategoryByName(eea, transactionType, transactionGlAccountCategoryName, entityPermission); 118 } 119 120 return transactionGlAccountCategory; 121 } 122 123 public TransactionGlAccountCategory getTransactionGlAccountCategoryByName(final ExecutionErrorAccumulator eea, 124 final String transactionTypeName, final String transactionGlAccountCategoryName) { 125 return getTransactionGlAccountCategoryByName(eea, transactionTypeName, transactionGlAccountCategoryName, EntityPermission.READ_ONLY); 126 } 127 128 public TransactionGlAccountCategory getTransactionGlAccountCategoryByNameForUpdate(final ExecutionErrorAccumulator eea, 129 final String transactionTypeName, final String transactionGlAccountCategoryName) { 130 return getTransactionGlAccountCategoryByName(eea, transactionTypeName, transactionGlAccountCategoryName, EntityPermission.READ_WRITE); 131 } 132 133 public TransactionGlAccountCategory getTransactionGlAccountCategoryByUniversalSpec(final ExecutionErrorAccumulator eea, 134 final TransactionGlAccountCategoryUniversalSpec universalSpec, final EntityPermission entityPermission) { 135 var accountingControl = Session.getModelController(AccountingControl.class); 136 var transactionTypeName = universalSpec.getTransactionTypeName(); 137 var transactionGlAccountCategoryName = universalSpec.getTransactionGlAccountCategoryName(); 138 var nameParameterCount= ParameterUtils.getInstance().countNonNullParameters(transactionTypeName, transactionGlAccountCategoryName); 139 var possibleEntitySpecs= EntityInstanceLogic.getInstance().countPossibleEntitySpecs(universalSpec); 140 TransactionGlAccountCategory transactionGlAccountCategory = null; 141 142 if(nameParameterCount == 2 && possibleEntitySpecs == 0) { 143 var transactionType = TransactionTypeLogic.getInstance().getTransactionTypeByName(eea, transactionTypeName); 144 145 if(!eea.hasExecutionErrors()) { 146 transactionGlAccountCategory = getTransactionGlAccountCategoryByName(eea, transactionType, transactionGlAccountCategoryName, entityPermission); 147 } 148 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 149 var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, universalSpec, 150 ComponentVendors.ECHO_THREE.name(), EntityTypes.TransactionGlAccountCategory.name()); 151 152 if(!eea.hasExecutionErrors()) { 153 transactionGlAccountCategory = accountingControl.getTransactionGlAccountCategoryByEntityInstance(entityInstance, entityPermission); 154 } 155 } else { 156 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 157 } 158 159 return transactionGlAccountCategory; 160 } 161 162 public TransactionGlAccountCategory getTransactionGlAccountCategoryByUniversalSpec(final ExecutionErrorAccumulator eea, 163 final TransactionGlAccountCategoryUniversalSpec universalSpec) { 164 return getTransactionGlAccountCategoryByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY); 165 } 166 167 public TransactionGlAccountCategory getTransactionGlAccountCategoryByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 168 final TransactionGlAccountCategoryUniversalSpec universalSpec) { 169 return getTransactionGlAccountCategoryByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE); 170 } 171 172 public void deleteTransactionGlAccountCategory(final ExecutionErrorAccumulator eea, final TransactionGlAccountCategory transactionGlAccountCategory, 173 final BasePK deletedBy) { 174 var accountingControl = Session.getModelController(AccountingControl.class); 175 176 accountingControl.deleteTransactionGlAccountCategory(transactionGlAccountCategory, deletedBy); 177 } 178 179}