001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 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.invoice.server.logic;
018
019import com.echothree.model.control.invoice.server.control.InvoiceControl;
020import com.echothree.model.data.invoice.server.entity.Invoice;
021import com.echothree.model.data.invoice.server.entity.InvoiceDetail;
022import com.echothree.model.data.invoice.server.entity.InvoiceTime;
023import com.echothree.model.data.invoice.server.entity.InvoiceTimeType;
024import com.echothree.model.data.invoice.server.entity.InvoiceType;
025import com.echothree.model.data.invoice.server.value.InvoiceTimeValue;
026import com.echothree.util.common.message.ExecutionErrors;
027import com.echothree.util.common.persistence.BasePK;
028import com.echothree.util.server.message.ExecutionErrorAccumulator;
029import com.echothree.util.server.persistence.Session;
030
031public class InvoiceTimeLogic {
032
033    private InvoiceTimeLogic() {
034        super();
035    }
036
037    private static class InvoiceTimeLogicHolder {
038        static InvoiceTimeLogic instance = new InvoiceTimeLogic();
039    }
040
041    public static InvoiceTimeLogic getInstance() {
042        return InvoiceTimeLogicHolder.instance;
043    }
044
045    private String getInvoiceTypeName(InvoiceType invoiceType) {
046        return invoiceType.getLastDetail().getInvoiceTypeName();
047    }
048
049    public void createOrUpdateInvoiceTimeIfNotNull(final ExecutionErrorAccumulator ema, final Invoice invoice, final String invoiceTimeTypeName, final Long time,
050            final BasePK partyPK) {
051        if(time != null) {
052            createOrUpdateInvoiceTime(ema, invoice, invoiceTimeTypeName, time, partyPK);
053        }
054    }
055
056    public void createOrUpdateInvoiceTime(final ExecutionErrorAccumulator ema, final Invoice invoice, final String invoiceTimeTypeName, final Long time,
057            final BasePK partyPK) {
058        var invoiceControl = Session.getModelController(InvoiceControl.class);
059        InvoiceDetail invoiceDetail = invoice.getLastDetail();
060        InvoiceType invoiceType = invoiceDetail.getInvoiceType();
061        InvoiceTimeType invoiceTimeType = invoiceControl.getInvoiceTimeTypeByName(invoiceType, invoiceTimeTypeName);
062
063        if(invoiceTimeType == null) {
064            if(ema != null) {
065                ema.addExecutionError(ExecutionErrors.UnknownInvoiceTimeTypeName.name(), getInvoiceTypeName(invoiceType), invoiceTimeTypeName);
066            }
067        } else {
068            InvoiceTimeValue invoiceTimeValue = invoiceControl.getInvoiceTimeValueForUpdate(invoice, invoiceTimeType);
069
070            if(invoiceTimeValue == null) {
071                invoiceControl.createInvoiceTime(invoice, invoiceTimeType, time, partyPK);
072            } else {
073                invoiceTimeValue.setTime(time);
074                invoiceControl.updateInvoiceTimeFromValue(invoiceTimeValue, partyPK);
075            }
076        }
077    }
078
079    public Long getInvoiceTime(final ExecutionErrorAccumulator ema, final Invoice invoice, final String invoiceTimeTypeName) {
080        var invoiceControl = Session.getModelController(InvoiceControl.class);
081        InvoiceDetail invoiceDetail = invoice.getLastDetail();
082        InvoiceType invoiceType = invoiceDetail.getInvoiceType();
083        InvoiceTimeType invoiceTimeType = invoiceControl.getInvoiceTimeTypeByName(invoiceType, invoiceTimeTypeName);
084        Long result = null;
085
086        if(invoiceTimeType == null) {
087            if(ema != null) {
088                ema.addExecutionError(ExecutionErrors.UnknownInvoiceTimeTypeName.name(), getInvoiceTypeName(invoiceType), invoiceTimeTypeName);
089            }
090        } else {
091            InvoiceTime invoiceTime = invoiceControl.getInvoiceTime(invoice, invoiceTimeType);
092
093            if(invoiceTime == null) {
094                if(ema != null) {
095                    ema.addExecutionError(ExecutionErrors.UnknownInvoiceTime.name(), getInvoiceTypeName(invoiceType), invoiceDetail.getInvoiceName(), invoiceTimeTypeName);
096                }
097            } else {
098                result = invoiceTime.getTime();
099            }
100        }
101
102        return result;
103    }
104
105    public void deleteInvoiceTime(final ExecutionErrorAccumulator ema, final Invoice invoice, final String invoiceTimeTypeName, final BasePK deletedBy) {
106        var invoiceControl = Session.getModelController(InvoiceControl.class);
107        InvoiceDetail invoiceDetail = invoice.getLastDetail();
108        InvoiceType invoiceType = invoiceDetail.getInvoiceType();
109        InvoiceTimeType invoiceTimeType = invoiceControl.getInvoiceTimeTypeByName(invoiceType, invoiceTimeTypeName);
110
111        if(invoiceTimeType == null) {
112            if(ema != null) {
113                ema.addExecutionError(ExecutionErrors.UnknownInvoiceTimeTypeName.name(), getInvoiceTypeName(invoiceType), invoiceTimeTypeName);
114            }
115        } else {
116            InvoiceTime invoiceTime = invoiceControl.getInvoiceTimeForUpdate(invoice, invoiceTimeType);
117
118            if(invoiceTime == null) {
119                if(ema != null) {
120                    ema.addExecutionError(ExecutionErrors.UnknownInvoiceTime.name(), getInvoiceTypeName(invoiceType), invoiceDetail.getInvoiceName(), invoiceTimeTypeName);
121                }
122            } else {
123                invoiceControl.deleteInvoiceTime(invoiceTime, deletedBy);
124            }
125        }
126    }
127
128}