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