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}