EvaluationStateDto.java

package com.tdmconsult.ete.evaluation;

import static com.tdmconsult.ete.transactions.TradeTransaction.TransactionType.BUY;
import static com.tdmconsult.ete.transactions.TradeTransaction.TransactionType.SPLIT_BUY;

import com.tdmconsult.ete.configuration.EnumRegistryConfiguration.EnumValue;
import com.tdmconsult.ete.masterdata.SecurityDto;
import com.tdmconsult.ete.utils.JsonCurrencyAmountCents;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
import org.jspecify.annotations.Nullable;

@Data
@Accessors(chain = true)
public class EvaluationStateDto {

    @Nullable
    private SecurityDto security;

    private int fiscalYearT0;
    private int fiscalYearT1;

    private boolean requiresEoyProcessing;

    @Nullable
    private String buySellPhrase;
    @Nullable
    private String profitLossPhrase;
    @Nullable
    private String eoyEvaluationPhrase;

    private long totalQuantity;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal marketValue;

    @Data
    @Accessors(chain = true)
    public static class RateDto {
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal value;
        @Nullable
        private LocalDate date;
        @Nullable
        private String type;
    }

    @Nullable
    private RateDto evaluationRateT0;
    @Nullable
    private RateDto evaluationRateT1;

    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal evaluationTotalAmountT0;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal evaluationTotalAmountT1;

    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal evaluationTotalDeltaT0;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal evaluationTotalDeltaT1;

    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal totalBuyInFiscalYear;
    @Nullable
    @JsonCurrencyAmountCents

    private BigDecimal totalSellInFiscalYear;

    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal totalProfitInFiscalYear;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal totalLossInFiscalYear;

    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal eoyDepreciationHr;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal eoyDepreciation;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal eoyAppreciationHr;
    @JsonCurrencyAmountCents
    @Nullable
    private BigDecimal eoyAppreciation;

    private List<LineItem> items = new ArrayList<>();

    @Data
    @Accessors(chain = true)
    public static class LineItem {

        @Nullable
        private String publicId;
        @Nullable
        private LocalDate tradingDate;
        @Nullable
        private EnumValue transactionType;
        private long quantity;

        @Nullable
        private Long remainingQuantityT0;
        @Nullable
        private Long remainingQuantityT1;

        public boolean isTopUp() {
            return transactionType != null
                    && (transactionType.name().equals(BUY.name()) || transactionType.name().equals(SPLIT_BUY.name()));
        }

        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal price;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal principleAmount;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal totalCost;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal evaluatedAmountT0;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal evaluatedAmountT1;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal evaluationDeltaT0;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal evaluationDeltaT1;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal realizedPl;

        private List<BucketChange> bucketChanges = new ArrayList<>();
    }

    @Data
    @Accessors(chain = true)
    public static class BucketChange {

        @Nullable
        private String sourceTransactionPublicId;
        @Nullable
        private String sourceDescription;
        private long quantityBefore;
        private long quantityAfter;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal otherChangeAmount;
        @JsonCurrencyAmountCents
        @Nullable
        private BigDecimal ourChangeAmount;
    }
}