EvaluableTransaction.java

package com.tdmconsult.ete.evaluation;

import com.tdmconsult.ete.masterdata.Security;
import com.tdmconsult.ete.transactions.PortfolioTransaction;
import com.tdmconsult.ete.transactions.TradeTransaction;
import jakarta.annotation.Nullable;
import java.math.BigDecimal;
import java.time.LocalDate;

public interface EvaluableTransaction {
    PortfolioTransaction getPortfolioTransaction();

    BigDecimal getTotalCost();

    @Nullable BigDecimal getPrincipleAmount();

    Long getQuantity();

    boolean isBuy();

    boolean isLikeBuy();

    boolean isSell();

    default String getPublicId() {
        return getPortfolioTransaction().getPublicId();
    }

    default Security getSecurity() {
        return  getPortfolioTransaction().getSecurity();
    }

    default LocalDate getTradingDate() {
        return  getPortfolioTransaction().getTradingDate();
    }

    static EvaluableTransaction of(final TradeTransaction transaction) {
        return new EvaluableTransaction() {

            @Override
            public PortfolioTransaction getPortfolioTransaction() {
                return transaction;
            }

            @Override
            public BigDecimal getTotalCost() {
                return transaction.getTotalCost();
            }

            @Override
            public @Nullable BigDecimal getPrincipleAmount() {
                return transaction.getPrincipleAmount();
            }

            @Override
            public Long getQuantity() {
                return transaction.getQuantity();
            }

            @Override
            public boolean isBuy() {
                return transaction.getType() == TradeTransaction.TransactionType.BUY;
            }

            @Override
            public boolean isLikeBuy() {
                return transaction.getType() == TradeTransaction.TransactionType.BUY
                        || transaction.getType() == TradeTransaction.TransactionType.SPLIT_BUY;
            }

            @Override
            public boolean isSell() {
                return transaction.getType() == TradeTransaction.TransactionType.SELL;
            }
        };
    }
}