MoneyWiseQIFPortfolioEvent.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.quicken.file;

import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
import io.github.tonywasher.joceanus.oceanus.date.OceanusDateFormatter;
import io.github.tonywasher.joceanus.oceanus.decimal.OceanusDecimalParser;
import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
import io.github.tonywasher.joceanus.oceanus.decimal.OceanusPrice;
import io.github.tonywasher.joceanus.oceanus.decimal.OceanusRatio;
import io.github.tonywasher.joceanus.oceanus.decimal.OceanusUnits;
import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQActionType;
import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQPortfolioLineType;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFCategoryAccountLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFCategoryLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFClearedLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFDateLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFMoneyLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFPayeeLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFPriceLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFRatioLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFSecurityLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFStringLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFUnitsLine;
import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFXferAccountLine;

import java.util.List;

/**
 * Class representing a QIF Portfolio Event record.
 */
public class MoneyWiseQIFPortfolioEvent
        extends MoneyWiseQIFEventRecord<MoneyWiseQPortfolioLineType> {
    /**
     * The Date.
     */
    private final OceanusDate theDate;

    /**
     * The Cleared Flag.
     */
    private final Boolean isCleared;

    /**
     * The Action.
     */
    private final MoneyWiseQActionType theAction;

    /**
     * Constructor.
     *
     * @param pFile   the QIF File
     * @param pTrans  the transaction
     * @param pAction the action
     */
    protected MoneyWiseQIFPortfolioEvent(final MoneyWiseQIFFile pFile,
                                         final MoneyWiseTransaction pTrans,
                                         final MoneyWiseQActionType pAction) {
        /* Call super-constructor */
        super(pFile, MoneyWiseQPortfolioLineType.class);

        /* Store values */
        theDate = pTrans.getDate();
        isCleared = pTrans.isReconciled();
        theAction = pAction;

        /* Add the lines */
        addLine(new MoneyWiseQIFPortfolioDateLine(theDate));
        addLine(new MoneyWiseQIFPortfolioActionLine(theAction));
        addLine(new MoneyWiseQIFPortfolioClearedLine(isCleared));

        /* Add the comment line if it exists */
        final String myComment = pTrans.getComments();
        if (myComment != null) {
            addLine(new MoneyWiseQIFPortfolioCommentLine(myComment));
        }
    }

    /**
     * Constructor.
     *
     * @param pFile      the QIF File
     * @param pFormatter the Data Formatter
     * @param pLines     the data lines
     */
    protected MoneyWiseQIFPortfolioEvent(final MoneyWiseQIFFile pFile,
                                         final OceanusDataFormatter pFormatter,
                                         final List<String> pLines) {
        /* Call super-constructor */
        super(pFile, MoneyWiseQPortfolioLineType.class);

        /* Determine details */
        OceanusDate myDate = null;
        MoneyWiseQActionType myAction = null;
        Boolean myCleared = null;

        /* Obtain parsers */
        final OceanusDateFormatter myDateParser = pFormatter.getDateFormatter();
        final OceanusDecimalParser myDecParser = pFormatter.getDecimalParser();

        /* Loop through the lines */
        for (String myLine : pLines) {
            /* Determine the category */
            final MoneyWiseQPortfolioLineType myType = MoneyWiseQPortfolioLineType.parseLine(myLine);
            if (myType != null) {
                /* Access data */
                final String myData = myLine.substring(myType.getSymbol().length());

                /* Switch on line type */
                switch (myType) {
                    case DATE:
                        final OceanusDate myDateDay = myDateParser.parseDateBase(myData, MoneyWiseQIFWriter.QIF_BASEYEAR);
                        addLine(new MoneyWiseQIFPortfolioDateLine(myDateDay));
                        myDate = myDateDay;
                        break;
                    case CLEARED:
                        final Boolean myFlag = myData.equals(MoneyWiseQIFLine.QIF_RECONCILED);
                        addLine(new MoneyWiseQIFPortfolioClearedLine(myFlag));
                        myCleared = myFlag;
                        break;
                    case AMOUNT:
                        OceanusMoney myMoney = myDecParser.parseMoneyValue(myData);
                        addLine(new MoneyWiseQIFPortfolioAmountLine(myMoney));
                        break;
                    case COMMENT:
                        addLine(new MoneyWiseQIFPortfolioCommentLine(myData));
                        break;
                    case ACTION:
                        myAction = MoneyWiseQActionType.parseLine(myData);
                        addLine(new MoneyWiseQIFPortfolioActionLine(myAction));
                        break;
                    case PRICE:
                        final OceanusPrice myPrice = myDecParser.parsePriceValue(myData);
                        addLine(new MoneyWiseQIFPortfolioPriceLine(myPrice));
                        break;
                    case COMMISSION:
                        myMoney = myDecParser.parseMoneyValue(myData);
                        addLine(new MoneyWiseQIFPortfolioCommissionLine(myMoney));
                        break;
                    case PAYEE:
                        addLine(new MoneyWiseQIFPortfolioPayeeDescLine(myData));
                        break;
                    case QUANTITY:
                        final OceanusUnits myUnits = myDecParser.parseUnitsValue(myData);
                        addLine(new MoneyWiseQIFPortfolioQuantityLine(myUnits));
                        break;
                    case SECURITY:
                        addLine(new MoneyWiseQIFPortfolioSecurityLine(pFile.getSecurity(myData)));
                        break;
                    case XFERACCOUNT:
                        /* Look for account, category and classes */
                        final MoneyWiseQIFAccount myAccount = MoneyWiseQIFXferAccountLine.parseAccount(pFile, myData);
                        final MoneyWiseQIFEventCategory myCategory = MoneyWiseQIFCategoryLine.parseCategory(pFile, myData);
                        List<MoneyWiseQIFClass> myClasses = MoneyWiseQIFXferAccountLine.parseAccountClasses(pFile, myData);
                        if (myAccount == null) {
                            myClasses = MoneyWiseQIFCategoryLine.parseCategoryClasses(pFile, myData);
                            addLine(new MoneyWiseQIFPortfolioCategoryLine(myCategory, myClasses));
                            convertPayee();
                        } else if (myCategory == null) {
                            addLine(new MoneyWiseQIFPortfolioAccountLine(myAccount, myClasses));
                        } else {
                            addLine(new MoneyWiseQIFPortfolioCategoryAccountLine(myCategory, myAccount, myClasses));
                            convertPayee();
                        }
                        break;
                    case XFERAMOUNT:
                        myMoney = myDecParser.parseMoneyValue(myData);
                        addLine(new MoneyWiseQIFPortfolioXferAmountLine(myMoney));
                        break;
                    default:
                        break;
                }
            }
        }

        /* Convert any split */
        if (MoneyWiseQActionType.STKSPLIT.equals(myAction)) {
            convertSplit();
        }

        /* Build details */
        theDate = myDate;
        theAction = myAction;
        isCleared = myCleared;
    }

    @Override
    public OceanusDate getDate() {
        return theDate;
    }

    @Override
    public Boolean isCleared() {
        return isCleared;
    }

    /**
     * Obtain the action.
     *
     * @return the action.
     */
    public MoneyWiseQActionType getAction() {
        return theAction;
    }

    /**
     * record security.
     *
     * @param pSecurity the security
     */
    protected void recordSecurity(final MoneyWiseQIFSecurity pSecurity) {
        /* Add security line */
        addLine(new MoneyWiseQIFPortfolioSecurityLine(pSecurity));
    }

    /**
     * record category.
     *
     * @param pCategory the category
     */
    protected void recordCategory(final MoneyWiseQIFEventCategory pCategory) {
        /* Add category line */
        addLine(new MoneyWiseQIFPortfolioCategoryLine(pCategory));
    }

    /**
     * record category.
     *
     * @param pCategory the category
     * @param pClasses  the classes
     */
    protected void recordCategory(final MoneyWiseQIFEventCategory pCategory,
                                  final List<MoneyWiseQIFClass> pClasses) {
        /* Add category line */
        addLine(new MoneyWiseQIFPortfolioCategoryLine(pCategory, pClasses));
    }

    /**
     * record amount.
     *
     * @param pAmount the amount
     */
    protected void recordAmount(final OceanusMoney pAmount) {
        /* Add amount line */
        addLine(new MoneyWiseQIFPortfolioAmountLine(pAmount));
    }

    /**
     * record payee.
     *
     * @param pPayee the payee
     */
    protected void recordPayee(final String pPayee) {
        /* Add payee line */
        addLine(new MoneyWiseQIFPortfolioPayeeDescLine(pPayee));
    }

    /**
     * record payee.
     *
     * @param pPayee the payee
     */
    protected void recordPayee(final MoneyWiseQIFPayee pPayee) {
        /* Add payee line */
        addLine(new MoneyWiseQIFPortfolioPayeeLine(pPayee));
    }

    /**
     * record transfer.
     *
     * @param pAccount the transfer account
     * @param pAmount  the transfer amount
     */
    protected void recordXfer(final MoneyWiseQIFAccount pAccount,
                              final OceanusMoney pAmount) {
        /* Add transfer lines */
        addLine(new MoneyWiseQIFPortfolioAccountLine(pAccount));
        addLine(new MoneyWiseQIFPortfolioXferAmountLine(pAmount));
    }

    /**
     * record transfer.
     *
     * @param pAccount the transfer account
     * @param pClasses the classes
     * @param pAmount  the transfer amount
     */
    protected void recordXfer(final MoneyWiseQIFAccount pAccount,
                              final List<MoneyWiseQIFClass> pClasses,
                              final OceanusMoney pAmount) {
        /* Add transfer lines */
        addLine(new MoneyWiseQIFPortfolioAccountLine(pAccount, pClasses));
        addLine(new MoneyWiseQIFPortfolioXferAmountLine(pAmount));
    }

    /**
     * record transfer.
     *
     * @param pCategory the transfer category
     * @param pAmount   the transfer amount
     */
    protected void recordXfer(final MoneyWiseQIFEventCategory pCategory,
                              final OceanusMoney pAmount) {
        /* Add transfer lines */
        addLine(new MoneyWiseQIFPortfolioCategoryLine(pCategory));
        addLine(new MoneyWiseQIFPortfolioXferAmountLine(pAmount));
    }

    /**
     * record quantity.
     *
     * @param pQuantity the units quantity
     */
    protected void recordQuantity(final OceanusUnits pQuantity) {
        /* Add quantity line */
        addLine(new MoneyWiseQIFPortfolioQuantityLine(pQuantity));
    }

    /**
     * record quantity.
     *
     * @param pRatio the split ratio
     */
    protected void recordQuantity(final OceanusRatio pRatio) {
        /* Add quantity line */
        addLine(new MoneyWiseQIFPortfolioSplitRatioLine(pRatio));
    }

    /**
     * record price.
     *
     * @param pPrice the price
     */
    protected void recordPrice(final OceanusPrice pPrice) {
        /* Add price line */
        addLine(new MoneyWiseQIFPortfolioPriceLine(pPrice));
    }

    /**
     * record commission.
     *
     * @param pCommission the commission
     */
    protected void recordCommission(final OceanusMoney pCommission) {
        /* Add commission line */
        addLine(new MoneyWiseQIFPortfolioCommissionLine(pCommission));
    }

    /**
     * Convert Payee.
     */
    private void convertPayee() {
        /* Look for a payee line */
        final MoneyWiseQIFLine<MoneyWiseQPortfolioLineType> myLine = getLine(MoneyWiseQPortfolioLineType.PAYEE);
        if (myLine instanceof MoneyWiseQIFPortfolioPayeeDescLine myDesc) {
            /* Access payee */
            final String myName = myDesc.getValue();

            /* Register the payee */
            final MoneyWiseQIFPayee myPayee = getFile().registerPayee(myName);
            addLine(new MoneyWiseQIFPortfolioPayeeLine(myPayee));
        }
    }

    /**
     * Convert Split.
     */
    private void convertSplit() {
        /* Look for an action line */
        final MoneyWiseQIFLine<MoneyWiseQPortfolioLineType> myLine = getLine(MoneyWiseQPortfolioLineType.QUANTITY);
        if (myLine instanceof MoneyWiseQIFPortfolioQuantityLine myQuantity) {
            /* Extract action */
            final OceanusUnits myUnits = myQuantity.getUnits();

            /* Convert to ratio line */
            final OceanusRatio myRatio = new OceanusRatio(myUnits.toString());
            addLine(new MoneyWiseQIFPortfolioSplitRatioLine(myRatio));
        }
    }

    /**
     * The Portfolio Date line.
     */
    public static class MoneyWiseQIFPortfolioDateLine
            extends MoneyWiseQIFDateLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pDate the Date
         */
        protected MoneyWiseQIFPortfolioDateLine(final OceanusDate pDate) {
            /* Call super-constructor */
            super(pDate);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.DATE;
        }
    }

    /**
     * The Portfolio Comment line.
     */
    public static class MoneyWiseQIFPortfolioCommentLine
            extends MoneyWiseQIFStringLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pComment the comment
         */
        protected MoneyWiseQIFPortfolioCommentLine(final String pComment) {
            /* Call super-constructor */
            super(pComment);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.COMMENT;
        }

        /**
         * Obtain Comment.
         *
         * @return the comment
         */
        public String getComment() {
            return getValue();
        }
    }

    /**
     * The Portfolio Cleared line.
     */
    public static class MoneyWiseQIFPortfolioClearedLine
            extends MoneyWiseQIFClearedLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pCleared is the event cleared?
         */
        protected MoneyWiseQIFPortfolioClearedLine(final Boolean pCleared) {
            /* Call super-constructor */
            super(pCleared);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.CLEARED;
        }
    }

    /**
     * The Portfolio Amount line.
     */
    public static class MoneyWiseQIFPortfolioAmountLine
            extends MoneyWiseQIFMoneyLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pAmount the amount
         */
        protected MoneyWiseQIFPortfolioAmountLine(final OceanusMoney pAmount) {
            /* Call super-constructor */
            super(pAmount);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.AMOUNT;
        }

        /**
         * Obtain Amount.
         *
         * @return the amount
         */
        public OceanusMoney getAmount() {
            return getMoney();
        }
    }

    /**
     * The Portfolio Commission line.
     */
    public static class MoneyWiseQIFPortfolioCommissionLine
            extends MoneyWiseQIFMoneyLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pCommission the commission
         */
        protected MoneyWiseQIFPortfolioCommissionLine(final OceanusMoney pCommission) {
            /* Call super-constructor */
            super(pCommission);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.COMMISSION;
        }

        /**
         * Obtain Commission.
         *
         * @return the commission
         */
        public OceanusMoney getCommission() {
            return getMoney();
        }
    }

    /**
     * The Portfolio Price line.
     */
    public static class MoneyWiseQIFPortfolioPriceLine
            extends MoneyWiseQIFPriceLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pPrice the price
         */
        protected MoneyWiseQIFPortfolioPriceLine(final OceanusPrice pPrice) {
            /* Call super-constructor */
            super(pPrice);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.PRICE;
        }
    }

    /**
     * The Portfolio Quantity line.
     */
    public static class MoneyWiseQIFPortfolioQuantityLine
            extends MoneyWiseQIFUnitsLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pUnits the units
         */
        protected MoneyWiseQIFPortfolioQuantityLine(final OceanusUnits pUnits) {
            /* Call super-constructor */
            super(pUnits);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.QUANTITY;
        }
    }

    /**
     * The Portfolio Split Ratio line.
     */
    public static class MoneyWiseQIFPortfolioSplitRatioLine
            extends MoneyWiseQIFRatioLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pRatio the ratio
         */
        protected MoneyWiseQIFPortfolioSplitRatioLine(final OceanusRatio pRatio) {
            /* Call super-constructor */
            super(pRatio);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.QUANTITY;
        }
    }

    /**
     * The Portfolio Action line.
     */
    public static class MoneyWiseQIFPortfolioActionLine
            extends MoneyWiseQIFLine<MoneyWiseQPortfolioLineType> {
        /**
         * The action type.
         */
        private final MoneyWiseQActionType theAction;

        /**
         * Constructor.
         *
         * @param pAction the action type
         */
        protected MoneyWiseQIFPortfolioActionLine(final MoneyWiseQActionType pAction) {
            /* Store the data */
            theAction = pAction;
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.ACTION;
        }

        /**
         * Obtain the security.
         *
         * @return the security
         */
        public MoneyWiseQActionType getAction() {
            return theAction;
        }

        @Override
        protected void formatData(final OceanusDataFormatter pFormatter,
                                  final StringBuilder pBuilder) {
            /* Add the action */
            pBuilder.append(theAction.getSymbol());
        }
    }

    /**
     * The Portfolio Security line.
     */
    public static class MoneyWiseQIFPortfolioSecurityLine
            extends MoneyWiseQIFSecurityLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pSecurity the security
         */
        protected MoneyWiseQIFPortfolioSecurityLine(final MoneyWiseQIFSecurity pSecurity) {
            /* Call super-constructor */
            super(pSecurity);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.SECURITY;
        }
    }

    /**
     * The Portfolio Payee Account line.
     */
    public static class MoneyWiseQIFPortfolioPayeeLine
            extends MoneyWiseQIFPayeeLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pPayee the payee
         */
        protected MoneyWiseQIFPortfolioPayeeLine(final MoneyWiseQIFPayee pPayee) {
            /* Call super-constructor */
            super(pPayee);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.PAYEE;
        }
    }

    /**
     * The Portfolio Payee Description line.
     */
    public static class MoneyWiseQIFPortfolioPayeeDescLine
            extends MoneyWiseQIFStringLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pPayee the payee description
         */
        protected MoneyWiseQIFPortfolioPayeeDescLine(final String pPayee) {
            /* Call super-constructor */
            super(pPayee);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.PAYEE;
        }
    }

    /**
     * The Portfolio Account line.
     */
    public static class MoneyWiseQIFPortfolioAccountLine
            extends MoneyWiseQIFXferAccountLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pAccount the account
         */
        protected MoneyWiseQIFPortfolioAccountLine(final MoneyWiseQIFAccount pAccount) {
            /* Call super-constructor */
            super(pAccount);
        }

        /**
         * Constructor.
         *
         * @param pAccount the account
         * @param pClasses the account classes
         */
        protected MoneyWiseQIFPortfolioAccountLine(final MoneyWiseQIFAccount pAccount,
                                                   final List<MoneyWiseQIFClass> pClasses) {
            /* Call super-constructor */
            super(pAccount, pClasses);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.XFERACCOUNT;
        }
    }

    /**
     * The Portfolio Category line.
     */
    public static class MoneyWiseQIFPortfolioCategoryLine
            extends MoneyWiseQIFCategoryLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pCategory the category
         */
        protected MoneyWiseQIFPortfolioCategoryLine(final MoneyWiseQIFEventCategory pCategory) {
            /* Call super-constructor */
            super(pCategory);
        }

        /**
         * Constructor.
         *
         * @param pCategory the category
         * @param pClasses  the account classes
         */
        protected MoneyWiseQIFPortfolioCategoryLine(final MoneyWiseQIFEventCategory pCategory,
                                                    final List<MoneyWiseQIFClass> pClasses) {
            /* Call super-constructor */
            super(pCategory, pClasses);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.XFERACCOUNT;
        }
    }

    /**
     * The Portfolio Category line.
     */
    public static class MoneyWiseQIFPortfolioCategoryAccountLine
            extends MoneyWiseQIFCategoryAccountLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pCategory the category
         * @param pAccount  the account
         */
        protected MoneyWiseQIFPortfolioCategoryAccountLine(final MoneyWiseQIFEventCategory pCategory,
                                                           final MoneyWiseQIFAccount pAccount) {
            /* Call super-constructor */
            super(pCategory, pAccount);
        }

        /**
         * Constructor.
         *
         * @param pCategory the category
         * @param pAccount  the account
         * @param pClasses  the account classes
         */
        protected MoneyWiseQIFPortfolioCategoryAccountLine(final MoneyWiseQIFEventCategory pCategory,
                                                           final MoneyWiseQIFAccount pAccount,
                                                           final List<MoneyWiseQIFClass> pClasses) {
            /* Call super-constructor */
            super(pCategory, pAccount, pClasses);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.XFERACCOUNT;
        }
    }

    /**
     * The Portfolio Transfer Amount line.
     */
    public static class MoneyWiseQIFPortfolioXferAmountLine
            extends MoneyWiseQIFMoneyLine<MoneyWiseQPortfolioLineType> {
        /**
         * Constructor.
         *
         * @param pAmount the amount
         */
        protected MoneyWiseQIFPortfolioXferAmountLine(final OceanusMoney pAmount) {
            /* Call super-constructor */
            super(pAmount);
        }

        @Override
        public MoneyWiseQPortfolioLineType getLineType() {
            return MoneyWiseQPortfolioLineType.XFERAMOUNT;
        }

        /**
         * Obtain Amount.
         *
         * @return the amount
         */
        public OceanusMoney getAmount() {
            return getMoney();
        }
    }
}