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.user.server.transfer;
018
019import javax.inject.Inject;
020import com.echothree.model.control.accounting.server.control.AccountingControl;
021import com.echothree.model.control.associate.server.control.AssociateControl;
022import com.echothree.model.control.campaign.server.control.CampaignControl;
023import com.echothree.model.control.offer.server.control.OfferUseControl;
024import com.echothree.model.control.party.server.control.PartyControl;
025import com.echothree.model.control.user.common.UserOptions;
026import com.echothree.model.control.user.common.transfer.UserVisitTransfer;
027import com.echothree.model.data.user.server.entity.UserVisit;
028import com.echothree.util.common.transfer.ListWrapper;
029import javax.enterprise.context.RequestScoped;
030
031@RequestScoped
032public class UserVisitTransferCache
033        extends BaseUserTransferCache<UserVisit, UserVisitTransfer> {
034
035    @Inject
036    AccountingControl accountingControl;
037
038    @Inject
039    AssociateControl associateControl;
040
041    @Inject
042    CampaignControl campaignControl;
043
044    @Inject
045    OfferUseControl offerUseControl;
046
047    @Inject
048    PartyControl partyControl;
049
050    boolean includeUserVisitCampaigns;
051    
052    /** Creates a new instance of UserVisitTransferCache */
053    protected UserVisitTransferCache() {
054        super();
055
056        var options = session.getOptions();
057        if(options != null) {
058            includeUserVisitCampaigns = options.contains(UserOptions.UserVisitIncludeUserVisitCampaigns);
059        }
060    }
061    
062    public UserVisitTransfer getUserVisitTransfer(UserVisit userVisit, UserVisit userVisitEntity) {
063        var userVisitTransfer = get(userVisit);
064        
065        if(userVisitTransfer == null) {
066            var userKey = userVisitEntity.getUserKey();
067            var userKeyTransfer = userKey == null ? null : userControl.getUserKeyTransfer(userVisit, userKey);
068            var preferredLanguage = userVisitEntity.getPreferredLanguage();
069            var preferredLanguageTransfer = preferredLanguage == null ? null : partyControl.getLanguageTransfer(userVisit, preferredLanguage);
070            var preferredCurrency = userVisitEntity.getPreferredCurrency();
071            var preferredCurrencyTransfer = preferredCurrency == null ? null : accountingControl.getCurrencyTransfer(userVisit, preferredCurrency);
072            var preferredTimeZone = userVisitEntity.getPreferredTimeZone();
073            var preferredTimeZoneTransfer = preferredTimeZone == null ? null : partyControl.getTimeZoneTransfer(userVisit, preferredTimeZone);
074            var preferredDateTimeFormat = userVisitEntity.getPreferredDateTimeFormat();
075            var preferredDateTimeFormatTransfer = preferredDateTimeFormat == null ? null : partyControl.getDateTimeFormatTransfer(userVisit, preferredDateTimeFormat);
076            var unformattedLastCommandTime = userVisitEntity.getLastCommandTime();
077            var lastCommandTime = formatTypicalDateTime(userVisit, unformattedLastCommandTime);
078            var offerUse = userVisitEntity.getOfferUse();
079            var offerUseTransfer = offerUse == null ? null : offerUseControl.getOfferUseTransfer(userVisit, offerUse);
080            var associateReferral = userVisitEntity.getAssociateReferral();
081            var associateReferralTransfer = associateReferral == null ? null : associateControl.getAssociateReferralTransfer(userVisit, associateReferral);
082            var unformattedRetainUntilTime = userVisitEntity.getRetainUntilTime();
083            var retainUntilTime = formatTypicalDateTime(userVisit, unformattedRetainUntilTime);
084
085            userVisitTransfer = new UserVisitTransfer(userKeyTransfer, preferredLanguageTransfer, preferredCurrencyTransfer, preferredTimeZoneTransfer,
086                    preferredDateTimeFormatTransfer, unformattedLastCommandTime, lastCommandTime, offerUseTransfer, associateReferralTransfer,
087                    unformattedRetainUntilTime, retainUntilTime);
088            put(userVisit, userVisitEntity, userVisitTransfer);
089            
090            if(includeUserVisitCampaigns) {
091                userVisitTransfer.setUserVisitCampaigns(new ListWrapper<>(campaignControl.getUserVisitCampaignTransfersByUserVisit(userVisit, userVisitEntity)));
092            }
093        }
094
095        return userVisitTransfer;
096    }
097    
098}