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.period.server.transfer;
018
019import com.echothree.model.control.accounting.common.workflow.FiscalPeriodStatusConstants;
020import com.echothree.model.control.core.server.control.EntityInstanceControl;
021import com.echothree.model.control.period.common.PeriodConstants;
022import com.echothree.model.control.period.common.transfer.PeriodTransfer;
023import com.echothree.model.control.period.server.control.PeriodControl;
024import com.echothree.model.control.workflow.common.transfer.WorkflowEntityStatusTransfer;
025import com.echothree.model.control.workflow.server.control.WorkflowControl;
026import com.echothree.model.data.period.server.entity.Period;
027import com.echothree.model.data.user.server.entity.UserVisit;
028import com.echothree.util.server.persistence.Session;
029import javax.enterprise.context.RequestScoped;
030
031@RequestScoped
032public class PeriodTransferCache
033        extends BasePeriodTransferCache<Period, PeriodTransfer> {
034    
035    EntityInstanceControl entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
036    PeriodControl periodControl = Session.getModelController(PeriodControl.class);
037    WorkflowControl workflowControl = Session.getModelController(WorkflowControl.class);
038    
039    /** Creates a new instance of PeriodTransferCache */
040    protected PeriodTransferCache() {
041        super();
042        
043        setIncludeEntityInstance(true);
044    }
045    
046    public PeriodTransfer getPeriodTransfer(UserVisit userVisit, Period period) {
047        var periodTransfer = get(period);
048        
049        if(periodTransfer == null) {
050            var periodDetail = period.getLastDetail();
051            var periodKindTransfer = periodControl.getPeriodKindTransfer(userVisit, periodDetail.getPeriodKind());
052            var periodName = periodDetail.getPeriodName();
053            var parentPeriod = periodDetail.getParentPeriod();
054            var parentPeriodTransfer = parentPeriod == null? null: periodControl.getPeriodTransfer(userVisit, parentPeriod);
055            var periodType = periodDetail.getPeriodType();
056            var periodTypeTransfer = periodType == null? null: periodControl.getPeriodTypeTransfer(userVisit, periodType);
057            var unformattedStartTime = periodDetail.getStartTime();
058            var startTime = formatTypicalDateTime(userVisit, unformattedStartTime);
059            var unformattedEndTime = periodDetail.getEndTime();
060            var endTime = formatTypicalDateTime(userVisit, unformattedEndTime);
061            var description = periodControl.getBestPeriodDescription(period, getLanguage(userVisit));
062            WorkflowEntityStatusTransfer status = null;
063
064            var entityInstance = entityInstanceControl.getEntityInstanceByBasePK(period.getPrimaryKey());
065            var periodKindName = periodTypeTransfer.getPeriodKind().getPeriodKindName();
066            if(periodKindName.equals(PeriodConstants.PeriodKind_FISCAL)) {
067                status = workflowControl.getWorkflowEntityStatusTransferByEntityInstanceUsingNames(userVisit,
068                        FiscalPeriodStatusConstants.Workflow_FISCAL_PERIOD_STATUS, entityInstance);
069            }
070            
071            periodTransfer = new PeriodTransfer(periodKindTransfer, periodName, parentPeriodTransfer, periodTypeTransfer, unformattedStartTime, startTime, unformattedEndTime,
072                    endTime, description, status);
073            put(userVisit, period, periodTransfer);
074        }
075        
076        return periodTransfer;
077    }
078    
079}