FEC.java

package com.tradecloud.domain.model.fec;

import com.tradecloud.domain.model.ForexGroup;
import com.tradecloud.domain.model.Money;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import org.hibernate.annotations.DiscriminatorOptions;
import org.joda.time.LocalDate;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Date;
import java.util.List;

/**
 * FEC is the root entity of the FEC aggregate. FEC stands for Foreign Exchange
 * Contract. An FEC represents a contract with a particular bank to buy or sell
 * an amount of foreign exchange at a specific rate (forward rate) on a
 * particular date (maturity date). The details that constitute a FEC are
 * captured by a Treasurer using a separation of concerns Context Mapping
 * Strategy (see the Domain Driven Design book by Eric Evans).
 */
@Entity
@Table(name = "fec")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 255)
@DiscriminatorValue("FEC")
@DiscriminatorOptions(force = true)
public class FEC extends AbstractFEC {

    /**
     * for JPA use only.
     */
    public FEC() {
    }

    public static FEC createFEC(LocalDate dealDate, BankReference bankReference, InternalReference internalReference, Money amount,
                                LocalDate maturityDate, BankDetails bankDetails, Money spotRate, Money forwardRate,
                                OrganisationalUnit organisationalUnit,
                                ForexGroup forexGroup, FECTransactionType fecTransactionType) {
        return new FEC(dealDate, bankReference, internalReference, amount, maturityDate, bankDetails, spotRate, forwardRate, organisationalUnit,
                forexGroup, fecTransactionType);
    }

    protected FEC(LocalDate dealDate, BankReference bankReference, InternalReference internalReference, Money amount, LocalDate maturityDate,
                  BankDetails bankDetails, Money spotRate, Money forwardRate, OrganisationalUnit organisationalUnit,
                  ForexGroup forexGroup, FECTransactionType fecTransactionType) {

        this.bankReference = bankReference;
        this.internalReference = internalReference;
        this.amount = amount;
        this.maturityDate = maturityDate;
        this.bankDetails = bankDetails;
        this.spotRate = spotRate;
        this.forwardRate = forwardRate;
        this.dealDate = dealDate;
        if (this.dealDate == null) {
            this.dealDate = new LocalDate();
        }
        this.unlinkedAmount = amount;
        this.organisationalUnit = organisationalUnit;
        this.forexGroup = forexGroup;
        this.fecTransactionType = fecTransactionType;
        type = FECType.FEC;
    }

    public static FEC createBlankFEC(LocalDate maturityDate, Money amount, Currency currency) {
        return new FEC(new LocalDate(), null, null, amount, maturityDate, null, new Money(BigDecimal.ZERO, currency), new Money(BigDecimal.ZERO,
                currency), null, null, null);
    }

    @Override
    public void confirm() {
        confirmed = true;
        confirmedDateTime = new Date();
    }

    @Override

    public void update(BankReference bankReference, InternalReference internalReference, Money amount, LocalDate dealDate, LocalDate maturityDate,
                       BankDetails bankDetails, Money spotRate, Money forwardRate, FECTransactionType fecTransactionType) {
        this.bankReference = bankReference;
        this.internalReference = internalReference;
        this.unlinkedAmount = this.unlinkedAmount.add(amount.subtract(this.amount));
        this.amount = amount;
        this.maturityDate = maturityDate;
        this.dealDate = dealDate;
        this.bankDetails = bankDetails;
        this.spotRate = spotRate;
        this.forwardRate = forwardRate;
        this.fecTransactionType = fecTransactionType;
    }

    @Override
    public BankReference getBankReference() {
        return bankReference;
    }

    @Override
    public InternalReference getInternalReference() {
        return internalReference;
    }

    @Override
    public Money getForwardRate() {
        return forwardRate;
    }

    @Override
    public Money getSpotRate() {
        return spotRate;
    }

    @Override
    public LocalDate getMaturityDate() {
        return maturityDate;
    }

    @Override
    public LocalDate getDealDate() {
        return dealDate;
    }

    @Override
    public boolean isConfirmed() {
        return confirmed;
    }

    @Override
    public boolean isSurrender() {
        return false;
    }

    public static StringBuilder getFECListAsXml(List<IFEC> fecs) {
        StringBuilder builder = new StringBuilder();
        builder.append("<fecs>");
        for (IFEC fec : fecs) {
            builder.append(fec.getStateAsXML());
        }
        builder.append("</fecs>");
        return builder;
    }

    @Override
    public BankDetails getBankDetails() {
        return bankDetails;
    }

    @Override
    public Money getUnlinkedAmount() {
        return unlinkedAmount;
    }

    @Override
    public Money getLinkedAmount() {
        return getAmount().subtract(getUnlinkedAmount());
    }

    @Override
    public void setUnlinkedAmount(Money unlinkedAmount) {
        this.unlinkedAmount = unlinkedAmount;
    }

}