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