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.financial.server.transfer;
018
019import com.echothree.model.control.accounting.common.transfer.CurrencyTransfer;
020import com.echothree.model.control.accounting.common.transfer.GlAccountTransfer;
021import com.echothree.model.control.accounting.server.control.AccountingControl;
022import com.echothree.model.control.financial.common.FinancialOptions;
023import com.echothree.model.control.financial.common.transfer.FinancialAccountRoleTransfer;
024import com.echothree.model.control.financial.common.transfer.FinancialAccountTransfer;
025import com.echothree.model.control.financial.common.transfer.FinancialAccountTypeTransfer;
026import com.echothree.model.control.financial.server.control.FinancialControl;
027import com.echothree.model.data.accounting.server.entity.Currency;
028import com.echothree.model.data.financial.server.entity.FinancialAccount;
029import com.echothree.model.data.financial.server.entity.FinancialAccountDetail;
030import com.echothree.model.data.financial.server.entity.FinancialAccountStatus;
031import com.echothree.model.data.user.server.entity.UserVisit;
032import com.echothree.util.common.transfer.ListWrapper;
033import com.echothree.util.common.transfer.MapWrapper;
034import com.echothree.util.server.persistence.Session;
035import com.echothree.util.server.string.AmountUtils;
036import java.util.List;
037import java.util.Set;
038
039public class FinancialAccountTransferCache
040        extends BaseFinancialTransferCache<FinancialAccount, FinancialAccountTransfer> {
041    
042    AccountingControl accountingControl;
043    boolean includeRoles;
044    boolean includeTransactions;
045    
046    /** Creates a new instance of FinancialAccountTransferCache */
047    public FinancialAccountTransferCache(UserVisit userVisit, FinancialControl financialControl) {
048        super(userVisit, financialControl);
049        
050        accountingControl = Session.getModelController(AccountingControl.class);
051
052        var options = session.getOptions();
053        if(options != null) {
054            includeRoles = options.contains(FinancialOptions.FinancialAccountIncludeRoles);
055            includeTransactions = options.contains(FinancialOptions.FinancialAccountIncludeTransactions);
056        }
057        
058        setIncludeEntityInstance(true);
059    }
060    
061    public FinancialAccountTransfer getFinancialAccountTransfer(FinancialAccount financialAccount) {
062        FinancialAccountTransfer financialAccountTransfer = get(financialAccount);
063        
064        if(financialAccountTransfer == null) {
065            FinancialAccountDetail financialAccountDetail = financialAccount.getLastDetail();
066            FinancialAccountTypeTransfer financialAccountType = financialControl.getFinancialAccountTypeTransfer(userVisit, financialAccountDetail.getFinancialAccountType());
067            String financialAccountName = financialAccountDetail.getFinancialAccountName();
068            Currency currency = financialAccountDetail.getCurrency();
069            CurrencyTransfer currencyTransfer = accountingControl.getCurrencyTransfer(userVisit, currency);
070            GlAccountTransfer glAccountTransfer = accountingControl.getGlAccountTransfer(userVisit, financialAccountDetail.getGlAccount());
071            String reference = financialAccountDetail.getReference();
072            String description = financialAccountDetail.getDescription();
073            FinancialAccountStatus financialAccountStatus = financialControl.createFinancialAccountStatus(financialAccount);
074            Long unformattedActualBalance = financialAccountStatus.getActualBalance();
075            AmountUtils amountUtils = AmountUtils.getInstance();
076            String actualBalance = amountUtils.formatPriceLine(currency, unformattedActualBalance);
077            Long unformattedAvailableBalance = financialAccountStatus.getAvailableBalance();
078            String availableBalance = amountUtils.formatPriceLine(currency, unformattedAvailableBalance);
079            
080            financialAccountTransfer = new FinancialAccountTransfer(financialAccountType, financialAccountName, currencyTransfer, glAccountTransfer, reference,
081                    description, unformattedActualBalance, actualBalance, unformattedAvailableBalance, availableBalance);
082            put(financialAccount, financialAccountTransfer);
083            
084            if(includeRoles) {
085                List<FinancialAccountRoleTransfer> financialAccountRoleTransfers = financialControl.getFinancialAccountRoleTransfersByFinancialAccount(userVisit, financialAccount);
086                MapWrapper<FinancialAccountRoleTransfer> financialAccountRolesMap = new MapWrapper<>(financialAccountRoleTransfers.size());
087
088                financialAccountRoleTransfers.forEach((financialAccountRoleTransfer) -> {
089                    financialAccountRolesMap.put(financialAccountRoleTransfer.getFinancialAccountRoleType().getFinancialAccountRoleTypeName(), financialAccountRoleTransfer);
090                });
091
092                financialAccountTransfer.setFinancialAccountRoles(financialAccountRolesMap);
093            }
094            
095            if(includeTransactions) {
096                 financialAccountTransfer.setFinancialAccountTransactions(new ListWrapper<>(financialControl.getFinancialAccountTransactionTransfersByFinancialAccount(userVisit, financialAccount)));
097            }
098        }
099        
100        return financialAccountTransfer;
101    }
102    
103}