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.model.control.accounting.common.exception.DuplicateTransactionTimeException;
020import com.echothree.model.control.accounting.common.exception.UnknownTransactionTimeException;
021import com.echothree.model.control.accounting.common.exception.UnknownTransactionTimeTypeNameException;
022import com.echothree.model.control.accounting.common.transfer.TransactionTimeTransfer;
023import com.echothree.model.control.accounting.server.control.TransactionTimeControl;
024import com.echothree.model.data.accounting.server.entity.Transaction;
025import com.echothree.model.data.accounting.server.entity.TransactionTime;
026import com.echothree.model.data.accounting.server.entity.TransactionTimeType;
027import com.echothree.model.data.user.server.entity.UserVisit;
028import com.echothree.util.common.message.ExecutionErrors;
029import com.echothree.util.common.persistence.BasePK;
030import com.echothree.util.server.control.BaseLogic;
031import com.echothree.util.server.message.ExecutionErrorAccumulator;
032import java.util.List;
033import javax.enterprise.context.ApplicationScoped;
034import javax.inject.Inject;
035
036@ApplicationScoped
037public class TransactionTimeLogic
038        extends BaseLogic {
039
040    @Inject
041    TransactionTimeControl transactionTimeControl;
042
043    protected TransactionTimeLogic() {
044        super();
045    }
046
047    public TransactionTimeType getTransactionTimeTypeByName(final ExecutionErrorAccumulator eea, final String transactionTimeTypeName) {
048        var transactionTimeType = transactionTimeControl.getTransactionTimeTypeByName(transactionTimeTypeName);
049
050        if(transactionTimeType == null) {
051            handleExecutionError(UnknownTransactionTimeTypeNameException.class, eea, ExecutionErrors.UnknownTransactionTimeTypeName.name(), transactionTimeTypeName);
052        }
053
054        return transactionTimeType;
055    }
056
057    public void createTransactionTime(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName, final Long time, final BasePK partyPK) {
058        var transactionTimeType = transactionTimeControl.getTransactionTimeTypeByName(transactionTimeTypeName);
059
060        if(eea == null || !eea.hasExecutionErrors()) {
061            if(transactionTimeControl.transactionTimeExists(transaction, transactionTimeType)) {
062                handleExecutionError(DuplicateTransactionTimeException.class, eea, ExecutionErrors.DuplicateTransactionTime.name(),
063                        transaction.getLastDetail().getTransactionName(), transactionTimeTypeName);
064            } else {
065                transactionTimeControl.createTransactionTime(transaction, transactionTimeType, time, partyPK);
066            }
067        }
068    }
069
070    public void updateTransactionTime(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName, final Long time, final BasePK partyPK) {
071        var transactionTimeType = transactionTimeControl.getTransactionTimeTypeByName(transactionTimeTypeName);
072
073        if(eea == null || !eea.hasExecutionErrors()) {
074            var transactionTimeValue = transactionTimeControl.getTransactionTimeValueForUpdate(transaction, transactionTimeType);
075
076            if(transactionTimeValue == null) {
077                handleExecutionError(UnknownTransactionTimeException.class, eea, ExecutionErrors.UnknownTransactionTime.name(),
078                        transaction.getLastDetail().getTransactionName(), transactionTimeTypeName);
079            } else {
080                transactionTimeValue.setTime(time);
081                transactionTimeControl.updateTransactionTimeFromValue(transactionTimeValue, partyPK);
082            }
083        }
084    }
085
086    public void createOrUpdateTransactionTimeIfNotNull(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName, final Long time,
087            final BasePK partyPK) {
088        if(time != null) {
089            createOrUpdateTransactionTime(eea, transaction, transactionTimeTypeName, time, partyPK);
090        }
091    }
092
093    public void createOrUpdateTransactionTime(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName, final Long time,
094            final BasePK partyPK) {
095        var transactionTimeType = getTransactionTimeTypeByName(eea, transactionTimeTypeName);
096
097        if(eea == null || !eea.hasExecutionErrors()) {
098            var transactionTimeValue = transactionTimeControl.getTransactionTimeValueForUpdate(transaction, transactionTimeType);
099
100            if(transactionTimeValue == null) {
101                transactionTimeControl.createTransactionTime(transaction, transactionTimeType, time, partyPK);
102            } else {
103                transactionTimeValue.setTime(time);
104                transactionTimeControl.updateTransactionTimeFromValue(transactionTimeValue, partyPK);
105            }
106        }
107    }
108
109    private TransactionTime getTransactionTimeEntity(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName) {
110        var transactionTimeType = getTransactionTimeTypeByName(eea, transactionTimeTypeName);
111        TransactionTime result = null;
112
113        if(eea == null || !eea.hasExecutionErrors()) {
114            result = transactionTimeControl.getTransactionTimeForUpdate(transaction, transactionTimeType);
115
116            if(result == null) {
117                handleExecutionError(UnknownTransactionTimeException.class, eea, ExecutionErrors.UnknownTransactionTime.name(),
118                        transaction.getLastDetail().getTransactionName(), transactionTimeTypeName);
119            }
120        }
121
122        return result;
123    }
124
125    public Long getTransactionTime(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName) {
126        var transactionTime = getTransactionTimeEntity(eea, transaction, transactionTimeTypeName);
127        
128        return transactionTime == null ? null : transactionTime.getTime();
129    }
130
131    public TransactionTimeTransfer getTransactionTimeTransfer(final ExecutionErrorAccumulator eea, final UserVisit userVisit, final Transaction transaction, final String transactionTimeTypeName) {
132        var transactionTime = getTransactionTimeEntity(eea, transaction, transactionTimeTypeName);
133        
134        return transactionTime == null ? null : transactionTimeControl.getTransactionTimeTransfer(userVisit, transactionTime);
135    }
136
137    public List<TransactionTimeTransfer> getTransactionTimeTransfersByOrder(final ExecutionErrorAccumulator eea, final UserVisit userVisit, final Transaction transaction) {
138        return transactionTimeControl.getTransactionTimeTransfersByTransaction(userVisit, transaction);
139    }
140
141    public void deleteTransactionTime(final ExecutionErrorAccumulator eea, final Transaction transaction, final String transactionTimeTypeName, final BasePK deletedBy) {
142        var transactionTimeType = getTransactionTimeTypeByName(eea, transactionTimeTypeName);
143
144        if(eea == null || !eea.hasExecutionErrors()) {
145            var transactionTime = transactionTimeControl.getTransactionTimeForUpdate(transaction, transactionTimeType);
146
147            if(transactionTime == null) {
148                handleExecutionError(UnknownTransactionTimeException.class, eea, ExecutionErrors.UnknownTransactionTime.name(),
149                        transaction.getLastDetail().getTransactionName(), transactionTimeTypeName);
150            } else {
151                transactionTimeControl.deleteTransactionTime(transactionTime, deletedBy);
152            }
153        }
154    }
155
156}