MoneyWiseXAnalysis.java

/*
 * MoneyWise: Finance Application
 * Copyright 2012-2026. Tony Washer
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.  You may obtain a copy
 * of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets;

import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogManager;
import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogger;
import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
import io.github.tonywasher.joceanus.metis.preference.MetisPreferenceManager;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEventList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisCashBucket.MoneyWiseXAnalysisCashBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisCashCategoryBucket.MoneyWiseXAnalysisCashCategoryBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisDepositBucket.MoneyWiseXAnalysisDepositBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisDepositCategoryBucket.MoneyWiseXAnalysisDepositCategoryBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisInterfaces.MoneyWiseXAnalysisCursor;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisLoanBucket.MoneyWiseXAnalysisLoanBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisLoanCategoryBucket.MoneyWiseXAnalysisLoanCategoryBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisPayeeBucket.MoneyWiseXAnalysisPayeeBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisPortfolioBucket.MoneyWiseXAnalysisPortfolioBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTaxBasisBucket.MoneyWiseXAnalysisTaxBasisBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTransCategoryBucket.MoneyWiseXAnalysisTransCategoryBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTransTagBucket.MoneyWiseXAnalysisTransTagBucketList;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisAccountAttr;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisPayeeAttr;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisSecurityAttr;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisAttr;
import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTransAttr;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxAnalysis;
import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxYear;
import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxYearCache;
import io.github.tonywasher.joceanus.moneywise.tax.uk.MoneyWiseUKTaxYearCache;
import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;

/**
 * Data Analysis.
 *
 * @author Tony Washer
 */
public class MoneyWiseXAnalysis
        implements MetisFieldItem {
    /**
     * Logger.
     */
    private static final OceanusLogger LOGGER = OceanusLogManager.getLogger(MoneyWiseXAnalysis.class);

    /**
     * Local Report fields.
     */
    private static final MetisFieldSet<MoneyWiseXAnalysis> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysis.class);

    /*
     * Declare Fields.
     */
    static {
        FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_RANGE, MoneyWiseXAnalysis::getDateRange);
        FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.TAX_YEARS, MoneyWiseXAnalysis::getTaxYearCache);
        FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.CURRENCY, MoneyWiseXAnalysis::getCurrency);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.DEPOSIT.getListId(), MoneyWiseXAnalysis::getDeposits);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.CASH.getListId(), MoneyWiseXAnalysis::getCash);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.LOAN.getListId(), MoneyWiseXAnalysis::getLoans);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.PAYEE.getListId(), MoneyWiseXAnalysis::getPayees);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.PORTFOLIO.getListId(), MoneyWiseXAnalysis::getPortfolios);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.DEPOSITCATEGORY.getListId(), MoneyWiseXAnalysis::getDepositCategories);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.CASHCATEGORY.getListId(), MoneyWiseXAnalysis::getCashCategories);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.LOANCATEGORY.getListId(), MoneyWiseXAnalysis::getLoanCategories);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.TRANSCATEGORY.getListId(), MoneyWiseXAnalysis::getTransCategories);
        FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.TRANSTAG.getListId(), MoneyWiseXAnalysis::getTransactionTags);
        FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.TAXBASIS.getListId(), MoneyWiseXAnalysis::getTaxBasis);
        FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.TAX_CALCULATION, MoneyWiseXAnalysis::getTaxAnalysis);
    }

    /**
     * The EditSet.
     */
    private final PrometheusEditSet theEditSet;

    /**
     * The Cursor.
     */
    private final MoneyWiseXAnalysisCursor theCursor;

    /**
     * The taxYear cache.
     */
    private final MoneyWiseTaxYearCache theTaxYearCache;

    /**
     * The Currency.
     */
    private final MoneyWiseCurrency theCurrency;

    /**
     * The Preference Manager.
     */
    private final MetisPreferenceManager thePreferences;

    /**
     * The DataRange.
     */
    private final OceanusDateRange theDateRange;

    /**
     * The deposit buckets.
     */
    private final MoneyWiseXAnalysisDepositBucketList theDeposits;

    /**
     * The cash buckets.
     */
    private final MoneyWiseXAnalysisCashBucketList theCash;

    /**
     * The loan buckets.
     */
    private final MoneyWiseXAnalysisLoanBucketList theLoans;

    /**
     * The payee buckets.
     */
    private final MoneyWiseXAnalysisPayeeBucketList thePayees;

    /**
     * The portfolio buckets.
     */
    private final MoneyWiseXAnalysisPortfolioBucketList thePortfolios;

    /**
     * The deposit category buckets.
     */
    private final MoneyWiseXAnalysisDepositCategoryBucketList theDepositCategories;

    /**
     * The cash category buckets.
     */
    private final MoneyWiseXAnalysisCashCategoryBucketList theCashCategories;

    /**
     * The loan category buckets.
     */
    private final MoneyWiseXAnalysisLoanCategoryBucketList theLoanCategories;

    /**
     * The transaction category buckets.
     */
    private final MoneyWiseXAnalysisTransCategoryBucketList theTransCategories;

    /**
     * The TransactionTag buckets.
     */
    private final MoneyWiseXAnalysisTransTagBucketList theTransTags;

    /**
     * The tax basis buckets.
     */
    private final MoneyWiseXAnalysisTaxBasisBucketList theTaxBasis;

    /**
     * The new tax calculations.
     */
    private final MoneyWiseTaxAnalysis theTaxAnalysis;

    /**
     * The Events.
     */
    private MoneyWiseXAnalysisEventList theEvents;

    /**
     * Do we have active securities?
     */
    private Boolean haveActiveSecurities = Boolean.FALSE;

    /**
     * Do we have a foreign account?
     */
    private Boolean haveForeignCurrency = Boolean.FALSE;

    /**
     * Constructor for a full analysis.
     *
     * @param pEditSet       the editSet to analyse events for
     * @param pCursor        the cursor
     * @param pPreferenceMgr the preference manager
     */
    public MoneyWiseXAnalysis(final PrometheusEditSet pEditSet,
                              final MoneyWiseXAnalysisCursor pCursor,
                              final MetisPreferenceManager pPreferenceMgr) {
        /* Store the data */
        theEditSet = pEditSet;
        theCursor = pCursor;
        final MoneyWiseDataSet myDataSet = getData();
        theCurrency = myDataSet.getReportingCurrency();
        thePreferences = pPreferenceMgr;
        theDateRange = myDataSet.getDateRange();

        /* Access the TaxYearCache */
        theTaxYearCache = (MoneyWiseUKTaxYearCache) myDataSet.getTaxFactory();

        /* Create a new set of buckets */
        theDeposits = new MoneyWiseXAnalysisDepositBucketList(this);
        theCash = new MoneyWiseXAnalysisCashBucketList(this);
        theLoans = new MoneyWiseXAnalysisLoanBucketList(this);
        thePortfolios = new MoneyWiseXAnalysisPortfolioBucketList(this);
        thePayees = new MoneyWiseXAnalysisPayeeBucketList(this);
        theTaxBasis = new MoneyWiseXAnalysisTaxBasisBucketList(this);
        theTransCategories = new MoneyWiseXAnalysisTransCategoryBucketList(this);
        theTransTags = new MoneyWiseXAnalysisTransTagBucketList(this);

        /* Create totalling buckets */
        theDepositCategories = new MoneyWiseXAnalysisDepositCategoryBucketList(this);
        theCashCategories = new MoneyWiseXAnalysisCashCategoryBucketList(this);
        theLoanCategories = new MoneyWiseXAnalysisLoanCategoryBucketList(this);
        theTaxAnalysis = null;
    }

    /**
     * Constructor for a dated analysis.
     *
     * @param pBase the base analysis
     * @param pDate the date for the analysis
     */
    public MoneyWiseXAnalysis(final MoneyWiseXAnalysis pBase,
                              final OceanusDate pDate) {
        /* Store the data */
        theEditSet = pBase.getEditSet();
        final MoneyWiseDataSet myDataSet = getData();
        theCurrency = pBase.getCurrency();
        thePreferences = pBase.getPreferenceMgr();
        theDateRange = new OceanusDateRange(myDataSet.getDateRange().getStart(), pDate);
        theEvents = pBase.getEvents();
        theCursor = null;

        /* Access the TaxYearCache */
        theTaxYearCache = (MoneyWiseUKTaxYearCache) myDataSet.getTaxFactory();

        /* Create a new set of buckets */
        theDeposits = new MoneyWiseXAnalysisDepositBucketList(this, pBase.getDeposits(), pDate);
        theCash = new MoneyWiseXAnalysisCashBucketList(this, pBase.getCash(), pDate);
        theLoans = new MoneyWiseXAnalysisLoanBucketList(this, pBase.getLoans(), pDate);
        thePortfolios = new MoneyWiseXAnalysisPortfolioBucketList(this, pBase.getPortfolios(), pDate);
        thePayees = new MoneyWiseXAnalysisPayeeBucketList(this, pBase.getPayees(), pDate);
        theTaxBasis = new MoneyWiseXAnalysisTaxBasisBucketList(this, pBase.getTaxBasis(), pDate);
        theTransCategories = new MoneyWiseXAnalysisTransCategoryBucketList(this, pBase.getTransCategories(), pDate);
        theTransTags = new MoneyWiseXAnalysisTransTagBucketList(this, pBase.getTransactionTags(), pDate);

        /* Create totalling buckets */
        theDepositCategories = new MoneyWiseXAnalysisDepositCategoryBucketList(this);
        theCashCategories = new MoneyWiseXAnalysisCashCategoryBucketList(this);
        theLoanCategories = new MoneyWiseXAnalysisLoanCategoryBucketList(this);
        theTaxAnalysis = null;
    }

    /**
     * Constructor for a ranged analysis.
     *
     * @param pBase  the base analysis
     * @param pRange the range for the analysis
     */
    public MoneyWiseXAnalysis(final MoneyWiseXAnalysis pBase,
                              final OceanusDateRange pRange) {
        /* Store the data */
        theEditSet = pBase.getEditSet();
        final MoneyWiseDataSet myDataSet = getData();
        theCurrency = pBase.getCurrency();
        thePreferences = pBase.getPreferenceMgr();
        theDateRange = pRange;
        theEvents = pBase.getEvents();
        theCursor = null;

        /* Access the TaxYearCache */
        theTaxYearCache = (MoneyWiseUKTaxYearCache) myDataSet.getTaxFactory();

        /* Create a new set of buckets */
        theDeposits = new MoneyWiseXAnalysisDepositBucketList(this, pBase.getDeposits(), pRange);
        theCash = new MoneyWiseXAnalysisCashBucketList(this, pBase.getCash(), pRange);
        theLoans = new MoneyWiseXAnalysisLoanBucketList(this, pBase.getLoans(), pRange);
        thePortfolios = new MoneyWiseXAnalysisPortfolioBucketList(this, pBase.getPortfolios(), pRange);
        thePayees = new MoneyWiseXAnalysisPayeeBucketList(this, pBase.getPayees(), pRange);
        theTaxBasis = new MoneyWiseXAnalysisTaxBasisBucketList(this, pBase.getTaxBasis(), pRange);
        theTransCategories = new MoneyWiseXAnalysisTransCategoryBucketList(this, pBase.getTransCategories(), pRange);
        theTransTags = new MoneyWiseXAnalysisTransTagBucketList(this, pBase.getTransactionTags(), pRange);

        /* Create totalling buckets */
        theDepositCategories = new MoneyWiseXAnalysisDepositCategoryBucketList(this);
        theCashCategories = new MoneyWiseXAnalysisCashCategoryBucketList(this);
        theLoanCategories = new MoneyWiseXAnalysisLoanCategoryBucketList(this);

        /* Handle new tax calculations */
        final MoneyWiseTaxYear myYear = (MoneyWiseTaxYear) theTaxYearCache.findTaxYearForRange(theDateRange);
        theTaxAnalysis = myYear != null
                ? myYear.analyseTaxYear(thePreferences, theTaxBasis)
                : null;
    }

    /**
     * Is the analysis manager idle?
     *
     * @return true/false
     */
    public boolean isIdle() {
        return theCurrency == null;
    }

    @Override
    public MetisFieldSet<MoneyWiseXAnalysis> getDataFieldSet() {
        return FIELD_DEFS;
    }

    @Override
    public String formatObject(final OceanusDataFormatter pFormatter) {
        return FIELD_DEFS.getName();
    }

    /**
     * Do we have a foreign currency?
     *
     * @return true/false
     */
    public Boolean haveForeignCurrency() {
        return haveForeignCurrency;
    }

    /**
     * Do we have active securities?
     *
     * @return true/false
     */
    public Boolean haveActiveSecurities() {
        return haveActiveSecurities;
    }

    /**
     * Obtain the editSet.
     *
     * @return the editSet
     */
    public PrometheusEditSet getEditSet() {
        return theEditSet;
    }

    /**
     * Obtain the events.
     *
     * @return the events
     */
    public MoneyWiseXAnalysisEventList getEvents() {
        return theEvents;
    }

    /**
     * Set the events.
     *
     * @param pEvents the events
     */
    public void setEvents(final MoneyWiseXAnalysisEventList pEvents) {
        theEvents = pEvents;
    }

    /**
     * Obtain the cursor.
     *
     * @return the cursor
     */
    public MoneyWiseXAnalysisCursor getCursor() {
        return theCursor;
    }

    /**
     * Obtain the data.
     *
     * @return the data
     */
    public MoneyWiseDataSet getData() {
        return (MoneyWiseDataSet) theEditSet.getDataSet();
    }

    /**
     * Obtain the currency.
     *
     * @return the currency
     */
    private MoneyWiseTaxYearCache getTaxYearCache() {
        return theTaxYearCache;
    }

    /**
     * Obtain the currency.
     *
     * @return the currency
     */
    public MoneyWiseCurrency getCurrency() {
        return theCurrency;
    }

    /**
     * Obtain the preference manager.
     *
     * @return the data
     */
    public MetisPreferenceManager getPreferenceMgr() {
        return thePreferences;
    }

    /**
     * Obtain the date range.
     *
     * @return the date range
     */
    public OceanusDateRange getDateRange() {
        return theDateRange;
    }

    /**
     * Is this a ranged analysis?
     *
     * @return true/false
     */
    public boolean isRangedAnalysis() {
        return theDateRange.getStart() == null;
    }

    /**
     * Obtain the deposit buckets list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisDepositBucketList getDeposits() {
        return theDeposits;
    }

    /**
     * Obtain the cash buckets list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisCashBucketList getCash() {
        return theCash;
    }

    /**
     * Obtain the loan buckets list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisLoanBucketList getLoans() {
        return theLoans;
    }

    /**
     * Obtain the portfolio buckets list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisPortfolioBucketList getPortfolios() {
        return thePortfolios;
    }

    /**
     * Obtain the payee buckets list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisPayeeBucketList getPayees() {
        return thePayees;
    }

    /**
     * Obtain the deposit categories list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisDepositCategoryBucketList getDepositCategories() {
        return theDepositCategories;
    }

    /**
     * Obtain the cash categories list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisCashCategoryBucketList getCashCategories() {
        return theCashCategories;
    }

    /**
     * Obtain the loan categories list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisLoanCategoryBucketList getLoanCategories() {
        return theLoanCategories;
    }

    /**
     * Obtain the transaction categories list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisTransCategoryBucketList getTransCategories() {
        return theTransCategories;
    }

    /**
     * Obtain the transactionTag list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisTransTagBucketList getTransactionTags() {
        return theTransTags;
    }

    /**
     * Obtain the tax basis list.
     *
     * @return the list
     */
    public MoneyWiseXAnalysisTaxBasisBucketList getTaxBasis() {
        return theTaxBasis;
    }

    /**
     * Obtain the tax analysis.
     *
     * @return the analysis
     */
    public MoneyWiseTaxAnalysis getTaxAnalysis() {
        return theTaxAnalysis;
    }

    /**
     * Produce Totals.
     */
    public void produceTotals() {
        /* Analyse the deposits */
        theDepositCategories.analyseDeposits(theDeposits);
        theDepositCategories.produceTotals();
        haveForeignCurrency = theDepositCategories.haveForeignCurrency();

        /* Analyse the cash */
        theCashCategories.analyseCash(theCash);
        theCashCategories.produceTotals();
        haveForeignCurrency |= theCashCategories.haveForeignCurrency();

        /* Analyse the loans */
        theLoanCategories.analyseLoans(theLoans);
        theLoanCategories.produceTotals();
        haveForeignCurrency |= theLoanCategories.haveForeignCurrency();

        /* Analyse the securities */
        thePortfolios.analyseSecurities();
        haveForeignCurrency |= thePortfolios.haveForeignCurrency();
        haveActiveSecurities = thePortfolios.haveActiveSecurities();

        /* Analyse the Payees */
        thePayees.produceTotals();

        /* Analyse the TransactionCategories */
        theTransCategories.produceTotals();

        /* Analyse the TaxBasis */
        theTaxBasis.produceTotals();

        /* Sort the transaction Tag list */
        theTransTags.sortBuckets();
    }

    /**
     * Check totals.
     */
    public void checkTotals() {
        /* Obtain Totals bucket */
        final MoneyWiseXAnalysisDepositCategoryBucket myDepCat = theDepositCategories.getTotals();
        final MoneyWiseXAnalysisCashCategoryBucket myCashCat = theCashCategories.getTotals();
        final MoneyWiseXAnalysisLoanCategoryBucket myLoanCat = theLoanCategories.getTotals();
        final MoneyWiseXAnalysisPortfolioBucket myPort = thePortfolios.getTotals();
        final MoneyWiseXAnalysisPayeeBucket myPayee = thePayees.getTotals();
        final MoneyWiseXAnalysisTransCategoryBucket myTrans = theTransCategories.getTotals();
        final MoneyWiseXAnalysisTaxBasisBucket myTax = theTaxBasis.getTotals();

        /* Handle null data */
        if (myDepCat == null) {
            return;
        }

        /* Access totals */
        OceanusMoney myDepTotal = myDepCat.getValues().getMoneyValue(MoneyWiseXAnalysisAccountAttr.VALUEDELTA);
        final OceanusMoney myCashTotal = myCashCat.getValues().getMoneyValue(MoneyWiseXAnalysisAccountAttr.VALUEDELTA);
        final OceanusMoney myLoanTotal = myLoanCat.getValues().getMoneyValue(MoneyWiseXAnalysisAccountAttr.VALUEDELTA);
        final OceanusMoney myPortTotal = myPort.getValues().getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUEDELTA);
        final OceanusMoney myPayTotal = myPayee.getValues().getMoneyValue(MoneyWiseXAnalysisPayeeAttr.PROFIT);
        final OceanusMoney myEvtTotal = myTrans.getValues().getMoneyValue(MoneyWiseXAnalysisTransAttr.PROFIT);
        final OceanusMoney myTaxTotal = myTax.getValues().getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);

        /* Create a copy */
        myDepTotal = new OceanusMoney(myDepTotal);

        /* Add sub-accounts */
        myDepTotal.addAmount(myCashTotal);
        myDepTotal.addAmount(myLoanTotal);
        myDepTotal.addAmount(myPortTotal);

        /* Check identities */
        if (!myDepTotal.equals(myPayTotal)) {
            LOGGER.error("Payee total mismatch");
        }
        if (!myDepTotal.equals(myEvtTotal)) {
            LOGGER.error("TransactionCategory total mismatch");
        }
        if (!myDepTotal.equals(myTaxTotal)) {
            LOGGER.error("TaxBasis total mismatch");
        }
    }
}